第6章 K8s管理应用程序生命周期(下)

• Pod对象:

• 基本概念

• 存在的意义

• 资源共享实现机制

• 管理命令

• Pod设计思想

• 应用自修复(重启策略+健康检查)

• 环境变量

• Init container

• 静态Pod 

6.1Pod对象:基本概念

Pod是Kubernetes创建和管理的最小单元,一个pod由一个容器或多个容器组成,这些容器共享存储、网络。

6.1.1Pod特点:
  • 一个pod可以理解为是一个应用实例,提供服务
  • Pod中容器始终部署在一个Node节点上
  • Pod中容器共享网络,存储资源
  • Kubernetes直接管理pod,而不是容器

6.2  Pod对象:存在的意义  

6.2.1Pod主要用法:

1)      运行单个容器:最常见的用法,在这种情况下,可以将pod看做是单个容器的抽象封装

2)      运行多个容器:封装多个紧密耦合且需要共享自愿的应用程序  

6.2.2如果有这些需求,你可以运行多个容器:

1)      两个应用之间发生文件交互    

2)      两个应用需要通过127.0.0.1或者socket通信

3)      两个应用需要发生频繁的调用

6.3Pod对象:资源共享实例机制

 共享网络:将业务容器网络加入到"负责网络的容器"实现网络共享

 

 

共享存储: 容器通过数据卷共享数据    

 

6.3.1 Pod对象:共享网络/共享存储

(1)共享网络实例:

复制代码
apiVersion: v1
kind: Pod
metadata:
 labels:
  app: test
 name: pod-net-test
 namespace: default
spec:
 containers:
 - image: busybox
   name: test
   command: ["/bin/sh","-c","sleep 12h"]
 - image: nginx
   name: web
复制代码

结果:

复制代码
[root@k8s-master1 network-gongxiang]# kubectl exec -it pod-net-test -c web  -- sh
# cd /usr/share/nginx/html
# ls
50x.html  index.html
# echo web>index.html    
# exit  
[root@k8s-master1 network-gongxiang]# kubectl exec -it pod-net-test -c test -- sh
/ # wget 127.0.0.1:80
Connecting to 127.0.0.1:80 (127.0.0.1:80)
saving to 'index.html'
index.html           100% |********************************************************|     4  0:00:00 ETA
'index.html' saved
/ # ls
bin         etc         index.html  root        tmp         var
dev         home        proc        sys         usr
/ # cat index.html
复制代码

(2)共享存储示例

复制代码
apiVersion: v1
kind: Pod
metadata:
 labels:
  app: test
 name: pod-volume-test
 namespace: default
spec:
 containers:
 - image: busybox
   name: test
   command: ["/bin/sh","-c","sleep 12h"]
   volumeMounts: # 数据卷挂载
   - name: log # 指定挂载的数据卷名称
     mountPath: /data # 数据卷挂载到容器中的路径
 - image: nginx
   name: web
   volumeMounts:
   - name: log
     mountPath: /usr/share/nginx/html
 volumes: # 定义数据卷
 - name: log # 数据卷名称
   emptyDir: {} # 数据卷类型
复制代码

结果:

复制代码
kubectl  apply -f pod-volume-test.yaml
kubectl exec -it pod-volume-test -c web -- sh
[root@k8s-master1 network-gongxiang]# kubectl  get pods 
NAME              READY   STATUS    RESTARTS   AGE
pod-volume-test   2/2     Running   0          4m51s
[root@k8s-master1 network-gongxiang]# 
[root@k8s-master1 network-gongxiang]# 
[root@k8s-master1 network-gongxiang]# kubectl exec -it pod-volume-test -c test -- sh
/ # cd /data/
/data # ls
/data # touch a.txt
/data # exit
[root@k8s-master1 network-gongxiang]# kubectl exec -it pod-volume-test -c web -- sh
# cd /usr/share/nginx/html/     
# ls 
a.    txt
# touch b.txt 
# exit
[root@k8s-master1 network-gongxiang]# kubectl exec -it pod-volume-test -c test -- sh
/ # cd /data
/data # ls
a.txt  b.txt
复制代码

6.4pod对象:管理命令

复制代码
创建Pod:
kubectl apply -f pod.yaml
或者使用命令:kubectl run nginx --image=nginx
查看Pod:
kubectl get pods
kubectl describe pod <Pod名称>
查看日志:
kubectl logs <Pod名称> [-c CONTAINER]
kubectl logs <Pod名称> [-c CONTAINER] -f
进入容器终端:
kubectl exec <Pod名称> [-c CONTAINER] -- bash
删除Pod:
kubectl delete pod <Pod名称>
复制代码

定义pod

复制代码
apiVersion: v1
kind: Pod
metadata:
 name: my-pod
spec:
 containers:
 - name: container1
   image: nginx 
 - name: container2
   image: centos
复制代码

6.5 Pod对象:重启策略和健康检查(应用自修复)

6.5.1重启策略(restartPolicy):
  • Always:当容器终止退出后,总是重启容器,默认策略。  
  • OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。
  • Never:当容器终止退出,从不重启容器。
6.5.2健康检查有以下两种类型:
  • StartupProbe:(主要应用容器启动慢的场景)

k8s1.16版本后新加的探测方式,用于判断容器内应用程序是否已经启动。如果配置了startupProbe,

就会先禁止其他的探测,直到它成功为止,成功后将不在进行探测。

  • livenessProbe(存活检查):用于探测容器是否运行,如果探测失败,kubelet会根据配置的重启策略进行相应的处理。若没有配置该探针,默认就是success。(根据Pod的restartPolicy来操作。)
  • readinessProbe(就绪检查):一般用于探测容器内的程序是否健康,他的返回值如果为success,那么就代表这个容器已经完成启动,并且程序已经是可以接受流量的状态。如果检查失败,Kubernetes会把Pod从service endpoints中剔除。

    

6.5.3支持以下三种检查方法:

• httpGet:通过应用程序暴露的API地址来检查程序是否是正常的(发送HTTP请求),返回200-400范围状态码为成功。

• exec:执行Shell命令返回状态码是0为成功。

• tcpSocket:发起TCP Socket建立成功。

6.5.4 探针检查参数配置

 InitialDelaySeconds:60 #初始化时间

timeoutSeconds:2 #超时时间
PeriodSeconds:5 #检测间隔
SuccessThreshold:1 #检查成功为1次表示就绪
FailureThreshold:2 #检测失败2次就表示外就绪

PostStart:#容器创建完成后执行的指令,可以是exec,httpGet,TCPSocket

 

 

案例:

复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: pod-check
  name: pod-check
spec:
  replicas: 3
  selector:
    matchLabels:
      app: pod-check
  strategy: {}
  template:
    metadata:
      labels:
        app: pod-check
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
        livenessProbe:
          httpGet:
            path: /index.html
            port: 80
          initialDelaySeconds: 30 #启动容器后多少秒健康检查
          periodSeconds: 10 #以后每间隔多少秒检查一次
        readinessProbe:
          httpGet:
            path: /index.html
            port: 80
          initialDelaySeconds: 10
          periodSeconds: 10
status: {}
复制代码

service:

复制代码
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: pod-check
  name: pod-check
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: pod-check
  type: NodePort
复制代码

验证:livenessProbe

Kubectl  logs  pod-check-7f9bb5c47b-2bzw4 -f

验证:readinessProbe

6.6Pod的环境变量

创建pod时,可以为其下的容器设置环境变量

应用场景:

  • 容器内应用程序获取pod信息
  • 容器内应用程序通过用户定义的变量改变默认行为

变量值几种定义方式:

  • 自定义变量值
  • 变量值从pod属性获取
  • 变量值从Secret、ConfigMap获取
复制代码
apiVersion: v1
kind: Pod
metadata:
 name: pod-envars
spec:
 containers:
  - name: test
    image: busybox
    command: [ "sh", "-c", "sleep 36000"]
    env:
      # 变量值从Pod属性获取
     - name: MY_NODE_NAME
       valueFrom:
        fieldRef:
          fieldPath: spec.nodeName
     - name: MY_POD_NAME
       valueFrom:
        fieldRef:
          fieldPath: metadata.name
     - name: MY_POD_NAMESPACE
       valueFrom:
        fieldRef:
          fieldPath: metadata.namespace
     - name: MY_POD_IP
       valueFrom:
         fieldRef:
           fieldPath: status.podIP
     - name: ABC # 自定义变量值
       value: "123456"
View Code
复制代码

6.7Pod对象:Init Container

Init Container:顾名思义,用于初始化工作,执行完就结束,可以理解为一次性任务。
•    支持大部分应用容器配置,但不支持健康检查
•    优先应用容器执行 
应用场景:
•    环境检查:例如确保应用容器依赖的服务启动后再启动应用容器
•    初始化配置:例如给应用容器准备配置文件

6.7.1 Pod对象:Init Container案例:

示列:部署一个web网站,网站程序没有打到镜像中,而是希望从代码仓库中动态拉取到应用容器中。

 

 

复制代码
apiVersion: v1
kind: Pod
metadata:
 name: init-demo
spec:
 initContainers:
 - name: download
   image: busybox
   command:
   - wget
   - "-O"
   - "/opt/index.html"
   - http://www.ctnrs.com
   volumeMounts:
   - name: wwwroot
     mountPath: "/opt"
 containers:
 - name: nginx
   image: nginx
   ports:
   - containerPort: 80
   volumeMounts:
   - name: wwwroot
     mountPath: /usr/share/nginx/html
 volumes:
 - name: wwwroot
   emptyDir: {}
复制代码

6.8Pod对象,Init Container

因此,Pod中会有这几种类型的容器:
• Infrastructure Container:基础容器
• 维护整个Pod网络空间
• InitContainers:初始化容器
• 先于业务容器开始执行
• Containers:业务容器
• 并行启动

6.9 Pod对象:静态Pod

静态Pod特点:

1)      Pod由特定节点上的kubelet管理

2)      不能使用控制器

3)      Pod名称标识当前节点名称

在kubelet配置文件启用静态pod的参数:

staticPodPath: /etc/kubernetes/manifests

注意:将部署的Pod yaml放到该目录会由kubelet自动创建

复制代码
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: static-pod
  name: static-pod
spec:
  containers:
  - image: nginx
name: static-pod
#kubectl run static-pod --image=nginx --dry-run=client -o yaml>static-pod.yaml
复制代码
posted @   逆风飞翔的博客  阅读(16)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示