自学k8s系列~06之滚动更新

Pod健康检查与服务可用性检查

Kubenetes 对 Pod 的健康检查可用两类探针来进行检查: LivenessProbeReadinessProbe

LivenessProbe

判断容器是否存活,主要是对 Running 状态进行检测,如果检测到不健康,则将该容器杀掉然后根据容器的重启策略做相应的处理。如果容器没有指定 LivenessProbe 探针,则 kubelet 认为该容器永远是健康的。

ReadinessProbe

ReadinessProbe 探针主要用于判断容器服务是否可用,即是否处于(Ready状态)。达到 Ready 状态的 Pod 才可以接收请求,如果容器不是 Ready 状态则自动将该容器从 Service 的 Endpoing 列表中隔离出去。当容器恢复到 Ready 状态时,再将容器加入到 Endping 列表中。这样就能保证容器如果没有处于 Ready 状态就不会有流量请求到该 Pod 上。

探针实现方式

LivenessProbeReadinessProbe 都可以配置以下三种实现方式和自定义扩展的方式。

ExecAction

在容器内部执行一个命令,如果该命令返回码为 0 ,则标志着该容器健康。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: v1
kind: Pod
metadata:
name: liveness
labels:
name: liveness
spec:
containers:
- name: liveness
image: busybox
args:
- /bin/sh
- -c
- echo ok > /tmp/headlth; sleep 10; rm -rf /tmp/health; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/health
initialDelaySeconds: 15
timeoutSeconds: 1

创建了一个文件位于 /tmp 目录下,10 秒后将期删除,然后探针去检测该文件。该 Pod 会被判断为不健康,执行多次重启。

1
2
3
kubectl get pod liveness
NAME READY STATUS RESTARTS AGE
liveness 1/1 Running 2 2m30s

TCPSocketAction

通过容器的 IP 地址和端口号执行 TCP 检查,如果能够建立 TCP 链接,则表明容器健康。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: v1
kind: Pod
metadata:
name: goproxy
labels:
app: goproxy
spec:
containers:
- name: goproxy
image: snail007/goproxy
ports:
- containerPort: 8080
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 15
periodSeconds: 20

通过 RESTARTS 可以查看到重启的次数

1
2
3
4
5
kubectl get pods
NAME READY STATUS RESTARTS AGE
goproxy 0/1 CrashLoopBackOff 3 93s
webapp-f2ckt 1/1 Running 1 24h
webapp-wsllj 1/1 Running 1 24h

HTTPGetAction

通过容器的 IP 地址、端口号及路径调用 HTTP GET 方法,如果响应码(HttpStatusCode) 大于等于 200 且小于 400,则表明容器健康。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 15
periodSeconds: 20

Pod的升级

Pod 升级时,使用 kubectl edit xxx.yaml ,将自动进行 Pod 升级操作。升级过程如下:

  1. 先创建一个新的 ReplicaSet ,将副本设为1.
  2. 老的 ReplicaSet 副本缩减1.
  3. 重复以上过程

Pod滚动更新

升级策略

  • 重建(Recreate): 设置 spec.strategy.type=Recreate 。在创建 Pod 的时候会先杀掉所有正在运行的 Pod ,然后创建新的 Pod
  • 滚动更新(RollingUpdate): 设置 spec.strategy.type=RollingUpdateDeployment 会以滚动更新的方式来逐个更新 Pod ,配合参数 spec.strategy.type.RollingUpdate.maxUnavailabelspec.strategy.type.RollingUpdate.maxSurge 可以控制滚动更新的过程。

Pod的回滚

Pod的扩缩容

Pod 的扩缩容其实就是维持 Pod 的数量,当 Pod 数量增加是就是扩容,当 Pod 数量减少时就是缩容。扩缩容有手动自动两种方式。

  • 手动扩缩容:手动的去调整 pod 的数量。通过 --replicas 指定 Pod 的数量,也可以在 yaml 文件中调整 spec.replicas 的值
  • 自动扩缩容:使用者指定一些指标并指定 Pod 数量的范围,系统将在这个范围内自动调整 Pod 的数量。

手动扩缩容

  • 命令方式
1
kubectl scale deployment pod_name -- replicas podNumber #通过指定 --replicase 来指定 pod 数量完成扩缩容
  • yaml 方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: apps/v1
kind: Deployment
metadata:
name: scale
spec:
replicas: 3 #指定 Pod 副本数
selector:
matchLabels:
app: scale
template:
metadata:
labels:
app: scale
spec:
containers:
- name: scale
image: nginx
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 80

自动扩缩容

自动扩缩容指标:Pod 资源使用率、Pod 自定义指标、Object 自定义指标或外部自定义指标。

  • todo 自动扩缩容目前暂时没有场景,不深入研究。

写在最后

自学 k8s 系列,到这里我准备暂时告一段落了,等过三个月后再回来复习复习 k8s 的内容。2021-08-24开始学习 k8s 到今天 2021-09-07 也有 15 天时间,时间也不算长。当时学习 k8s 是因为现在 k8s 实在太火了,各种大会各路大牛几乎都在提 k8s ,这么火的东西我想要了解它到底是什么(应用层面^_^)。k8s 的基本概念和一些简单操作也算是入门了,在当前的工作中也没有这方面的应用场景,所以打算暂停了,同时为了避免自己学过的东西遗忘也定下了 3 个月后再回来复习的目标。

  • 2021-12-07 开始回来复习 k8s 的内容。