k8s自主式pod之应用策略规则
自主式pod应用
我们接触的pod大多数是控制器控制的pod,那么今天讲的是自主式pod(也就是由yaml文件来创建的pod),也就是pod自己去控制自己,防止pod被控制器杀死。
1,首先我们来创建一个nginx的pod资源对象:
在创建pod之前,我们来查看一下镜像的下载策略:
[root@master yaml]# kubectl explain pod.spec.containers 查看imagePullpolicy的策略字段: imagePullPolicy <string> Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images
几种策略解释:
-
Always:镜像标签为“latest”或镜像标签不存在的时候,总是在从指定的仓库(Dockerhub)中获取镜像。
目前 Docker 官方维护了一个公共仓库 Docker Hub,其中已经包括了数量超过 2,650,000 的镜像。大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。 - Nerver:禁止从仓库中下载镜像,也就是说只使用本地镜像。如果本地也没有镜像,则pod将无法运行。
- IfNotPresent(提供):仅当本地没有对应镜像时,才从目标仓库中下载。
默认的获取策略如下:
镜像标签为“latest”,它的默认下载策略是Always。
镜像标签为自定义(不是默认的latest),它的默认下载策略是IfNotPresent。
//创建一个pod(定义某种策略):
[root@master yaml]# vim test-pod.yaml apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - name: myapp image: nginx imagePullPolicy: Always #定义镜像下载策略(从指定仓库获取镜像) ports: - containerPort: 80 #暴露容器的端口
//执行yaml文件: [root@master yaml]# vim test-pod.yaml [root@master yaml]# kubectl apply -f test-pod.yaml
//查看pod的状态: [root@master yaml]# kubectl get pod test-pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES test-pod 1/1 Running 0 7m55s 10.244.2.2 node02 <none> <none>
//以json格式查看pod的一个详细信息: [root@master yaml]# kubectl get pod test-pod -o json
image镜像相位(状态):
-
Running:Pod所需的容器已经被成功调度到某个节点,且已经成功运行。
-
Pending:APIserver创建了pod资源对象,并且已经存入etcd中,但它尚未被调度完成或者仍然处于仓库中下载镜像的过程。
-
Succeeded:Pod中的所有容器已成功终止,并且不会重新启动。
-
Failed:Pod中的所有容器均已终止,并且至少一个容器因故障而终止。也就是说,容器要么以非零状态退出,要么被系统终止
- Unknown:APIserver无法正常获取到pod对象的状态,通常用于其无法与所在工作节点的kubelet通信所致。
一定要熟悉并且记住这几种状态,因为这有利于在集群出现故障时能够准确的找到问题,且快速的排查错误。
2,pod的重启策略:
//首先我们查看pod的一个重启策略: [root@master yaml]# kubectl explain pod.spec #查看pod的spec字段的重启策略
- 字段解释:
- Always:但凡是pod对象终止就重启,此为默认策略。
- OnFailure:仅在pod对象出现错误时才重启,如果容器是处于complete状态,也就是正常退出的状态,是不会重启的。
- Never:从不重启。
3,我们模拟一下,创建一个pod,使用公司内部的私有仓库中的镜像,其镜像下载策略为:Never(使用本地镜像),pod的重启策略为Never(从不重启)。
[root@master yaml]# vim nginx-pod1.yaml apiVersion: v1 kind: Pod metadata: name: mynginx labels: #定义标签与servic相关联 test: myweb spec: restartPolicy: Never #定义镜像重启策略为Never containers: - name: myweb image: 172.16.1.30:5000/nginx:v1 imagePullPolicy: Never #定义镜像下载策略为Never --- apiVersion: v1 kind: Service metadata: name: mynginx spec: type: NodePort selector: test: myweb ports: - name: nginx port: 8080 #定义Cluster IP端口 targetPort: 80 #暴露容器端口 nodePort: 30000 #定义给外网通过宿主机暴露的端口
[root@master yaml]# kubectl apply -f nginx-pod1.yaml pod/mynginx created service/mynginx created
//查看pod当前状态:
查看pod信息可以看到镜像拉取失败,所以我们查看该pod的详细信息进行排查:
[root@master yaml]# kubectl describe pod mynginx
可以看到是策略的原因,Nerver策略只能从该节点的本地镜像进行下载,所以我们需要在该节点(node02)上将私有仓库中的镜像进行拉取到本地。
[root@node02 ~]# docker pull 172.16.1.30:5000/nginx:v1 v1: Pulling from nginx Digest: sha256:189cce606b29fb2a33ebc2fcecfa8e33b0b99740da4737133cdbcee92f3aba0a Status: Downloaded newer image for 172.16.1.30:5000/nginx:v1
//回到master,再次查看pod1是否运行: [root@master yaml]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES mynginx 1/1 Running 0 7m32s 10.244.2.4 node02 <none> <none> test-pod 1/1 Running 1 7h10m 10.244.2.3 node02 <none> <none>
2)测试pod重启策略:
我们模拟pod非正常退出
[root@master yaml]# vim nginx-pod1.yaml apiVersion: v1 kind: Pod metadata: name: mynginx labels: test: myweb spec: restartPolicy: Never containers: - name: myweb image: 172.16.1.30:5000/nginx:v1 imagePullPolicy: Never args: [/bin/sh -c sleep 10; exit 1] #添加args字段,模拟sleep10秒后退出
//重新启动pod [root@master yaml]# kubectl delete -f nginx-pod1.yaml pod "mynginx" deleted service "mynginx" deleted [root@master yaml]# kubectl apply -f nginx-pod1.yaml pod/mynginx created service/mynginx created
PS:因为在pod的文件中设置了pod的重启策略为Never,所以在无法修改策略的情况下,需要将该pod删除,重新执行yaml文件生成新的pod。
//第一次查看pod状态:
看到新的pod再node01节点上,所以我们还需再node01上将镜像拉取到本地。
[root@node01 ~]# docker pull 172.16.1.30:5000/nginx:v1 v1: Pulling from nginx Digest: sha256:189cce606b29fb2a33ebc2fcecfa8e33b0b99740da4737133cdbcee92f3aba0a Status: Downloaded newer image for 172.16.1.30:5000/nginx:v1
为了更好的查看到效果,我们重新执行yaml文件,生成新pod:
[root@master yaml]# kubectl delete -f nginx-pod1.yaml
[root@master yaml]# kubectl apply -f nginx-pod1.yaml
//查看pod的最终状态:
我们来查看该pod的详细信息(查看pod运行失败的原因): [root@master yaml]# kubectl describe pod mynginx
从上面的信息中我们可以得知pod在创建出容器后,却非正常退出了,最后导致容器创建失败。
3)我们修改策略规则,将规则设置为OnFailure:
//重新运行pod: [root@master yaml]# kubectl delete -f nginx-pod1.yaml pod "mynginx" deleted service "mynginx" deleted [root@master yaml]# kubectl apply -f nginx-pod1.yaml pod/mynginx created service/mynginx created
查看pod状态(失败): [root@master yaml]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES mynginx 0/1 RunContainerError 3 55s 10.244.2.8 node02 <none> <none>
[root@master yaml]# kubectl get pod -o json
我们可以看到当前pod创建容器失败。
//我们马上实时监控pod当前的状态:
可以看到pod一直在不停的重启,原因是我们在设置pod重启为OnFailure时,同时设置了pod在睡眠10秒后,便会重启,所以该pod会一直重启下去。
4)我们修改策略规则,并将其pod恢复正常运行:
//重新运行yaml文件,生成新的pod: [root@master yaml]# kubectl delete -f nginx-pod1.yaml pod "mynginx" deleted service "mynginx" deleted k[root@master yaml]# kubectl apply -f nginx-pod1.yaml pod/mynginx created service/mynginx created
//查看pod是否恢复正常运行:(正常运行) [root@master yaml]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES mynginx 1/1 Running 0 71s 10.244.1.8 node01 <none> <none>
5) 查看servie信息,验证nginx的web界面能否正常访问:
[root@master yaml]# kubectl get svc mynginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE mynginx NodePort 10.101.131.36 <none> 8080:30000/TCP 4m23s
———————— 本文至此结束,感谢阅读 ————————
- k8s外网如何访问业务应用之Service 池化pod
- 实验:组策略的应用规则
- 组策略的应用规则
- .net core i上 K8S(四).netcore程序的pod管理,重启策略与健康检查
- 组策略应用规则
- 组策略应用规则示例
- 域控的升级及客户端加入域;组策略的应用规则;组策略筛选
- 【原创】Java 应用中对于异常处理的一般策略
- 组策略应用之一——软件分发 推荐
- Java实现策略模式的简单应用
- 简单介绍J2EE应用的五种核心策略
- 设计模式——23、策略模式剖析及在集合框架中的应用
- 应用设计模式之策略模式(Factory)
- 【安卓中的缓存策略系列】安卓缓存策略之综合应用ImageLoader实现照片墙的效果
- K8s的内部Pod之间都不通,搞了快两天
- 邮件策略在域树中的实战应用:Exchange2003系列之十
- 设计模式的应用-策略模式实现支付方式回调策略
- 组策略应用之二――限制客户端软件安装及使用
- JQData应用 | 基于估值波动周期的择时策略(转)
- k8s基本概念-配置调度策略之(Taints-and-Tolerations)