带你玩转kubernetes-k8s(第四篇:k8s-Label,Deployment基本概念及实例)

  周六本人生日和朋友喝酒去了,给大家说声抱歉,两天没有更新,希望大家可以谅解!

 今天我们主要讲解k8s中的Label,Doployment,Horizontal Pod Aitoscaler(HPA).在讲解中途,我们会穿插一些小的实例,使大家可以更加的了解。

Label:一个Label是一个Key-Value的键值对,Label可以被附加到各种资源对象上(Pod,Node,Service,RC)

Label:一个Label可以定义任意数量个标签,通常在资源对象定义时确定,可以在对象创建后动态添加或删除。

Label:通过给指定的资源对象捆绑一个或多个不同的Label来实现多维度的资源分组管理功能。

Label:给某个资源对象定义一个标签,我们可以通过Label Selector(标签选择器)查看和筛选。生产环境中常用的Label如下:

                            ◎ 版本标签:"release":"stable"、"release":"canary"。
                            ◎ 环境标签:"environment":"dev"、"environment":"qa"、"environment":"production"。
                            ◎ 架构标签:"tier":"frontend"、"tier":"backend"、"tier":"middleware"。
                            ◎ 分区标签:"partition":"customerA"、"partition":"customerB"。
                            ◎ 质量管控标签:"track":"daily"、"track":"weekly"。

Label:基于等式(Equality-based)的筛选标签的例子:

                           ◎ name=redis-slave:匹配所有具有标签name=redis-slave的资源对象。
                           ◎ env!=production:匹配所有不具有标签env=production的资源对象,比如env=test就是满足此条件的标签之一
后者则使用集合操作(Set-based)类表达式匹配标签,下面是一些具体的例子。
                          ◎ name in(redis-master, redis-slave):匹配所有具有标签name=redis-master或者name=redis-slave的资源对象。
                          ◎ name not in(php-frontend):匹配所有不具有标签name=php-frontend的资源对象

 

Label Selector 在k8s中重要使用场景如下:

                         ◎ kube-controller进程通过在资源对象RC上定义的Label Selector来筛选要监控的Pod副本数量,使Pod副本数量始终符合预期设定的全自动控制流程。
                         ◎ kube-proxy进程通过Service的Label Selector来选择对应的Pod,自动建立每个Service到对应Pod的请求转发路由表,从而实现Service的智能负载均衡机制。
                         ◎ 通过对某些Node定义特定的Label,并且在Pod定义文件中使用NodeSelector这种标签调度策略,kube-scheduler进程可以实现Pod定向调度的特性。

完整的rc.yarm

apiVersion: v1
kind: ReplicationController
metadata:
  name: frontend
spec:
  replicas: 1
  selector:
    tier: frontend
  template:
    metadata:
      labels:   #可以自己定义key-value
        app: app-demo   
        tier: frontend   #前端架构
    spec:
      containers:
      - name: tomcat-damo
        image: tomcat
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
        env:             #环境变量
        - name: GET_HOSTS_FROM
          value: dns

创建方法:

kubectl create -f tomcatdemo-rc.yaml

查看方法

 

Deployment:在内部使用了Replica Set来实现目的,无论从Deployment的作用与目的、YAML定义,还是从它的具体命令行操作来看,我们都可以把它看作RC的一次升级,两者的相似度超过90%。

Deployment:相对于RC的一个最大升级是我们可以随时知道当前Pod“部署”的进度。

Deployment:典型的使用场景有以下几个:

        ◎ 创建一个Deployment对象来生成对应的Replica Set并完成Pod副本的创建。

        ◎ 检查Deployment的状态来看部署动作是否完成(Pod副本数量是否达到预期的值)。
        ◎ 更新Deployment以创建新的Pod(比如镜像升级)。
        ◎ 如果当前Deployment不稳定,则回滚到一个早先的Deployment版本。
        ◎ 暂停Deployment以便于一次性修改多个PodTemplateSpec的配置项,之后再恢复Deployment,进行新的发布。
        ◎ 扩展Deployment以应对高负载。
        ◎ 查看Deployment的状态,以此作为发布是否成功的指标。
        ◎ 清理不再需要的旧版本ReplicaSets。

我们来运行一个例子来直观感受Deployment的概念

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: frontend
spec:
  replicas: 1
  selector:
    matchLabels:
      tier: frontend
    matchExpressions:
    - {key: tier, operator: In, values: [frontend]}
  template:
    metadata:
      labels:
        app: app-demo
        tier: frontend   #前端架构
    spec:
      containers:
      - name: tomcat-damo2
        image: tomcat
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8081
        env:             #环境变量
        - name: GET_HOSTS_FROM
          value: dns
kubectl create -f tomcat-deployment.yarml

 

带你玩转kubernetes-k8s(第四篇:k8s-Label,Deployment基本概念及实例)_第1张图片

小结:

        看到这里大家今天的内容理解了吗?没有理解可以自行百度慢慢消化哦,如果有什么不懂得可以在下面评论,周一至周五晚12点之前博主会更新出一篇关于k8s的讲解文章,博主晚上看到评论中的问题,会第一时间为大家解答哦

         谢谢大家的支持!

 

 

 

 

你可能感兴趣的:(kubernetes)