deployment 资源也是一种保障 Pod 高可用的方式,它解决了 RC 的一个痛点:滚动升级引起标签变化将无法被节点代理到。
RC 的一个痛点
如:
- 先确认,在上次示例后最后开启的端口是 3000,通过浏览器
172.16.156.128:3000
可以实现访问 - 使用之前创建的 rc-v2.yaml 进行滚动升级
kubectl rolling-update myweb2 -f k8s/rc/rc-v2.yaml --update-period=1s
(rc-v2.yaml 中设置的是 app=myweb3 标签) - 升级后再次尝试浏览器输入
172.16.156.128:3000
,访问失败
这是因为我们 svc 配置文件中还是指定的标签为 app=myweb2 而升级后的服务标签不对应的缘故。我们接下来需要修改 svc 的配置文件后方可生效。(可通过 kubectl edit svc myweb
来修改)。改后再次访问,成功。
创建 Deployment 资源
# k8s/deploy/nginx-deploy.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: 172.16.156.128:5000/nginx:1.13
ports:
- containerPort: 80
删除之前创建的所有资源,并创建此 deployment 资源:
![](https://img.haomeiwen.com/i3491218/d542f1c0ca5ea641.png)
从截图中可以看到,启动 deployment 后,会启动一个 rs,然后有三个 pod。RS 拥有比 RC 90% 的功能且还有一些额外的功能,deployment 会先启动一个 RS 然后再启动对于的 Pod。但此时还不可以被外部访问,还需要创建 Service 资源才可以被外界访问。
创建 Service 资源除了用配置文件外,还可以用一个命令:
kubectl expose deployment nginx-deployment --port=80 --type=NodePort
#
![](https://img.haomeiwen.com/i3491218/baf2b4628d7647c1.png)
创建成功后,发现多了一个 svc/nginx-deployment 资源,并且对外暴露的端口是 21290 (随机的),可通过浏览器访问任意 Node 的此端口。成功。
Deployment 升级
kubectl edit deployment nginx-deployment
通过编辑 deployment 的配置文件,可以进行直接升级,如修改 nginx 版本为 1.15,保存之后马上生效。
通过 describe 命令可以看到具体 pod 中的版本信息已升级完成。
通过获取 pod 信息可以看到此时多了一个 RS 资源,并且旧的 RS 资源还保持存在,只是 DESIRED 等的数量发生了变化。他的逻辑就是吧之前的 RS 资源逐渐设置为 0,新的 RS 资源设置为 3。
![](https://img.haomeiwen.com/i3491218/63c95be03905beae.png)
Deployment 回滚
kubectl rollout undo deployment nginx-deployment
![](https://img.haomeiwen.com/i3491218/24fc2731fbc40cf8.png)
回滚之后可以发现旧的 RS 资源的个数变为 3,新的 RS 变为 0。
Deployment 更多命令
kubectl rollout history deployment nginx-deployment # 查看历史版本
![](https://img.haomeiwen.com/i3491218/f4fba62a20247b28.png)
kubectl run nginx --image=172.16.156.128:5000/nginx:1.15 --replicas=3 --record # 可以通过 run 直接将镜像跑起来
# 设置副本数目
# 设置记录
![](https://img.haomeiwen.com/i3491218/7765fe4e44f9b803.png)
kubectl set image deploy nginx=172.16.156.128/nginx:1.13
# 通过命令方式改变 nginx 版本
![](https://img.haomeiwen.com/i3491218/396c055e0c4f757a.png)
kubectl rollout undo deployment nginx --to-revesion=1 # 按版本记录进行回滚
![](https://img.haomeiwen.com/i3491218/e860efadd731be26.png)
用
kubectl run nginx --image=172.16.156.128:5000/nginx:1.15 --replicas=3 --record
的方式运行起来的资源,通过查看其 label 是 run=nginx,所以需要创建一个 run=nginx 的 svc 资源,就可以对外访问。
网友评论