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中;