一、什么是Pod
Pod是Kubernetes中最小的單元,它由一組、一個或多個容器組成,每個Pod還包含了一個Pause容器,Pause容器是Pod的父容器,主要負責僵屍進程的回收管理,通過Pause容器可以使同一個Pod里面的多個容器共享存儲、網絡、PID、IPC等。

二、如何定義一個Pod
2.1、一份比較完整的yaml文件介紹
apiVersion: v1 # 必選,API的版本號
kind: Pod # 必選,類型Pod
metadata: # 必選,元數據
name: nginx # 必選,符合RFC 1035規范的Pod名稱
namespace: default # 可選,Pod所在的命名空間,不指定默認為default,可以使用-n 指定namespace
labels: # 可選,標簽選擇器,一般用於過濾和區分Pod
app: nginx
role: frontend # 可以寫多個
annotations: # 可選,注釋列表,可以寫多個
app: nginx
spec: # 必選,用於定義容器的詳細信息
initContainers: # 初始化容器,在容器啟動之前執行的一些初始化操作
- command:
- sh
- -c
- echo "I am InitContainer for init some configuration"
image: busybox
imagePullPolicy: IfNotPresent
name: init-container
containers: # 必選,容器列表
- name: nginx # 必選,符合RFC 1035規范的容器名稱
image: nginx:latest # 必選,容器所用的鏡像的地址
imagePullPolicy: Always # 可選,鏡像拉取策略
command: # 可選,容器啟動執行的命令
- nginx
- -g
- "daemon off;"
workingDir: /usr/share/nginx/html # 可選,容器的工作目錄
volumeMounts: # 可選,存儲卷配置,可以配置多個
- name: webroot # 存儲卷名稱
mountPath: /usr/share/nginx/html # 掛載目錄
readOnly: true # 只讀
ports: # 可選,容器需要暴露的端口號列表
- name: http # 端口名稱
containerPort: 80 # 端口號
protocol: TCP # 端口協議,默認TCP
env: # 可選,環境變量配置列表
- name: TZ # 變量名
value: Asia/Shanghai # 變量的值
- name: LANG
value: en_US.utf8
resources: # 可選,資源限制和資源請求限制
limits: # 最大限制設置
cpu: 1000m
memory: 1024Mi
requests: # 啟動所需的資源
cpu: 100m
memory: 512Mi
# startupProbe: # 可選,檢測容器內進程是否完成啟動。注意三種檢查方式同時只能使用一種。
# httpGet: # httpGet檢測方式,生產環境建議使用httpGet實現接口級健康檢查,健康檢查由應用程序提供。
# path: /api/successStart # 檢查路徑
# port: 80
readinessProbe: # 可選,健康檢查。注意三種檢查方式同時只能使用一種。
httpGet: # httpGet檢測方式,生產環境建議使用httpGet實現接口級健康檢查,健康檢查由應用程序提供。
path: / # 檢查路徑
port: 80 # 監控端口
livenessProbe: # 可選,健康檢查
#exec: # 執行容器命令檢測方式
#command:
#- cat
#- /health
#httpGet: # httpGet檢測方式
# path: /_health # 檢查路徑
# port: 8080
# httpHeaders: # 檢查的請求頭
# - name: end-user
# value: Jason
tcpSocket: # 端口檢測方式
port: 80
initialDelaySeconds: 60 # 初始化時間
timeoutSeconds: 2 # 超時時間
periodSeconds: 5 # 檢測間隔
successThreshold: 1 # 檢查成功為2次表示就緒
failureThreshold: 2 # 檢測失敗1次表示未就緒
lifecycle:
postStart: # 容器創建完成后執行的指令, 可以是exec httpGet TCPSocket
exec:
command:
- sh
- -c
- 'mkdir /data/ '
preStop:
httpGet:
path: /
port: 80
# exec:
# command:
# - sh
# - -c
# - sleep 9
restartPolicy: Always # 可選,默認為Always
#nodeSelector: # 可選,指定Node節點
# region: subnet7
imagePullSecrets: # 可選,拉取鏡像使用的secret,可以配置多個
- name: default-dockercfg-86258
hostNetwork: false # 可選,是否為主機模式,如是,會占用主機端口
volumes: # 共享存儲卷列表
- name: webroot # 名稱,與上述對應
emptyDir: {} # 掛載目錄
#hostPath: # 掛載本機目錄
# path: /etc/hosts
2.2、創建一個容器(maser01上)
[root@k8s-master01 ~]# cat > pod.yaml << EOF
apiVersion: v1 # 必選,API的版本號
kind: Pod # 必選,類型Pod
metadata: # 必選,元數據
name: nginx # 必選,符合RFC 1035規范的Pod名稱
# namespace: default # 可選,Pod所在的命名空間,不指定默認為default,可以使用-n 指定namespace
labels: # 可選,標簽選擇器,一般用於過濾和區分Pod
app: nginx
role: frontend # 可以寫多個
annotations: # 可選,注釋列表,可以寫多個
app: nginx
spec: # 必選,用於定義容器的詳細信息
containers: # 必選,容器列表
- name: nginx # 必選,符合RFC 1035規范的容器名稱
image: nginx:1.15.2 # 必選,容器所用的鏡像的地址
imagePullPolicy: IfNotPresent # 可選,鏡像拉取策略, IfNotPresent: 如果宿主機有這個鏡像,那就不需要拉取了. Always: 總是拉取, Never: 不管是否存儲都不拉去
command: # 可選,容器啟動執行的命令 ENTRYPOINT, arg --> cmd
- nginx
- -g
- "daemon off;"
workingDir: /usr/share/nginx/html # 可選,容器的工作目錄
ports: # 可選,容器需要暴露的端口號列表
- name: http # 端口名稱
containerPort: 80 # 端口號
protocol: TCP # 端口協議,默認TCP
env: # 可選,環境變量配置列表
- name: TZ # 變量名
value: Asia/Shanghai # 變量的值
- name: LANG
value: en_US.utf8
restartPolicy: Always # 可選,默認為Always,容器故障或者沒有啟動成功,那就自動該容器,Onfailure: 容器以不為0的狀態終止,自動重啟該容器, Never:
EOF
# 創建一個pod
[root@k8s-master01 ~]# kubectl create -f pod.yaml
pod/nginx created
# 查看剛剛創建的Pod
[root@k8s-master01 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 4 17h
nginx 1/1 Running 0 5m24s
[root@k8s-master01 ~]# kubectl get po --show-labels
NAME READY STATUS RESTARTS AGE LABELS
busybox 1/1 Running 4 16h <none>
nginx 0/1 Running 0 90s app=nginx,role=frontend
# 刪除一個po
[root@k8s-master01 ~]# kubectl delete po nginx
pod "nginx" deleted
三、Pod探針的檢測方式
ExecAction:在容器內執行一個命令,如果返回值為0,則認為容器健康
TCPSocketAction:通過TCP連接檢查容器內的端口是否是通的,如果是通的就認為容器健康
HTTPGetAction:通過應用程序暴露的API地址來檢查程序是否是正常的,如果狀態碼為200~400之間,則認為容器健康
四、探針檢查參數配置
initialDelaySeconds: 60 # 初始化時間
timeoutSeconds: 2 # 超時時間
periodSeconds: 5 # 檢測間隔
successThreshold: 1 # 檢查成功為1次表示就緒
failureThreshold: 2 # 檢測失敗2次表示未就緒
五、Pod退出流程
Prestop:先去請求eureka接口,把自己的IP地址和端口號,進行下線,eureka從注冊表中刪除該應用的IP地址。然后容器進行sleep 90;kill `pgrep java`
# 這個時間不一定是90s
