YAML格式的POD定义文件内容详解
apiVersion: v1 # 版本号 kind: Pod # 资源类型 metadata: # 元数据 name: string # Pod的名称 namespace: string # Pod所属的命名空间,默认值为default labels: # 自定义标签列表 - name: string annotations: # 自定注解列表 - name: string spec: # Pod中容器的详细定义 containers: # Pod中容器列表 - name: string # 容器的名称 image: string # 容器的镜像名称 imagePullPolicy: [Always | Never |IfNotPresent] # 镜像拉取的策略,默认值为Always command: [string] # 容器的启动命令列表,如果不指定,则使用镜像打包时使用的启动命令 args: [string] # 容器的启动命令参数列表 workingDir: string # 容器的工作目录 volumeMounts: # 挂载到容器内部的存储卷配置 - name: string # 引用Pod定义的共享存储卷的名称,需使用volumes[]部分定义的共享存储卷名称 mountPath: string # 存储卷在容器内mount的绝对路径 readOnly: boolean # 是否为只读模式,模式为读写模式 ports: - name: string # 端口的名称 containerPort: int # 容器需要监听的端口号 hostPort: int # 容器所在主机需要监听的端口号,默认于containerPort相同,设置hostPort时,同一宿主机将无法启动该容器的第2个副本 protocol: string # 端口协议,支持TCP和UDP,默认为TCP env: # 容器运行前需要设置的环境变量列表 - name: string # 环境变量的名称 value: string # 环境变量的值 resources: # 资源限制和资源请求的设置 limits: # 最小使用资源限制的设置 cpu: string # 逻辑CPU数,将用于docker run --cpu-shares参数 memory: string # 内存限制,单位MiB、GiB等,将用于docker run --memory参数 requests: # 最大使用资源限制的设置 cpu: string # 逻辑CPU数,容器启动的初始可用数量 memory: string # 内存请求,单位MiB、GiB等,容器启动的初始可用数量 livenessProbe: # 对pod内各容器健康检查的设置,当探测无响应几次后,系统将自动重启该容器,对一个容器仅需设置一种检查方法 exec: # 健康检查为exec方式 command: [string] # exec方式需指定的命令或脚本 httpGet: # 健康检查为httpGet方式,需指定path、port path: string port: number host: string scheme: string httpHeaders: - name: string value: string tcpSocket: # 健康检查为tcpSocket方式 port: number initialDelaySeconds: 0 # 容器启动完成后首次探测的时机,单位为s timeoutSeconds: 0 # 对容器健康检查的探测等待响应的超时时间,单位为s,默认值1s。若超过该定义值,则认为该容器不健康会重启容器 periodSeconds: 0 # 对容器健康检查的定期探测时间,单位为s,默认值10s探测一次 successThreshold: 0 failureThreshold: 0 securityContext: privileged: false restartPolicy: [Always | Never | OnFailure] # Pod的重启策略 nodeSelector: object # 设置node的label,以key:value格式指定,pod将被调度到具有这些label的node上 imagePullSecrets: # pull镜像时使用的Secret名称,以name:secretkey格式指定 - name: string hostNetwork: false # 是否使用主机网络模式,默认值false,设为true表示容器使用宿主机网络,不再使用docker网桥,该pod将无法在同一宿主机上启动第2个副本 volumes: # 在该Pod上定义的共享存储卷列表 - name: string # 共享存储卷名称,在一个pod中每个存储卷定义一个名称,容器定义部分的containers.volumeMounts.name将引用该共享存储卷的名称 emptyDir: {} # 类型为emptDir的存储卷,其值为一个空对象 hostPath: # 类型为hostPath的存储卷,通过volume.hostPath.path指定挂载路径 path: string # Pod所在主机的目录,将被用于容器中的mount的目录 secret: # 类型为secret的存储卷,表示挂载集群预定义的secret对象到容器内部 secretName: string items: - key: string path: string configMap: # 类型为configMap的存储卷,表示挂载集群预定义的configMap对象到容器内部 name: string items: - key: string path: string
说明:
spec.containers.imagePullPolicy定义值含义:
- Always:表示每次都尝试重新拉取镜像
- IfNotPresent:表示如果本地有该镜像,则使用本地镜像,本地不存在则拉取镜像
- Never:表示仅使用本地镜像
spec.restartPolicy定义值含义:
- Always:Pod一旦终止运行,则无论容器是如何终止的,kubelet都将重启它
- OnFailure:只有Pod以非零退出码终止时,kubectl才会重启该容器,如果容器正常结束(退出码为0),则kubelet将不会重启它
- Never:Pod终止后,kubelet将退出码报告给Master,不会再重启该Pod
1.POD类型和资源配额
# vi mariadb-pod.yaml apiVersion: v1 kind: pod metadata: name: mariadb10.5 labels: name: mysql spec: containers: - name: mariadb10.5 image: mariadb:10.5.4 resources: memory: "64Mi" # 最少使用64MB内存 cpu: "250m" # 最小使用0.25个CPU limits: memory: "1Gi" # 最多使用1GB内存 cpu: "1000m" # 最多使用1个逻辑CPU(CPU逻辑数=物理CPU个数x每颗CPU核数x超线程数,cat /proc/cpuinfo | grep “processor” | wc -l) ports: - containerPort: 3306 env: - name: MYSQL_ROOT_PASSWORD value: "123456" 查看POD信息 # kubectl get pods
2.ReplicaSet类型
# vi mysql-rs.yaml apiVersion: extensions/v1beta1 kind: ReplicaSet # 副本控制器RS metadata: name: mysql5.7 # RS名称全局唯一 spec: replicas: 2 # pod副本期待数量 selector: app: mysql # 符合目标的pod拥有此标签 template: # 根据此模版创建pod的副本 metadata: labels: app: mysql # pod副本拥有的标签,对应spec.selector名称要相同 spec: containers: # pod内容器的定义部分 - name: mysql5.7 # 容器的名称 image: mysql:5.7.29 # 容器对应的docker image ports: - containerPort: 3306 # 容器应用监听的端口号 env: # 注入容器内的环境变量 - name: MYSQL_ROOT_PASSWORD value: "123456" # vi tomcat-rs.yaml apiVersion: extensions/v1beta1 kind: ReplicaSet metadata: name: tomcat7-java8 spec: replicas: 3 selector: app: tomcat template: metadata: labels: app: tomcat # spec.template.metadata.labels标签名与spec.selector名称要相同 spec: containers: - name: tomcat7-java8 image: maluuba/tomcat7-java8:latest ports: - containerPort: 8080 env: - name: MYSQL_SERVICE_HOST value: 'mysql5.7' # mysql-svc metadata.name - name: MYSQL_SERVICE_PORT value: '3306' # mysql-svc spec.port # vi nginx-rs.yaml apiVersion: extensions/v1beta1 kind: ReplicaSet metadata: name: frontend spec: replicas: 3 selector: tier: frontend template: metadata: labels: app: nginx tier: frontend spec: containers: - name: nginx1.18 image: nginx:1.18.0 imagePullPolicy: IfNotPresent env: - name: GET_HOSTS_FROM value: env ports: - containerPort: 80 查看ReplicaSet信息 # kubectl get rs 手动操作动态扩容 # kubectl scale rc nginx1.18 --replicas=3 扩容3台容器
3.Deployment类型
# vi tomcat-deployment.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: tomcat7-java8 spec: replicas: 3 selector: app: tomcat template: metadata: labels: app: tomcat # spec.template.metadata.labels标签名与spec.selector名称要相同 spec: containers: - name: tomcat7-java8 image: maluuba/tomcat7-java8:latest ports: - containerPort: 8080 env: - name: MYSQL_SERVICE_HOST value: 'mysql5.7' # mysql-svc metadata.name - name: MYSQL_SERVICE_PORT value: '3306' # mysql-svc spec.port 创建Deployment # kubectl create -f tomcat-deployment.yaml 查看Deployment信息 # kubectl get deployment 内容说明: desired:pod副本数量的期望值,即deployment里定义的replicas数量 current:当前replicas,这个值不断增加,直到达到desired值为止 up-to-date:最新版本的pod副本数量,用于指示在滚动升级过程中,有多少个pod副本已经升级成功 available:当前集群中可用的pod副本数量
4.Horizontal POD Autoscaler类型(按负载动态扩容)
# vi tomcat-HPA.yaml apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata: name: tomcat7-java8 namespace: default spec: maxReplicas: 10 # 最大副本数10 minReplicas: 3 # 最小副本数3 scaleTargetRef: kind: Deployment name: tomcat7-java8 targetCPUUtilizationPercentage: 90 # CPU利用率超过90%触发自动扩容 支持创建一个HPA对象 # kubectl autoscale deployment tomcat7-java8 --cpu-percent=90 --min=3 --max=10
5.Service类型
# vi mysql-svc.yaml apiVersion: v1 kind: Service metadata: name: mysql5.7 spec: ports: - port: 3306 selector: app: mysql # vi tomcat-svc.yaml apiVersion: v1 kind: Service metadata: name: tomcat7-java8 spec: type: NodePort ports: - port: 8080 nodePort: 30001 # 远程直接访问nodeIP+30001端口 selector: app: tomcat # vi nginx-svc.yaml apiVersion: v1 kind: Service metadata: name: nginx-service spec: ports: - port: 80 name: http-port protocol: TCP targetPort: 80 # 容器所暴露(EXPOSE)的端口号,不定义默认与port端口号相同 - port: 443 name: https-port protocol: TCP targetPort: 443 selector: tier: frontend # label名称是tier=frontend 创建service # kubectl create -f nginx-svc.yaml 查看endpoint列表 # kubectl get endpoints 查看service分配的cluster ip # kubectl get svc nginx-service -o yaml 创建nodeport类型,服务通过node ip+node port可直接访问 # vi tomcat-svc_nodeport.yaml apiVersion: v1 kind: Service metadata: name: tomcat-service spec: type: NodePort ports: - port: 8080 nodePort: 31002 selector: app: tomcat # netstat -tlp | grep 31002
6.DaemonSet类型
# vi zabbix-agent_daemonset.yaml apiVersion: apps/v1 kind: DaemonSet metadata: name: zabbix-agent namespace: default labels: app: zabbix spec: selector: matchLabels: name: zabbix-agent template: metadata: labels: app: zabbix spec: containers: - name: zabbix-agent image: zabbix/zabbix-agent:latest volumes: - name: zabbixagentdir hostPath: path: /etc/zabbix-agent
一个DaemonSet对象能确保其创建的Pod在集群中的每一台(或指定)Node上都运行一个副本。如果集群中动态加入了新的Node,DaemonSet中的Pod也会被添加在新加入Node上运行。删除一个DaemonSet也会级联删除所有其创建的Pod。
7.StatefulSet类型
apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql spec: serviceName: "mysql" replicas: 2 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: nmysql image: mysql:5.27 ports: - containerPort: 3306 - protocol: tcp
serviceName=mysql字段的作用,就是告诉StatefulSet控制器,在执行控制循环时,要使用nginx这个Headless Service来保证Pod的可解析身份,StatefulSet给它所管理的所有Pod名字进行编号,使得每个Pod实例不重复.而更重要的是,这些Pod的创建,也是严格按照编号顺序来进行的。当使用StatefulSet创建mysql这种有主从关系的有状态pod时,有明确先后关系时,StatefulSet通过这种机制,使得先后创建顺序成为可能。