三、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(失败) | 所有容器都已终止,并且至少有一个容器以失败的方式终止,也就是说这个容器要么以非零状态退出,要么被系统终止,可以通过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