带你玩转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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
1apiVersion: v1
2kind: ReplicationController
3metadata:
4  name: frontend
5spec:
6  replicas: 1
7  selector:
8    tier: frontend
9  template:
10    metadata:
11      labels:   #可以自己定义key-value
12        app: app-demo  
13        tier: frontend   #前端架构
14    spec:
15      containers:
16      - name: tomcat-damo
17        image: tomcat
18        imagePullPolicy: IfNotPresent
19        ports:
20        - containerPort: 8080
21        env:             #环境变量
22        - name: GET_HOSTS_FROM
23          value: dns
24
25

创建方法:


1
2
1kubectl create -f tomcatdemo-rc.yaml
2

查看方法

 

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的概念


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
1apiVersion: extensions/v1beta1
2kind: Deployment
3metadata:
4  name: frontend
5spec:
6  replicas: 1
7  selector:
8    matchLabels:
9      tier: frontend
10    matchExpressions:
11    - {key: tier, operator: In, values: [frontend]}
12  template:
13    metadata:
14      labels:
15        app: app-demo
16        tier: frontend   #前端架构
17    spec:
18      containers:
19      - name: tomcat-damo2
20        image: tomcat
21        imagePullPolicy: IfNotPresent
22        ports:
23        - containerPort: 8081
24        env:             #环境变量
25        - name: GET_HOSTS_FROM
26          value: dns
27

1
2
1kubectl create -f tomcat-deployment.yarml
2

 

小结:

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

         谢谢大家的支持!

 

 

 

 

给TA打赏
共{{data.count}}人
人已打赏
安全运维

故障复盘的简洁框架-黄金三问

2021-9-30 19:18:23

安全运维

OpenSSH-8.7p1离线升级修复安全漏洞

2021-10-23 10:13:25

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索