三、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的计算 内置绝大多数磁芯数据 内置变压器分层计算器 可用户编程功能 包含绝大多数拓…