kubernetes实战之三(Replication Controller)

Replication Controller是kubernetes中的另外一个核心概念,应用托管在kubernetes之后,kubernetes需要保证应用能够持续运行,这是Replication Controller的工作内容,它会确保任何时候kubernetes中有指定数量的Pod副本。在此基础上,Replication Controller进一步提供了高级特性,比如弹性伸缩、滚动升级等。
一、Replication Controller定义文件my-nginx-rc.yaml
apiVersion:v1
kind:ReplicationController
metadata:
    name:my-nginx
spec:
    replicas:2
    selector:
        app:nginx
    template:
        metadata:
            labels:
                app:nginx
        spec:
            containers:
                -name:nginx
                image:nginx
                ports:
                    -containerPort:80
主要元素描述:
1.apiVersion:声明kubernetes的API版本,目前是v1。
2.kind:声明API对象的类型,这里的类型是ReplicationController。
3.metadata:设置Replication Controller的元数据。
3.1.name:指定Replication Controller的名称,名称必须在Namespace内唯一。
4.spec:配置Replication Controller的具体规格。
4.1.replicas:设置Replication Controller控制的Pod的副本数目。
4.2.selector:指定Replication Controller的Label Selector来匹配Pod的Label。
5.template:设置Pod模板,同Pod的定义一致。
5.1.metadata:设置Pod的元数据。
5.1.1.labels:设置Pod的Label的key/value标签。
5.1.1.1.app:nginx:label的key和value。
5.2.spec:配置Pod的具体规格。
5.2.1.containers:设置Pod的容器。
5.2.1.1.name:设置容器的名称。
5.2.1.2.image:设置容器的镜像地址。
5.2.1.3.ports:设置容器的端口。
5.2.1.3.1.containerPort:设置容器的端口。

二、Replication Controller的基本操作
1.通过定义文件创建Replication Controller
$kubectl create -f my-nginx-rc.yaml
除了kubectl create命令之外,也可以通过kubectl run命令创建Replication Controller:
$kubectl run my-nginx --image nginx --replicas 2 --labels app=nginx
2.查询Replication Controller
$kubectl get replicationController my-nginx
同时可以查询Replication Controller创建的Pod:
$kuectl get pod --selector app=nginx --label-columns app
3.删除Replication Controller
$kubectl delete rc my-nginx
相应的Pod也会被删除。如果需要保留Pod的运行,删除的时候可以设置参数--cascade=false。

三、Replication Controller和Pod的关联
Replication Controller和Pod的关联是通过Label实现的,Label机制是kubernetes中很重要的一个设计,通过Label进行对象的弱关联,可以灵活地进行分类和选择。
Replication Controller和Pod的关联是通过Label实现的,Label机制是kubernetes中很重要的一个设计,通过Label进行对象的弱关联,可以灵活地进行分类和选择。
对于Pod,需要设置Label来进行标识,Label是一系列的Key/value对。
Label的定义时任意的,但是Label必须具有可标识性,比如设置Pod的应用名称和版本号等。另外,Label是不具有为一些,为了更准确地标识Pod,建议为Pod设置不同维度的Label。
对于Replication Controller来说就是通过Label Selector来匹配Pod的Label,从而实现关联关系。在Replication Controller的定义中通过.spec.selector来设置Label Selector。

四、弹性伸缩
弹性伸缩是指适应负载变化,以弹性可伸缩方式提供资源,特别是在虚拟化的支持下,提供资源的利用率和用户满意度,较好的解决了资源利用率和应用系统之间的矛盾,是云计算领域的关键能力。
目前kubernetes提供了API接口实现Pod弹性伸缩。Pod的副本数通过Replication Controller进行控制,所以Pod的弹性伸缩就是修改Replication Controller的Pod的副本数。可以通过kubectl scale命令来完成。
1.修改Pod的副本数目
$kubectl scale replicationController my-nginx --replicas=3
2.kubectl scale如果设置--current-replicas参数,就会先检查当前Pod的副本数是否匹配,不匹配的话就会报错:
$kubectl scale replicationController my-nginx --current-replicas=2 --replicas=3
3.另外,可以将Pod的副本数目设置为0,即删除Replication Controller关联的所有Pod:
$kubectl scale replicationController my-nginx --replicas=0

五、自动伸缩
通过Replication Controller可以非常方便的实现Pod的弹性伸缩,在此基础上,只要有平台监控支持,就可以实现自动伸缩的功能,即基于Pod的资源使用情况,根据配置的策略自动调整Pod的副本数。
在kubernetes中通过Horizontal Pod Autoscaler来实现Pod的自动伸缩,Horizontal Pod Autoscaler同Replication Controller是一一对应的,Horizontal Pod Autoscaler将定时从平台监控系统中获取Replication Controller关联Pod的整体资源使用情况。当策略匹配的时候,通过Replication Controller来调整Pod的副本数,实现自动伸缩(kubernetes需要安装平台监控)。

六、滚动升级
滚动升级是一种平滑过渡的升级方式,通过逐步替换的策略,保证整体系统的稳定,在初始升级的时候就可以及时发现、调整问题,以保证问题影响度不会扩大。
1.定义my-nginx-v1-rc.yaml文件
apiVersion:v1
kind:ReplicationController
metadata:
    name:my-nginx-v1
spec:
    replicas:2
    selector:
        app:nginx
        version:v1
    template:
        metadata:
            labels:
                app:nginx
                version:v1
        spec:
            containers:
                -name:nginx
                image:nginx:v1
                ports:
                    -containerPort:80
2.通过定义文件创建Replication Controller
$kubectl create -f my-nginx-v1-rc.yaml
3.定义my-nginx-v2-rc.yaml文件
apiVersion:v1
kind:ReplicationController
metadata:
    name:my-nginx-v2
spec:
    replicas:2
    selector:
        app:nginx
        version:v2
    template:
        metadata:
            labels:
                app:nginx
                version:v2
        spec:
            containers:
                -name:nginx
                image:nginx:v2
                ports:
                    -containerPort:80
4.滚动升级,将my-nginx-v1-rc.yaml升级到my-nginx-v2-rc.yaml
$kubectl rolling-update my-nginx-v1 -f my-nginx-v2-rc.yaml --update-period=10s
如果在升级过程中,发生了错误中途退出的时候,可以选择继续升级。kubernetes能够智能的判断出升级中断之前的阶段,然后紧接着继续执行升级。
另外,也可以进行回退。命令如下:
$kubectl rolling-update my-nginx-v1 -f my-nginx-v2-rc.yaml --update-period=10s --rollback

七、Deployment
kubernetes提供了一种更加简单的更新Replication Controller和Pod的机制,叫做Deployment。
1.Deployment定义文件my-nginx-deployment.yaml
apiVersion:extensions/v1beta1
kind:Deployment
metadata:
    name:my-nginx-deployment
spec:
    replicas:2
    selector:
        app:nginx
    template:
        metadata:
            labels:
                app:nginx
        spec:
            containers:
                -name:nginx
                image:nginx:v1
                ports:
                    -containerPort:80
                    protocol:TCP
Deployment的定义与Replication Controller类似,包括Pod副本数和Pod副本设置,这些定义将会作用于Deployment创建的Replication Controller。
2.创建Deployment
$kubectl create -f my-nginx-deployment.yaml --validate=false
创建成功后可以查询到Deployment:
$kubectl get deployment my-nginx-deployment
也可以查询到其创建的Replication Controller:
$kubectl get replicationController --selector app=nginx
3.更新升级
定义文件my-nginx-v2-deployment.yaml,新的deployment定义文件镜像版本更改为v2:
apiVersion:extensions/v1beta1
kind:Deployment
metadata:
    name:my-nginx-deployment
spec:
    replicas:2
    selector:
        app:nginx
    template:
        metadata:
            labels:
                app:nginx
        spec:
            containers:
                -name:nginx
                image:nginx:v2
                ports:
                    -containerPort:80
                    protocol:TCP
执行命令更新升级当前Deployment:
$kubectl apply -f my-nginx-v2-deployment.yaml --validate=false
这样Deployment会控制新旧Replication Controller,实现Pod的升级。
默认情况下Deployment采取的是滚动升级方式,通使用kubectl rolling-update是一致的。即逐步增加新的Replication Controller的副本数,逐步减少旧的Replication Controller的副本数。


在Deployment中可以使用升级的策略,通过.spec.trategy.type指定升级类型,包括Recreate和RollingUpdate。

八、一次性任务的Pod
Replication Controller创建的Pod都是长时间运行服务,相应的,kubernetes提供了另外一种机制,Job来管理一次性任务的Pod。
1.Job定义文件busybox.yml
apiVersion: batch/v1
kind: Job
metadata:
  labels:
    name: busybox
  name: busybox
spec:
  template:
    metadata:
      name: busybox
      labels:
        mylabel:busybox
    spec:
      containers:
        - name: busybox
          image: myhub.mingyuanyun.com/library/busybox
          command:
            - sleep
            - "30"
      restartPolicy: Never
因为是一次性任务Pod,所以Pod的重启策略只能是Never或者OnFailure。
2.创建Job
$kubectl create -f busybox.yml
3.查看Job
$kubectl get job  busybox

posted @ 2017-12-11 16:59  牛头人  阅读(1055)  评论(0编辑  收藏  举报