Kubernetes-Pod

Kubernetes-Pod

基本概念

Pod是Kubernetes中最小的单元,他由一组、一个或多个容器组成,每个Pod还包含了一个Pause容器,Pause容器是Pod的父容器,主要负责僵尸进程的回收管理,
通过Pause容器可以使用一个Pod里面的多个容器共享存储、网络、PID、IPC等。

存在意义

* 创建容器使用docker,一个docker对应一个容器,一个容器运行一个进程
* pod是多线程,运行多个应用程序(一个pod中有多个docker,一个docker运行一个应用程序)
* pod存在亲密性
* 两个应用之间进行交互
* 网络之间调用
* 两个应用需要频繁调用

实现机制

* 共享网络:通过Pause容器,把其他业务容器加入到Pause容器中,让所有业务容器在同一个名称空间中,实现网络共享
* 共享存储:映入数据卷概念Vloume,使用数据卷进行持久化存储

Pod定义

apiVersion: v1 # 必选,API的版本号
kind: Pod      # 必选,类型Pod
metadata:      # 必选,元数据
  name: nginx  # 必选,符合RFC 1035规范的Pod名称
  namespace: default  # 可选,Pod所在的命名空间,不指定默认为default,可以使用-n指定namespace
  labels:      # 可选,表现选择器,一般用于过滤和区分Pod
    app: nginx
    role: frontend  # 可以写多个
  annotations: # 可选,注释列表,可以写多个
    app: nginx
  spec:  # 必选,用于定义容器的详细信息
    initContainers:  # 初始化容器,在容器启动之前执行一些初始化操作
    - command:
      - sh
      - -c
      - echo "I am InitContainer for init some configuration"
      image: busybox
      imagePullPolicy: IfNotPresent
      name: init-container
    containers:   # 必选,容器列表
    - name: nginx # 必选,符合RFC 1035规范的容器名称
      image: nginx:latest  # 必选,容器所用的镜像的地址
      imagePullPolicy: Always  # 可选,镜像拉取策略
      command:  #可选,容器启动执行的命令
      - nginx
      - -g
      - "daemon off;"
      workingDir: /usr/share/nginx/html  # 可选,容器的工作目录
      volumeMounts:  # 可选,存储卷配置,可以配置多个
      - name: webroot  # 存储卷名称
        mountPath: /usr/share/nginx/html  # 挂载目录
        readOnly: true # 只读
      ports:  # 可选,容器需要暴露的端口号列表
      - name: http  # 端口名称
        containerPort: 80  # 端口号
        protocol: TCP  # 端口协议,默认TCP
      env:  # 可选,环境变量配置列表
      - name: TZ  # 变量名
        value: Asia/Shanghai  # 变量的值
      - name: LANG
        value: en_US.utf8
      resources:   # 可选,资源限制和资源请求限制
        limits:    # 最大限制设置
          cpu: 1000m
          memory: 1024Mi
        requests:  # 请求启动所需的资源
          cpu: 100m
          memory: 512Mi
      startupProbe:  # 可选,检测容器内进程是否完成启动。注意三种检查方式只能同时使用一种
        httpGet:  # httpGet 检测方式,生产环境建议使用httpGet实现接口级健康检查,健康检查由应用程序提供
          path: / # 检查路径
          port: 80 # 监控端口
      redinessProbe: # 可选,健康检查。注意三种检查方式只能同时使用一种
        httpGet:  # httpGet 检测方式,生产环境建议使用httpGet实现接口级健康检查,健康检查由应用程序提供
          path: / # 检查路径
          port: 80 # 监控端口
      livenessProbe: # 可选,健康检查。注意三种检查方式只能同时使用一种
        exec:  # 执行容器命令检测方式
          command: 
          - cat
          - /health
        httpGet: # httpGet检测方式
          path: /_helth # 检查路径
          port: 8080 
          httpHeaders: # 检查的请求头
          - name: end-user
            value: Jason
        tcpSocket:  # 端口检测方式
          port: 80
        initiaDelaySeconds: 60  # 初始化时间
        timeoutSeconds: 60  # 超时时间
        periodSeconds: 5    # 检测间隔
        successThreshold: 1 # 检查成功2次表示就绪
        failureThreshold: 2 # 检测失败1次表示未就绪
      lifecycle:
        postStart: # 容器创建完成后执行的指令,可以是exec httpGet TcpSocket
          exec:
            command:
            - sh
            - -c
            - 'mkdir /data'
        preStop:
          httpGet:
            path: /
            port: 80
          exec:
           command:
           - sh
           - -c
           - sleep 9
    restartPolicy: Always   # 可选,默认为Always
    nodeSelector:  # 可选,指定node节点
      region: subnet7
    imagePullSecrets:  # 可选,拉取镜像使用的secret,可以配置多个
    - name: default-dockercfg-86258
    hostNetwork: false  # 可选,是否为主机模式,如是,会占用主机端口
    volumes:  # 共享存储卷列表
    - name: webroot  # 名称,与上述对应
      emptyDir: {}  # 挂载目录
      hostPath:  # 挂载本机目录
        path: /etc/hosts

Pod拉取策略

imagePullPolicy: Always
 * IfNotPresent: 默认值,镜像在宿主机上不存在时才拉取
 * Always: 每次创建 Pod 都会重新拉取一次镜像
 * Never: Pod 永远不会主动拉取镜像

Pod资源限制

resource:
  requests: #调度
    memory: "64Mi"
    cpu: "250m"
  limits: #最大
    memory: "128Mi"
    cpu: "500m"

Pod重启策略

restartPolicy: Never
 * Always: 当容器终止退出后,总是重启容器,默认策略
 * OnFailurF: 当容器异常退出(退出状态码非0)时,才重启容器
 * Never:当容器终止退出,从不重启容器

Pod探针

StartProbe: # 1.16版本后新加的探测方式,用于判断容器内应用程序是否已经启动。如果配置了startupProbe,就会禁止其他的探测,知道它成功为止,成功后将不在进行探测。
livenessProbe(存活检查)  # 用于探测容器是否运行,如果探测失败,kubelet会根据配置的重启策略进行相应的处理。若没有配置该探针,默认就是success。
readinessProbe(就绪检查) # 一般用于探测容器内的程序是否健康,它的返回值如果为success,那么就代表这个容器已经完成启动,并且程序已经是可以接受流量的状态。

探测方式

Exec        # 在容器内执行shell命令,返回状态码是0为成功
TcpSocket   # 通过TCP连接检查容器内的端口是否是通的,如果通的就认为容器健康
HttpGet	    # 通过应用程序暴露的API地址来检查程序是否正常的,如果状态码为200~400之间,则认为容器健康
参数
initialDelaySeconds: 60      # 初始化时间
timeoutSeconds: 2            # 超时时间
periodSeconds: 5             # 检测间隔
successThreshold: 1          # 检查成功为2次表示就绪
failureThreshold: 2          # 检测失败1次表示未就绪

Pod调度

调度过程

master节点:
1、用户使用create yaml创建pod,请求给apiserver,apiserver将yaml中的属性信息(metadata)写入etcd中;
2、apiserver触发watch机制准备创建pod,信息转发给scheduler调度器,scheduler使用调度算法选择node,调度将node信息给apiserver,apiserver将绑定的node信息写入etcd中;

node节点:
1、apisserver又通过watch监听机制,调用kubelet,指定pod信息,触发docker run命令创建容器;
2、node节点创建好pod之后反馈给kubelet,kubelet又将pod的状态信息给apiserver,apiserver又将pod的状态信息写入etcd中;
posted @ 2021-08-30 21:52  Cai_HL  阅读(134)  评论(0编辑  收藏  举报
>