K8S与Docker部署实践笔记

举报
yd_210205184 发表于 2026/10/23 14:14:10 2026/10/23
【摘要】 本文记录K8S流量控制、Docker镜像构建、本地镜像仓库、K8S使用本地仓库,以及Docker端口映射和卷持久化等实践。文中命令和YAML需按实际环境替换IP、端口、镜像名和路径。

一、K8S流量控制

  1. 集群内Ingress流量控制

集群内流量控制常见方案包括ToaP方案和Calico方案。本文采用Calico方案,通过GlobalNetworkPolicy构建流量限制规则。

先确认GlobalNetworkPolicy的CRD是否安装及版本:

kubectl get crd | grep globalnetworkpolicies

若看到,并确认为v1版本,则YAML中使用:

apiVersion:

GlobalNetworkPolicy示例:

apiVersion: 
kind: GlobalNetworkPolicy
metadata:
name: allow-tcp-6379
spec:
selector: role == 'database'
types:

  • Ingress

  • Egress
    ingress:

  • action: Allow
    protocol: TCP
    source:
    selector: role == 'frontend'
    destination:
    ports: [6379]
    egress:

  • action: Allow

确认版本和规则后,按实际业务编写自己的GlobalNetworkPolicy YAML即可。

  1. 集群外流量控制

集群外流量控制可考虑TC框架,也可采用Service端口映射。本文采用Service端口映射,直接通过K8S Service配置暴露端口。

Service示例:

apiVersion: v1
kind: Service
metadata:
labels:
app: nginx-service
name: nginx-service
spec:
ports:

  • nodePort: 30013
    port: 80
    protocol: TCP
    targetPort: 80
    selector:
    app: nginx-pod
    type: NodePort

其中,nodePort是节点暴露端口,port是Service虚拟端口,targetPort是后端Pod端口,selector用于选择后端Pod。

二、Docker镜像构建

  1. Java应用Dockerfile

使用openjdk:11作为基础镜像,可减少环境安装工作。示例Dockerfile:

FROM openjdk:11
RUN mkdir -p /project
WORKDIR /project
COPY ./Server.jar /project/Server.jar
CMD java -jar Server.jar

  1. 准备Java程序

单文件编译示例:

javac /home/pro*.java

多文件编译当前目录全部Java文件:

javac *.java

打包jar示例:

jar cvf your-application.jar -C output_directory .

注意命令最后有一个点,表示打包output_directory目录下的内容。

  1. 构建镜像

docker build -t javaserver ./

该命令以当前目录为构建上下文,构建名为javaserver的镜像。查看镜像:

docker images

确认javaserver镜像已出现,即完成镜像构建。

三、Docker本地镜像仓库

  1. 拉取registry镜像

可使用registry:2.7作为本地仓库服务器。若国内拉取困难,可使用镜像源

  1. 配置镜像源

临时使用镜像源下载:


  1. 启动Registry容器

将仓库映射到本地5000端口:

验证仓库是否启动:


返回{"repositories":[]},表示仓库已成功启动。

四、K8S使用本地镜像仓库

永久设置镜像仓库时,记得在worker节点上配置。先将本地镜像标记为私有仓库镜像:

docker tag centos:7 your_private_registry_ip:5000/centos:7

推送镜像:

docker push your_private_registry_ip:5000/centos:7

拉取镜像:

docker pull your_private_registry_ip:5000/centos:7

若本地仓库为HTTP仓库,需要关闭对应仓库的HTTPS验证。编辑/etc/docker/daemon.json,加入:

"insecure-registries": ["master:5000"]

修改后重启Docker。也可在Deployment YAML中直接写死镜像地址,示例:

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-deploy
name: nginx-deploy
spec:
replicas: 1
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:

  • image: 
    name: nginx
    ports:

    • containerPort: 80
      resources: {}

五、Docker端口映射与卷持久化

端口映射可在启动镜像时增加-p参数,例如:

-p 27000:27000

卷持久化示例:

-v /home/root2/Documents/saves:/home/steam/.avorion/galaxies/avorion_galaxy

  1. 宿主机权限问题

若容器挂载卷后出现权限问题,先确认容器内用户和宿主机用户ID。进入容器:

docker run -it --entrypoint="" 镜像名 /bin/bash

在容器内执行:

id

查看uid和gid。再在宿主机执行:

id

Docker挂载卷的权限通常与容器内用户ID对应。例如容器内用户为1000:1000,则挂载目录在宿主机上也按1000:1000用户权限处理。

若报“Operation not permitted”,可在挂载参数后增加:z:

-v /home/root2/Documents/saves:/home/steam/.avorion/galaxies/avorion_galaxy:z

:z用于让Docker重新设置SELinux标签,使容器进程能够读写该目录。

若:z无效,可在启动命令中增加--privileged进行排障。该参数会赋予容器全部Linux capability并解除SELinux/AppArmor限制,不建议用于生产环境,生产环境应使用精确的--cap-add。也可增加:

-u 1000:1000

确保容器以1000用户运行。

  1. SELinux补充说明

SELinux工作在内核LSM钩子层,会对进程访问文件、套接字、端口等客体进行权限判断。每个文件和进程都有安全上下文,日常主要关注type。例如普通用户家目录常为user_home_t,Docker卷默认为container_file_t,容器进程为container_t。若卷未带:z或:Z,宿主机目录type保持不变,容器进程访问时可能被拒绝。

:z表示Docker将目录递归改为container_file_t,所有容器都可读写;:Z表示改为container_file_t并增加私有类别,只有当前容器可读写。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。