K8S与Docker部署实践笔记
一、K8S流量控制
-
集群内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即可。
-
集群外流量控制
集群外流量控制可考虑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镜像构建
-
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
-
准备Java程序
单文件编译示例:
javac /home/pro*.java
多文件编译当前目录全部Java文件:
javac *.java
打包jar示例:
jar cvf your-application.jar -C output_directory .
注意命令最后有一个点,表示打包output_directory目录下的内容。
-
构建镜像
docker build -t javaserver ./
该命令以当前目录为构建上下文,构建名为javaserver的镜像。查看镜像:
docker images
确认javaserver镜像已出现,即完成镜像构建。
三、Docker本地镜像仓库
-
拉取registry镜像
可使用registry:2.7作为本地仓库服务器。若国内拉取困难,可使用镜像源
-
配置镜像源
临时使用镜像源下载:
-
启动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
-
宿主机权限问题
若容器挂载卷后出现权限问题,先确认容器内用户和宿主机用户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用户运行。
-
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并增加私有类别,只有当前容器可读写。
- 点赞
- 收藏
- 关注作者
评论(0)