第一章、前言
在上一篇博客中,我們大致簡述了一般情況下資源清單的格式,以及如何獲得清單配置的命令幫助,下面我們再講解下清單中spec字段中比較常見的字段及其含義
第二章、常用字段講解
spec.containers <[]object>
spec.containers <[]object> spec.containers.name <string> #pod的名稱,必須字段,名稱唯一且對象創建后不可以被修改 spec.containers.image <string> #鏡像倉庫的路徑/鏡像的名稱:鏡像的標簽 spec.containers.image.imagePullPolicy <string> #鏡像的下載策略。有三種:Always(總是去倉庫下載) ,Never(從不去倉庫下載) , IfNotPresent(如果本地沒有就去倉庫下載) 默認是"IfNotPresent" 但是,如果鏡像的標簽是latest,則總會是"Always,並且對象一旦被創建,這個字段不允許被改變
spec.containers.ports: #容器公開的端口列表。在這里公開端口可以為系統提供關於容器使用的網絡連接的額外信息,但主要是提供信息。在這里不指定端口不會阻止該端口被公開。任何監聽容器內默認的“0.0.0.0”地址的端口都可以從網絡訪問 spec.containers.ports.containerPort <integer> -required- #pod暴露的端口,此端口僅是額外的信息,對端口是否被暴露沒有影響 spec.containers.ports.hostPort <integer> #主機上公開的端口 spec.containers.ports.protocol <string> #端口的協議 spec.containers.ports.hostIP <string> #指定要綁定的主機 spec.containers.command <[]string> #運行的程序,類似於docker中的entrypiont,並且這里的命令不會運行在shell中,如果沒有這個字段docker鏡像會運行自己entrypiont中的指令 spec.containers.args <[]string> #向docker鏡像中傳遞參數 如果定義了這個字段,docker鏡像中cmd命令不會被執行,如果引用變量使用$(VAR_NAME)格式引用,如果想使用命令引用的的方式,需要使用$$(VAR_NAME)方式來引用
#關於args和command的官方文檔鏈接:https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/
pod.spec.containers.volumeMounts
pod.spec.containers.volumeMounts.name
pod.spec.containers.volumeMounts.mountPath #可以被容器掛載的存儲卷的路徑,路徑不能包含':' 符號
pod.spec.containers.volumeMounts.subPath #可以被容器掛載的存儲卷的路徑,並且不會覆蓋掛載點中的文件
pod.spec.containers.volumeMounts.readOnly #是否只讀,默認為false
pod.spec.containers.resources
spec.containers.resources.limits #資源限制
spec.containers.resources.limits.cpu : CPU 上限, 可以短暫超過, 容器也不會被停止
spec.containers.resources.limits.memory : 內存上限, 不可以超過; 如果超過, 容器可能會被終止或調度到其他資源充足的機器上
spec.containers.resources.requests #資源需求
spec.containers.resources.requests.cpu : CPU 請求, 也是調度 CPU 資源的依據, 可以超過
spec.containers.resources.requests.memory : 內存請求, 也是調度內存資源的依據, 可以超過; 但如果超過, 容器可能會在 Node 內存不足時清理
spec.nodeSelector <map[string]string>
pod.spec.nodeSelector: #指定對象的調度節點,節點必須存在
pod.spec.restartPolicy <string>
pod.spec.restartPolicy:#容器的重啟策略。有三種Always(只有退出就重啟),OnFailure(失敗退出時不重啟),Never(只要退出就不重啟),kubelet重新啟動的已退出容器將以指數退避延遲(10秒,20秒,40秒......)重新啟動,上限為五分鍾,並在成功執行十分鍾后重置
第三章、簡單示例
1.常見pod清單(使用ConfigMap傳遞環境變量)
[root@k8s-master01 ~]#kubectl create configmap special-config --from literal=special.how=very --from-literal=sepcial.type=charm #創建一個ConfigMap,ConfigMap是用來存儲配置文件的kubernetes資源對象,獲取命令幫助kubectl create configmap -h [root@k8s-master01 ~]#kubectl create configmap env-config --from-literal=log_level=INFO [root@k8s-master01 ~]#kubectl get configmap special-config -o go-template='{{.data}}' #查看ConfigMap的內容 [root@k8s-master01 ~]#kubectl get configmap env-config -o go-template='{{.data}}' [root@k8s-master01 manifests]# kubectl label node k8s-node01 disk=ssd #對集群中的一個節點打上標簽 [root@k8s-master01 manifests]# cat test-pod.yaml #創建一個測試pod清單 apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - name: test-container #容器名稱 image: busybox #鏡像路徑 command: ["/bin/sh", "-c", "env"] #執行命令,需要注意command、args和container中的entrypiont中的命令和參數相互的關系 env: #配置env - name: SPECIAL_LEVEL_KEY #env名稱 valueFrom: #指定env的來源 configMapKeyRef: #表示從ConfMap中選擇 name: special-config #ConfigMap的文件名稱 key: special.how #ConfigMap中的key名稱 - name: SPECIAL_TYPE_KEY valueFrom: configMapKeyRef: name: special-config key: sepcial.type envFrom: #容器中填充環境變量的列表 - configMapRef: #指定ConfigMap文件 name: env-config #ConfigMap文件 restartPolicy: Never #定義重啟策略 nodeSelector: #node選擇器 disk: ssd
2.常見pod清單(使用secret傳遞環境變量)
[root@k8s-master01 manifests]# cat secrets.yaml apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: password: MTIzNDU2Cg== #這里的環境變量的值需要使用base64加密,例如:echo "admin"|base64[加密] , echo "YWRtaW4K"|base64 -d [解密] username: YWRtaW4K [root@k8s-master01 manifests]# cat secrets-demo.yaml apiVersion: v1 kind: Pod metadata: name: secret-nginx labels: name: secret-nginx spec: volumes: - name: secret-nginx secret: secretName: mysecret containers: - name: secret-nginx image: nginx:1.14.0-alpine volumeMounts: - name: secret-nginx mountPath: "/etc/secrets" readOnly: true ports: - name: www containerPort: 8888 hostPort: 8888
pod清單配置3(定義pod postStart或preStop,即容器創建后和容器中止前需要做的操作)
[root@k8s-master01 manifests]# cat poststart-pod.yaml apiVersion: v1 kind: Pod metadata: name: poststart-pod spec: containers: - name: buxybox-httpd image: busybox imagePullPolicy: IfNotPresent lifecycle: postStart: exec: command: ["mkdir", "-p"," /data/web/html"] #注意,此處command和下面的command不可以有強依賴關系,下面的command會在此處command先執行 command: ["/bin/sh","-c","sleep 3600"]
pod清單配置4(以exec方式對pod進行存活性探測)
[root@k8s-master01 manifests]# cat liveness-exec.yaml apiVersion: v1 kind: Pod metadata: name: liveness-exec-pod spec: containers: - name: liveness-exec-pod image: busybox:latest imagePullPolicy: IfNotPresent command: ["/bin/sh","-c","touch /tmp/healthy;sleep 30;rm -rf /tmp/healthy;sleep 3600"] livenessProbe: exec: #探測方式由三種,exec(執行命令探測) HttpGet(Http請求) tcpSocket(TCP端口探測) command: ["test","-e","/tmp/healthy"] initialDelaySeconds: 2 #容器啟動后多長時間開始探測 periodSeconds: 5 #每次探測的間隔時間,單位為秒
pod清單配置5(以HttpGet方式對pod進行存貨性探測)
[root@k8s-master01 manifests]# cat liveness-httpget.yaml apiVersion: v1 kind: Pod metadata: name: liveness-httpget-pod spec: containers: - name: liveness-httpget-pod image: ikubernetes/myapp:v1 imagePullPolicy: IfNotPresent livenessProbe: httpGet: port: 80 path: /index.html initialDelaySeconds: 2 periodSeconds: 5
pod清單配置6(使用httpget方式對pod進行就緒性探測)
[root@k8s-master01 manifests]# cat readiness-httpget.yaml #與存活性探測相類似 apiVersion: v1 kind: Pod metadata: name: readiness-httpget-pod spec: containers: - name: readiness-httpget-pod image: ikubernetes/myapp:v1 imagePullPolicy: IfNotPresent readinessProbe: httpGet: port: 80 path: /index.html initialDelaySeconds: 2 periodSeconds: 5