滚动更新:
[root@master rolingup]# vim httpd-deploy.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpd-deploy
labels:
run: apache
spec:
replicas: 3
selector:
matchLabels:
run: apache
template:
metadata:
labels:
run: apache
spec:
containers:
- name: httpd
image: httpd:2.2
ports:
- containerPort: 80
执行文件
查看:
[root@master 1]# kubectl get deployments.apps -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
httpd-deploy 3/3 2 3 20s httpd httpd:2.4 run=apache
查看pod:
[root@master 1]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
httpd-deploy-6cbfc784b4-5sjdp 1/1 Running 1 30s 10.244.4.157 node2 <none> <none>
httpd-deploy-6cbfc784b4-hgccs 1/1 Running 1 30s 10.244.0.21 master <none> <none>
httpd-deploy-6cbfc784b4-qn6k8 1/1 Running 1 30s 10.244.3.128 no
可以看到pod都起来了 也可以看到使用的镜像是httpd2.2
接下来滚动更新
编写httpd-deploy.yml文件
把镜像换成httpd2.4的:
执行文件
查看:
[root@master 1]# kubectl get deployments.apps -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
httpd-deploy 3/3 2 3 3d10h httpd httpd:2.4 run=apache
可以看到镜像变成2.4了完成了升级
回滚:
创键3个yml文件准备测试:
[root@master 2]# ls
httpd1.yml httpd2.yml httpd3.yml
[root@k8smaster 1]# vim httpd1.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpd-deploy
labels:
run: apache
spec:
replicas: 3
selector:
matchLabels:
run: apache
template:
metadata:
labels:
run: apache
spec:
containers:
- name: httpd
image: httpd:2.4.37
ports:
- containerPort: 80
23 文件把image.httpd:2.4.37 改成 38 39
依次执行文件:
[root@master 2]# kubectl apply -f httpd1.yml --record
[root@master 2]# kubectl get deployments.apps httpd-deploy -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
httpd-deploy 3/3 3 3 69s httpd httpd:2.4.37 run=apache
在执行
[root@master rollout]# kubectl apply -f httpd2.yml --record
查看:
[root@master rollout]# kubectl get deployments.apps -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
httpd-deploy 3/3 3 3 4m httpd httpd:2.4.38 run=apache
执行
[root@master 2]# kubectl apply -f httpd3.yml --record
查看:
[root@master 2]# kubectl get deployments.apps -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
httpd-deploy 3/3 3 3 5m46s httpd httpd:2.4.39 run=apache
--record是把每次的更新写道revision中 这样就知道每条revision对应哪个文件方便回滚
查看revision:
[root@master 2]# kubectl rollout history deployment httpd-deploy
deployment.apps/httpd-deploy
REVISION CHANGE-CAUSE
1 kubectl apply --filename=httpd1.yml --record=true
2 kubectl apply --filename=httpd2.yml --record=true
3 kubectl apply --filename=httpd3.yml --record=true
我们回滚到v1版本:
[root@master 2]# kubectl rollout undo deployment httpd-deploy --to-revision=1
–to-revision指定回滚到那条revision
再次查看一下:
[root@master 2]# kubectl get deployments.apps httpd-deploy -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
httpd-deploy 3/3 3 3 10m httpd httpd:2.4.37 run=apache
可以看到回到了 2.4.37那个版本
再次查看revision:
[root@master r2]# kubectl rollout history deployment httpd-deploy
deployment.apps/httpd-deploy
REVISION CHANGE-CAUSE
2 kubectl apply --filename=httpd2.yml --record=true
3 kubectl apply --filename=httpd3.yml --record=true
4 kubectl apply --filename=httpd1.yml --record=true
会发现REVISION变了 从2-4了不是之前的1-3
健康检查:
[root@k8smaster health]# vim health.yml
apiVersion: v1
kind: Pod
metadata:
labels:
aaaa: aaaaa
name: health
spec:
restartPolicy: OnFailure
containers:
- name: heal
image: busybox
args:
- /bin/sh
- -c
- sleep 10; exit 1
实时查看pod的变化:
[root@master health]# watch kubectl get pod -o wide
会发现只running 10秒就退出了显示error
这种只可以查看进程是否错误,如网页丢失什么的这个就不管用了,这个就通过liveness来检查
Liveness:
[root@master health]# cp health.yml liveness.yml
编写liveness.yml文件
[root@k8smaster health]# vim liveness.yml
apiVersion: v1
kind: Pod
metadata:
labels:
aaaa: liveness
name: liveness
spec:
restartPolicy: OnFailure
containers:
- name: liveness
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/aaaaa;sleep 30;rm -f /tmp/aaaaa;sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/aaaaa
initialDelaySeconds: 10
periodSeconds: 5
创键一个文件,休眠30秒,然后删除这个文件,休眠600秒
查看这个文件,启动10秒之后liveness探测这个文件,之后每隔5秒探测一下这个文件,探测失败几次就会重启pod
实时查看
[root@master health]# watch kubectl get pod
在查看一下:
[root@master health]# kubectl get pod
NAME READY STATUS RESTARTS AGE
liveness 1/1 Running 2 3m47s
可以看到已经重启2次了
Readiness:
[root@master health]# cp liveness.yml readiness.yml
[root@master health]# vim readiness.yml
apiVersion: v1
kind: Pod
metadata:
labels:
aaaa: readiness
name: readiness
spec:
restartPolicy: OnFailure
containers:
- name: readiness
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/aaaaa;sleep 30;rm -f /tmp/aaaaa;sleep 600
readinessProbe:
exec:
command:
- cat
- /tmp/aaaaa
initialDelaySeconds: 10
periodSeconds: 5
执行文件
查看时
[root@master health]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
readiness 0/1 Running 0 66s 10.244.3.128 node1 <none> <none>
一开始把ready标记为不可用
它是第15秒时第一次查看 是正确的有哪个文件 在标记为可用
30秒之后由于文件被删除了 readiness探测几次都探测不到 就又标记为不可用了
Liveness 是探测失败后重启pod
Readiness是探测失败后把pod标记为不可用
在 scale up 中使用健康检查:
在scale up中使用健康检查可以防止请求发送给没有ready的pod
[root@master health]# cp /root/deployment/httpd-deploy.yml health-httpd.yml
[root@master health]# cat /root/deployment/httpd-ser.yml >> health-httpd.yml
2个apiversion之间用—来分割
编写
[root@master health]# vim health-httpd.yml 文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpd-deploy
labels:
run: apache
spec:
replicas: 10
selector:
matchLabels:
run: apache
template:
metadata:
labels:
run: apache
spec:
containers:
- name: httpd
image: httpd
ports:
- containerPort: 80
readinessProbe:
httpGet:
scheme: HTTP
path: /aa
port: 80
initialDelaySeconds: 10
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: httpd-ser
spec:
type: NodePort
selector:
run: apache
ports:
- protocol: TCP
nodePort: 30000
port: 8000
targetPort: 80
由于没有这个网页所以他会不接受service的请求 ,每隔五秒探测一次 直到有这个网页为止 即curl ip:80/aa 返回200-400之间即为成功
在滚动更新中使用健康检查:
我们来模拟滚动更新失败用健康检查来探测:
[root@master health]# cp health-httpd.yml heal-roll.yml
[root@master health]# vim heal-roll.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpd-deploy
labels:
run: apache
spec:
replicas: 10
selector:
matchLabels:
run: apache
template:
metadata:
labels:
run: apache
spec:
containers:
- name: app
image: busybox
args:
- /bin/sh
- -c
- sleep 10;touch /tmp/aaaa; sleep 30000000
readinessProbe:
exec:
command:
- cat
- /tmp/aaaa
initialDelaySeconds: 10
periodSeconds: 5
执行文件:
[root@master health]# kubectl apply -f heal-roll.yml --record
查看:
[root@master health]# kubectl get deployments.apps httpd-deploy
NAME READY UP-TO-DATE AVAILABLE AGE
httpd-deploy 10/10 10 10 96s
在准备一个文件
[root@master health]# cp heal-roll.yml heal-roll1.yml
修改这个文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpd-deploy
labels:
run: apache
spec:
replicas: 10
selector:
matchLabels:
run: apache
template:
metadata:
labels:
run: apache
spec:
containers:
- name: app
image: busybox
args:
- /bin/sh
- -c
- sleep 30000000
readinessProbe:
exec:
command:
- cat
- /tmp/aaaa
initialDelaySeconds: 10
periodSeconds: 5
直接让他睡 不让他创建文件 后面又要查看文件所以会失败 执行文件查看
[root@master health]# kubectl apply -f heal-roll1.yml --record
查看:
[root@master health]# kubectl get deployments.apps httpd-deploy
NAME READY UP-TO-DATE AVAILABLE AGE
httpd-deploy 8/10 5 8 5m47s
可以看到 更新完成的是5个 活动的是8个也就是旧副本是8个 总数是13个副本 由于我们手动设置的原因所以 那5个新副本是不可能ready的
那么为什么有8个旧副本 5个新副本呢
就是maxSurge和maxUnavailable (默认为25%)
maxSurge:
控制副本更新时超过DESIRED即副本的 READY总数 向上取整数
所以此次实例为 10+10*25%
maxUnavailable:
控制副本更新时不可用的个数 向下取整
所以此次实例为 10-10*25% 得出的结果为副本的可用个数
我们回滚到上一个版本:
[root@master health]# kubectl rollout undo deployment httpd-deploy --to-revision=1
查看一下:
[root@master health]# kubectl get deployments.apps httpd-deploy -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
httpd-deploy 10/10 10 10 17m app busybox run=apache
修改:手动设置更新几个副本和可用副本个数
[root@master health]# vim heal-roll1.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpd-deploy
labels:
run: apache
spec:
strategy:
rollingUpdate:
maxSurge: 50%
maxUnavailable: 35%
replicas: 10
selector:
matchLabels:
run: apache
template:
metadata:
labels:
run: apache
spec:
containers:
- name: app
image: busybox
args:
- /bin/sh
- -c
- sleep 30000000
readinessProbe:
exec:
command:
- cat
- /tmp/aaaa
initialDelaySeconds: 10
periodSeconds: 5
查看:
[root@master health]# kubectl get deployments.apps -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
httpd-deploy 7/10 8 7 21m app busybox run=apache
可以看到更新完成的有8个 7个可用的
即 10+1050%=15个总数
10-1035%=7个可用(向下取整)
那么更新的就是 15-7=8个更新的
查看pod:
[root@k8smaster health]# kubectl get pod
NAME READY STATUS RESTARTS AGE
httpd-deploy-7c7d96468f-8zcdx 1/1 Terminating 0 24m
httpd-deploy-7c7d96468f-9fbgb 1/1 Terminating 0 24m
httpd-deploy-7c7d96468f-bmng9 1/1 Terminating 0 24m
httpd-deploy-7c7d96468f-g8mb4 1/1 Terminating 0 24m
httpd-deploy-7c7d96468f-h6q4l 1/1 Terminating 0 24m
httpd-deploy-7c7d96468f-krtpf 1/1 Terminating 0 24m
httpd-deploy-7c7d96468f-qfp4n 1/1 Terminating 0 24m
httpd-deploy-d95cc4757-2qnd8 0/1 Terminating 0 2m31s
httpd-deploy-d95cc4757-87gvk 0/1 Terminating 0 2m31s
httpd-deploy-d95cc4757-cskz6 0/1 Terminating 0 2m31s
httpd-deploy-d95cc4757-mlzwg 0/1 Terminating 0 2m31s
httpd-deploy-d95cc4757-png62 0/1 Terminating 0 2m31s
httpd-deploy-d95cc4757-t8drl 0/1 Terminating 0 2m31s
httpd-deploy-d95cc4757-v9gt7 0/1 Terminating 0 2m31s
httpd-deploy-d95cc4757-xkvh5 0/1 Terminating 0 2m31s