01 引言
至此,pod的相关知识已经讲解完了,下面是整理的脑图:
02 总结
下面是关于pod的文章详情总结:
- 《k8s教程(pod篇)-定义与基本用法》
- 《k8s教程(pod篇)-容器共享volume》
- 《k8s教程(pod篇)-配置管理》
- 《k8s教程(pod篇)-容器获取pod信息(Downward API)》
- 《k8s教程(pod篇)-生命周期、重启策略及健康检查》
- 《k8s教程(pod篇)-调度概述》
- 《k8s教程(pod篇)-全自动调度》
- 《k8s教程(pod篇)-定向调度》
- 《k8s教程(pod篇)-node亲和性调度》
- 《k8s教程(pod篇)-亲和性与互斥性调度》
- 《k8s教程(pod篇)-污点与容忍》
- 《k8s教程(pod篇)-优先级调度》
- 《k8s教程(pod篇)-DaemonSet(每个node上只调度一个pod)》
- 《k8s教程(pod篇)-批处理调度》
- 《k8s教程(pod篇)-定时任务》
- 《k8s教程(pod篇)-容灾调度》
- 《k8s教程(pod篇)-调度总结》
- 《k8s教程(pod篇)-初始化容器》
- 《k8s教程(pod篇)-升级与回滚》
- 《k8s教程(pod篇)-扩缩容》
- 《k8s教程(pod篇)-使用StatefulSet搭建MongoDB集群》
2.1 定义与基本用法
详情参考: 《k8s教程(pod篇)-定义与基本用法》
pod定义的完整内容如下:
apiVersion: v1 kind: Pod metadata: name: string namespace: string labels: - name: string annotations: - name: string spec: containers: - name: string image: string imagePullPolicy: [Always Never IfNotPresent] command: [string] args: [string] workingDir: string volumeMounts: - name: string mountPath: string readonly: boolean ports: - name: string containerPort: int hostPort: int protocol: string env: - name: string - value: string resources: limits: cpu: string memory: string requests: cpu: string memory: string livenessProbe: exec: command: [string] httpGet: path: string port: number host: string scheme: string httpHeaders: - name: string value: string tcpSocket: port: number initialDelaySeconds: 0 timeoutSeconds: 0 periodSeconds: 0 successThreshold: 0 failureThreshold: 0 securityContext: privileged: false restartPolicy: [Always | Never | OnFailure] nodeselector: object imagePullSecrets: - name: string hostNetwork: false volumes: - name: string emptyDir: {} hostPath: path: string secret: secretName: string items: - key: string path: string configMap: - name: string items: - key: string path: string
属性含义:
2.2 容器共享volume
详情参考: 《k8s教程(pod篇)-容器共享volume》
容器共享volume:同一个 Pod 中的多个容器能够共享Pod级别的存储卷 Volume。
举例:在 Pod 内包含两个容器(tomcat 和 busybox),在 Pod 级别设置 Volume “app-logs
”,用于 tomcat 容器向其中写日志文件,busybox 容器从中读日志文件。
apiversion: v1 kind: Pod metadata: name: volume-pod spec: containers: - name: tomcat image: tomcat ports: - containerPort: 8080 volumeMounts: - name: app-logs mountPath: /usr/local/tomcat/logs - name: busybox image: busybox command: ["sh","-c","tail-f /logs/catalina*.log"] volumeMounts: - name: app-logs mountPath: /logs volumes: - name: app-logs emptyDir: {}
这里设置的 Volume 名称为 app-logs,类型为 emptyDir(也可以设置为其他类型),挂载到 tomcat容器内 的/usr/local/tomcat/logs目录下,同时挂载到busybox容器内的/logs目录下。
tomcat容器在启动后会向/usr/local/tomcat/logs目录写文件,busybox 容器就可以读取其中的文件了。
2.3 配置管理
详情参考: 《k8s教程(pod篇)-配置管理》
Pod可以使用 ConfigMap进行配置管理,ConfigMap以一个或多个key:value的形式保存在Kubenetes系统中供应用使用,它既可以表示一个变量的值(例如: apploglevel=info
),也可以用于表示一个完整的配置文件内容(例如:server.xml=<?xml...>
)。
典型用法如下:
- 生成容器的环境变量;
- 设置容器启动命令的启动参数(需要设置为环境变量);
- 以Volume的形式挂载为容器内部的文件或目录。
下面展示将两个配置文件(server.xml
和logging.properties
)定义为ConfigMap
的用法,设置key为配置文件的别名,value则是配置文件的全部文本内容:
apiVersion: v1 kind: ConfigMap metadata: name: cm-appconfigfiles data: key-serverxml: | <?xml version='1.0'encoding='utf-8'?> .......此处省略内容 key-loggingproperties: "handlers=catalina.org.apache.juli ......此处省略内容"
接着使用kubectl命令创建该ConfigMap:
$ kubectl create -f cm-appconfigfiles.yaml configmap "cm-appconfigfiles" created
然在Pod “cm-test-app” 的定义中,将ConfigMap “cm-appconfigfiles”中的内容以文件的形式挂载到容器内部的/configfiles目录下,Pod配置文件cm-test-app.yaml的内容如下:
apiVersion: v1 kind: Pod metadata: name: cm-test-app spec: containers: - name: cm-test-app image: kubeguide/tomcat-app:v1 ports: - containerPort: 8080 volumeMounts: - name: serverxml #引用Volume的名称 mountPath: /configfiles #挂载到容器内的目录 volumes: - name: serverxml #定义Volume的名称 configMap: name: cm-appconfigfiles #使用ConfigMap"cm-appconfigfiles" items: - key: key-serverxml # key=key-serverxml path: server.xml #value将server.ml文件名进行挂载 - key: key-loggingproperties # key=key-loggingproperties path: logging.properties #value将logging,properties文件名进行挂载
创建完该Pod之后,登录容器,查看到在**/configfiles目录下存在server.xml
和logging.properties
文件,他们的内容就是ConigMap “cm-appconfigfiles”** 中两个key定义的内容:
2.4 容器获取pod信息(Downward API)
详情参考:《k8s教程(pod篇)-容器获取pod信息(Downward API)》
Downward API可以通过以下两种方式将Pod和容器的元数据信息注入容器内部:
- 环境变量:将Pod或Container信息设置为容器内的环境变量;
- Volume挂载:将Pod或Container信息以文件的形式挂载到容器内部。
下面仅举例通过Downward API将Pod的 IP、名称和所在命名空间注入容器的环境变量中(通过Volume挂载的方式可以看原文):
apiVersion: v1 kind: Pod metadata: name: dapi-envars-fieldref spec: containers: - name: test-container image: busybox command: ["sh","-c"] args: - while true;do echo -en '\n'; printenv MY NODE NAME MY POD NAME MY POD NAMESPACE; printenv MY POD IP MY POD SERVICE ACCOUNT; sleep 10; done; env: - name: MY NODE NAME valueFrom: fieldRef: fieldPath: spec.nodeName - name: MY POD NAME valueFrom: fieldRef: fieldPath: metadata.name - name: MY POD NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: MY POD IP valueFrom: fieldRef: fieldPath: status.podIP - name: MY POD SERVICE ACCOUNT valueFrom: fieldRef: fieldPath: spec.serviceAccountName restartPolicy: Never
yaml设置的环境变量有:
spec.nodeName
:Pod所在Node的名称;metadata.name
:Pod名称;metadata.namespace
:Pod所在命名空间的名称;status.podIP
:Pod的IP地址;spec.serviceAccountName
:Pod使用的ServiceAccount名称。
使用命令创建pod之后,进入容器,可以看到环境变量的配置了: