1、RS
RC (ReplicationController )主要的作用就是用来确保容器应用的副本数始终保持在用户定义的副本数 。即如果有容器异常退出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收。
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: frontend
spec:
replicas: 3
selector:
matchLabels:
tier: frontend
template:
metadata:
labels:
tier: frontend
spec:
containers:
- name: myapp
image: docker.harbor.com/library/nginx:v1
env:
- name: GET_HOSTS_FROM
value: dns
ports:
- containerPort: 80
RS其实分为两部分
第一部分为RS
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: frontend
spec:
replicas: 3
selector:
matchLabels:
tier: frontend
第二部分为Pod
template:
metadata:
labels:
tier: frontend
spec:
containers:
- name: myapp
image: docker.harbor.com/library/nginx:v1
env:
- name: GET_HOSTS_FROM
value: dns
ports:
- containerPort: 80
运行成功后
[root@m1 yaml]# kubectl get pod
NAME READY STATUS RESTARTS AGE
frontend-5m88f 1/1 Running 0 6s
frontend-m7kn6 1/1 Running 0 6s
frontend-vpbxj 1/1 Running 0 6s
此时删除default命名空间下的所有pod
kubectl delete pod --all
RS创建的pod会自动再生成三个副本,这就是自主式Pod 和 资源控制器的Pod 区别
查看Pod标签
[root@m1 yaml]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
frontend-9sjjh 1/1 Running 0 2m23s tier=frontend
frontend-cm664 1/1 Running 0 2m23s tier=frontend
frontend-p54fl 1/1 Running 0 2m23s tier=frontend
更改其中一个pod的标签
[root@m1 yaml]# kubectl label pod frontend-9sjjh tier=frontend1
error: 'tier' already has a value (frontend), and --overwrite is false #### 如果报错,需要改为执行下面命令
[root@m1 yaml]#
[root@m1 yaml]# kubectl label pod frontend-9sjjh tier=frontend1 --overwrite=True
pod/frontend-9sjjh labeled
再次查看pod,会发现变成了四个
其中一个的标签是frontend1,也就是刚刚更改的一个pod
原因是replicas指定副本数是根据标签进行的,所以当标签为frontend的副本数小于期望值时会自动再补充一个,而标签为frontend1的pod将不受当前RS控制,所以即使删除RS也不会删除掉标签为frontend1这个Pod
RS匹配Pod是通过yaml文件配置中 matchLabels 选择的
[root@m1 yaml]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
frontend-9sjjh 1/1 Running 0 5m9s tier=frontend1
frontend-cm664 1/1 Running 0 5m9s tier=frontend
frontend-lq97j 1/1 Running 0 18s tier=frontend
frontend-p54fl 1/1 Running 0 5m9s tier=frontend
2、RS与Deployment的关联
- Deployment 为 Pod 和 ReplicaSet 提供了一个声明式定义(declarative)方法,用来替代以前的
- ReplicationController 来方便的管理应用。典型的应用场景包括:
- 定义Deployment来创建Pod和ReplicaSet
- 滚动升级和回滚应用
- 扩容和缩容
- 暂停和继续Deployment
示例:
[root@m1 yaml]# cat deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: docker.harbor.com/library/nginx:v1
ports:
- containerPort: 80
[root@m1 yaml]# kubectl apply -f deployment.yaml --record
--record参数可以记录命令,我们可以很方便的查看每次revision的变化
查看信息
查看deployment
[root@m1 yaml]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 7s
查看RS,可以看到创建deployment时自动会创建对应的RS
[root@m1 yaml]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-5bd5cb5c6c 3 3 3 12s
查看Pod
[root@m1 yaml]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-deployment-5bd5cb5c6c-6fsqp 1/1 Running 0 29s app=nginx,pod-template-hash=5bd5cb5c6c
nginx-deployment-5bd5cb5c6c-hqw5q 1/1 Running 0 29s app=nginx,pod-template-hash=5bd5cb5c6c
nginx-deployment-5bd5cb5c6c-q5vn6 1/1 Running 0 29s app=nginx,pod-template-hash=5bd5cb5c6c
3、Deployment操作
扩容:
[root@m1 yaml]# kubectl scale deployment nginx-deployment --replicas 10
deployment.extensions/nginx-deployment scaled
[root@m1 yaml]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-5bd5cb5c6c-27gnp 1/1 Running 0 9s
nginx-deployment-5bd5cb5c6c-5qlsd 1/1 Running 0 9s
nginx-deployment-5bd5cb5c6c-cb77s 1/1 Running 0 9s
nginx-deployment-5bd5cb5c6c-gr9c5 1/1 Running 0 9s
nginx-deployment-5bd5cb5c6c-gvkd9 1/1 Running 0 47s
nginx-deployment-5bd5cb5c6c-l5mts 1/1 Running 0 9s
nginx-deployment-5bd5cb5c6c-m9d54 1/1 Running 0 9s
nginx-deployment-5bd5cb5c6c-pgmhk 1/1 Running 0 47s
nginx-deployment-5bd5cb5c6c-qfjzc 1/1 Running 0 9s
nginx-deployment-5bd5cb5c6c-tcmrn 1/1 Running 0 47s
更新镜像:
[root@m1 yaml]# kubectl set image deployment/nginx-deployment nginx=docker.harbor.com/library/nginx:v2
deployment.extensions/nginx-deployment image updated
更新后查看rs状态,会发现有两个rs在一增一减进行滚动更新,直到全部更新完成
[root@m1 yaml]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-5bd5cb5c6c 2 2 2 79s
nginx-deployment-84f6467746 9 9 7 5s
[root@m1 yaml]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-5bd5cb5c6c 0 0 0 82s
nginx-deployment-84f6467746 10 10 9 8s
回滚:
[root@m1 yaml]# kubectl rollout undo deployment/nginx-deployment
deployment.extensions/nginx-deployment rolled back
查看rs
[root@m1 yaml]# kubectl get rs
NAME DESIRED CURRENT READY AGE
frontend 3 3 3 50m
nginx-deployment-5bd5cb5c6c 7 7 5 115s
nginx-deployment-84f6467746 4 4 4 41s
[root@m1 yaml]# kubectl get rs
NAME DESIRED CURRENT READY AGE
frontend 3 3 3 50m
nginx-deployment-5bd5cb5c6c 8 8 6 117s
nginx-deployment-84f6467746 3 3 3 43s
[root@m1 yaml]# kubectl get rs
NAME DESIRED CURRENT READY AGE
frontend 3 3 3 50m
nginx-deployment-5bd5cb5c6c 10 10 8 119s
nginx-deployment-84f6467746 1 1 1 45s
[root@m1 yaml]# kubectl get rs
NAME DESIRED CURRENT READY AGE
frontend 3 3 3 50m
nginx-deployment-5bd5cb5c6c 10 10 10 2m1s
nginx-deployment-84f6467746 0 0 0 47s
查看状态
[root@m1 yaml]# kubectl rollout status deployment/nginx-deployment
deployment "nginx-deployment" successfully rolled out 表示回滚成功
查看历史
注意:CHANGE-CAUSE下的信息只有创建deployment时加入了 --record 才会有,否则只有<none>
[root@m1 yaml]# kubectl rollout history deployment/nginx-deployment
deployment.extensions/nginx-deployment
REVISION CHANGE-CAUSE
2 kubectl create --filename=deployment.yaml --record=true
3 kubectl create --filename=deployment.yaml --record=true
指定版本回退
如果历史版本中有3个版本或更多,此时想从版本3回退到版本1,不能使用两次回退命令,因为回退命令是回退到上次版本,也就是会造成循环 2 3 版本
kubectl rollout undo deployment/nginx-deployment --to-revision=1
退出码
echo $? 熟悉linux的都知道这个命令,这里使用它主要是用于管理脚本,了解即可
历史版本设置
deployment默认保留所有历史,也可以指定保留历史的数量,通过 .spec.revisonHistoryLimit 指定,如果设置为 0,则表示不允许回退。