Kubernetes之资源控制器ReplicaSet,Deployment
deployment通过ReplicaSets(RS)创建Pod
Rs演示:(创建一个Rs)
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: frontend
spec:
replicas: 3
selector:
matchLabels:
tier: frontend
template:
metadata:
labels:
tier: frontend
spec:
containers:
- name: php-nginx
image: hub.atshooter.com/k8s/nginx:v1.0
env:
- name: GET_HOSTS_FROM
value: dns
ports:
- containerPort: 80
kubectl create -f xxx.yaml
验证理论:kubernetes 很多时候副本数都是通过标签来维护的
kubectl get pod --show-labels
更改第一个容器的标签试试
语法:kubectl label pod [podName] [标签]
kubectl label pod frontend-4hgj2 tier=frontend111
错误:说这个容器已经有了标签,如果想要覆盖原有的标签值,需要加 –overwrite=true
语法:kubectl label pod [podName] [标签] --overwrite=True
kubectl label pod frontend-4hgj2 tier=frontend111 --overwrite=true
查看
我们发现多出了一个frontend容器,加上刚才更改掉标签那个共计4个,这是因为ReplicaSets(RS)是通过标签来维护副本数的,当他发现副本数不足3个就会再启动一个frontend标签的容器。
验证完毕(kubernetes 很多时候副本数都是通过标签来维护的)
删除
如果现在我们删除掉这个rs 结果会如何呢,当然标签是frontend的都会被删掉,我们更改掉标签那个会留下来,不会被回收
只剩这一个了
deployment演示:
(创建一个deployment) deployment是一个声明式的方法,可以使用apply去创建
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx-shooter
image: hub.atshooter.com/k8s/nginx:v1.0
ports:
- containerPort: 80
kubectl apply -f xxx.yaml --record
#--record参数可以记录命令,我们可以很方便的查看每次 revision 的变化
创建deployment同时deployment也会创建响应的RS(replicaSets),然后replicaSets再去创建相应的Pod
所以
deploymentName = nginx-deployment-shoote
rsName = PodName + 随机串 = nginx-deployment-shooter-78bc9b8f69
PodName = rsName + 随机串 = nginx-deployment-shooter-78bc9b8f69-nfdbb
deployment扩容
语法: kubectl scale deployment [deployment名称] --replicas [副本数]
kubectl scale deployment nginx-deployment-shooter --replicas 10
我更新副本数,你可以查看他的rs名称是没有任何变化的,这就说明,他的模板不会被更新,也就不会出现回退这些现象
deployment更新镜像
语法:kubectl set image deployment/[deployment名称] [容器名称]=镜像地址 #这里的容器名称是指containers下的name
kubectl set image deployment/nginx-deployment-shooter nginx=nginx:1.9.1
先登录当前容器查看当前nginx版本
kubectl exec -it nginx-deployment-shooter-78bc9b8f69-2v8jn sh
# nginx -v
nginx version: nginx/1.17.8
可以看到当前nginx容器版本是1.17.8 (这是当前最新版的nginx)
那就执行更新到 1.16.1 试试
kubectl set image deployment/nginx-deployment-shooter nginx=nginx:1.16.1
这个更新比较慢,可能跟我网速有关系,半天了只更新成功了一个
我们可以观察rs 列表的变化
上面我更新了2次,有没有发现rs多出2个旧版本Pod,每更新一次就会残留一个上个版本的ReplicaSet 的Pod,这个有什么用呢,当你回滚到上个版本的时候他就有用了。
已经全部更新成功
查看副本更新状态
kubectl rollout status deployments nginx-deployment-shooter
deployment回滚镜像
#回滚到上一个版本
语法:kubectl rollout undo deployment/[deployment名称]
kubectl rollout undo deployment/nginx-deployment-shooter
回滚到上一个版本,那么nginx的版本就会变成1.17.8
验证
回滚后版本号为 1.17.8 无问题 是上一个版本
查看回滚历史
kubectl rollout history deployment/nginx-deployment-shooter
[root@k8s-master ~]# kubectl rollout history deployment/nginx-deployment-shooter
deployment.extensions/nginx-deployment-shooter
REVISION CHANGE-CAUSE
2 kubectl apply --filename=dep-nginx.yaml --record=true
4 kubectl apply --filename=dep-nginx.yaml --record=true
5 kubectl apply --filename=dep-nginx.yaml --record=true
#这里的revision是版本号,为后面指定回滚版本会用到
回滚到指定版本
(回滚的版本可以查看回滚历史获取) 需要使用 --revision参数指定
kubectl rollout undo deployment/nginx-deployment --to-revision=2
暂停deployment正在进行的更新
kubectl rollout pause deployment/nginx-deployment-shooter
验证
例如我要回滚到版本 5
kubectl rollout undo deployment/nginx-deployment --to-revision=5
可以看到暂停后 有7个容器已经回滚到了 1.16.1 还有3个容器在上个版本没有
继续deployment刚在暂停的更新
kubectl rollout resume deployment/nginx-deployment-shooter
自动继续回滚到指定版本,并且完成
deployment设置自动扩展
如果集群支持 horizontal pod autoscaling 的话,还可以为Deployment设置自动扩展
语法kubectl autoscale deployment [deployment名称] --min=[最小副本数] --max=[最大副本数] --cpu-percent=[cpu百分比]
kubectl autoscale deployment nginx-deployment-shooter --min=10 --max=15 --cpu-percent=80
其他补充内容
deployment更新策略
deployment可以保证在升级时只有一定数量的Pod,是down的,如上面我们操作的,你发现更新镜像的过程中,每次只更新2个容器.他会确保至少有比期望的Pod数量少一个是update状态(最多一个不可用)
deployment同时也可以保证,创建出超出期望数量一定量的pod,它会确保最多比期望的Pod数量多一个Pod 是update的(最多多一个)
未来的kubernetes版本中,将从1-1变成25%-25%
查看deployment状态
kubectl describe deployments
Rollover(多个rollout并行)
假如您创建了一个有5个 nginx:1.7.9 replicaSet的deployment 但是当还只有3个 nginx:1.7.9 的 replica 创建
出来的时候您就开始更新含有5个 nginx:1.9.1 replica 的 Deployment。在这种情况下,Deployment 会立即
杀掉已创建的3个 nginx:1.7.9 的 Pod,并开始创建 nginx:1.9.1 的 Pod。它不会等到所有的5个 nginx:1.7.9 的
Pod 都创建完成后才开始改变航道
回退 Deployment
您可以用 kubectl rollout status 命令查看 Deployment 是否完成。如果 rollout 成功完成, kubectl rollout status 将返回一个0值的 Exit Code
语法:kubectl rollout status deployment/[deployment名称]
kubectl rollout status deployment/nginx-deployment-shooter
[root@k8s-master ~]# kubectl rollout status deployment/nginx-deployment-shooter
deployment "nginx-deployment-shooter" successfully rolled out
[root@k8s-master ~]# echo $?
0
[root@k8s-master ~]#
清理 Policy
您可以通过设置 .spec.revisonHistoryLimit 项来指定 deployment 最多保留多少 revision 历史记录。默认的会保留所有的 revision;如果将该项设置为0,Deployment 就不允许回退了
- 转载请注明: shooter