一、pod的配置文件
Pod配置文件的属性说明
属性名称 | 取值类型 | 是否必须 | 取值说明 |
version | String | √ | 版本号 ,例如V1 |
kind | String | √ | Pod |
metadata | Object | √ | 元数据 |
metadata.name | String | √ | Pod名称 |
metadata.namespace | String | √ | 所属命名空间,默认为default |
metadata.labels[] |
|
|
|
metadata.annotation[] | List | 自定义注解列表 | |
Spec | Object | √ | Pod中容器的详细定义 |
spec.containers[] | List | √ | Pod中的容器列表 |
spec.containers[].name | String | √ | 容器的名称 |
spec.containers[].image | String | √ | 容器的镜像名称 |
spec.containers[].imagePullPolicy | String | 镜像拉取策略 Always:每次都拉取最新镜像 IfNotPresent:如果本地有该镜则使用本地镜像,如果没有则拉取镜像 Never:只使用本地镜像,当本地没有镜像时,Pod启动会报错 | |
spec.containers[].command[] | List | 容器的启动命令列表,如不指定则使用镜像打包时的命令 | |
spec.containers[].args[] | List | 容器启动时的命令 参数列表 | |
spec.containers[].workingDir | String | 容器的工作目录 | |
spec.containers[].volumeMounts[] | List | 挂载到容器内部的存储卷配置 | |
spec.containers[].volumeMounts[].name | String | 引用Pod共享存储卷的名称 | |
spec.containers[].volumeMounts[].mountPath | String | 存储卷在容器内挂载的绝对路径,应少于512个字符 | |
spec.containers[].volumeMounts[].readOnly | Boolean | 是否为读写模式,默认为读写模式 | |
spec.containers[].ports[] | List | 容器需要暴露的端口号列表 | |
spec.containers[].ports[].name | String | 端口名称 | |
spec.containers[].ports[].containerPort | int | 容器需要监听的端口号 | |
spec.containers[].ports[].hostPort | int | 容器所在主机需要监听的端口号,默认与containerPort相同 | |
spec.containers[].ports[].protocol | String | 端口协议,支持TCP、UDP默认为TCP | |
spec.containers[].env[] | List | 容器运行前需设置的环境变量列表 | |
spec.containers[].env[].name | String | 环境变量的名称 | |
spec.containers[].env[].value | String | 环境变量的值 | |
spec.containers[].resources | Object | 资源限制和资源请求的配置 | |
spec.containers[].resources.limits | Object | 资源上限限制的配置 | |
spec.containers[].resources.limits.cpu | String | CPU限制 | |
spec.containers[].resources.limits.memory | String | 内存限制,单位为MiB、GiB | |
spec.containers[].resources.request | Object | 资源最小配置的限制 | |
spec.containers[].resources.request.cpu | String | CPU限制容器启动所需的最小CPU核数 | |
spec.containers[].resources.request.memory | String | 容器启动所需的内存,单位为MiB、GiB | |
spec.restartPolicy | String | Pod重启策略 Always: Pod一旦终止运行,则无论容器是如何终止i,kubectl都会重启。 OnFailure:容器不是正常结束(退出码不为0)Kubectl会重启它。 Never:kubectl将退出码上报Master,不会再重启该Pod | |
spec.nodeSelector | Object | 标签选择器,Pod根据标签调度 | |
spec.imagePullSecrets | Objectt | 镜像私有仓库的密码 以name:secretkey格式指定 |
注:这并不是Pod的所有属性,还有一些属性没有一一列举
apiVersion: v1
kind: Namespace
metadata:
name: wssnail-test #指定namespace名称
---
apiVersion: v1 #版本
kind: Pod #类型为pod
metadata: #元数据
name: my-nginx-pod #指定pod名称,不会随机生成
namespace: 'wssnail-test' #指定namespace名称
labels: #定义标签
version: 1.0.0 #标签的值。可以有多个值
env: test
spec:
containers: #pod中容器描述
- name: my-nginx-contaniner #指定容器名称
image: nginx:1.21.4 #指定镜像
imagePullPolicy: IfNotPresent #always 总是拉取镜像;IfNotPresent如果本地没有镜像就从远程拉取;Never仅使用本地镜像,默认是alaways
workingDir: /usr/share/nginx/html #容器启动后的工作目录
ports:
- name: my-port #端口名称
containerPort: 80 #端口
protocol: TCP #网络协议 UDP、TCP
resources: #所需资源
limits: #最大分配资源
memory: "200Mi"
cpu: "700m"
requests: #所需最少资源
memory: "200Mi"
cpu: "100m"
restartPolicy: Always #重启策略 Always pod 一旦终止,无论如何终止都会重启,OnFailure 只有Pod以非零退出码终止;Never将退出码上报给master,不会重启
二、Pod探针
Pod的探针技术目的是为了检测Pod的健康状态,有三类探针分别是StartupProbe、LivenessProbe和ReadinessProbe。
StartupProbe探针(启动探针):启动探针的目的是为了检测容器启动的时候是否健康,能否启动起来。例如一个Springboot 项目启动时候需要依赖mysql,那么Mysql就必须先于Springboot启动,这时启动探针就可以通过指令检查Mysql是否启动成功。
LivenessProbe探针(存活探针):用于判断容器是否存活(Running状态),如果LivenessProbe探针检测到容器不健康,Kubelet将干掉这个容器,然后该容器根据重启策略作相应的处理,如果不配置这个探针,那么kubelet就认为这个探针返回值永远是Success。
ReadinessProbe(就绪探针):这个探针用于检测容器是否可用(Ready状态),只有就绪状态的Pod才会接收请求。
以上三种方式的探针均有三种方式检测即 HttpGetAction、TCPSocketAction和命令行ExecAction的方式实现
1、StartupProbe启动探针
基于HttpGetAction方式
apiVersion: v1 #版本号
kind: Namespace #类型为namespace
metadata: #元数据
name: wssnail-nginx #命名空间名称
---
apiVersion: v1
kind: Pod #类型为pod
metadata: #元数据
name: my-nginx-pod #名称
namespace: 'wssnail-nginx' # 该pod所属的命名空间
labels: #标签
purpose: test-startup-probe # k-v格式自定义即可 这里我打的标签是 测试启动探针
spec: #容器的描述
containers:
- name: my-nginx-container #容器名称
image: nginx:1.21.4 #镜像
imagePullPolicy: IfNotPresent #镜像拉取策略 always 总是拉取镜像;IfNotPresent如果本地没有镜像就从远程拉取;Never仅使用本地镜像,默认是alaways
#配置启动探针
startupProbe: #启动探针
httpGet: #基于http的探测
port: 80 #端口
path: /api #请求路径,这里我故意写了一个不存在的路径,目的是为了检测启动探针报错,启动失败
initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
failureThreshold: 3 #失败多少次才算失败
periodSeconds: 10 # 间隔时间 单位为秒
successThreshold: 1 #成功几次算成功
timeoutSeconds: 5 #请求超时时间 单位秒
workingDir: /usr/share/nginx/html #容器内工作目录
ports: #端口
- name: my-port #端口名称
containerPort: 80 #端口
protocol: TCP #协议 TCP 、UDP
resources: #所需资源
requests: #所需最小资源限制
cpu: "200m"
memory: "128Mi"
limits: #分配的最大资源限制
cpu: "500m"
memory: "256Mi"
restartPolicy: Always #重启策略 Always pod 一旦终止,无论如何终止都会重启,OnFailure 只有Pod以非零退出码终止;Never将退出码上报给master,不会重启
#创建资源
kubectl create -f my-nginx-pod.yaml
#查看资源
kubectl get pods -n wssnail-nginx
查看资源描述
kubectl describe pod my-nginx-pod -n wssnail-nginx
可以看到容器请求返回状态码为404,此时检测容器不健康。基于Http方式检测的探针状态码返回值大于等于200且小于400之间认为是健康的否则认为是不健康的。
当我们把配置文件修改为以下内容
apiVersion: v1 #版本号
kind: Namespace #类型为namespace
metadata: #元数据
name: wssnail-nginx #命名空间名称
---
apiVersion: v1
kind: Pod #类型为pod
metadata: #元数据
name: my-nginx-pod #名称
namespace: 'wssnail-nginx' # 该pod所属的命名空间
labels: #标签
purpose: test-startup-probe # k-v格式自定义即可 这里我打的标签是 测试启动探针
spec: #容器的描述
containers:
- name: my-nginx-container #容器名称
image: nginx:1.21.4 #镜像
imagePullPolicy: IfNotPresent #镜像拉取策略 always 总是拉取镜像;IfNotPresent如果本地没有镜像就从远程拉取;Never仅使用本地镜像,默认是alaways
#配置启动探针
startupProbe: #启动探针
httpGet: #基于http的探测
port: 80 #端口
path: /index.html #请求路径,修改为正确路径
initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
failureThreshold: 3 #失败多少次才算失败
periodSeconds: 10 # 间隔时间 单位为秒
successThreshold: 1 #成功几次算成功
timeoutSeconds: 5 #请求超时时间 单位秒
workingDir: /usr/share/nginx/html #容器内工作目录
ports: #端口
- name: my-port #端口名称
containerPort: 80 #端口
protocol: TCP #协议 TCP 、UDP
resources: #所需资源
requests: #所需最小资源限制
cpu: "200m"
memory: "128Mi"
limits: #分配的最大资源限制
cpu: "500m"
memory: "256Mi"
restartPolicy: Always #重启策略 Always pod 一旦终止,无论如何终止都会重启,OnFailure 只有Pod以非零退出码终止;Never将退出码上报给master,不会重启
#创建资源
kubectl create -f my-nginx-pod.yaml
#查看资源
kubectl get pods -n wssnail-nginx
#容器描述
kubectl describe pod my-nginx-pod -n wssnail-nginx
基于TCPSocketAction方式
apiVersion: v1 #版本号
kind: Namespace #类型为namespace
metadata: #元数据
name: wssnail-nginx #命名空间名称
---
apiVersion: v1
kind: Pod #类型为pod
metadata: #元数据
name: my-nginx-pod #名称
namespace: 'wssnail-nginx' # 该pod所属的命名空间
labels: #标签
purpose: test-startup-probe # k-v格式自定义即可 这里我打的标签是 测试启动探针
spec: #容器的描述
containers:
- name: my-nginx-container #容器名称
image: nginx:1.21.4 #镜像
imagePullPolicy: IfNotPresent #镜像拉取策略 always 总是拉取镜像;IfNotPresent如果本地没有镜像就从远程拉取;Never仅使用本地镜像,默认是alaways
#配置启动探针
startupProbe: #启动探针
# httpGet: #基于http的探测
# port: 80 #端口
# path: /api #请求路径,这里我故意写了一个不存在的路径,目的是为了检测启动探针报错,启动失败
tcpSocket:
port: 80
initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
failureThreshold: 3 #失败多少次才算失败
periodSeconds: 10 # 间隔时间 单位为秒
successThreshold: 1 #成功几次算成功
timeoutSeconds: 5 #请求超时时间 单位秒
workingDir: /usr/share/nginx/html #容器内工作目录
ports: #端口
- name: my-port #端口名称
containerPort: 80 #端口
protocol: TCP #协议 TCP 、UDP
resources: #所需资源
requests: #所需最小资源限制
cpu: "200m"
memory: "128Mi"
limits: #分配的最大资源限制
cpu: "500m"
memory: "256Mi"
restartPolicy: Always #重启策略 Always pod 一旦终止,无论如何终止都会重启,OnFailure 只有Pod以非零退出码终止;Never将退出码上报给master,不会重启
然后同样查看命令发现pod正确被创建
#创建资源
kubectl create -f my-nginx-pod.yaml
#查看资源
kubectl get pods -n wssnail-nginx
#容器描述
kubectl describe pod my-nginx-pod -n wssnail-nginx
基于命令行ExecAction
apiVersion: v1 #版本号
kind: Namespace #类型为namespace
metadata: #元数据
name: wssnail-nginx #命名空间名称
---
apiVersion: v1
kind: Pod #类型为pod
metadata: #元数据
name: my-nginx-pod #名称
namespace: 'wssnail-nginx' # 该pod所属的命名空间
labels: #标签
purpose: test-startup-probe # k-v格式自定义即可 这里我打的标签是 测试启动探针
spec: #容器的描述
containers:
- name: my-nginx-container #容器名称
image: nginx:1.21.4 #镜像
imagePullPolicy: IfNotPresent #镜像拉取策略 always 总是拉取镜像;IfNotPresent如果本地没有镜像就从远程拉取;Never仅使用本地镜像,默认是alaways
#配置启动探针
startupProbe: #启动探针
# httpGet: #基于http的探测
# port: 80 #端口
# path: /api #请求路径,这里我故意写了一个不存在的路径,目的是为了检测启动探针报错,启动失败
# tcpSocket:
# port: 80
exec:
command:
- sh
- -c
- "sleep 3; echo success"
initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
failureThreshold: 3 #失败多少次才算失败
periodSeconds: 10 # 间隔时间 单位为秒
successThreshold: 1 #成功几次算成功
timeoutSeconds: 5 #请求超时时间 单位秒
workingDir: /usr/share/nginx/html #容器内工作目录
ports: #端口
- name: my-port #端口名称
containerPort: 80 #端口
protocol: TCP #协议 TCP 、UDP
resources: #所需资源
requests: #所需最小资源限制
cpu: "200m"
memory: "128Mi"
limits: #分配的最大资源限制
cpu: "500m"
memory: "256Mi"
restartPolicy: Always #重启策略 Always pod 一旦终止,无论如何终止都会重启,OnFailure 只有Pod以非零退出码终止;Never将退出码上报给master,不会重启
2、LivenessProbe 存活探针
基于HttpGetAction方式
apiVersion: v1 #版本号
kind: Namespace #类型为namespace
metadata: #元数据
name: wssnail-nginx #命名空间名称
---
apiVersion: v1
kind: Pod #类型为pod
metadata: #元数据
name: my-nginx-pod #名称
namespace: 'wssnail-nginx' # 该pod所属的命名空间
labels: #标签
purpose: test-startup-probe # k-v格式自定义即可 这里我打的标签是 测试启动探针
spec: #容器的描述
containers:
- name: my-nginx-container #容器名称
image: nginx:1.21.4 #镜像
imagePullPolicy: IfNotPresent #镜像拉取策略 always 总是拉取镜像;IfNotPresent如果本地没有镜像就从远程拉取;Never仅使用本地镜像,默认是alaways
#配置启动探针
startupProbe: #启动探针
exec:
command:
- sh
- -c
- "sleep 3; echo success"
initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
failureThreshold: 3 #失败多少次才算失败
periodSeconds: 10 # 间隔时间 单位为秒
successThreshold: 1 #成功几次算成功
timeoutSeconds: 5 #请求超时时间 单位秒
livenessProbe: #存活探针
httpGet: #基于http方式
port: 80 #端口
path: /api #访问路径
workingDir: /usr/share/nginx/html #容器内工作目录
ports: #端口
- name: my-port #端口名称
containerPort: 80 #端口
protocol: TCP #协议 TCP 、UDP
resources: #所需资源
requests: #所需最小资源限制
cpu: "200m"
memory: "128Mi"
limits: #分配的最大资源限制
cpu: "500m"
memory: "256Mi"
restartPolicy: Always #重启策略 Always pod 一旦终止,无论如何终止都会重启,OnFailure 只有Pod以非零退出码终止;Never将退出码上报给master,不会重启
#创建资源
kubectl create -f my-nginx-pod-liveness.yaml
#查看资源
kubectl get po -n wssnail-nginx
#查看描述
kubectl describe po my-nginx-pod -n wssnail-nginx
修改配置文件如下
apiVersion: v1 #版本号
kind: Namespace #类型为namespace
metadata: #元数据
name: wssnail-nginx #命名空间名称
---
apiVersion: v1
kind: Pod #类型为pod
metadata: #元数据
name: my-nginx-pod #名称
namespace: 'wssnail-nginx' # 该pod所属的命名空间
labels: #标签
purpose: test-startup-probe # k-v格式自定义即可 这里我打的标签是 测试启动探针
spec: #容器的描述
containers:
- name: my-nginx-container #容器名称
image: nginx:1.21.4 #镜像
imagePullPolicy: IfNotPresent #镜像拉取策略 always 总是拉取镜像;IfNotPresent如果本地没有镜像就从远程拉取;Never仅使用本地镜像,默认是alaways
#配置启动探针
startupProbe: #启动探针
exec:
command:
- sh
- -c
- "sleep 3; echo success"
initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
failureThreshold: 3 #失败多少次才算失败
periodSeconds: 10 # 间隔时间 单位为秒
successThreshold: 1 #成功几次算成功
timeoutSeconds: 5 #请求超时时间 单位秒
livenessProbe: #存活探针
httpGet: #基于http方式
port: 80 #端口
path: /index.html #访问路径
workingDir: /usr/share/nginx/html #容器内工作目录
ports: #端口
- name: my-port #端口名称
containerPort: 80 #端口
protocol: TCP #协议 TCP 、UDP
resources: #所需资源
requests: #所需最小资源限制
cpu: "200m"
memory: "128Mi"
limits: #分配的最大资源限制
cpu: "500m"
memory: "256Mi"
restartPolicy: Always #重启策略 Always pod 一旦终止,无论如何终止都会重启,OnFailure 只有Pod以非零退出码终止;Never将退出码上报给master,不会重启
#创建资源
kubectl create -f my-nginx-pod-liveness.yaml
#查看资源
kubectl get po -n wssnail-nginx
#查看描述
kubectl describe po my-nginx-pod -n wssnail-nginx
基于TCPScocketAction方式
apiVersion: v1 #版本号
kind: Namespace #类型为namespace
metadata: #元数据
name: wssnail-nginx #命名空间名称
---
apiVersion: v1
kind: Pod #类型为pod
metadata: #元数据
name: my-nginx-pod #名称
namespace: 'wssnail-nginx' # 该pod所属的命名空间
labels: #标签
purpose: test-startup-probe # k-v格式自定义即可 这里我打的标签是 测试启动探针
spec: #容器的描述
containers:
- name: my-nginx-container #容器名称
image: nginx:1.21.4 #镜像
imagePullPolicy: IfNotPresent #镜像拉取策略 always 总是拉取镜像;IfNotPresent如果本地没有镜像就从远程拉取;Never仅使用本地镜像,默认是alaways
#配置启动探针
startupProbe: #启动探针
exec:
command:
- sh
- -c
- "sleep 3; echo success"
initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
failureThreshold: 3 #失败多少次才算失败
periodSeconds: 10 # 间隔时间 单位为秒
successThreshold: 1 #成功几次算成功
timeoutSeconds: 5 #请求超时时间 单位秒
livenessProbe: #存活探针
# httpGet: #基于http方式
# port: 80 #端口
# path: /index.html #访问路径
tcpSocket:
port: 80
workingDir: /usr/share/nginx/html #容器内工作目录
ports: #端口
- name: my-port #端口名称
containerPort: 80 #端口
protocol: TCP #协议 TCP 、UDP
resources: #所需资源
requests: #所需最小资源限制
cpu: "200m"
memory: "128Mi"
limits: #分配的最大资源限制
cpu: "500m"
memory: "256Mi"
restartPolicy: Always #重启策略 Always pod 一旦终止,无论如何终止都会重启,OnFailure 只有Pod以非零退出码终止;Never将退出码上报给master,不会重启
#创建资源
kubectl create -f my-nginx-pod-liveness.yaml
#查看资源
kubectl get po -n wssnail-nginx
#查看描述
kubectl describe po my-nginx-pod -n wssnail-nginx
基于命令行ExecAction
apiVersion: v1 #版本号
kind: Namespace #类型为namespace
metadata: #元数据
name: wssnail-nginx #命名空间名称
---
apiVersion: v1
kind: Pod #类型为pod
metadata: #元数据
name: my-nginx-pod #名称
namespace: 'wssnail-nginx' # 该pod所属的命名空间
labels: #标签
purpose: test-startup-probe # k-v格式自定义即可 这里我打的标签是 测试启动探针
spec: #容器的描述
containers:
- name: my-nginx-container #容器名称
image: nginx:1.21.4 #镜像
imagePullPolicy: IfNotPresent #镜像拉取策略 always 总是拉取镜像;IfNotPresent如果本地没有镜像就从远程拉取;Never仅使用本地镜像,默认是alaways
#配置启动探针
startupProbe: #启动探针
exec:
command:
- sh
- -c
- "sleep 3; echo success"
initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
failureThreshold: 3 #失败多少次才算失败
periodSeconds: 10 # 间隔时间 单位为秒
successThreshold: 1 #成功几次算成功
timeoutSeconds: 5 #请求超时时间 单位秒
livenessProbe: #存活探针
# httpGet: #基于http方式
# port: 80 #端口
# path: /index.html #访问路径
# tcpSocket:
# port: 80
exec:
command:
- sh
- -c
- "echo 'started' > start_file" #输出内容到文件
workingDir: /usr/share/nginx/html #容器内工作目录
ports: #端口
- name: my-port #端口名称
containerPort: 80 #端口
protocol: TCP #协议 TCP 、UDP
resources: #所需资源
requests: #所需最小资源限制
cpu: "200m"
memory: "128Mi"
limits: #分配的最大资源限制
cpu: "500m"
memory: "256Mi"
restartPolicy: Always #重启策略 Always pod 一旦终止,无论如何终止都会重启,OnFailure 只有Pod以非零退出码终止;Never将退出码上报给master,不会重启
#创建资源
kubectl create -f my-nginx-pod-liveness.yaml
#查看资源
kubectl get po -n wssnail-nginx
#查看描述
kubectl describe po -n wssnail-nginx
#进入容器查看文件是否创建成功
kubectl exec -it my-nginx-pod -n wssnail-nginx -- /bin/bash
#列出文件列表
ls
#查看文件
cat start_file
或者将文件复制到宿主机查看
#将文件从容器复制到宿主机
kubectl cp <namespace>/pod名称:<绝对路径> <宿主机路径>
kubectl cp wssnail-nginx/my-nginx-pod:/usr/share/nginx/html/start_file /root/start
3、ReadinessProbe 就绪探针
基于HttpGetAction
apiVersion: v1 #版本号
kind: Namespace #类型为namespace
metadata: #元数据
name: wssnail-nginx #命名空间名称
---
apiVersion: v1
kind: Pod #类型为pod
metadata: #元数据
name: my-nginx-pod #名称
namespace: 'wssnail-nginx' # 该pod所属的命名空间
labels: #标签
purpose: test-startup-probe # k-v格式自定义即可 这里我打的标签是 测试启动探针
spec: #容器的描述
containers:
- name: my-nginx-container #容器名称
image: nginx:1.21.4 #镜像
imagePullPolicy: IfNotPresent #镜像拉取策略 always 总是拉取镜像;IfNotPresent如果本地没有镜像就从远程拉取;Never仅使用本地镜像,默认是alaways
#配置启动探针
startupProbe: #启动探针
exec:
command:
- sh
- -c
- "sleep 3; echo success"
initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
failureThreshold: 3 #失败多少次才算失败
periodSeconds: 10 # 间隔时间 单位为秒
successThreshold: 1 #成功几次算成功
timeoutSeconds: 5 #请求超时时间 单位秒
livenessProbe: #存活探针
httpGet: #基于http方式
port: 80 #端口
path: /index.html #访问路径
initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
failureThreshold: 3 #失败多少次才算失败
periodSeconds: 10 # 间隔时间 单位为秒
successThreshold: 1 #成功几次算成功
timeoutSeconds: 5 #请求超时时间 单位秒
# tcpSocket:
# port: 80
# exec:
# command:
# - sh
# - -c
# - "echo 'started' > start_file" #输出内容到文件
readinessProbe:
httpGet:
port: 80
path: /start.html
initialDelaySeconds: 0 #启动容器进行健康检查的等待时间
failureThreshold: 5 #失败多少次才算失败
periodSeconds: 10 # 间隔时间 单位为秒
successThreshold: 1 #成功几次算成功
timeoutSeconds: 5 #请求超时时间 单位秒
workingDir: /usr/share/nginx/html #容器内工作目录
ports: #端口
- name: my-port #端口名称
containerPort: 80 #端口
protocol: TCP #协议 TCP 、UDP
resources: #所需资源
requests: #所需最小资源限制
cpu: "200m"
memory: "128Mi"
limits: #分配的最大资源限制
cpu: "500m"
memory: "256Mi"
restartPolicy: Always #重启策略 Always pod 一旦终止,无论如何终止都会重启,OnFailure 只有Pod以非零退出码终止;Never将退出码上报给master,不会重启
#创建资源
kubectl create -f my-nginx-pod-readiness.yaml
#查看
kubectl get po -n wssnail-nginx
#查看描述
kubectl describe po my-nginx-pod -n wssnail-nginx
接下来我们创建一个start.html,然后复制到容器内
#创建文件
echo 'success' > start.html
#复制文件到容器内
kubectl cp start.html wssnail-nginx/my-nginx-pod:/usr/share/nginx/html
基于TCPScocketAction方式
apiVersion: v1 #版本号
kind: Namespace #类型为namespace
metadata: #元数据
name: wssnail-nginx #命名空间名称
---
apiVersion: v1
kind: Pod #类型为pod
metadata: #元数据
name: my-nginx-pod #名称
namespace: 'wssnail-nginx' # 该pod所属的命名空间
labels: #标签
purpose: test-startup-probe # k-v格式自定义即可 这里我打的标签是 测试启动探针
spec: #容器的描述
containers:
- name: my-nginx-container #容器名称
image: nginx:1.21.4 #镜像
imagePullPolicy: IfNotPresent #镜像拉取策略 always 总是拉取镜像;IfNotPresent如果本地没有镜像就从远程拉取;Never仅使用本地镜像,默认是alaways
#配置启动探针
startupProbe: #启动探针
exec:
command:
- sh
- -c
- "sleep 3; echo success"
initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
failureThreshold: 3 #失败多少次才算失败
periodSeconds: 10 # 间隔时间 单位为秒
successThreshold: 1 #成功几次算成功
timeoutSeconds: 5 #请求超时时间 单位秒
livenessProbe: #存活探针
httpGet: #基于http方式
port: 80 #端口
path: /index.html #访问路径
initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
failureThreshold: 3 #失败多少次才算失败
periodSeconds: 10 # 间隔时间 单位为秒
successThreshold: 1 #成功几次算成功
timeoutSeconds: 5 #请求超时时间 单位秒
# tcpSocket:
# port: 80
# exec:
# command:
# - sh
# - -c
# - "echo 'started' > start_file" #输出内容到文件
readinessProbe: #就绪探针
# httpGet:
# port: 80
# path: /start.html
tcpSocket:
port: 80
initialDelaySeconds: 0 #启动容器进行健康检查的等待时间
failureThreshold: 5 #失败多少次才算失败
periodSeconds: 10 # 间隔时间 单位为秒
successThreshold: 1 #成功几次算成功
timeoutSeconds: 5 #请求超时时间 单位秒
workingDir: /usr/share/nginx/html #容器内工作目录
ports: #端口
- name: my-port #端口名称
containerPort: 80 #端口
protocol: TCP #协议 TCP 、UDP
resources: #所需资源
requests: #所需最小资源限制
cpu: "200m"
memory: "128Mi"
limits: #分配的最大资源限制
cpu: "500m"
memory: "256Mi"
restartPolicy: Always #重启策略 Always pod 一旦终止,无论如何终止都会重启,OnFailure 只有Pod以非零退出码终止;Never将退出码上报给master,不会重启
#创建资源
kubectl create -f my-nginx-pod-readiness.yaml
#查看资源
kubectl get po -n wssnail-nginx
#查看描述
kubectl describe po my-nginx-pod -n wssnail-nginx
基于命令行ExecAction
apiVersion: v1 #版本号
kind: Namespace #类型为namespace
metadata: #元数据
name: wssnail-nginx #命名空间名称
---
apiVersion: v1
kind: Pod #类型为pod
metadata: #元数据
name: my-nginx-pod #名称
namespace: 'wssnail-nginx' # 该pod所属的命名空间
labels: #标签
purpose: test-startup-probe # k-v格式自定义即可 这里我打的标签是 测试启动探针
spec: #容器的描述
containers:
- name: my-nginx-container #容器名称
image: nginx:1.21.4 #镜像
imagePullPolicy: IfNotPresent #镜像拉取策略 always 总是拉取镜像;IfNotPresent如果本地没有镜像就从远程拉取;Never仅使用本地镜像,默认是alaways
#配置启动探针
startupProbe: #启动探针
exec:
command:
- sh
- -c
- "sleep 3; echo success"
initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
failureThreshold: 3 #失败多少次才算失败
periodSeconds: 10 # 间隔时间 单位为秒
successThreshold: 1 #成功几次算成功
timeoutSeconds: 5 #请求超时时间 单位秒
livenessProbe: #存活探针
httpGet: #基于http方式
port: 80 #端口
path: /index.html #访问路径
initialDelaySeconds: 3 #启动容器进行健康检查的等待时间
failureThreshold: 3 #失败多少次才算失败
periodSeconds: 10 # 间隔时间 单位为秒
successThreshold: 1 #成功几次算成功
timeoutSeconds: 5 #请求超时时间 单位秒
# tcpSocket:
# port: 80
# exec:
# command:
# - sh
# - -c
# - "echo 'started' > start_file" #输出内容到文件
readinessProbe: #就绪探针
# httpGet:
# port: 80
# path: /start.html
# tcpSocket:
# port: 80
exec:
command:
- sh
- -c
- "echo 'success'"
initialDelaySeconds: 0 #启动容器进行健康检查的等待时间
failureThreshold: 5 #失败多少次才算失败
periodSeconds: 10 # 间隔时间 单位为秒
successThreshold: 1 #成功几次算成功
timeoutSeconds: 5 #请求超时时间 单位秒
workingDir: /usr/share/nginx/html #容器内工作目录
ports: #端口
- name: my-port #端口名称
containerPort: 80 #端口
protocol: TCP #协议 TCP 、UDP
resources: #所需资源
requests: #所需最小资源限制
cpu: "200m"
memory: "128Mi"
limits: #分配的最大资源限制
cpu: "500m"
memory: "256Mi"
restartPolicy: Always #重启策略 Always pod 一旦终止,无论如何终止都会重启,OnFailure 只有Pod以非零退出码终止;Never将退出码上报给master,不会重启
#创建资源
kubectl create -f my-nginx-pod-readiness.yaml
#查看资源
kubectl get po -n wssnail-nginx
#查看描述
kubectl describe po my-nginx-pod -n wssnail-nginx
三、Pod生命周期
pod生命周期
在pod的生命周期中我们可以利用容器初始化和preStop做一些处理,类似spring的初始化和销毁时可以做一些处理。
Pod状态描述
状态值 | 描述 |
Pending | Api Server已经创建Pod,但在Pod内部还有至少一个镜像没有创建,包括正在下载的镜像 |
Running | Pod 内所有的容器均已创建,且至少有一个容器处于运行状态、正在启动或者重启状态 |
Succeeded | Pod内所有的容器均成功执行后退出,且不会再重启 |
Failed | Pod内所有的容易均已退出,但至少有一个容器退出为失败状态 |
Unknow | 由于某种原因无法获取Pod信息,例如网络通信不畅导致 |
Prestop的使用
apiVersion: v1 #版本号
kind: Namespace #类型为namespace
metadata: #元数据
name: wssnail-nginx #命名空间名称
---
apiVersion: v1
kind: Pod #类型为pod
metadata: #元数据
name: my-nginx-pod #名称
namespace: 'wssnail-nginx' # 该pod所属的命名空间
labels: #标签
purpose: test-startup-probe # k-v格式自定义即可 这里我打的标签是 测试启动探针
spec: #容器的描述
terminationGracePeriodSeconds: 30 #容器销毁时在该时间之后进行删除操作
containers:
- name: my-nginx-container #容器名称
image: nginx:1.21.4 #镜像
imagePullPolicy: IfNotPresent #镜像拉取策略 always 总是拉取镜像;IfNotPresent如果本地没有镜像就从远程拉取;Never仅使用本地镜像,默认是alaways
lifecycle: #生命周期配置
postStart: #生命周期启动阶段,该命令不一定比容器的command命令早执行,
exec:
command:
- sh
- -c
- "echo '<h1>preStart<h1>' > /usr/share/nginx/html/preStop.html"
# httpGet:
# path: /index.html
# port: 80
# tcpSocket: #该方法已过期
# port: 80
# sleep:
# seconds: 10
preStop: #容器在停止时处理的事情
exec:
command:
- sh
- -c
- "sleep 45; echo 'sleep over' >> /usr/share/nginx/html/preStop.html" #理论上能访问到该内容
# httpGet:
# path: /index.html
# port: 80
# tcpSocket: #该方法已过期
# port: 80
# sleep:
# seconds: 10
workingDir: /usr/share/nginx/html #容器内工作目录
ports: #端口
- name: my-port #端口名称
containerPort: 80 #端口
protocol: TCP #协议 TCP 、UDP
resources: #所需资源
requests: #所需最小资源限制
cpu: "200m"
memory: "128Mi"
limits: #分配的最大资源限制
cpu: "500m"
memory: "256Mi"
restartPolicy: Always #重启策略 Always pod 一旦终止,无论如何终止都会重启,OnFailure 只有Pod以非零退出码终止;Never将退出码上报给master,不会重启
#查看信息
kubectl get pod -n wssnail-ngin -o wide
#访问
curl 10.244.1.4/preStop.html
四、资源调度
1、自动调度
apiVersion: v1 #版本号
kind: Namespace #类型为namespace
metadata: #元数据
name: wssnail-deploy #命名空间名称
---
apiVersion: apps/v1 #版本
kind: Deployment #类型为Deployment
metadata: #元数据
labels: #标签
app: my-nginx
name: my-nginx-deploy
namespace: wssnail-deploy
spec: #描述
replicas: 3 #副本数量
revisionHistoryLimit: 10 #历史版本限制,用来回退,如果设置为0则没有回退
selector: #选择器
matchLabels:
app: my-nginx
strategy:
rollingUpdate: #滚动更新策略
maxSurge: 25% #控制滚动更新过程中副本总数的超过期望值的上限。maxSurge 可以是具体的整数,也可以是百分百,向上取整。maxSurge 默认值为 25%,比如期望值是10,那么最大的副本数就是10+10*25%(向上取整)=13
maxUnavailable: 1 #不可用的副本相占期望值的最大比例。 maxUnavailable 可以是具体的整数,也可以是百分百,向下取整。maxUnavailable 默认值为 25%。比如期望值是10,那么副本数至少要为10-10*25%(向下取整)=8才认为是健康。
type: RollingUpdate #滚动更新
template:
metadata:
labels:
app: my-nginx
spec: #容器描述
containers:
- name: nginx-container
image: nginx:1.21.4
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 5
httpGet:
path: /index.html
port: 80
scheme: HTTP
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
ports:
- containerPort: 80
name: nginx-port
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /index.html
port: 80
scheme: HTTP
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
resources:
limits:
memory: 170Mi
requests:
cpu: 100m
memory: 70Mi
#创建资源
kubectl create -f my-nginx-deploy.yaml
#查看ReplicaSet
kubectl get replicaset -n wssnail-deploy
kubectl get rs -n wssnail-deploy
#查看pod
kubectl get pod -n wssnail-deploy -o wide
从上可以看出3个Nginx Pod是由系统自动完成调度的。他们各自运行在那个节点上是由Scheduler经过一系列的算法计算出来的。
2、标签和选择器
给pod添加标签和修改标签
#显示标签
kubectl get pod -n wssnail-deploy --show-labels
#添加标签
kubectl label po my-nginx-deploy-c67dd47d5-54vsw -n wssnail-deploy version=1.21.4
#修改标签
kubectl label po my-nginx-deploy-c67dd47d5-54vsw -n wssnail-deploy version=v2 --overwrite
通过修改配置文件的方式修改label
#修改配置文件的方式修改标签
kubectl edit po my-nginx-deploy-c67dd47d5-54vsw -n wssnail-deploy
#查看
kubectl get pod -n wssnail-deploy --show-labels
根据标签查询pod
#查询标签中app=my-nginx的pod
kubectl get pod -n wssnail-deploy -A -l app=my-nginx --show-labels
#查询标签中app=my-nginx并且version=v2的pod
kubectl get pod -n wssnail-deploy -A -l app=my-nginx,version=v2 --show-labels
#查询标签中app=my-nginx并且version=v2并且 env在(test,prd,prod)中的pod
kubectl get pod -n wssnail-deploy -A -l 'app=my-nginx,version=v2, env in(test,prd,prod)' --show-labels
# 查询标签中app不等于my-nginx并且version=v2并且 env在(test,prd,prod)中的pod
kubectl get pod -n wssnail-deploy -A -l 'app!=my-nginx,version=v2, env in(test,prd,prod)' --show-labels
NodeSelector的使用
#给节点打标签
kubectl label node node1 role=micro_service
apiVersion: v1 #版本号
kind: Namespace #类型为namespace
metadata: #元数据
name: wssnail-deploy #命名空间名称
---
apiVersion: apps/v1 #版本
kind: Deployment #类型为Deployment
metadata: #元数据
labels: #标签
app: my-nginx
name: my-nginx-deploy
namespace: wssnail-deploy
spec: #描述
replicas: 3 #副本数量
revisionHistoryLimit: 10 #历史版本限制,用来回退,如果设置为0则没有回退
selector: #选择器
matchLabels:
app: my-nginx
strategy:
rollingUpdate: #滚动更新策略
maxSurge: 25% #控制滚动更新过程中副本总数的超过期望值的上限。maxSurge 可以是具体的整数,也可以是百分百,向上取整。maxSurge 默认值为 25%,比如期望值是10,那么最大的副本数就是10+10*25%(向上取整)=13
maxUnavailable: 1 #不可用的副本相占期望值的最大比例。 maxUnavailable 可以是具体的整数,也可以是百分百,向下取整。maxUnavailable 默认值为 25%。比如期望值是10,那么副本数至少要为10-10*25%(向下取整)=8才认为是健康。
type: RollingUpdate #滚动更新
template:
metadata:
labels:
app: my-nginx
spec: #容器描述
nodeSelector: #节点选择
role: micro_service #通过添加标签控制到那个节点上
containers:
- name: nginx-container
image: nginx:1.21.4
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 5
httpGet:
path: /index.html
port: 80
scheme: HTTP
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
ports:
- containerPort: 80
name: nginx-port
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /index.html
port: 80
scheme: HTTP
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
resources:
limits:
memory: 170Mi
requests:
cpu: 100m
memory: 70Mi
#创建资源
kubectl create -f my-nginx-deploy.yaml
#查看pod
kubectl get po -n wssnail-deploy -o wide
可以看出所有的pod都调度到了node1节点。
3、deployment
滚动更新
apiVersion: v1 #版本号
kind: Namespace #类型为namespace
metadata: #元数据
name: wssnail-deploy #命名空间名称
---
apiVersion: apps/v1 #版本
kind: Deployment #类型为Deployment
metadata: #元数据
labels: #标签
app: my-nginx
name: my-nginx-deploy
namespace: wssnail-deploy #命名空间
spec: #描述
replicas: 1 #副本数量
revisionHistoryLimit: 10 #历史版本限制,用来回退,如果设置为0则没有回退
selector: #选择器
matchLabels: #按招标前匹配
app: my-nginx #标签的值
strategy: #更新策略
rollingUpdate: #滚动更新策略
maxSurge: 25% #控制滚动更新过程中副本总数的超过期望值的上限。maxSurge 可以是具体的整数,也可以是百分百,向上取整。maxSurge 默认值为 25%,比如期望值是10,那么最大的副本数就是10+10*25%(向上取整)=13
maxUnavailable: 1 #不可用的副本相占期望值的最大比例。 maxUnavailable 可以是具体的整数,也可以是百分百,向下取整。maxUnavailable 默认值为 25%。比如期望值是10,那么副本数至少要为10-10*25%(向下取整)=8才认为是健康。
type: RollingUpdate #滚动更新 可选值 Recreate 、RollingUpdate 默认为RollingUpdate
template: #模板信息
metadata: #元数据
labels: #模板标签
app: my-nginx #标签的值
spec: #容器描述
terminationGracePeriodSeconds: 30 #宽限时间
containers: #容器
- name: nginx-container #容器名称
image: nginx:1.21.4 #镜像
imagePullPolicy: IfNotPresent #拉取策略
#创建资源
kubectl create -f my-nginx-rollout-deploy.yaml
#查看deployment
kubectl get deploy -n wssnail-deploy
#查看replicaSet
kubectl get rs -n wssnail-deploy
#查看pod
kubectl get po -n wssnail-deploy
#编辑deploy配置文件,将副本数改成3
kubectl edit deploy my-nginx-deploy -n wssnail-deploy
注意名称和个数
#修改镜像版本 nginx-container 为容器名称,--record参数已过期,加上这个参数在查询版本历史的时候显示修改的内容
kubectl set image deployment/my-nginx-deploy nginx-container=nginx:1.22.0 -n wssnail-deploy
kubectl set image deployment/my-nginx-deploy nginx-container=nginx:1.21.4 -n wssnail-deploy --record
#查看修改状态
kubectl rollout status deploy my-nginx-deploy -n wssnail-deploy
查看滚动更近过程
#查看描述
kubectl describe deploy my-nginx-deploy -n wssnail-deploy
结论:可以看到滚动更新的效果大概是是先启动新的然后再干掉老的
回滚版本
#查看版本列表
kubectl rollout history deployment/my-nginx-deploy -n wssnail-deploy
#查看某个版本的修改内容
kubectl rollout history deployment/my-nginx-deploy -n wssnail-deploy --revision=2
#回滚到指定版本
kubectl rollout undo deployment/my-nginx-deploy -n wssnail-deploy --to-revision=3
扩容与缩容
#扩容,增加副本数
kubectl scale --replicas=6 deploy my-nginx-deploy -n wssnail-deploy
#缩容 减少副本数
kubectl scale --replicas=3 deploy my-nginx-deploy -n wssnail-deploy
注意:扩容和缩容replicaSet的记录条数不会发生改变。
更新暂停与恢复
#暂停,这里暂停只是暂停template下内容的更新,其他内容修改时还是会更新
kubectl rollout pause deploy my-nginx-deploy -n wssnail-deploy
#恢复
kubectl rollout resume deploy my-nginx-deploy -n wssnail-deploy