深入理解pod对象基本管理
1407字约5分钟
2024-09-29
Pod基本概念
Pod是Kubernetes创建和管理的最小单元,一个Pod由一个容器 或多个容器组成,这些容器共享存储、网络。

Pod特点:
- 一个Pod可以理解为是一个应用实例,提供服务 
- Pod中容器始终部署在一个Node上 
- Pod中容器共享网络、存储资源 
- Kubernetes直接管理Pod,而不是容器 
Pod存在的意义
Pod主要用法:
- 运行单个容器:最常见的用法,在这种情况下,可以将Pod看做是单个容器的抽象封装 
- 运行多个容器:封装多个紧密耦合且需要共享资源的应用程序 
如果有这些需求,你可以运行多个容器:
- 两个应用之间发生文件交互 
- 两个应用需要通过127.0.0.1或者socket通信 
- 两个应用需要发生频繁的调用 
Pod资源共享实现机制

共享网络:将业务容器网络加入到“负责网络的容器”实现网络共享
测试验证是否共享网络:
vim pod-net.yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: web
    image: nginx
  - name: test
    image: busybox
    command: ["/bin/sh","-c","sleep 360000"]kubectl apply -f pod-net.yaml 
kubectl exec -it my-pod -c test -- sh   #进入tets容器验证是否能访问nginx
wget 127.0.0.1:80 
cat index.html
共享存储:容器通过数据卷共享数据
测试验证是否共享存储:
vim pod-vol.yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-pod2
spec:
  containers:
  - name: web2
    image: nginx
    volumeMounts:
    - name: log
      mountPath: /data
  - name: test2
    image: busybox
    command: ["/bin/sh","-c","sleep 360000"]
    volumeMounts:
    - name: log
      mountPath: /data
  volumes:
  - name: log
    emptyDir: {}kubectl apply -f pod-vol.yaml 
kubectl exec -it my-pod2 -c test2 -- sh     #进入test容器在/data目录下创建文件
cd /data
touch 1.txt
kubectl exec -it my-pod2 -c web2 -- bash   #进入web2容器/data目录下查看是否有1.txt
cd /data
lsPod管理命令
创建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名称>
重启策略+健康检查(应用自修复)

重启策略:
- Always:当容器终止退出后,总是重启容器,默认策略。 
- OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。 
- Never:当容器终止退出,从不重启容器 
健康检查有以下两种类型:
- livenessProbe(存活检查):如果检查失败,将杀死容器,根据Pod 的restartPolicy来操 作。 
- readinessProbe(就绪检查):如果检查失败,Kubernetes会把 Pod从service endpoints中剔除。 
- startupProbe(启动检查): 
支持以下三种检查方法:
- httpGet:发送HTTP请求,返回200-400范围状态码为成功。 
- exec:执行Shell命令返回状态码是0为成功。 
- tcpSocket:发起TCP Socket建立成功 
参考链接:https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
测试验证:
vim pod-check.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: pod-check
spec:
  containers:
  - name: liveness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5
    readinessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5     ##启动容器后多少秒健康检查
      periodSeconds: 5           ##以后间隔多少秒检查一次kubectl apply -f pod-check.yaml
kubectl expose pod pod-check --port 80 --target-port=80
kubectl get pod -w           #实时验证pod的重启次数是否增加
kubectl get endpoints -w     #实时验证pod是否被service剔除
kubectl describe pod pod-check  #查看pod的变化信息

示例:端口探测
apiVersion: v1
kind: Pod
metadata:
  name: probe-demo
  namespace: demo
spec:
  containers:
  - name: web
    image: nginx
    ports:
    - containerPort: 80
    readinessProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 30 #启动容器后多少秒健康检查
      periodSeconds: 10 #以后间隔多少秒检查一次
    livenessProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 30 #启动容器后多少秒健康检查
      periodSeconds: 10 #以后间隔多少秒检查一次注:livenessProbe与readinessProbe配置一样。
示例:执行Shell命令
livenessProbe:
  exec:
    command:
    - cat
    - /tmp/healthy示例:HTTP请求
livenessProbe:
  httpGet:
    path: /healthz
    port: 8080
    httpHeaders:
    - name: Custom-Header
      value: Awesome环境变量
变量值几种定义方式:
- 自定义变量值 
- 变量值从Pod属性获取 
- 变量值从Secret、ConfigMap获取 
示例
vim pod-var.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-envars
spec:
  containers:
    - name: test
      image: busybox
      command: [ "sh", "-c", "sleep 36000"]
      env:
      - 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"kubectl apply -f pod-var.yaml 
kubectl exec -it pod-envars -- sh验证:

Init Container
Init Container:顾名思义,用于初始化工作,执行完就结束,可以理解为一次性任务。
- 支持大部分应用容器配置,但不支持健康检查 
- 优先应用容器执行 
应用场景:
- 环境检查:例如确保应用容器依赖的服务启动后再启动应用容器 
- 初始化配置:例如给应用容器准备配置文件 
示例:
部署一个web网站,网站程序没有打到镜像中,而是希望从代码 仓库中动态拉取放到应用容器中。
vim pod-init.yaml
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: {}kubectl apply -f pod-init.yaml 
kubectl get pod 
kubectl describe pod init-demo 
kubectl exec -it init-demo -- bash验证:

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