Kubernetes之资源控制器ReplicaSet,Deployment

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

img

验证理论:kubernetes 很多时候副本数都是通过标签来维护的

kubectl get pod --show-labels

img

更改第一个容器的标签试试

语法:kubectl label pod [podName] [标签]
kubectl label pod frontend-4hgj2 tier=frontend111

img错误:说这个容器已经有了标签,如果想要覆盖原有的标签值,需要加 –overwrite=true

语法:kubectl label pod [podName] [标签] --overwrite=True
kubectl label pod frontend-4hgj2 tier=frontend111 --overwrite=true

查看

img

我们发现多出了一个frontend容器,加上刚才更改掉标签那个共计4个,这是因为ReplicaSets(RS)是通过标签来维护副本数的,当他发现副本数不足3个就会再启动一个frontend标签的容器。

验证完毕(kubernetes 很多时候副本数都是通过标签来维护的)

删除

如果现在我们删除掉这个rs 结果会如何呢,当然标签是frontend的都会被删掉,我们更改掉标签那个会留下来,不会被回收

img

img只剩这一个了

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

img

deployment扩容

语法: kubectl scale deployment [deployment名称] --replicas [副本数]
kubectl scale deployment nginx-deployment-shooter --replicas 10

img

我更新副本数,你可以查看他的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)

img

那就执行更新到 1.16.1 试试

kubectl set image deployment/nginx-deployment-shooter nginx=nginx:1.16.1

img

这个更新比较慢,可能跟我网速有关系,半天了只更新成功了一个

img

我们可以观察rs 列表的变化

上面我更新了2次,有没有发现rs多出2个旧版本Pod,每更新一次就会残留一个上个版本的ReplicaSet 的Pod,这个有什么用呢,当你回滚到上个版本的时候他就有用了。

img

已经全部更新成功

img

查看副本更新状态

kubectl rollout status deployments nginx-deployment-shooter

deployment回滚镜像

#回滚到上一个版本
语法:kubectl rollout undo deployment/[deployment名称]
kubectl rollout undo deployment/nginx-deployment-shooter

img回滚到上一个版本,那么nginx的版本就会变成1.17.8

验证

img

img

回滚后版本号为 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

img

img

可以看到暂停后 有7个容器已经回滚到了 1.16.1 还有3个容器在上个版本没有

继续deployment刚在暂停的更新

kubectl rollout resume deployment/nginx-deployment-shooter

img

自动继续回滚到指定版本,并且完成

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 就不允许回退了