文章目錄
1. Pod定義
1.1 pod yaml格式
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 # 容器的鏡像名稱
# Always: 表示每次都嘗試重新拉取鏡像
# Never: 表示僅使用本地鏡像
# IfNotPresent: 如果本地有該鏡像,則使用本地的鏡像,本地不存在時拉取鏡像
imagePullPolicy: [Always | Never | IfNotPresent]
command: [string] # 容器的啓動命令列表,如果不指定,則使用鏡像打包時使用的啓動命令
args: [string] # 容器的啓動命令參數列表
workingDir: string # 容器的工作目錄
volumeMounts: # 掛載到容器內部的存儲卷配置
- name: string # 引用pod定義的共享存儲卷的名稱,需使用volumes[]部分定義的共享存儲卷名稱
mountPath: string # 存儲卷在容器內mount的絕對路徑(小於512字符)
readonly: boolean # 是否爲只讀模式,默認爲讀寫模式
ports: # 容器需要暴露的端口號列表
- name: string # 端口的名稱
containerPort: int # 容器需要監聽的端口號
hostPort: int # 容器所在主機需要監聽的端口號,默認與container port相同。設置hostPort時,同一宿主機將無法啓動該容器的第二份副本
protocol: string # 端口協議,支持TCP和UDP,默認值爲TCP
env: # 容器運行前需設置的環境變量列表
- name: string # 環境變量名稱
value: string # 環境變量的值
resources: # 資源限制和資源請求的設置
limits: # 資源限制的設置
cpu: string # CPU限制,單位爲core數,將用於docker run --cpu-share 參數
memory: string # 內存限制,單位可以爲MiB,GiB等,將用於docker run --memiry 參數
requests: # 資源請求的設置
cpu: string # CPU請求,單位爲core數,容器啓動的初始可用數量
memory: string # 內存請求,單位可以爲MiB,GiB等,容器啓動的初始可用數量
livenessProbe: # 對pod內各容器健康檢查的設置,當探測無響應幾次之後,系統將自動重啓該容器。可以設置的方法包括exec、httpGet、tcpSocket。對一個容器僅需設置一種健康檢查方法。
exec:
command: [string] # exec方式需要指定命令或者腳本,返回值爲0則表示容器正常
httpGet: # 對pod內個容器健康檢查設置,需要指定path、port,任何大於200小於400的返回碼都會認定是成功的返回碼
path: string # 訪問的HTTP server的path
port: number # 訪問的容器的端口名字或者端口號
host: string # 連接的主機名,默認連接到pod的IP
scheme: string # 連接使用的schema,默認HTTP
httpHeaders: # 自定義請求的header
- name: string
value: string
tcpSocket:
port: number
initialDelaySeconds: 0 # 容器啓動後第一次執行探測是需要等待多少秒
timeoutSeconds: 0 # 對容器健康監測的探測等待響應的超時時間設置,默認爲1s。若超過該設置,則認爲容器不健康,會重啓該容器
periodSeconds: 0 # 對容器健康檢查的定期探測時間設置。默認是10秒,最小1秒
successThreshold: 0 # 探測失敗後,最少連續探測成功多少次才被認定爲成功。默認是1。對於liveness必須是1。最小值是1。
failureThreshold: 0 # 探測成功後,最少連續探測失敗多少次才被認定爲失敗。默認是3。最小值是1。
securitycontext:
privileged: false
# pod重啓策略
# Always: pod一旦終止運行,無論容器時如何終止的,kubelet都將重啓它
# Never: pod終止後,kubelet將退出碼報告給master,不會重啓該pod
# OnFailure: 只有pod以非零退出碼終止時,kubelet纔會重啓該容器。如果容器正常結束,則kubelet將不會重啓它。
restartPolicy: [Always | Never | OnFailure]
nodeSelector: object # 設置node的label,以key:value格式指定,pod將被調度到具備有這些label的node上
imagePullSecrets:
- name: string
hostNetwork: false # 是否使用主機網絡模式,默認值爲false。設置爲ture表示容器使用宿主機網絡,不再使用Docker網橋,該pod將無法再同一臺宿主機上啓動第2個副本
volumes: # 在該pod上定義的共享存儲卷列表
- name: string # 共享存儲卷的名稱,在一個pod中每個存儲卷定義一個名稱。容器定義部分的containers[].volumeMounts[].name將引用共享存儲卷的名稱
emptyDir: {} # 類型爲emptyDir的存儲卷,表示與pod同生命週期的一個臨時目錄,其值爲一個空對象
hostPath: # 類型爲hostPath表示掛載pod所在宿主機的目錄
path: string # pod所在主機的目錄。將被用於容器中的mount目錄containers[].volumeMounts[].mountPath
secret: # 類型爲secret的存儲卷,表示掛載集羣預定義的secret對象到容器內部
secretNarae: string
items:
- key: string
path: string
configMap: # 類型爲configMap的存儲卷,表示掛載集羣預定義的configMap對象到容器內部
name: string
items:
- key: string
path: string
2. Pod的基本用法
2.1 啓動一個容器組成的pod
創建pod:kubectl create -f php-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: php-nginx
namespace: pod-test
labels:
name: mysql
spec:
containers:
- name: php-nginx # 容器的名稱
image: docker.io/webdevops/php-nginx # 容器的鏡像名稱
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
protocol: TCP
檢查pod創建過程:kubectl describe pod -n pod-test php-nginx
查看pod運行狀態:kubectl get pod -n pod-test php-nginx
刪除pod:kubectl delete pod -n pod-test php-nginx
2.2 啓動由多個容器組成的pod
創建pod:kubectl create -f php-redis-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: php-redis
namespace: pod-test
labels:
name: php
spec:
containers:
- name: php-nginx # 容器的名稱
image: docker.io/webdevops/php-nginx # 容器的鏡像名稱
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
protocol: TCP
- name: redis
image: docker.io/redis
imagePullPolicy: IfNotPresent
ports:
- containerPort: 6379
protocol: TCP
檢查pod創建過程:kubectl describe pod -n pod-test php-redis
4. Pod hostPath Volume
這裏只介紹hostPath模式,一般用於日誌落盤操作。
hostpath模式會將pod所在宿主機的目錄映射到pod內部,如下yaml就將宿主機的/logs目錄映射到了php pod的/data/logs下
4.1 創建pod
創建pod:kubectl create -f volume-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: php
namespace: pod-test
labels:
name: php
spec:
containers:
- name: php-nginx # 容器的名稱
image: docker.io/webdevops/php-nginx # 容器的鏡像名稱
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
protocol: TCP
volumeMounts:
- name: php-logs
mountPath: /data/logs
volumes:
- name: php-logs # 共享存儲卷的名稱,在一個pod中每個存儲卷定義一個名稱。容器定義部分的containers[].volumeMounts[].name將引用共享存儲卷的名稱
hostPath:
path: /logs
查看創建詳情:kubectl describe pod -n pod-test php
4.2 驗證日誌落盤是否成功
在pod內掛載目錄寫入文件
根據kubectl describe pod -n pod-test php
查看到的信息可以得出,此pod在node2
的宿主機上
5. pod的配置管理(ConfigMap)
5.1 ConfigMap概述
ConfigMap以一個或多個key:value的形式保存在Kubernetes系統中供應用使用,既可以用於表示一個變量的值,也可以用於表示一個完整配置文件的內容
ConfigMap供容器使用的典型用法如下:
- 生成爲容器內的環境變量
- 設置容器啓動命令的啓動參數(需設置爲環境變量)
- 以Volume的形式掛載爲容器內部的文件或目錄
5.2 創建ConfigMap資源對象
5.2.1 通過YAML配置文件方式創建
【例1】:將幾個應用所需的變量定義爲ConfigMap的用法
創建ConfigMap:kubectl create -f test-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: test-configmap
namespace: pod-test
labels:
name: config
data:
appname: tce
appdir: /data/tce
查看ConfigMap的詳細信息:kubectl get configmap test-configmap -n pod-test -o yaml
kubectl describe configmap -n pod-test
【例2】:將兩個配置文件a.config
和b.config
定義爲ConfigMap的用法,設置key爲配置文件的別名,value則是配置文件的全部文本內容
創建ConfigMap:kubectl create -f file-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: file-configmap
namespace: pod-test
labels:
name: config
data:
a.config: |
a=1
b=2
b.config: |
c=1
d=2
查看ConfigMap的詳細信息:kubectl get configmap file-configmap -n pod-test -o yaml
5.2.2 通過kubectl命令方式創建
可以使用參數--from-file或--from-literal指定內容,並且可以在一行命令中指定多個參數
5.2.2.1 通過--from-file參數從文件中進行創建
通過命令行創建ConfigMap:kubectl create configmap cli-file-configmap --from-file=a.txt -n pod-test
查看創建的ConfigMap:kubectl get configmap cli-file-configmap -o yaml -n pod-test
5.2.2.2 通過--from-file參數從目錄中進行創建
該目錄下的每個配置文件的名都被設置爲key,文件的內容被設置爲value
準備好配置文件存放的文件夾
根據配置文件夾創建ConfigMap:kubectl create configmap cli-files-configmap --from-file=configfile
查看ConfigMap詳情:kubectl get configmap cli-files-configmap -o yaml
5.2.2.3 使用--from-literal參數創建k-v類型的ConfigMap內容
使用--from-literal
創建:kubectl create configmap cli-k-v-configmap --from-literal=data=nihao --from-literal=logfile=/data/logs
查看ConfigMap信息:kubectl get configmap cli-k-v-configmap -o yaml
5.3 在pod中使用ConfigMap
5.3.1 通過環境變量方式使用ConfigMap
這裏使用5.2.1中例1的ConfigMap
進行掛載
創建pod:kubectl create -f conf-php-pod.yaml
(1.6版本的k8s有更簡單掛載方法envFrom
,以後再說)
apiVersion: v1
kind: Pod
metadata:
name: conf-php
namespace: pod-test
labels:
name: configmap-test
spec:
containers:
- name: php-nginx # 容器的名稱
image: docker.io/webdevops/php-nginx # 容器的鏡像名稱
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
protocol: TCP
env:
- name: app_name # 自定義環境變量名稱
valueFrom:
configMapKeyRef:
name: test-configmap # 取自於哪一個ConfigMap
key: appname # ConfigMap內的key
- name: app_dir # 自定義環境變量名稱
valueFrom:
configMapKeyRef:
name: test-configmap # 取自於哪一個ConfigMap
key: appdir # ConfigMap內的key
查看pod創建過程:kubectl describe pod -n pod-test conf-php
檢測環境變量是否傳遞成功
5.3.2 通過volumeMount使用ConfigMap
這裏使用5.2.1中例2的ConfigMap
進行掛載
創建pod:kubectl create -f c-v-php-pod.yaml
查看pod創建信息:kubectl describe pod c-v-php -n pod-test
檢測是否掛載成功
5.4 使用ConfigMap的限制條件
- ConfigMap必須在pod之前創建
- ConfigMap受Namespace限制,只有處於相同Namespace中的pod纔可以應用它
- ConfigMap暫未實現配額管理
6. 在容器中獲取Pod信息
6.1 環境變量方式
6.1.1 將pod信息注入爲環境變量
【例】:將pod的ip、名稱和所在Namespace注入容器的環境變量中
apiVersion: v1
kind: Pod
metadata:
name: downward-api
namespace: pod-test
labels:
name: downward-api
spec:
containers:
- name: redis
image: docker.io/redis
imagePullPolicy: IfNotPresent
ports:
- containerPort: 6379
protocol: TCP
env:
- name: pod_name
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: pod_namespace
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: pod_ip
valueFrom:
fieldRef:
fieldPath: status.podIP
可以使用kubectl get pod downward-api -n pod-test -o yaml
去獲取fieldPath
的值,例如:status.hostIP
檢測pod信息是否導入容器內
6.1.2 將容器資源信息注入爲環境變量
apiVersion: v1
kind: Pod
metadata:
name: container-downward-api
namespace: pod-test
labels:
name: downward-api
spec:
containers:
- name: redis
image: docker.io/redis
imagePullPolicy: IfNotPresent
resources:
requests:
memory: "64Mi" # 容器內存請求值
cpu: "0.5" # 容器cpu請求值 0.5=500m
limits:
memory: "128Mi" # 容器內存限制值
cpu: "1" # 容器cpu限制值
env:
- name: container_requests_memory
valueFrom:
resourceFieldRef:
containerName: redis
resource: requests.memory
- name: container_requests_cpu
valueFrom:
resourceFieldRef:
containerName: redis
resource: requests.cpu
- name: container_limits_memory
valueFrom:
resourceFieldRef:
containerName: redis
resource: limits.cpu
- name: container_limits_cpu
valueFrom:
resourceFieldRef:
containerName: redis
resource: limits.cpu
6.2 Volume掛載方式
通過掛載的方式將metadata.labels
和metadata.annotations
的信息掛載爲容器內的一個文件
創建pod:kubectl create -f volume-downward-api.yaml
apiVersion: v1
kind: Pod
metadata:
name: v-downward-api
namespace: pod-test
labels:
zone: home
tag: more
annotations:
version: v6.6
spec:
containers:
- name: redis
image: docker.io/redis
imagePullPolicy: IfNotPresent
ports:
- containerPort: 6379
protocol: TCP
volumeMounts:
- name: podinfo
mountPath: /data
readOnly: false
volumes:
- name: podinfo
downwardAPI:
items:
- path: "labels"
fieldRef:
fieldPath: metadata.labels
- path: "annotations"
fieldRef:
fieldPath: metadata.annotations
查看pod創建詳細信息kubectl describe pod v-downward-api -n pod-test
驗證掛載是否成功