前言:

参考k8s教程由浅入深

一、Pod概述:

定义:

  • k8s系统中可以创建、管理的最小单元
  • 资源对象模型中用户创建或部署的最小资源模型
  • k8s上运行容器化应用的资源对象
  • 其他资源作用是支持pod,如控制器是为了管控pod,Service和Ingress是为了暴露pod引用对象,PersistentVolume为pod提供存储
  • pod不是容器,是一个或多个容器组成。k8s不会直接操作容器
  • 一个pod中共享网络命名空间
  • pod是短暂的。每一个pod都有一个根容器,叫pause容器,还有用户自己创建的容器

二、pod存在意义:

  • 创建容器使用docker,一个docker对应一个容器,一个容器运行一个应用程序,对应一个进程
  • pod是多进程设计,运行多个应用程序
  • pod是为亲密性应用而存在的(两个应用频繁相互调用)

三、pod实现机制

1. docker之间相互隔离

实现机制:linux的namespace机制/cgroup

namespace:linux内核隔离内核资源的方式。通过namespace能让进行仅看到和自己进程相关的资源

cgroup:Linux下控制一个(或一组)进程的资源限制机制,可精细化的控制进程使用的cpu/内存

2.共享网络

前提条件:容器在同一个namespace下可以共享网络

实现机制:

a.默认创建根容器 pause(info容器)

b.后续创建的业务容器会加入info容器,使得业务容器与info容器在同一个namespace中,实现网络共享

3.共享存储

pod需要持久化的数据:日志数据、业务数据

实现机制:使用数据卷(Volume)进行持久化存储

多个pod将数据存储到Volume中,若node结点宕机,新建的镜像可以从数据卷中重新读取数据进行同步

apiVersion: apps/v1
kind: Pod
metadata:
  name: pod-test
spec:
  containers:
  - image: centos
    name: write
    command: ["bash","-c","for i in {1,100};do echo $i >> /data/hello;sleep 1;done"]
    # 挂载数据卷
    volumeMounts:
    - name: data
      mountPath: /data
  - name: read
    image: centos
    command: ["bash","-c","tail -f /data/hello"]
    # 挂载数据卷
    volumeMounts:
    - name: data
      mountPath: /data
# 定义数据卷
volumes:
- name: data
  emptyDir: {}

四、镜像拉取策略

apiVersion: apps/v1
kind: Pod
metadata:
  name: pod-test
spec:
  containers:
  - image: nginx:1.14
    name: nginx
    # 镜像拉取策略
    imagePullPolicy:Always

如上,imagePullPolicy为镜像拉取策略。拉取策略分为:

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

五、pod资源限制

apiVersion: apps/v1
kind: Pod
metadata:
  name: pod-test
spec:
  containers:
  - image: nginx:1.14
    name: nginx
    imagePullPolicy:Always
    # 资源限制
    resources:
      # 调度大小
      request:
        memory: "64Mi"
        cpu: "250m"  # 一核=1c=1000m
      # 限制最大资源
      limit:
        memory: "128Mi"
        cpu: "500m"

六、pod重启机制

apiVersion: apps/v1
kind: Pod
metadata:
  name: pod-test
spec:
  containers:
  - image: nginx:1.14
    name: nginx
    imagePullPolicy:Always
  # 重启策略
  restartPolicy:Never

Always:容器终止退出后,总重启容器

OnFailure:容器异常退出后(状态码非0)重启

Never:不重启

七、健康检查

1.容器检查(部分问题容器检查定位不了)

2.应用层面检查

存活检查:如果检查失败,kill,根据restartPolicy策略操作

就绪检查:如果检查失败,将pod从service endpoints中剔除

Probe检查方法:

1.httpGet 状态码200-400则为成功

2.exec 执行shell命令返回0为成功

3.tcpSocket 发起TCP socket建立成功

apiVersion: apps/v1
kind: Pod
metadata:
  name: pod-test
spec:
  containers:
  - image: busybox
    name: write
    args:
    - /bin/sh
    - -C
    - touch /tmp/healthy; sleep 30;rm -rf /tmp/healthy
    livenessProbe:
      # probe检查方法:exec;有tmp/healthy--->0  无--->1
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5