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还包含一个或多个紧密相关的用户业务容器
- 最小部署的单元
- 包含多个容器(一组容器的集合)
- 一个pod中容器共享网络命名空间
-
1.2. pod存在意义
创建容器使用docker,一个docker对应一个容器,一个容器有进程,一个容器运行一个应用程度
- pod是多进程涉及,运行多个应用程序(一个pod有多个容器,一个容器里面运行一个应用程序)
- pod存在为了亲密性应用
- 两个应用之间进行交互
- 网络之间调用
- 两个应用需要频繁调用
1.3. pod实现机制
- 共享网络
通过Pause容器,把其他业务容器加入到Pause容器里面,让所有业务容器在同一个名称空间namespace中,可以实现网络共享
- 共享存储
引入数据卷概念Volumn,使用数据卷进行持久化存储
1.4. pod镜像拉取策略
apiVersion: v1kind: Podmetadata:name: mypodspec:containers:- name: nginximage: nginx:1.14imagePullPolicy: 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的健康检查
- 容器检查
- linenessProbe 存活检查
如果检查失败,将杀死容器,根据Pod的restartPolicy来操作.
- readinessProbe 就绪检查
如果检查失败,Kubernetes会把Pod从service endponits中剔除
- probe支持以下三种检查方法
- httpGet
发送HTTP请求,返回200—400范围状态码为成功
- exec
执行shell命令返回状态码是0为成功
- 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的流程

- 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: dev1.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. 污点和污点容忍
- 基本介绍
taint污点: 节点不做普通分配调度, 是节点属性
nodeSelector和nodeAffinity: Pod调度到某节点上, Pod属性, 调度的时候实现
- 场景
- 专用节点
- 配置特点硬件节点
- 基于Taint驱逐
演示
(1). 查看节点污点情况
> kubectl describe node k8smaster| grep Taint Taints: node-role.kubernetes.io/master:NoSchedule污点值有三个:
- NoSchedule: 一定不被调度
- PreferNoSchdule: 尽量不被调度
- NoExcute: 不会调度,并且还会驱逐Node已有的Pod
(2). 为节点添加污点
kubectl taint node [node] key=value:污点值(3). 删除污点 “-“的符号
kubectl taint node k8snode1 env_role:NoSchedule-污点容忍
即使节点添加了污点.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实现应用的运维
比如伸缩或滚动升级等等操作是通过控制器来实现
