写在前面:如有问题,以你为准,
目前24年应届生,各位大佬轻喷,部分资料与图片来自网络
内容较长,页面右上角目录方便跳转
namespace 实现资源分组,label实现业务分组
Namespace
基础理论
最重要功能:资源分割,网络隔离(结合NNetworkPolicy)
- 默认情况下,kubernetes集群中的所有Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那么此时就可以将两个Pod划分到不同的Namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的“组”,以方便不同的组的资源进行隔离使用和管理。
- 可以通过kubernetes的授权机制,将不同的Namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理
如下图中,dev交给开发组部门进行管理,test交给测试组部门进行管理
- ① 基于环境隔离,如:dev(开发)、test(测试)、prod(生产)等。
- ② 基于产品线隔离,如:前端、后端、中间件、大数据、Android、iOS、小程序等。
- ③ 基于团队隔离,如:企业发展事业部、技术工程事业部、云平台事业部等。
命名规则
- ① 不能带小数点(.)。
- ② 不能带下划线(_)。
- ③ 使用数字、小写字母或减号(-)组成的字符串
自带命名空间
kubernetes在集群启动之后,会默认创建几个namespace
default:所有未指定的Namespace的对象都会被分配在default命名空间。
kube-node-lease:集群节点之间的心跳维护,v1.13开始引入。
kube-public:此命名空间的资源可以被所有人访问(包括未认证用户)。
实操
命令行实操
查看
# 查看所有namespace
kubectl get namespace
kubectl get ns
# 指定查看ns
kubectl get ns default
# 指定命名空间的输出格式
kubectl get ns default -o wide/json/yaml
# 查看命名空间的详情
kubectl describe ns default
#Active命名空间正在使用中 Terminating正在删除命名空间
#ResourceQuota针对namespace做的资源限制
#LimitRange针对namespacel中的每个组件做的资源限制
创建 删除
kubectl create ns dev
kubectl delete ns dev
# 注可以通过删除 namespace 来删除隶属于该命名空间的所有pod
yaml 方式
apiVersion: v1
kind: Namespace
metadata:
name: dev
kubectl create -f ns-dev.yaml
Label
理论
例子:前台和后台程序需要进行通信哪就要再同一个namespace下,这样就没办法进行逻辑上的分组来区分前台和后台,就要使用label来进行逻辑上的分组,同一个组的Pod使用同一个label进行区分
- Label是kubernetes的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择。
- Label的特点:
- 一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去。
- Label通常在资源对象定义时确定,当然也可以在对象创建后动态的添加或删除。
重点:namespace 实现资源分组,label实现业务分组
- 版本标签:“version”:”release”,”version”:”stable”
- 环境标签:“environment”:”dev”,“environment”:”test”,“environment”:”pro”
- 架构标签:“tier”:”frontend”,”tier”:”backend”
标签语法
- 标签是一组键值对(key/value),标签的 key 有两个部分:可选的前缀和标签名,通过 / 分隔。
- 标签前缀:
- 如果指定,必须是一个 DNS 的子域名,如:k8s.eip.work 。
- 不能多余 253 个字符。
- 使用 / 和标签名分隔。
如果省略标签前缀,则标签的 key 就被认为是专属于用户的。Kubernetes 的系统组件
(如:kube-scheduler、kube-controller-manager、kube-apiserver、kubectl
或其他第三方组件)向可以的 Kubernetes 对象添加标签的时候,必须指定一个前缀。
- 标签名:
- 标签名部分是必须的。
- 不能多余 63 个字符。
- 必须由字母、数字开始和结尾。
- 可以包含字母、数字、减号(-)、下划线(_)、小数点(.)
- 标签的 value :
- 不能多于 63 个字符。
- 可以为空字符串。
- 如果不为空,则必须由字母、数字开始和结尾。
- 如果不为空,可以包含字母、数字、减号(-)、下划线(_)、小数点(.)。
Label Selector
- 通常来讲,会有多个 Kubernetes 对象包含相同的标签。通过使用标签选择器(label selector),用户/客户端可以选择一组对象。标签选择器是 Kubernetes 中最主要的分类和筛选手段。
- Kubernetes 的 api-server 支持两种形式的标签选择器,equality-based 基于等式的 和 set-based 基于集合的 。标签选择器可以包含多个条件,并使用逗号进行分隔,此时只要满足所有条件的 Kubernetes对象才会被选中。
- 基于等式的标签选择器,可以使用三种操作符 = 、== 、!=。前两个操作符含义是一样的,都代表相等;后一个操作符代表不相等。
标签定义完毕之后,还要考虑到标签的选择,这就要用到Label Selector,即:
-
- Label用于给某个资源对象定义标识。
- Label Selector用于查询和筛选拥有某些标签的资源对象
- 基于等式的Label Selector。
- name=slave:选择所有包含Label中的key=“name”并且value=“slave”的对象。
- env!=production:选择所有包含Label中的key=“env”并且value!=“production”的对象。
- 基于集合的Label Selector。
- name in (master,slave):选择所有包含Label中的key=“name”并且value=“master”或value=“slave”的对象。
- name not in (master,slave):选择所有包含Label中的key=“name”并且value!=“master”和value!=“slave”的对象。
- 标签的选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号(,)进行分隔即可。
- name=salve,env!=production。
- name not in (master,slave),env!=production
注解 annotations
注解(annotation) 可以用来向 Kubernetes 对象的 meta.annotations 字段添加任意的信息。Kubernetes 的客户端或者自动化工具可以存取这些信息以实现自定义的逻辑
label 实操
命令行
创建与查看
[root@master k8s]# kubectl get pod -n snj-test --show-labels
NAME READY STATUS RESTARTS AGE LABELS
snj-nginx-test 1/1 Running 0 47s <none>
[root@master k8s]# kubectl label pod -n snj-test snj-nginx-test version=1.0
pod/snj-nginx-test labeled
[root@master k8s]# kubectl get pod -n snj-test --show-labels
NAME READY STATUS RESTARTS AGE LABELS
snj-nginx-test 1/1 Running 0 4m6s version=1.0
更新与删除
[root@master k8s]# kubectl label pod -n snj-test snj-nginx-test version=2.0
error: 'version' already has a value (1.0), and --overwrite is false
[root@master k8s]# kubectl label pod -n snj-test snj-nginx-test version=2.0 --overwrite
pod/snj-nginx-test labeled
[root@master k8s]# kubectl get pod -n snj-test --show-labels
NAME READY STATUS RESTARTS AGE LABELS
snj-nginx-test 1/1 Running 0 5m16s version=2.0
[root@master k8s]# kubectl label pod -n snj-test snj-nginx-test version-
pod/snj-nginx-test unlabeled
[root@master k8s]# kubectl get pod -n snj-test --show-labels
NAME READY STATUS RESTARTS AGE LABELS
snj-nginx-test 1/1 Running 0 8m33s <none>
yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels: # 标签
app: nginx
environment: prod
spec:
containers:
- name: nginx
image: nginx
label selector 实操
命令行
# 选择了标签名为 `environment` 且 标签值为 `production` 的Kubernetes对象
kubectl get pods -l environment=production,tier=frontend
# 选择了标签名为 `tier` 且标签值不等于 `frontend` 的对象,以及不包含标签 `tier` 的对象
kubectl get pods -l tier != frontend
# 选择所有包含 `partition` 标签的对象
kubectl get pods -l partition
# 选择所有不包含 `partition` 标签的对象
kubectl get pods -l !partition
基于集合标签选择器,可以根据标签名的一组值进行筛选。支持的操作符有三种:
# 选择所有的包含 `environment` 标签且值为 `production` 或 `qa` 的对象
kubectl get pods -l environment in (production, qa)
# 选择所有的 `tier` 标签不为 `frontend` 和 `backend`的对象,或不含 `tier` 标签的对象
kubectl get pods -l tier notin (frontend, backend)
# 选择包含 `partition` 标签(不检查标签值)且 `environment` 不是 `qa` 的对象
kubectl get pods -l partition,environment notin (qa)
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: default
labels:
app: nginx
spec:
selector:
matchLabels:
# matchLabels 是一个 {key,value} 组成的 map。
# map 中的一个 {key,value} 条目相当于 matchExpressions 中的一个元素,
# 其 key 为 map 的 key,operator 为 In, values 数组则只包含 value 一个元素。
# matchExpression 等价于基于集合的选择方式
# 支持的 operator 有 In、NotIn、Exists 和 DoesNotExist。
# 当 operator 为 In 或 NotIn 时,values 数组不能为空。
# 所有的选择条件都以 AND 的形式合并计算,即所有的条件都满足才可以算是匹配
app: nginx
matchExpressions:
- {key: tier, operator: In, values: [cache]}
- {key: environment, operator: NotIn, values: [dev]}
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest