三、kubectl使用詳解

三、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(失敗)所有容器都已終止,并且至少有一個容器以失敗的方式終止,也就是說這個容器要么以非零狀態退出,要么被系統終止,可以通過logsdescribe查看Pod日志和狀態
Unknown(未知)通常是由于通信問題造成的無法獲得Pod的狀態
ImagePullBackOff/ErrImagePull鏡像拉取失敗,一般是由于鏡像不存在、網絡不通或者需要登錄認證引起的,可以使用describe命令查看具體原因
CrashLoopBackOff容器啟動失敗,可以通過logs命令查看具體原因,一般為啟動命令不正確,健康檢查不通過等
OOMKilled容器內存溢出,一般是容器的內存Limit設置的過小,或者程序本身有內存溢出,可以通過logs查看程序啟動日志
TerminatingPod正在被刪除,可以通過describe查看狀態
SysctlForbiddenPod自定義了內核配置,但kubelet沒有添加內核配置或配置的內核參數不支持,可以通過describe查看具體原因
Completed容器內部主進程退出,一般計劃任務執行結束會顯示該狀態,此時可以通過logs查看容器日志
ContainerCreatingPod正在創建,一般為正在下載鏡像,或者有配置不當的地方,可以通過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生效了之后,livenessProbereadinessProbe才會生效

種類說明
startupProbeKubernetes1.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 之間,則認為容器健康
GRPCGRPC 協議的健康檢查,如果響應的狀態是 “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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/910531.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/910531.shtml
英文地址,請注明出處:http://en.pswp.cn/news/910531.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JVM內存模型詳解

JVM內存模型詳解 Java虛擬機(JVM)內存模型是理解Java程序運行機制的核心&#xff0c;它定義了程序運行時數據的組織方式和訪問規則。與Java內存模型(JMM)關注并發不同&#xff0c;JVM內存模型主要描述運行時數據區的結構和功能。 一、JVM內存模型概述 JVM內存模型將運行時數…

《對話式 AI 白皮書》共創者招募

在 AI Agent 技術不斷演變的當下&#xff0c;共創一本不斷演變的對話式 AI 白皮書&#xff0c;共同探索人機對話的新紀元。無論你是開發者、技術專家、生態伙伴還是創業者&#xff0c;都期待你的加入。 項目地址&#xff1a;https://github.com/RTE-Dev/book_era_convoai/ 在…

Flux功能介紹,完整使用示例,與Mono對比

以下是關于Reactor框架中Flux與Mono的功能介紹、使用示例及對比分析&#xff1a; Flux功能介紹 核心定義 Flux是Reactor庫中的核心接口&#xff0c;表示一個異步的、包含零到多個元素的序列&#xff08;類似流式數據處理&#xff09;[3][4][7]。它可以處理無限長度的數據流&am…

Git使用基本指南

一、Git 基礎配置 首先需要配置用戶信息&#xff0c;讓 Git 知道你是誰&#xff1a; git config --global user.name "你的名字" git config --global user.email "你的郵箱example.com" 如果需要查看配置信息&#xff0c;可以使用&#xff1a; git co…

【入門】【例17.3】 內功逼毒

| 時間限制&#xff1a;C/C 1000MS&#xff0c;其他語言 2000MS 內存限制&#xff1a;C/C 64MB&#xff0c;其他語言 128MB 難度&#xff1a;中等 分數&#xff1a;100 OI排行榜得分&#xff1a;12(0.1分數2難度) 出題人&#xff1a;root | 描述 黃蓉中了毒&#xff0c;在 t 時…

蘋果芯片macOS安裝版Homebrew(親測)

在Linux服務器上安裝一個軟件常用yum&#xff0c;apt、dnf命令&#xff0c;同樣macOS可以使用brew命令來安裝軟件。 brew會自動幫你下載、解壓、安裝和配置&#xff0c;更重要的是&#xff1a;它還會自動處理好軟件之間的依賴關系&#xff0c;它將所有軟件都安裝在獨立的統一目…

uniapp+vue3做小程序,獲取容器高度

小程序獲能用createSelectorQuery&#xff0c;如果是子組件&#xff0c;后面可以額外加一個參數in來指定獲取dom的范圍。小程序里面可以直接.in(this)&#xff0c;但是vue3沒有this了&#xff0c;那就只能通過getCurrentInstance去獲取當前實例代替this &#xff0c;注意這里需…

【網工】華為配置專題進階篇①

目錄 ■浮動路由和BFD配置 ▲浮動路由 基本配置示例 ▲BFD ▲驗證命令 ▲測試連通性 ■路由綜合實驗RIP OSPF BGP ■浮動路由和BFD配置 ▲浮動路由 浮動路由&#xff1a;設置preference 浮動路由是一種備份路由機制&#xff0c;當主路由失效時&#xff0c;浮動路由會…

DeepLegal AI:智能法律文檔審查與合規助手+MVP

1. 商業價值與市場機會 DeepLegal AI旨在革新法律行業中耗時且資源密集型的文檔審查和合規流程。該應用將利用DeepSeek先進的語言模型能力&#xff0c;為律師事務所、企業法務部門和合規團隊提供一個高效、準確且經濟的解決方案。 市場機會&#xff1a; 法律科技市場正經歷爆…

使用 Rust 編寫簡單計算器

在編程語言的世界中&#xff0c;Rust 以其安全性和高性能而聞名。今天&#xff0c;我們將通過一個簡單的項目來探索 Rust 的魅力 —— 編寫一個簡單的命令行計算器。這個計算器將支持基本的算術運算&#xff08;加、減、乘、除&#xff09;&#xff0c;并且可以通過用戶輸入進行…

清華大學:《AI賦能教育 :高考志愿填報工具使用指南》下載

志愿填報的認知革命已經到來 “分數出來了&#xff0c;但不知道能上什么學校……” “喜歡這個專業&#xff0c;但不知道就業前景怎么樣&#xff1f;” “到底是選熱門專業還是選興趣愛好&#xff1f;” 這些讓百萬家庭徹夜難眠的問題&#xff0c;你是否正在經歷&#xff1f; …

【科技公司的管理】

如何打造高效、人性化的目標驅動型公司&#xff1f;——OKR管理法績效薪酬體系全指南 你希望公司目標清晰、員工高效、多勞多得&#xff0c;同時避免馬斯克式的“冷血管理”&#xff0c;兼顧員工生活需求。以下是系統性解決方案&#xff0c;涵蓋目標設定&#xff08;OKR&#x…

小白成長之路--nginx基礎配置(一)

文章目錄 一、概述1.1 Nginx 特點1.2 Nginx 作用1.3Nginx工作原理 二、Nginx服務搭建2.1安裝2.2 目錄結構2.3 配置文件作用2.4 nginx,conf配置文件詳解2.5 核心命令2.6 Nginx信號三.Nginx3.1啟動 總結 一、概述 Nginx 是開源、高性能、高可靠的 Web服務器 和反向代理服務器&am…

從最基礎的float布局開始學前端

前端學習其實不難&#xff0c;我們先從float布局講起&#xff0c;寫一個最簡單的導航欄&#xff1a;Logo在左&#xff0c;導航鏈接在右。下面是示例代碼&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"…

12. TypeScript 高級類型

TypeScript 中的高級類型包括映射類型、條件類型、字面量類型和遞歸類型等強大結構。這些特性使開發者能夠表達類型之間更復雜的關系&#xff0c;從而處理邊緣情況&#xff0c;并定義更動態、更靈活的類型系統。 一、映射類型 TypeScript 映射類型&#xff08;Mapped Types&a…

韓國證券交易所(KRX)全生態接入系統技術白皮書

核心價值&#xff1a;為全球最活躍的衍生品市場&#xff08;日均交易量480億美元&#xff09;提供 5μs延遲引擎全合規認證&#xff0c;助力中資機構搶占韓國78%衍生品交易份額 一、KRX市場機遇與準入壁壘 1.1 核心數據錨定&#xff08;2025Q2&#xff09; 指標數值全球競爭力…

【Clickhouse系列】增刪改查:對比mysql

目錄 1. 寫入操作 (INSERT) 2. 刪除操作 (DELETE) 3. 更新操作 (UPDATE) 4. 查詢操作 (SELECT) 5. 總結對比表&#xff1a; 6. 參考鏈接 核心哲學差異&#xff1a; MySQL&#xff1a; 面向在線事務處理。核心目標是保證數據的強一致性、原子性和低延遲的單行操作&#x…

低壓電工作業中,如何正確選用熔斷器的額定電流?

在低壓電工作業中&#xff0c;正確選用熔斷器額定電流需綜合考慮負載類型、額定電流等因素&#xff0c;具體方法如下&#xff1a; 照明電路&#xff1a;對于白熾燈負載&#xff0c;熔體額定電流可按被保護電路上所有白熾燈工作電流之和的 1.1 倍選取。若是日光燈和高壓水銀熒…

MySQL:索引優化實戰技巧

目錄 一、前言 二、基礎知識回顧 三、索引設計優化 1.遵循最左匹配原則&#xff0c;合理設計聯合索引順序 2.利用覆蓋索引避免回表查詢 3.針對字符串列使用前綴索引 4.合理使用復合索引替代多個單列索引 5.使用前綴索引優化模糊查詢的左匹配 四、索引使用優化 1.避免在…

開關電源計算輔助軟件SMPSKIT V10.3

資料下載地址&#xff1a;開關電源計算輔助軟件SMPSKIT V10.3 SMPSKIT &#xff1a; 內置一些常見IC的計算 內置絕大多數磁芯數據 內置變壓器分層計算器 可用戶編程功能 包含絕大多數拓…