1. pod

1.1. pod概念

pod是k8s系统中可以创建的管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在k8s上运行容器化应用的资源对象,其他的资源对象都是用来支撑或者扩展pod对象功能,比如控制器对象是用来管控Pod对象的,Service或者Ingress资源对象是用来暴露Pod引用对象,PersistentVolume资源对象是用来为Pod提供存储等等, k8s不会直接处理容器,而是Pod,Pod是由一个或多个container组成
pod是kubernetes的最重要概念,每一个Pod都有一个特殊的被称为”根容器”的Pause容器。Pause容器对应的镜像属于Kubernetes平台的一部分,除了Pause容器,每个Pod还包含一个或多个紧密相关的用户业务容器

  1. 最小部署的单元
  2. 包含多个容器(一组容器的集合)
  3. 一个pod中容器共享网络命名空间
  4. pod是短暂的

    1.2. pod存在意义

  5. 创建容器使用docker,一个docker对应一个容器,一个容器有进程,一个容器运行一个应用程度

  6. pod是多进程涉及,运行多个应用程序(一个pod有多个容器,一个容器里面运行一个应用程序)
  7. pod存在为了亲密性应用
  • 两个应用之间进行交互
  • 网络之间调用
  • 两个应用需要频繁调用

1.3. pod实现机制

  1. 共享网络

通过Pause容器,把其他业务容器加入到Pause容器里面,让所有业务容器在同一个名称空间namespace中,可以实现网络共享

  1. 共享存储

引入数据卷概念Volumn,使用数据卷进行持久化存储

1.4. pod镜像拉取策略

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: mypod
  5. spec:
  6. containers:
  7. - name: nginx
  8. image: nginx:1.14
  9. imagePullPolicy: Always

imagePullPolicy 拉取策略选择

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

1.5. pod资源的限制

apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: db
    image: mysql
    env:
    - name: MYSQL_ROOT_PASSWROD
      value: "password"
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

容器起来的最小资源限制

  • spec.containers[].resources.limits.cpu
  • spec.containers[].resources.limits.memory

容器最大资源限制

  • spec.containers[].resources.requests.cpu
  • spec.containers[].resources.requests.memory

1.6. pod重启机制

apiVersion: v1
kind: pod
metadata:
  name: dns-test
spec:
  containers:
  - name: busybox
    image: busybox:1.28.4
    args:
    - /bin/sh
    - -c
    - sleep 36000
  restartPolicy: Never

restartPolicy 重启策略

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

1.7. Pod的健康检查

  • 容器检查
  1. linenessProbe 存活检查

如果检查失败,将杀死容器,根据Pod的restartPolicy来操作.

  1. readinessProbe 就绪检查

如果检查失败,Kubernetes会把Pod从service endponits中剔除

  • probe支持以下三种检查方法
  1. httpGet

发送HTTP请求,返回200—400范围状态码为成功

  1. exec

执行shell命令返回状态码是0为成功

  1. tcpSocket

发送TCP Socket建立成功

  • 示例:
    apiVersion: v1
    kind: Pod
    metadata:
    labels:
      test: liveness
    name: liveness-exec
    spec:
    containers:
    - name: liveness
      image: busybox
      args:
      - /bin/sh
      - -c
      - touch /tmp/healthy ; sleep 30; rm -fr /tmp/healthy
      livenessProve:
        exec:
          command:
          - cat
          - /tmp/healthy
        initialDelaySeconds: 5
        periodSeconds: 5
    

1.8. 创建Pod的流程

image.png

  • master节点

create pod —-> apiserve —-> etcd
scheduler —> apiserver —> etcd —> 调度算法,把pod调度某个node节点上

  • node节点

kuberlet —> apiserver —> 读取etcd拿到分配给当前节点pod—> docker创建容器

1.9. 影响Pod调度的属性

1.9.1. Pod资源限制

resources:
  requests:
    memory: "64Mi"
    cpu: "250m"

根据request找到足够node节点进行调度

1.9.2. 节点选择器标签

  • 首先对节点创建标签

kubectl label node1 env_role=dev

  • 资源创建节点选择器标签

    spec:
    nodeSelector:
      env_role: dev
    

    1.9.3. 节点亲和性

  • 节点亲和性 nodeAffinity 和 nodeSelector 基本一样,根据节点上的标签约束来绝对Pod调度到哪些节点上

硬亲和度:
约束条件必须满足 requireDuringSchedulingIgnoredDuringExecution
软亲和度:
约束条件尝试满足,不保证 preferredDuringSchedulingIgnoredDuringExecution

其中 operator参数有 In NotIn Exists Gt Lt DoesNotExists
示例:

apiVersion: v1
kind: pod
metadata:
  name: with-node-affinity
spec:
  affinity:
    nodeAffinity:
      requireDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: env_role
            operator: In
            values:
            - dev
            - test
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: group
            operator: In
            values:
            - otherprod
  containers:
  - name: webdemo
    image: nginx

1.9.4. 污点和污点容忍

  1. 基本介绍

taint污点: 节点不做普通分配调度, 是节点属性
nodeSelector和nodeAffinity: Pod调度到某节点上, Pod属性, 调度的时候实现

  1. 场景
  • 专用节点
  • 配置特点硬件节点
  • 基于Taint驱逐
  1. 演示

    (1). 查看节点污点情况

    >  kubectl describe node k8smaster| grep Taint
    Taints:      node-role.kubernetes.io/master:NoSchedule
    

    污点值有三个:

    1. NoSchedule: 一定不被调度
    2. PreferNoSchdule: 尽量不被调度
    3. NoExcute: 不会调度,并且还会驱逐Node已有的Pod

    (2). 为节点添加污点

    kubectl taint node [node] key=value:污点值
    

    (3). 删除污点 “-“的符号

    kubectl taint node k8snode1 env_role:NoSchedule-
    
  2. 污点容忍

    即使节点添加了污点.pod定义了污点容忍, Pod也会调度到有污点的节点中

spec:
  tolerations:
  - key: "key"
    operator: "Equal"
    value: "value"
    effect: "NoSchedule"
  containers:
  - name: webdemo
    image: nginx

2. controller(控制器)

2.1. 什么是controller

在集群上管理和运行容器的对象

2.2. Pod和Controller关系

  • Pod是通过Controller实现应用的运维

比如伸缩或滚动升级等等操作是通过控制器来实现

  • Pod和Controller之间通过label标签建立关系 ,, selector与label

    2.3. deployment应用场景

  • 部署无状态应用 web服务或者微服务

  • 管理Pod和ReplicaSet
  • 部署,滚动升级等功能