K8s集群部署Deployer服务端
本章节介绍如何通过kubectl创建Deployment, 实现Deployer服务端的部署。
操作步骤
- 使用以下命令创建命名空间namespace。
kubectl create ns mindie
- 创建ClusterRole和ClusterRoleBinding。
ClusterRole和ClusterRoleBinding用于授予Deployer服务端访问Kube API-Server的权限,用户需自行准备以下yaml文件(比如:ms-role.yaml)。
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: ms-role rules: - apiGroups: ["apps"] resources: ["deployments"] verbs: ["create", "delete", "get", "patch"] - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "patch"] - apiGroups: [""] resources: ["configmaps"] verbs: ["get", "create", "delete"] - apiGroups: [""] resources: ["services"] verbs: ["get", "delete", "create"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: ms-role-bind subjects: - kind: User name: kubeclient # 集群用户名,该值为MindIE MS与Kube API-Server通信的客户端证书的CN字段值。 apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: ms-role apiGroup: rbac.authorization.k8s.io
表1 重要配置参数说明 参数
说明
rules
必填。
resources:Kubernetes资源,MindIE MS业务过程需要具备以下resources的操作权限。
- deployments:create、delete和get权限。
- pods:get、list和patch权限。
- configmaps:get、create和delete权限。
- services:get、create和delete权限。
ClusterRoleBinding中subjects参数的name
必填。
Kubernetes集群的用户名称,需要用户自定义。当创建该用户后,Kube API-Server将授予该用户rules参数中指定的权限。
Deployer服务端作为客户端向Kube API-Server发送HTTPS请求,Kube API-Server会检验客户端证书的CN字段,如果与该name一致,将授予上述操作权限。所以用户在使用Deployer服务端之前,需要先准备由集群中间CA签发的客户端证书,详情请参见签发其他证书。
使用以下命令创建Role资源。
kubectl apply -f ms-role.yaml
如显示以下回显则表示Role创建成功。
- 创建Deployment。
- 配置Deployment。
用户需自行编写与Kubernetes交互的yaml文件(例:ms_server_deployment.yaml),样例如下所示(格式必须和样例保持一致),部分参数请参考表2自行修改。
apiVersion: apps/v1 kind: Deployment metadata: name: ms-server namespace: mindie labels: app: ms-server spec: replicas: 1 selector: matchLabels: app: ms-server template: metadata: labels: app: ms-server spec: terminationGracePeriodSeconds: 5 automountServiceAccountToken: false nodeSelector: masterselector: dls-master-node #MindIE MS服务端需部署在Kubernetes管理节点上,节点标签必须选择为masterselector: dls-master-node containers: - image: {镜像名称}:{镜像版本} #内容和用户自定义的镜像名称和镜像版本一致 imagePullPolicy: IfNotPresent name: mindie-ms securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: true runAsUser: {UID} #容器用户ID,和Dockerfile的UID一致 runAsGroup: {UID} #容器所属组ID,和Dockerfile的UID一致。 capabilities: drop: ["ALL"] seccompProfile: type: RuntimeDefault volumeMounts: - name: dir1 mountPath: /var/log/mindie-ms - name: dir2 #容器内业务持久化数据文件路径 mountPath: /var/lib/mindie-ms - name: security #容器内证书文件目录 mountPath: /home/{容器内用户名}/mindie-service/latest/security command: ["bin/bash", "-c", "cd /home/{容器内用户名}/mindie-service/latest && ./bin/ms_server ./conf/ms_server.json"] #容器内用户名即为自定义MindIE MS的专用用户名称。 env: - name: HSECEASY_PATH value: /home/{容器内用户名}/mindie-service/latest/lib #容器内用户名即为自定义MindIE MS的专用用户名称。 - name: MINDIE_MS_SERVER_IP valueFrom: fieldRef: fieldPath: status.podIP resources: requests: memory: "512Mi" cpu: "4000m" limits: memory: "1024Mi" cpu: "4000m" volumes: - name: dir1 hostPath: path: /var/log/mindie-ms type: Directory - name: dir2 hostPath: path: /var/lib/mindie-ms type: Directory - name: security hostPath: path: /{用户工作目录}/mindie-service/latest/security type: Directory
表2 Deployment重要配置参数说明 参数
类型
说明
name
String
必填。
服务名称。
namespace
String
必填。
服务所属的命名空间。
image
String
必填。
内容和用户自定义的镜像名称和镜像版本一致,镜像制作中Dockerfile已创建好的镜像。
terminationGracePeriodSeconds
Int
允许进程优雅退出的时间,单位秒,优雅退出过程中存在端口占用的可能,若用户删除deployment后退出过程重新部署,可能因端口占用启动失败。
runAsUser
Int
必填。
容器用户ID,和Dockerfile的UID一致。
runAsGroup
Int
必填。
容器所属组ID,和Dockerfile的UID一致。
volumeMounts
List
选填。
用户需要挂载的容器路径(mountPath),需要与volumes参数中的name一一对应进行挂载,需要被挂载的物理路径都可以配置name和mountPath参数对应到容器路径。
- dir1:日志路径;如需挂载,则容器路径必须为/var/log/mindie-ms/。
- dir2:容器内持久化保存业务数据status.json文件路径;路径建议与volumes参数中的dir2保持一致。
- security: 挂载到容器内的证书目录路径。
挂载容器路径时,请勿挂载到6中的{USER_HOME_DIR}路径,防止覆盖。
volumes
List
选填。
用户需要挂载物理机路径(hostpath),需要与volumeMounts参数中的name一一对应进行挂载,需要保证挂载的物理路径容器内用户可读且可写。
用户自定义被挂载的物理路径:
- dir1:服务端写入的日志目录;该路径需要保证可读取且真实存在,且文件属主需要与容器内用户保持一致。首次启动MindIE MS会自动创建日志文件,用户无需在该目录下创建文件,避免权限出现问题。
- dir2:持久化保存业务数据文件(status.json)的物理机路径,需和ms_server.json配置文件中的ms_status_file参数保持一致,用户不能创建文件,只能填写目录,目录要求真实存在且可读。
- security: 宿主机上的证书目录,{用户工作目录}是用户安装mindie-service的所在的目录。
command
List
必填。
启动容器的运行指令。根据用户实际使用场景,填入真实且可以正常启动MindIE MS服务的命令。
用户需保证命令的安全性。
- /home/{容器内用户名}:与6中的{USER_HOME_DIR}一致。
- ms_server.json:启动服务配置文件,请参见ms_server.json配置文件进行配置。
- 在宿主机上创建日志文件目录和数据文件目录。
mkdir -p /var/lib/mindie-ms/ mkdir -p /var/log/mindie-ms/run mkdir -p /var/log/mindie-ms/operation chown -R {容器内uid}:{容器内gid} /var/lib/mindie-ms/ chown -R {容器内uid}:{容器内gid} /var/log/mindie-ms/ chmod 750 /var/log/mindie-ms/run chmod 750 /var/log/mindie-ms/operation chmod 750 /var/lib/mindie-ms/
- 使用以下命令创建Deployment。
kubectl apply -f {Deployment配置文件路径}
- 使用以下命令查看Deployment的状态,如果为“Running”,则表示创建成功,如图1所示。
kubectl get pod -A
- 使用以下命令查看Deployer服务端是否部署成功,如图2所示,则表示部署成功。
kubectl logs {NAME} -n {NAMESPACE}
- 配置Deployment。
- 卸载Deployer服务端。如不再使用Deployer服务端,可使用kubectl命令卸载服务。
kubectl delete -f {Deployment配置文件路径}
回显如下所示则表示卸载成功:
deployment.apps {Deployment配置文件中的name} deleted
- Deployer服务端部署成功后,可使用MindIE MS客户端和MindIE MS服务端进行交互,详细命令请参见使用msctl部署服务。
- 启动时如报错打印“change file mode error 30”,是由于内部KMC组件尝试在read only的文件系统中修改相关密钥文件权限失败,按照操作指导,文件权限已设置正常,不影响功能,可忽略。
- 启动时如出现“[warn] [1] entropy may not be enough”,是由于环境熵不足,需要安装haveged组件补熵。详情请参考《MindIE安装指南》中 章节。