本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Pod
Pod生命周期
生命周期中的重要行为:
- 初始化容器
- 生命周期回调
- 容器探测
状态
Pending
, Pod 已被 Kubernetes 接受,但尚未创建一个或多个容器镜像。这包括被调度之前的时间以及通过网络下载镜像所花费的时间,执行需要一段时间。Running
, Pod 已经被绑定到了一个节点,所有容器已被创建。至少一个容器正在运行,或者正在启动或重新启动。Failed
, 所有容器终止,至少有一个容器以失败方式终止。也就是说,这个容器要么已非 0 状态退出,要么被系统终止。Succeeded
, 所有容器成功终止,也不会重启。Unkown
, 由于一些原因,Pod 的状态无法获取,通常是与 Pod 通信时出错导致的
容器探测
-
livenessProbe
:指示容器是否正在运行,如果活动探测失败,则 kubelet 会杀死容器,并且容器将受其重启策略的约束。如果不指定活动探测,默认状态是 Success。apiVersion: v1 kind: Pod metadata: name: liveness-exec-pod namespace: default spec: containers: - name: liveness-exec-container image: busybox:latest imagePullPolicy: IfNotPresent command: ["/bin/sh", "-c", "touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 3600"] livenessProbe: exec: command: ["test", "-e", "/tmp/healthy"] initialDelaySeconds: 1 periodSeconds: 3
-
readinessProbe
:指示容器是否已准备好为请求提供服务,如果准备情况探测失败,则控制器会从与 Pod 匹配的所有服务的端点中删除 Pod 的 IP 地址。初始化延迟之前的默认准备状态是 Failure,如果容器未提供准备情况探测,则默认状态为 Success。
探针类型
ExecAction
:在容器内部执行指定的命令,如果命令以状态代码 0 退出,则认为诊断成功。TCPSocketAction
:对指定 IP 和端口的容器执行 TCP 检查,如果端口打开,则认为诊断成功。HTTPGetAction
:对指定 IP + port + path路径上的容器的执行 HTTP Get 请求。如果响应的状态代码大于或等于 200 且小于 400,则认为诊断成功。
生命周期回调
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:
- name: lifecycle-demo-container
image: nginx
lifecycle:
postStart: #在postStart启动时,ENTRYPOINT有可能还没结束
exec:
command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
preStop: #发生在容器被杀死之前,它会阻塞当前的容器杀死进程,直到这个Hook定义操作完成之后,才允许容器被杀死
exec:
command: ["/usr/sbin/nginx","-s","quit"]
Pod 控制器
ReplicaSet
ReplicaSet
确保Pod
资源一直符合用户期望的replicas
数量的状态。
核心资源
- 用户期望副本数,确保所控制的资源满足用户期望。
- 标签选择器,控制指定的资源。
- Pod 资源模板,当资源不满足时,根据资源模板完成创建。
A ReplicaSet ensures that a specified number of pod replicas are running at any given time. However, a Deployment is a higher-level concept that manages ReplicaSets and provides declarative updates to Pods along with a lot of other useful features. Therefore, we recommend using Deployments instead of directly using ReplicaSets, unless you require custom update orchestration or don't require updates at all.
ReplicaSet可确保指定数量的pod“replicas”在任何设定的时间运行。然而,Deployments是一个更高层次的概念,它管理ReplicaSets,并提供对pod的声明性更新以及许多其他的功能。因此,我们建议您使用Deployments而不是直接使用ReplicaSets,除非您需要自定义更新编排或根本不需要更新。
配置清单
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-demo
namespace: default
spec:
replicas: 2 # 副本数
selector: # 托管pod的label选择器
matchLabels:
app: rs-demo-pod
release: stable
template: # 模板,控制器会根据模板创建pods
metadata:
name: rs-demo-pod # 无用字段,pod会以replicaSet的名称+'_随机码'命名
labels: # 需与replicaSet的selector相符
app: rs-demo-pod
release: stable
enviroment: qa
spec:
containers:
- name: rs-demo-container
image: nginx
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
扩容缩容
# 使用edit命令
kubectl edit rs rs-demo
# 修改replicas的值即可
# 使用scale命令
kubectl scale --replicas=2 rs rs-demo
更新镜像版本
kubectl edit rs rs-demo
# 修改了模板,但已有pod镜像并不会更新,因为副本数目正确,pod不会重建。后续重建的pod才会使用更新的镜像。
Deployment
Deployment
建构在ReplicaSet
上,不直接控制Pod
,而是通过控制ReplicaSet
来控制Pod
。只用于管控无状态应用。
作用
- 创建部署
Pod
和ReplicaSet
- 扩容、缩容
- 滚动更新、回滚应用
- 暂停和继续
Deployment
Deployments
- ReplicaSets
- Pods
结构
创建Deployment
后,查询ReplicaSet
发现自动创建了ReplicaSet
[root@master ~]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
deploy-demo 2/2 2 2 4m12s
[root@master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
deploy-demo-7b5b46db88 2 2 2 4m16s
# rs的后缀随机码为模板的hash值,以便追踪到关联到的模板创建pods
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
deploy-demo-7b5b46db88-hnflh 1/1 Running 0 4m20s
deploy-demo-7b5b46db88-mc6z4 1/1 Running 0 4m20s
配置清单
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: myapp
release: stable
strategy: # 更新策略
type: RollingUpdate # 更新方式
rollingUpdate: # 滚动更新策略
maxSurge: 1 # 在滚动中,可以创建多少个新pod
maxUnavailable: 0 # 在滚动中,可以删除多少个旧pod
template:
metadata:
name: myapp-deploy-pod
namespace: default
labels:
app: myapp
release: stable
spec:
containers:
- name: myapp-deploy-container
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
滚动更新
kubectl edit deployment deploy-demo
kubectl set image deployment deploy-demo deploy-demo-container=nginx
# 查看更新历史
kubectl rollout history deployment deploy-demo
# 回滚至指定版本(不指定则默认上一版本)
kubectl rollout undo deployment deploy-demo --to-revision=1
DaemonSet
用于确保集群中每一个节点运行且只运行一个特定的Pod副本。常用来部署一些集群的日志、监控或者其他系统管理应用。
当节点新加入集群时,会自动添加这些Pod到这些节点。
当节点从集群中删除时,这些Pod会被删除。
常用于:
- 日志收集
- 系统监控
- 系统程序
Job
Job
负责处理一次性任务。
Pod
任务完成后退出,不需要作为守护进程运行。
重启策略为:仅当任务未完成的异常退出时重启。
CronJob
CronJob
周期性运行任务,即定时任务,重复创建Job
来执行任务。
StatefulSet
管理有状态应用(对应Deployments和ReplicaSets是为无状态应用而设计),并且每个副本被单独管理。
常用于持久化存储。
Service
Service
为Pod
提供固定访问端点。避免Pod
重启后ip
改变无法访问。
Service
通过selector
关联到对应的Pods
代理模式
-
userspace
效率低
-
iptables
灵活、功能强大
规则遍历匹配和更新
可扩展性
-
IPVS
工作在内核态,有更好的性能
调度算法丰富
DNS资源记录
DNS
服务监视Kubernetes API
,为每个Service
创建DNS
记录用于域名解析。
可通过DNS
名称访问Pods
SVC_NAME.NAMESPACE_NAME.svc.cluster.local
类型
ClusterIP
集群内部通讯NodePort
对外暴露LoadBalancer
对外暴露和负载均衡,仅限部分云平台
配置清单
apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
selector:
app: myapp
release: stable
type: NodePort
ports:
- port: 80
targetPort: 80