Kubernetes 控制器


Kubernetes中内建了很多controller(控制器),这些相当于一个状态机,用来控制Pod的具体状态和行为。

Deployment

Deployment 为 Pod 和 ReplicaSet(副本集) 提供了一个声明式定义(declarative)方法,用来替代以前的Replication Controller 但是它又具备了Replication Controller之外的新特性,来方便管理应用.

replication controller与deployment的区别:

replication controller特性:

 ● 确保pod数量:它会确保Kubernetes中有指定数量的Pod在运行。如果少于指定数量的pod,Replication Controller会创建新的,反之则会删除掉多余的以保证Pod数量不变。

 ● 确保pod健康:当pod不健康,运行出错或者无法提供服务时,Replication Controller也会杀死不健康的pod,重新创建新的。

 ● 弹性伸缩 :在业务高峰或者低峰期的时候,可以通过Replication Controller动态的调整pod的数量来提高资源的利用率。同时,配置相应的监控功能(Hroizontal Pod Autoscaler),会定时自动从监控平台获取Replication Controller关联pod的整体资源使用情况,做到自动伸缩。

 ● 滚动升级:滚动升级为一种平滑的升级方式,通过逐步替换的策略,保证整体系统的稳定,在初始化升级的时候就可以及时发现和解决问题,避免问题不断扩大。

Deployment特性:

 ● Deployment可以看做新一代的Replication Controller。除继承所有Replication Controller特性外,它又增加了Replication Controller之外的一些新特性:

 ● 回滚:当升级pod镜像或者相关参数的时候发现问题,可以使用回滚操作回滚到上一个稳定的版本或者指定的版本

 ● 版本记录: 每一次对Deployment的操作,都能保存下来,给予后续可能的回滚使用

 ● 暂停和启动:对于每一次升级,都能够随时暂停和启动

 ● 多种升级方案:
   Recreate:删除所有已存在的pod,重新创建新的;
   RollingUpdate:滚动升级,逐步替换的策略,同时滚动升级时,支持更多的附加参数,例如设置最大不可用pod数量,最小升级间隔时间等等.

deployment的常用命令:

1.使用deployment控制器创建一个Nginx服务.

命令行方式创建:

#kubectl run nginx-deployment --image=nginx --replicas=3 --port=80

为deployment的nginx创建service,并通过Service的8080端口转发至容器的80端口上

#kubectl expose deployment nginx-deployment --port=8080 --target-port=80 --external-ip=10.20.9.225 

#curl -I nginx-deployment

简单的yaml文件定义方式创建.

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.8
        ports:
        - containerPort: 80

创建nginx-deployment.

# kubectl create -f nginx-deployment.yaml --record

将kubectl的 --record 的 flag 设置为 true可以在 annotation 中记录当前命令创建或者升级了该资源。这在未来会很有用,例如,查看在每个 Deployment revision 中执行了哪些命令。

2.扩容,增加副本数量:

#kubectl scale deployment nginx-deployment --replicas 10

如果集群支持 horizontal pod autoscaling 的话,还可以为Deployment设置自动扩展

#kubectl autoscale deployment  nginx-deployment --min=10 --max=15 --cpu-percent=80

3.升级,将nginx从1.8升级到1.9.1版本.

# kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
deployment.apps "nginx-deployment" image updated

我们也可以使用edit命令来编辑 Deployment,修改 .spec.template.spec.containers[0].image为nginx:1.9.1即可.

#kubectl edit deployment/nginx-deployment
deployment "nginx-deployment" edited

4.检查 Deployment 升级的历史记录

首先,检查下 Deployment 的 revision:

# kubectl rollout history deployment/nginx-deployment
deployments "nginx-deployment":
REVISION    CHANGE-CAUSE
1           kubectl create -f nginx-deployment.yaml --record
2           kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
3           kubectl set image deployment/nginx-deployment nginx=nginx:1.8

因为我创建 Deployment 的时候使用了--record参数可以记录命令,我们可以很方便的查看每次 revision 的变化.

查看单个revision 的详细信息:

# kubectl rollout history deployment/nginx-deployment --revision=2
deployments "nginx-deployment" with revision #2
Pod Template:
  Labels:       app=nginx
        pod-template-hash=703038527
  Containers:
   nginx:
    Image:      nginx:1.8
    Port:       80/TCP
    Host Port:  0/TCP
    Environment:        <none>
    Mounts:     <none>
  Volumes:      <none>

5.回滚(回滚到上一版本):

#kubectl rollout undo deployment/nginx-deployment

也可以使用 --revision参数指定某个历史版本:

#kubectl rollout undo deployment/nginx-deployment --to-revision=2

查看 rollout 的状态.

#kubectl rollout status deployment/nginx-deployment

 6.查看正在创建或者正在更新的deplyment

# kubectl get deployments
NAME               DESIRED   CURRENT   UP-TO-DATE AVAILABLE AGE nginx-deployment 10 10 10 10 20h

查看replica set 和 pod

# kubectl get rs
NAME                          DESIRED   CURRENT   READY     AGE
nginx-deployment-c4747d96c    10        10        10        20h

 查看deployment详细信息

# kubectl describe deployment

7.清理 Policy

您可以通过设置.spec.revisonHistoryLimit项来指定 deployment 最多保留多少 revision 历史记录。默认的会保留所有的 revision;如果将该项设置为0,Deployment就不允许回退了。

 

参考文档:https://jimmysong.io/kubernetes-handbook/concepts/deployment.html


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM