Myluzh Blog

K8S笔记-Pod(实现机制、镜像拉取、健康检查、调度策略)

发布时间: 2023-8-23 文章作者: myluzh 分类名称: Kubernetes 朗读文章


0x01 Pod概述

Pod 是k8s 系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在 k8s 上运行容器化应用的资源对象,其他的资源对象都是用来支撑或者扩展 Pod 对象功能的,比如控制器对象是用来管控 Pod 对象的,Service 或者Ingress 资源对象是用来暴露 Pod 引用对象的,PersistentVolume 资源对象是用来为 Pod提供存储等等,k8s 不会直接处理容器,而是Pod,Pod 是由一个或多个 container 组成。

Pod是Kubernetes的最重要概念,每一个Pod都有一个特殊的被称为”根容器“的Pause容器。Pause 容器对应的镜像属于Kubernetes平台的一部分,除了Pause容器,每个Pod还包含一个或多个紧密相关的用户业务容器。


0x02 Pod存在的意义

(1)创建容器使用docker,一个docker对应市一个容器,一个容器有进程,一个容器运行一个应用程序。

(2)Pod是多进程设计,运行多个应用程序。

  • 一个Pod有多个容器,一个容器里面运行一个应用程序

(3)Pod存在为了亲密性应用。

  • 两个应用之间进行交互
  • 两个应用之间调用
  • 两个应用直接需要频繁调用


0x03 Pod实现机制

(1)共享网络

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

(2)共享存储

  • 引入数据卷根念volume.使用数据卷进行持久化存储。


0x04 Pod镜像拉取策略

apiVersion: v1
kind: Pod
metadata:
 name: mypod
spec:
 containers:
   - name: nginx
     image: nginx:1.14
     imagePullPolicy: Alway

IfNotpresent:默认值,镜像在宿主机上不存在时才拉取。

Always:每欧创建 Pod 都会重新拉取一次镜像Pod。

Never:永远不会主动拉取这个镜像。


0x05 Pod资源限制

requests:调度大小

limits:最大大小

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

Pod和Container的资源请求和限制:

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


0x06 Pod重启机制

restartPolicy: Never

Always:当容器终止退出后,总是重启容器,默认策略。

OnFailure:当容器异常退出(退出状态码非0时),才重启容器。

Never:当容器终止退出,从不重启容器。


0x07 Pod健康检查

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

两种检查机制:

(1)livenessProbe(存活检查):如果检查失败,将乐死容器,根据Pod的restartPolicy来操作。

(2)readinessProbe(就绪检查):如果检查失败,Kubernetes会把Pod从service endpoints中剔除。

三种检查方法:

(1)httpget:发送HTTP请求,返回200-400范围状态码为成功。

(2)exec:执行she11命令返回状态码是0为成功。

(3)tcpsocket:发起TCP Socket建立成功。


0x08 Pod调度策略

创建pod流程图:

点击查看原图

影响pod调度的属性:

(1)资源限制

根据request找到足够性能的node节点进行调度。

(2)节点选择器

apiVersion: v1
kind: Pod
metadata:
  name: pod-example
spec:
  nodeSelector:
    env_role: dev #选择env_role标签为dev的
  containers:
  - name: nginx
    image: nginx:1.15

给node1节点打上标签

kubectl label node node1 env_role dev

查看node1节点标签

kubectl get nodes node1 --show-labels

(3)节点亲和性

节点亲和性( nodeAffinity)和之前节点选择器(nodeSelector)基本一样,根据节点上标签约束来决定Pod调度到哪些节点上。

亲和性分为两种:硬亲和性(约束必须满足),软亲和性(尝试满足)。

常用的操作符为 In:在里面,NotIn:不在里面,Exists :存在,DoesNotExists:不存在,Gt :大于,Lt:小于。

apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  containers:
  - name: webdemo
    image: nginx
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:  # 硬亲和性
        nodeSelectorTerms:
        - matchExpressions:
          - key: eny role
            operator: In
            values:
            - dey
      preferredDuringSchedulingIgnoredDuringExecution:  # 软亲和性
      - weight: 1
        preference:
          matchExpressions:
          - key: group
            operator: In
            values:
            - otherprod


0x09 Pod污点与容忍

Taint污点:节点不做普通分配调度,是节点属性。

(1)添加污点

# kubectl taint node [nodeName] key=value:污点值
[root@master ~] kubectl taint node 172.16.10.20 node-role.kubernetes.io/master=true:NoSchedule

# 污点值有三个
# NoSchedule:一定不被调度
# PreferNoSchedule:尽量不被调度
# NoExecute:不会调度,并且还会驱逐Node已有Pod

(2)删除污点

# kubectl taint node [nodeName] key=value:污点值
[root@master ~] kubectl taint node 172.16.10.20 node-role.kubernetes.io/master=true:NoSchedule-

(3)查看污点情况

[root@master ~] kubectl describe node 172.16.10.20 | grep Taint
Taints:             node-role.kubernetes.io/master=true:NoSchedule

(4)污点容忍

设置污点容忍后,就算节点是NoSchedule也可以会被调度到。在yaml Deployment 中设置。

#这里的key跟value跟添加污点时候的key value值要一样
spec:
  tolerations:
  - key: "key"
    operator: "Equal"
    value: "value"
    effect: "NoSchedule


标签: k8s pod

发表评论