pod的基本概念

pod是一个逻辑抽象概念,是k8s创建和管理的额最小单元,一个pod由一个容器或者多个容器组成

pod特点:

  • 一个pod可以理解为一个应用实例,提供服务
  • pod中容器始终部署在一个node上
  • pod中容器共享网络,存储资源

pod存在的意义

主要用法:

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

  • 运行多个容器:(sidecar),通过在pod中定义专用容器,来执行主业务容器需要的辅助工作,这样的好处是将辅助功能同主业务容器解耦,实现独立发布和能力重用

    应用场景:日志收集,应用监控

容器之间资源共享的实现

共享网络:

将业务容器网络加入到“负责网络的容器”实现网络共享 infra container(pause)

共享存储:

容器通过数据卷共享网络

pod中常用的管理命令

创建pod

kubectl apply -f pod.yaml

查看pod

kubectl get pods
kubectl describe pod <pod名称>

查看容器日志

kubectl logs <pod名称> [-c CONTAINER] -f

#-f 动态显示日志
#-c 多个容器时显示指定容器的日志

进入容器终端

kubectl exec -it <pod名称> [-c CONTAINER] -- bash

#-c 进入到指定的容器中

删除pod

kubectl delete pod <pod名称>

容器的健康检查

Pod处于running状态并不能说明应用工作正常,因此,可以为容器定义健康检查(探针),周期性检查应用是否“真正”提供服务,在发生故障时采取合适的措施。

健康检查有以下三种类型:

  • livenessProbe(存活检查):如果检查失败,将杀死容器,根据Pod的restartPolicy来操作。
  • readinessProbe(就绪检查):如果检查失败,kubernetes会把Pod从service endpoints中剔除。
  • startupProbe(启动检查):检查成功才由存活检查接手,用于保护慢启动容器

支持以下三种检查方法:

  • httpGet发送HTTP请求,返回200-400范围状态码为成功。
  • exec 执行shell命令返回状态码是0为成功。
  • tcpSocket:发起TCP Socket建立成功。

示例:

apiVersion: v1
kund: Pod
metadata:
  name: probe-demo
spec:
  containers:
  - name: web
    image: nginx
    livenessProbe:  #存活检查,重启容器
      httpGet:
      path: /
      port: 80
    initialDelaySeconds: 5  #启动容器后多少秒健康检查
    periodSeconds: 10  #以后每间隔多少秒检查一次
  readinessProbe: #就绪检查,从Service中提出容器
    httpGet:
    path: /
    port: 80
  initialDelaySeconds: 5
  periodSeconds: 10

容器的环境变量

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

应用场景:

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

变量值几种定义的方式:

  • 自定义变量值
  • 变量值从Pod属性获取
  • 变量值从Secret、ConfigMap获取
apiVersion: v1
kind: Pod
metadata:
  name: pod-envars
spec:
  containers:
  - name: test
    images: busybox
    command: ["sh","-c","sleep 36000"]
    env:
    # 变量值从pod属性获取
      - name: MY_NODE_NAME
        valueFrom:
          fieldRef:
            fieldPath: spec.nodeName
      - name: MY_POD_NAME
        valueFrom:
          filedRef:
            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"

初始化容器(init container)

init container:顾名思义,用于初始化工作,执行完就结束,可以理解为一次性任务。

  • 支持大部分应用容器配置,但不支持健康检查
  • 优先应用容器执行

应用场景

  • 环境检查: 例如确保应用容器依赖的服务启动后再启动容器
  • 初始化检查:例如给应用容器准备配置文件

因此,pod中也会有这几种类型的容器:

  • infrastructure Container: 负责pod网络(pause镜像)
  • initContainers: 初始化容器,先于业务容器启动并完成
  • Containers: 应用容器,当配置多个容器时并行启动

静态pod

静态pod特点:

  • pod由特定节点上的kubelet管理
  • 不能使用容器
  • Pod名称标识当前节点名称

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

vi /var/lib/kubectl/config.yaml
...

staticPodPath: /etc/kubernetes/manifests

...

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

同时也是master节点主要组件yaml文件存放目录

/etc/kubernetes/manifests

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐