Kubernetes学习目录
1、基础知识
1.1、简介
Kubernetes通过标签来管理对应或者相关联的各种资源对象,Lable是kubernetes中的核心概念之一。
1.2、特点
1、创建:
Lable通常在资源对象定义时确定,也可以在对象创建后动态添加或者删除
2、作用:
一个资源对象可以定义多个Lable,同一个Lable也可以关联多个资源对象上去
3、本质:
lable本质上是一个key/value键值对,其中key与value由用户自己指定,Lable可以附加到各种资源对象上(比如我们学过的Node和Pod等)。
注意:
key的命名:由"字母、数字、_、.、-"这五类组成,只能以字符或数字作为开头和结尾。
标签名称不能多于63个字符
1.3、应用目的
Labe1关联到各种资源对象上,通过对Lable的管理从而达到对同Lable的资源进行分组管理(分配、调度、配置、部署等)。
常用标签使用场景:
版本标签: "release" : "stable","release" : "canary", "release" : "beta".。
环境标签: "environment" : "dev","environment" : "qa","environment": "prod"。
应用标签: "app" : "ui","app" : "as", "app" : "pc", "app" : "sc""。
架构层级标签: "tier" : "frontend","tier" : "backend", "tier" : "cache".
分区标签: "partition" : "customerA","partition": "customerB"。
品控级别标签: "track" : "daily","track" : "week1y"。
1.4、操作方法
1.4.1、yaml令行方法
yaml方法:
在特定的属性后面按照指定方式增加内容即可,格式如下:
labels:
key: value
注意:
labels 是 一个
1.4.2、命令行方法
查看标签:kubectl get pods -l label_name=label_value
参数:
-l 就是指定标签条件,获取指定资源对象,=表示匹配,!= 表示不匹配
如果后面的选择标签有多个的话,使用逗号隔开
如果针对标签的值进行范围过滤的话,可以使用如下格式:
-l "label_name in|notin (value1, value2, value3, ...)"
增加标签:kubectl label 资源类型 资源名称 label_name=label_value
参数:
同时增加多个标签,只需要在后面多写几个就可以了,使用空格隔开
默认情况下,已存在的标签是不能修改的,使用 --overwrite=true 表示强制覆盖
删除标签:
label_name=label_value样式写成 label_name- ,表示删除label
2、简单实践
2.1、资源文件方式
2.1.1、资源清单
cat > pod-test.yml<<'EOF'
apiVersion: v1
kind: Pod
metadata:
name: nginx-test
labels:
app: nginx
spec:
containers:
- name: nginx
image: 192.168.10.33:80/k8s/my_nginx:v1
env:
- name: HELLO
value: "Hello kubernetes nginx"
EOF
2.1.2、还没有增加标签的查询
master1 ]# kubectl get pods
...
Labels: <none>
...
2.1.3、应用清单并且查询标签
master1 ]# kubectl apply -f pod-test.yml
pod/nginx-test created
master1 ]# kubectl get pod nginx-test --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-test 1/1 Running 0 31s app=nginx
2.1.4、通过标签过滤查询pod
master1 ]# kubectl get pods -l app=nginx
NAME READY STATUS RESTARTS AGE
nginx-test 1/1 Running 0 92s
2.2、命令行方式
master1 ]# kubectl run nginx-test --image=192.168.10.33:80/k8s/my_nginx:v1 --labels="app=nginx,env=prod"
master1 ]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-test 1/1 Running 0 2m43s app=nginx,env=prod
master1 ]# kubectl get pod -l app=nginx
NAME READY STATUS RESTARTS AGE
nginx-test 1/1 Running 0 2m57s
3、标签管理【命令行】
3.1、增加标签
kubectl label pod nginx-test version=1.0
3.2、查询标签
kubectl get pod --show-labels
3.3、删除标签
kubectl label pod nginx-test version-
4、标签选择器
4.1、基础知识
4.1.1、简介
Lablel附加到Kubernetes集群中的各种资源对象上,目的就是对这些资源对象进行分组管理,而分组管理的核心就是:Lablel Selector。
分组管理的原理:
我们可以通过Label Selector(标签选择器)查询和筛选某些特定Label的资源对象,进而可以对他们进行相应的操作管理,类似于我们的sql语句中where的条件:
select * from where ...
Lablel Selector跟Label一样,不能单独定义,必须附加在一些资源对象的定义文件上。一般附加在RC和Service的资源定义文件中。
4.1.2、表达式
Label Selector使用时候有两种常见的表达式:等式和集合
等式:
name = nginx 匹配所有具有标签 name = nginx 的资源对象
name != nginx 匹配所有不具有标签 name = nginx 的资源对象
集合:
env in (dev, test) 匹配所有具有标签 env = dev 或者 env = test 的资
源对象
name not in (frontend) 匹配所有不具有标签 name = frontend 的资源对象
4.2、集合表达式
随着Kubernetes功能的不断完善,集合表达式逐渐有了两种规范写法:匹配标签、匹配表达式
4.2.1、匹配标签
4.2.2、匹配表达式
matchExpressions:
- {key: name, operator: NotIn, values: [frontend]}
常见的operator操作属性值有:
In、NotIn、Exists、NotExists等
Exists和DostNotExist时,values必须为空,即
{ key: environment, opetator: Exists,values:}
注意:
这些表达式,一般应用在RS、RC、Deployment等其它管理对象中。
4.3、应用场景
标签选择器的主要应用场景:
监控具体的Pod、负载均衡调度、定向调度,常用于 Pod、Node等资源对象

当设置 env=dev的Label Selector,则会匹配到Node1和Node2上的Pod
4.4、表达式过滤查询pod
4.4.1、等值过滤
# 等值过滤
master1 ]# kubectl get pods -l env=test
# 等值过滤
master1 ]# kubectl get pods -l env==test
4.4.2、不相等
# 不相等
master1 ]# kubectl get pods -l app!=nginx
4.4.3、包含标签的key
# 包含app的key
master1 ]# kubectl get pods -l app
4.4.4、多条件过滤
# 多条件过滤
master1 ]# kubectl get pods -l "env in(test,prod)"
4.4.5、多条件过滤取反
# 多条件过滤取反
master1 ]# kubectl get pods -l "env notin(test,prod)"
4.5、service资源对象关联对应标签的Pod
4.5.1、创建3个Pod
kubectl run nginx-test1 --image=192.168.10.33:80/k8s/my_nginx:v1 --labels='app=nginx'
kubectl run nginx-test2 --image=192.168.10.33:80/k8s/my_nginx:v1 --labels='app=nginx'
kubectl run nginx-test3 --image=192.168.10.33:80/k8s/my_nginx:v1 --labels='app=nginx'
master1 ]# kubectl get pods --show-labels -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
nginx-test1 1/1 Running 0 63s 10.244.3.99 node1 <none> <none> app=nginx
nginx-test2 1/1 Running 0 58s 10.244.3.100 node1 <none> <none> app=nginx
nginx-test3 1/1 Running 0 52s 10.244.4.59 node2 <none> <none> app=nginx
4.5.2、创建service对象关联对应标签的Pod
cat >service-test.yml<<'EOF'
kind: Service
apiVersion: v1
metadata:
name: service-test
spec:
selector:
app: nginx
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
EOF
master1 ]# kubectl apply -f service-test.yml
# 访问集群IP地址,是负载至每个pod节点上
master1 ]# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service-test ClusterIP 10.103.165.52 <none> 80/TCP 61s app=nginx
# 看到已经关联到相关的pod
master1 ]# kubectl describe service service-test
...
TargetPort: 80/TCP
Endpoints: 10.244.3.100:80,10.244.3.99:80,10.244.4.59:80
...