千家信息网

k8s自主式pod之应用策略规则

发表于:2024-11-24 作者:千家信息网编辑
千家信息网最后更新 2024年11月24日,自主式pod应用我们接触的pod大多数是控制器控制的pod,那么今天讲的是自主式pod(也就是由yaml文件来创建的pod),也就是pod自己去控制自己,防止pod被控制器杀死。1,首先我们来创建一个
千家信息网最后更新 2024年11月24日k8s自主式pod之应用策略规则

自主式pod应用

我们接触的pod大多数是控制器控制的pod,那么今天讲的是自主式pod(也就是由yaml文件来创建的pod),也就是pod自己去控制自己,防止pod被控制器杀死。

1,首先我们来创建一个nginx的pod资源对象:

在创建pod之前,我们来查看一下镜像的下载策略:

[root@master yaml]# kubectl explain pod.spec.containers查看imagePullpolicy的策略字段:   imagePullPolicy       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:总是在从指定的仓库中获取镜像,也就是说每次创建pod都会重新拉取一次镜像。

  • Nerver:禁止从仓库中下载镜像,也就是说只使用本地镜像。如果本地也没有镜像,则pod将无法运行。
  • IfNotPresent(提供):仅当本地没有对应镜像时,才从目标仓库中下载。

默认的获取策略如下:
镜像标签为"latest",它的默认下载策略是Always。
镜像标签为自定义(不是默认的latest),它的默认下载策略是IfNotPresent。

//创建一个pod(定义某种策略):

[root@master yaml]# vim test-pod.yaml apiVersion: v1kind: Podmetadata:  name: test-podspec:  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 wideNAME       READY   STATUS    RESTARTS   AGE     IP           NODE     NOMINATED NODE   READINESS GATEStest-pod   1/1     Running   0          7m55s   10.244.2.2   node02              
//以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.yamlapiVersion: v1kind: Podmetadata:  name: mynginx  labels:                           #定义标签与servic相关联    test: mywebspec:  restartPolicy: Never     #定义镜像重启策略为Never  containers:  - name: myweb    image: 172.16.1.30:5000/nginx:v1    imagePullPolicy: Never         #定义镜像下载策略为Never---apiVersion: v1kind: Servicemetadata:  name: mynginxspec:  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 createdservice/mynginx created

//查看pod当前状态:

查看pod信息可以看到镜像拉取失败,所以我们查看该pod的详细信息进行排查:
[root@master yaml]# kubectl describe pod mynginx

可以看到是策略的原因,Nerver策略只能从该节点的本地镜像进行下载,所以我们需要在该节点(node02)上将私有仓库中的镜像进行拉取到本地。

[root@node02 ~]# docker pull 172.16.1.30:5000/nginx:v1v1: Pulling from nginxDigest: sha256:189cce606b29fb2a33ebc2fcecfa8e33b0b99740da4737133cdbcee92f3aba0aStatus: Downloaded newer image for 172.16.1.30:5000/nginx:v1
//回到master,再次查看pod1是否运行:[root@master yaml]# kubectl  get pod -o wideNAME       READY   STATUS    RESTARTS   AGE     IP           NODE     NOMINATED NODE   READINESS GATESmynginx    1/1     Running   0          7m32s   10.244.2.4   node02              test-pod   1/1     Running   1          7h20m   10.244.2.3   node02              

2)测试pod重启策略:
我们模拟pod非正常退出

[root@master yaml]# vim nginx-pod1.yaml apiVersion: v1kind: Podmetadata:  name: mynginx  labels:    test: mywebspec:  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" deletedservice "mynginx" deleted[root@master yaml]# kubectl  apply -f  nginx-pod1.yaml pod/mynginx createdservice/mynginx created

PS:因为在pod的文件中设置了pod的重启策略为Never,所以在无法修改策略的情况下,需要将该pod删除,重新执行yaml文件生成新的pod。

//第一次查看pod状态:

看到新的pod再node01节点上,所以我们还需再node01上将镜像拉取到本地。

[root@node01 ~]# docker pull 172.16.1.30:5000/nginx:v1v1: Pulling from nginxDigest: sha256:189cce606b29fb2a33ebc2fcecfa8e33b0b99740da4737133cdbcee92f3aba0aStatus: 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" deletedservice "mynginx" deleted[root@master yaml]# kubectl apply -f  nginx-pod1.yaml pod/mynginx createdservice/mynginx created
查看pod状态(失败):[root@master yaml]# kubectl  get pod -o wideNAME      READY   STATUS              RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATESmynginx   0/1     RunContainerError   3          55s   10.244.2.8   node02              

[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" deletedservice "mynginx" deletedk[root@master yaml]# kubectl  apply -f  nginx-pod1.yaml pod/mynginx createdservice/mynginx created
//查看pod是否恢复正常运行:(正常运行)[root@master yaml]# kubectl  get pod -o wideNAME      READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATESmynginx   1/1     Running   0          71s   10.244.1.8   node01              

5) 查看servie信息,验证nginx的web界面能否正常访问:

[root@master yaml]# kubectl  get svc  mynginx NAME      TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGEmynginx   NodePort   10.101.131.36           8080:30000/TCP   4m23s

-------- 本文至此结束,感谢阅读 --------

镜像 策略 状态 容器 运行 仓库 也就是 信息 文件 对象 节点 字段 端口 规则 成功 也就是说 原因 标签 控制 生成 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网购网络安全案例及分析报告 fiery服务器色彩管理 数据库三级模式结构说法正确 潍坊平台软件开发外包公司 网络技术服务中心工作职责 天猫精灵显示服务器连接失败 金沙县委网络安全 怎么样清空表格数据库 杭州前端软件开发要多少钱 深圳电脑软件开发哪家实惠 软件开发是一项系统性的工程 江阴华硕服务器维修中心热线 巅峰网络技术研发工作室 杭州支付宝网络技术有限公司 数据库 vs 版本 AMG网络技术 软件开发后端一小时多少钱 数据库2005环境搭建 数据库授权语句的姓名加单引号吗 迷你世界切换服务器有什么好处 重庆c语言软件开发哪家实惠 友人牌串口服务器电源线 网络安全等保三级在哪办理 太原服务器内存回收 进入服务器显示启动方式不对 网络安全知识竞赛证书保存不了 华为服务器员工薪资多少 小程序云开发要先创建数据库吗 wind数据库上市公司年报 山西网络技术转让概况
0