三、kubectl使用詳解
文章目錄
- 三、kubectl使用詳解
- 1、常用基礎命令
- 1.1 Kubectl命令格式
- 1.2 查詢一個資源
- 1.3 創建一個資源
- 1.4 修改一個資源
- 1.5 刪除一個資源
- 1.6 其他
- 2、K8s隔離機制Namespace(命名空間作用及使用)
- 2.1 什么是命名空間
- 2.2 命名空間主要作用
- 2.3 默認Namespace
- 2.4 Namespace基本使用
- 3、K8s最小單元Pod
- 3.1 什么是Pod
- 3.2 Pod架構
- 3.3 Pod設計思想
- 3.4 Pod基本使用
- 3.5 Pod常見狀態及故障排查
- 4、Pod入門與實戰
- 4.1 創建一個 Pod
- 4.2 一個 Pod 多個容器
- 4.3 更改 Pod 的啟動命令和參數
- 4.4 分配 CPU 和內存
- 4.5 Pod 配置環境變量及內置字段
- 4.6 Pod 鏡像拉取策略
- 4.7 Pod 重啟策略
- 4.8 Pod 的三種探針
- 4.9 探針的四種檢查方式
- 4.10 livenessProbe 和 readinessProbe
- 4.11 配置 StartupProbe
- 4.12 preStop 和 postStart
- 4.13 gRPC 探測(1.24 默認開啟)
- 4.14 Pod啟動過程
1、常用基礎命令
1.1 Kubectl命令格式
1.2 查詢一個資源
# 查詢deploy下的資源
[root@k8s-master01 ~]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
counter 1/1 1 1 5d4h
test-harbor 1/1 1 1 9h# 指定命名空間,查詢它下面的資源
[root@k8s-master01 ~]# kubectl get deploy -n kube-system
NAME READY UP-TO-DATE AVAILABLE AGE
calico-kube-controllers 1/1 1 1 5d4h
coredns 2/2 2 2 5d4h
metrics-server 1/1 1 1 5d4h# 查詢所有命名空間下的資源
[root@k8s-master01 ~]# kubectl get deploy -A# 指定一個名稱查詢
[root@k8s-master01 ~]# kubectl get deploy counter
NAME READY UP-TO-DATE AVAILABLE AGE
counter 1/1 1 1 5d4h# 將其以yaml的格式導出
[root@k8s-master01 ~]# kubectl get deploy counter -o yaml
...
# 查詢一個pod
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
counter-7dd9fb465f-8j2wq 1/1 Running 3 (9h ago) 5d4h
test-harbor-7946964f55-2c5fs 1/1 Running 0 9h# 查詢指定命名空間的pod
[root@k8s-master01 ~]# kubectl get pod -n kube-system# 查詢所有命名空間的pod
[root@k8s-master01 ~]# kubectl get pod -A
# 查看一個pod的詳情
[root@k8s-master01 ~]# kubectl describe po counter-7dd9fb465f-8j2wq
Name: counter-7dd9fb465f-8j2wq
Namespace: default
Priority: 0
Service Account: default
Node: k8s-node01/192.168.200.51
Start Time: Mon, 02 Jun 2025 21:24:08 +0800
...
# 查看一個pod的日志
# 注意一個pod下面有可能會存在多個容器的情況,只指定pod名稱默認查看第一個容器的日志,如果需要查看指定容器的日志,需要在后面加上`-c 容器名稱`[root@k8s-master01 ~]# kubectl logs -f counter-7dd9fb465f-8j2wq
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
...
1.3 創建一個資源
# 指定一個鏡像創建
[root@k8s-master01 ~]# kubectl create deployment nginx --image=crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:1.15[root@k8s-master01 ~]# kubectl get deploy nginx
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 2m35s
# 生成一個yaml文件
[root@k8s-master01 ~]# kubectl create deployment nginx --image=crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:1.15 --dry-run=client -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:app: nginxname: nginx
spec:replicas: 1selector:matchLabels:app: nginxstrategy: {}template:metadata:creationTimestamp: nulllabels:app: nginxspec:containers:- image: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:1.15name: nginxresources: {}
status: {}
# 修改它的配置
[root@k8s-master01 ~]# vim nginx.deploy.yaml
[root@k8s-master01 ~]# cat nginx.deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:app: nginxname: nginx
spec:replicas: 1selector:matchLabels:app: nginxstrategy: {}template:metadata:creationTimestamp: nulllabels:app: nginxspec:containers:- image: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:1.15name: nginxenv: #增加了一個標簽-name: testvalue: testresources: {}
status: {}
# 重新加載配置
[root@k8s-master01 ~]# kubectl replace -f nginx.deploy.yaml
deployment.apps/nginx replaced查看pod,已經更新過了
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
...
nginx-b759bb7db-7pmhd 1/1 Running 0 4s
...#檢查更新的部分
[root@k8s-master01 ~]# kubectl get pod nginx-b759bb7db-7pmhd -o yaml
...
spec:containers:- env:- name: testvalue: test
...
kubectl replace -f xxx.yaml # 只能替換一個已經存在的資源
kubectl apply -f xxx.yaml # 如果不存在就創建,存在就更新
1.4 修改一個資源
# 修改它的副本數
[root@k8s-master01 ~]# kubectl edit deploy nginx
...
spec:progressDeadlineSeconds: 600replicas: 2revisionHistoryLimit: 10
...[root@k8s-master01 ~]# kubectl get deploy nginx
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 2/2 2 2 29m[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
counter-7dd9fb465f-8j2wq 1/1 Running 3 (10h ago) 5d5h
nginx-b759bb7db-7pmhd 1/1 Running 0 10m
nginx-b759bb7db-wtnp6 1/1 Running 0 2m2s
test-harbor-7946964f55-2c5fs 1/1 Running 0 10h
1.5 刪除一個資源
[root@k8s-master01 ~]# kubectl delete deploy nginx
deployment.apps "nginx" deleted
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
counter-7dd9fb465f-8j2wq 1/1 Running 3 (10h ago) 5d5h
test-harbor-7946964f55-2c5fs 1/1 Running 0 10h# 也可以直接指定yaml
kubectl delete -f xxx.yaml
1.6 其他
# 將當前配置文件打印出來
[root@k8s-master01 ~]# kubectl config view
apiVersion: v1
clusters:
- cluster:certificate-authority-data: DATA+OMITTEDserver: https://192.168.200.50:6443name: kubernetes
contexts:
- context:cluster: kubernetesuser: kubernetes-adminname: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-adminuser:client-certificate-data: DATA+OMITTEDclient-key-data: DATA+OMITTED
[root@k8s-master01 ~]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
counter 1/1 1 1 5d5h
test-harbor 1/1 1 1 10h# 重啟一個pod
[root@k8s-master01 ~]# kubectl rollout restart deploy counter[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
counter-84ff9ff4cd-sxrcn 1/1 Running 0 11s
更多命令可以參考官網
2、K8s隔離機制Namespace(命名空間作用及使用)
2.1 什么是命名空間
- Namespace提供了一種將集群資源邏輯上隔離的方式,允許在同一個集群中劃分多個虛擬的、邏輯上獨立的集群環境,相當于集群的“虛擬化”。
- Namespace經常用于多個團隊和多個項目的場景,可以按照不同的環境劃分Namespace,或者按照不同的團隊及租戶劃分Namespace
2.2 命名空間主要作用
- 資源隔離:不同團隊或項目可以擁有自己獨立的Namespace,以防止資源相互干擾
- 權限控制:可以為不同的Namespace設置不同的訪問權限,實現不同的用戶具有不同的權限
- 環境拆分:使用Namespace可以模擬出多個虛擬的集群環境,如開發、測試和生產環境。每個環境可以有自己的資源和服務,相互之間保持隔離,有助于簡化部署和管理
- 資源配額和限制:劃分不同的Namespace可以更加有效的分配資源和限制資源的使用量
- 服務發現和負載均衡:在同一個Namespace中服務發現和負載均衡更加簡單和高效
- 簡化管理:拆分不同的Namespace,可以更加方便的對Namespace下的資源進行操作,比如刪除、備份或遷移等
2.3 默認Namespace
- default: 默認命名空間,在未指定命名空間時,即表示為default
- kube-node-lease:此空間保存與每個節點關聯的租約(Lease)對象
- kube-public:公開的命名空間可以被任何用戶訪問,包括未授權的用戶
- kube-system: Kubernetes系統組件所在的命名空間
2.4 Namespace基本使用
# 創建:kubectl create ns NAMESPACE_NAME# 通過Yaml創建:
apiVersion: v1
kind: Namespace
metadata:name: development# 刪除:kubectl delete ns NAMESPACE_NAME# 查看:kubectl get ns NAMESPACE_NAME --show-labels
Namespace名字限制:最多63個字符,只能包含字母、數字、和中橫線-,并且開頭和結尾只能是數字和字母
3、K8s最小單元Pod
3.1 什么是Pod
Pod是Kubernetes集群中運行和管理的最小部署單元,其內部封裝了一個或多個容器,這些容器共享存儲、網絡、PID、IPC等,并且容器之間可以使用localhost:port相互訪問,也可以使用volume等實現數據共享。
同時每個Pod還包含了一個Pause容器,Pause容器是Pod的父容器,它主要負責僵尸進程的回收管理,并且存儲共享、網絡共享等功能都是通過Pause容器實現的。
3.2 Pod架構
3.3 Pod設計思想
- 多容器協作
- 強依賴服務
- 簡化應用的生命周期管理
- 兼容多種CRI運行時
3.4 Pod基本使用
kubectl run nginx --image=crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/counter:v1 -n xxx
apiVersion: v1
kind: Pod
metadata:name: nginx
spec:containers:- name: nginximage: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/counter:v1ports:- containerPort: 80kubectl delete po nginx
kubectl get po -owide --show-labels
kubectl describe po
kubectl logs -f
3.5 Pod常見狀態及故障排查
狀態 | 說明 |
---|---|
Pending(掛起) | Pod已被Kubernetes系統接收,但仍有一個或多個容器未被創建,可以通過kubectl describe 查看處于Pending狀態的原因 |
Running(運行中) | Pod已經被綁定到一個節點上,并且所有的容器都已經被創建,而且至少有一個是運行狀態,或者是正在啟動或者重啟,可以通過kubectl logs 查看Pod的日志 |
Succeeded(成功) | 所有容器執行成功并終止,并且不會再次重啟,可以通過kubectl logs 查看Pod日志 |
Failed/Error(失敗) | 所有容器都已終止,并且至少有一個容器以失敗的方式終止,也就是說這個容器要么以非零狀態退出,要么被系統終止,可以通過logs 和describe 查看Pod日志和狀態 |
Unknown(未知) | 通常是由于通信問題造成的無法獲得Pod的狀態 |
ImagePullBackOff/ErrImagePull | 鏡像拉取失敗,一般是由于鏡像不存在、網絡不通或者需要登錄認證引起的,可以使用describe 命令查看具體原因 |
CrashLoopBackOff | 容器啟動失敗,可以通過logs 命令查看具體原因,一般為啟動命令不正確,健康檢查不通過等 |
OOMKilled | 容器內存溢出,一般是容器的內存Limit設置的過小,或者程序本身有內存溢出,可以通過logs 查看程序啟動日志 |
Terminating | Pod正在被刪除,可以通過describe 查看狀態 |
SysctlForbidden | Pod自定義了內核配置,但kubelet沒有添加內核配置或配置的內核參數不支持,可以通過describe 查看具體原因 |
Completed | 容器內部主進程退出,一般計劃任務執行結束會顯示該狀態,此時可以通過logs 查看容器日志 |
ContainerCreating | Pod正在創建,一般為正在下載鏡像,或者有配置不當的地方,可以通過describe 查看具體原因 |
4、Pod入門與實戰
# 可以通過 explain 命令查看yaml文件格式該怎么寫,該使用什么格式,里面都包含什么
# 如果想查詢多個,格式:kubectl explain deploy.kind
[root@k8s-master01 ~]# kubectl explain deploy
GROUP: apps
KIND: Deployment
VERSION: v1DESCRIPTION:Deployment enables declarative updates for Pods and ReplicaSets.FIELDS:apiVersion <string>APIVersion defines the versioned schema of this representation of an object.Servers should convert recognized schemas to the latest internal value, andmay reject unrecognized values. More info:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resourceskind <string>Kind is a string value representing the REST resource this objectrepresents. Servers may infer this from the endpoint the client submitsrequests to. Cannot be updated. In CamelCase. More info:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kindsmetadata <ObjectMeta>Standard object's metadata. More info:https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataspec <DeploymentSpec>Specification of the desired behavior of the Deployment.status <DeploymentStatus>Most recently observed status of the Deployment.
4.1 創建一個 Pod
# 定義一個 Pod
[root@k8s-master01 ~]# vim nginx.yaml
[root@k8s-master01 ~]# cat nginx.yaml
apiVersion: v1 # 必選,API的版本號
kind: Pod # 必選,類型 Pod
metadata: # 必選,元數據name: nginx # 必選,符合 RFC 1035規范的 Pod名稱
spec: # 必選,用于定義 Pod的詳細信息containers: # 必選,容器列表- image: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:1.15 # 必選,容器所用的鏡像的地址name: nginx # 必選,符合 RFC 1035規范的容器名稱ports: # 可選,容器需要暴露的端口號列表- containerPort: 80# 創建 Pod
[root@k8s-master01 ~]# kubectl create -f nginx.yaml# 查看 Pod 狀態
[root@k8s-master01 ~]# kubectl get po nginx
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 93s
4.2 一個 Pod 多個容器
[root@k8s-master01 ~]# vim nginx.yaml
[root@k8s-master01 ~]# cat nginx.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx
spec:containers:- image: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:1.15name: nginxports: - containerPort: 80- image: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/redis:7.2.5name: redisports:- containerPort: 6379
4.3 更改 Pod 的啟動命令和參數
[root@k8s-master01 ~]# vim nginx.yaml
[root@k8s-master01 ~]# cat nginx.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx
spec:containers:- image: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:1.15name: nginxcommand: # 可選,容器啟動執行的命令- sleep- "30"ports: - containerPort: 80# 創建 Pod
[root@k8s-master01 ~]# kubectl create -f nginx.yaml# 查看 Pod 狀態
[root@k8s-master01 ~]# kubectl get po nginx
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 4s# 查看pod節點分配
[root@k8s-master01 ~]# kubectl get po nginx -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 17s 192.168.85.202 k8s-node01 <none> <none># 到node01節點驗證命令是否去執行
[root@k8s-node01 ~]# ps -ef|grep sleep|grep -v grep
root 35463 35153 0 18:40 ? 00:00:00 sleep 30
4.4 分配 CPU 和內存
[root@k8s-master01 ~]# vim nginx.yaml
[root@k8s-master01 ~]# cat nginx.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx
spec:containers:- image: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:1.15name: nginxports: - containerPort: 80resources:requests: # 給pod分配的最小資源(requests這里分配了多少資源直接從系統劃走)memory: "100Mi" # 單位 E、P、T、G、M、K、Ei、Pi、Ti、Gi、Mi、Kicpu: 100m # 1核等于 1000mlimits: # 給pod分配的最大資源限制memory: "200Mi"cpu: 200m# 查看部署到什么節點
[root@k8s-master01 ~]# kubectl get po nginx -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 19s 192.168.85.208 k8s-node01 <none> <none># 可分配cpu、內存、pod的容量
[root@k8s-master01 ~]# kubectl describe node k8s-node01 | grep Capacity -A6
Capacity:cpu: 2ephemeral-storage: 50108Mihugepages-1Gi: 0hugepages-2Mi: 0memory: 3710044Kipods: 110# 實際可分配cpu、內存、pod的數量
[root@k8s-master01 ~]# kubectl describe node k8s-node01 | grep Allocatable -A6
Allocatable:cpu: 2ephemeral-storage: 47287841509hugepages-1Gi: 0hugepages-2Mi: 0memory: 3607644Kipods: 110
4.5 Pod 配置環境變量及內置字段
[root@k8s-master01 ~]# vim nginx.yaml
[root@k8s-master01 ~]# cat nginx.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx
spec:containers:- image: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:1.15name: nginxports: - containerPort: 80env: # 兩種環境變量- name: ENVvalue: test- name: POD_IPvalueFrom:fieldRef:fieldPath: status.podIP[root@k8s-master01 ~]# kubectl create -f nginx.yaml # 進入到容器內查看變量是否生效
[root@k8s-master01 ~]# kubectl exec -it nginx -- bash
root@nginx:/# env|egrep "ENV|POD_IP"
ENV=test
POD_IP=192.168.85.210# 可選的內置字段:
metadata.name
metadata.namespace
metadata.uid
metadata.labels[xxx]
metadata.annotations[xxx]
spec.nodeName
spec.serviceAccountName
status.hostIP
status.hostIPs
status.podIP
status.podIPs
4.6 Pod 鏡像拉取策略
通過 spec.containers[].imagePullPolicy
參數可以指定鏡像的拉取策略,目前支持的策略如下:
操作方式 | 說明 |
---|---|
Always | 總是拉取,當鏡像 tag 為 latest 時,且 imagePullPolicy 未配置,默認為 Always |
Never | 不管是否存在都不會拉取 |
IfNotPresent | 鏡像不存在時拉取鏡像,如果tag 為非latest,且imagePullPolicy未配置,默認為IfNotPresent |
# Always
[root@k8s-master01 ~]# vim nginx.yaml
[root@k8s-master01 ~]# cat nginx.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx
spec:containers:- image: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:1.15name: nginximagePullPolicy: Always # 可選,鏡像拉取策略ports: - containerPort: 80# 創建 Pod
[root@k8s-master01 ~]# kubectl create -f nginx.yaml # 查看一個pod的詳情(重新拉取了鏡像)
[root@k8s-master01 ~]# kubectl describe po nginx
....
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 12s default-scheduler Successfully assigned default/nginx to k8s-node01Normal Pulling 0s kubelet Pulling image "crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:1.15"Normal Pulled 0s kubelet Successfully pulled image "crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:1.15" in 2.746s (2.746s including waiting). Image size: 44794060 bytes.Normal Created <invalid> kubelet Created container: nginxNormal Started <invalid> kubelet Started container nginx
# Never
[root@k8s-master01 ~]# vim nginx.yaml
[root@k8s-master01 ~]# cat nginx.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx
spec:containers:- image: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:1.15name: nginximagePullPolicy: Never # 可選,鏡像拉取策略ports: - containerPort: 80# 查看一個pod的詳情(沒有拉取鏡像的動作)
[root@k8s-master01 ~]# kubectl describe po nginx
....
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 44s default-scheduler Successfully assigned default/nginx to k8s-node01Normal Pulled 34s kubelet Container image "crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:1.15" already present on machineNormal Created 34s kubelet Created container: nginxNormal Started 33s kubelet Started container nginx
# IfNotPresent
[root@k8s-master01 ~]# vim nginx.yaml
[root@k8s-master01 ~]# cat nginx.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx
spec:containers:- image: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:stablename: nginximagePullPolicy: IfNotPresent # 可選,鏡像拉取策略ports: - containerPort: 80# 查看一個pod的詳情(鏡像不存在時拉取了鏡像)
[root@k8s-master01 ~]# kubectl describe po nginx
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 6s default-scheduler Successfully assigned default/nginx to k8s-node01Normal Pulling <invalid> kubelet Pulling image "crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:stable"
4.7 Pod 重啟策略
可以使用 spec.restartPolicy 指定容器的重啟策略
操作方式 | 說明 |
---|---|
Always | 默認策略。容器失效時,自動重啟該容器 |
OnFailure | 容器以不為 0 的狀態碼終止,自動重啟該容器 |
Never | 無論何種狀態,都不會重啟 |
[root@k8s-master01 ~]# vim nginx.yaml
[root@k8s-master01 ~]# cat nginx.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx
spec:containers:- image: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:1.15name: nginxcommand:- sleepp # 故意把命令寫錯- "30"ports: - containerPort: 80restartPolicy: Always # 默認策略。容器失效時,自動重啟該容器# pod一直在重啟
[root@k8s-master01 ~]# kubectl get po nginx
NAME READY STATUS RESTARTS AGE
nginx 0/1 CrashLoopBackOff 1 (3s ago) 16s
[root@k8s-master01 ~]#
[root@k8s-master01 ~]# kubectl get po nginx
NAME READY STATUS RESTARTS AGE
nginx 0/1 RunContainerError 2 (2s ago) 32s# 查看啟動日志
[root@k8s-master01 ~]# kubectl describe po nginx
....
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 49s default-scheduler Successfully assigned default/nginx to k8s-node01Normal Pulled <invalid> (x4 over 38s) kubelet Container image "crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:1.15" already present on machineNormal Created <invalid> (x4 over 38s) kubelet Created container: nginxWarning Failed <invalid> (x4 over 38s) kubelet Error: failed to create containerd task: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: exec: "sleepp": executable file not found in $PATH: unknown # 提示沒有這個命令Warning BackOff <invalid> (x5 over 36s) kubelet Back-off restarting failed container nginx in pod nginx_default(5798d3d1-a91a-48ec-bd5b-d2a2969ef6b0)
[root@k8s-master01 ~]# vim nginx.yaml
[root@k8s-master01 ~]# cat nginx.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx
spec:containers:- image: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:1.15name: nginxcommand:- sleepp- "30"ports: - containerPort: 80restartPolicy: Never# 查看狀態,直接就是startError
[root@k8s-master01 ~]# kubectl get po nginx
NAME READY STATUS RESTARTS AGE
nginx 0/1 StartError 0 5s# 查看啟動日志
[root@k8s-master01 ~]# kubectl describe po nginx
....
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 60s default-scheduler Successfully assigned default/nginx to k8s-node01Normal Pulled 48s kubelet Container image "crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:1.15" already present on machineNormal Created 48s kubelet Created container: nginxWarning Failed 48s kubelet Error: failed to create containerd task: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: exec: "sleepp": executable file not found in $PATH: unknown
4.8 Pod 的三種探針
三種探針都可以配置上,只有startupProbe
生效了之后,livenessProbe
與readinessProbe
才會生效
種類 | 說明 |
---|---|
startupProbe | Kubernetes1.16新加的探測方式,用于判斷容器內的應用程序是否已經啟動。如果配置了startupProbe,就會先禁用其他探測,直到它成功為止。如果探測失敗, Kubelet會殺死容器,之后根據重啟策略進行處理,如果探測成功,或沒有配置 startupProbe,則狀態為成功,之后就不再探測。 |
livenessProbe | 用于探測容器是否在運行,如果探測失敗,kubelet會“殺死”容器并根據重啟策略進行相應的處理。如果未指定該探針,將默認為 Success |
readinessProbe | 一般用于探測容器內的程序是否健康,即判斷容器是否為就緒(Ready)狀態。如果是,則可以處理請求,反之Endpoints Controller 將從所有的 Service 的 Endpoints中刪除此容器所在 Pod 的 IP 地址。如果未指定,將默認為 Success |
4.9 探針的四種檢查方式
四種檢查方式只能同時配置一個
實現方式 | 說明 |
---|---|
ExecAction | 在容器內執行一個指定的命令,如果命令返回值為 0,則認為容器健康 |
TCPSocketAction | 通過 TCP 連接檢查容器指定的端口,如果端口開放,則認為容器健康 |
HTTPGetAction | 對指定的 URL 進行 Get 請求,如果狀態碼在 200~400 之間,則認為容器健康 |
GRPC | GRPC 協議的健康檢查,如果響應的狀態是 “SERVING”,則認為容器健康 |
4.10 livenessProbe 和 readinessProbe
# readinessProbe 與 livenessProbe 是并行運行的
[root@k8s-master01 ~]# vim slow.yaml
[root@k8s-master01 ~]# cat slow.yaml
apiVersion: v1
kind: Pod
metadata:name: slow
spec:containers:- image: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/slow:latestname: slowports: - containerPort: 8080readinessProbe: # 可選,健康檢查。注意三種檢查方式同時只能使用一種httpGet: # 接口檢測方式path: /ping # 檢查路徑(返回碼必須在200~400之間)port: 8080scheme: HTTP # HTTP or HTTPSinitialDelaySeconds: 10 # 初始化時間(等待多長時間去執行readinessProbe這個檢查)timeoutSeconds: 2 # 超時時間(2s沒有返回狀態碼,就認為已經故障了)periodSeconds: 5 # 檢測間隔successThreshold: 1 # 檢查成功 1 次表示就緒failureThreshold: 2 # 檢測失敗 2 次表示未就緒livenessProbe: # 可選,健康檢查tcpSocket: # 端口檢測方式port: 8080initialDelaySeconds: 60 # 初始化時間(不太推薦這種)timeoutSeconds: 2 # 超時時間periodSeconds: 5 # 檢測間隔successThreshold: 1 # 檢查成功 1 次表示就緒failureThreshold: 2 # 檢測失敗 2 次表示未就緒ports:- containerPort: 8080restartPolicy: Never
解析:
1、livenessProbe:初始化時間是60s,所以會等待60s才會去檢測容器內的程序是否正常啟動。如果2s之內沒有返回200~400之間的狀態嘛,就默認程序啟動失敗(或者未成功啟動)會間隔5s之后再去檢測一遍。如果檢測2遍都沒有成功啟動程序,就說明啟動失了;如果有成功檢測成功一次,就表明程序啟動成功。
2、但是 readinessProbe 與 livenessProbe 是并行運行的
3、readinessProbe:初始化時間是10s,默認會等待10s去檢測接口是否正常。如果在預期的時間內檢測失敗會導致Pod從Service的Endpoints中移除。
4.11 配置 StartupProbe
[root@k8s-master01 ~]# vim slow.yaml
[root@k8s-master01 ~]# cat slow.yaml
apiVersion: v1
kind: Pod
metadata:name: slow
spec:containers:- image: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/slow:latestname: slowports: - containerPort: 8080startupProbe:tcpSocket: # 接口檢測方式port: 8080 # 探測端口initialDelaySeconds: 10 # 初始化時間timeoutSeconds: 2 # 超時時間periodSeconds: 5 # 檢測間隔successThreshold: 1 # 檢查成功 1 次表示就緒failureThreshold: 30 # 檢測失敗 30 次表示未就緒readinessProbe:httpGet:path: /pingport: 8080scheme: HTTPinitialDelaySeconds: 10timeoutSeconds: 2periodSeconds: 5successThreshold: 1failureThreshold: 2livenessProbe:exec:command: ["mkdir", "-p", "/tmp/slow"]initialDelaySeconds: 10timeoutSeconds: 2periodSeconds: 5successThreshold: 1failureThreshold: 2ports:- containerPort: 8080# 查看啟動狀態
[root@k8s-master01 ~]# kubectl get po slow
NAME READY STATUS RESTARTS AGE
slow 1/1 Running 0 78s# 查看日志
[root@k8s-master01 ~]# kubectl logs -f slow
Starting...
Start initializing basic data...
Startup Success: 8080
4.12 preStop 和 postStart
# preStop
[root@k8s-master01 ~]# vim nginx.yaml
[root@k8s-master01 ~]# cat nginx.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx
spec:# terminationGracePeriodSeconds: 30 # 寬限期時間containers:- image: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:1.15name: nginxlifecycle:postStart:exec:command: ["mkdir", "-p", "/tmp/test"] # 創建一個目錄ports:- containerPort: 80# 檢查是否成功創建目錄
[root@k8s-master01 ~]# kubectl exec -it nginx -- ls /tmp
test
[root@k8s-master01 ~]# vim nginx.yaml
[root@k8s-master01 ~]# cat nginx.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx
spec:# terminationGracePeriodSeconds: 30 # 寬限期時間containers:- image: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:1.15name: nginxlifecycle:postStart: # 命令并不是容器啟動之前完成的(可以理解是同時進行的)exec:command: ["mkdir", "-p", "/tmp/test"]preStop:exec:command: ["sleep", "10"] # 退出等待10sports:- containerPort: 80# 刪除pod測試
[root@k8s-master01 ~]# time kubectl delete po nginx
pod "nginx" deletedreal 0m11.366s
user 0m0.045s
sys 0m0.037s
4.13 gRPC 探測(1.24 默認開啟)
[root@k8s-master01 ~]# vim etcd.yaml
[root@k8s-master01 ~]# cat etcd.yaml
apiVersion: v1
kind: Pod
metadata:name: etcd
spec:containers:- image: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/etcd:3.5.1-0name: etcdcommand: ["/usr/local/bin/etcd", "--data-dir", "/var/lib/etcd", "--listen-client-urls", "http://0.0.0.0:2379", "--advertise-client-urls","http://127.0.0.1:2379", "--log-level", "debug"]ports: - containerPort: 2379name: grpc-2379readinessProbe:grpc:port: 2379initialDelaySeconds: 10timeoutSeconds: 2periodSeconds: 5successThreshold: 1failureThreshold: 2livenessProbe:tcpSocket:port: 2379initialDelaySeconds: 10timeoutSeconds: 2periodSeconds: 5successThreshold: 1failureThreshold: 2ports:- containerPort: 2379# 啟動成功
[root@k8s-master01 ~]# kubectl get po etcd
NAME READY STATUS RESTARTS AGE
etcd 1/1 Running 0 2m20s
4.14 Pod啟動過程
此博客來源于:https://edu.51cto.com/lecturer/11062970.html