一、Label资源

Label是kubernetes系统中的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择。

Label的特点:
  • 不同Label间的应用是可以互相通信的(而不同Namespace之间的应用无法直接通信)

  • 一个Label会以key/value键值对的形式附加到各种对象上,如Node、Pod、Service等等

  • 一个资源对象可以定义任意数量的Label ,同一个Label也可以被添加到任意数量的资源对象上去

  • Label通常在资源对象定义时确定,当然也可以在对象创建后动态添加或者删除

可以通过Label实现资源的多维度分组,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作。

对已有资源添加Label
一些常用的Label 示例如下:
​
版本标签:“version”:“release”, “version”:“stable”
环境标签:“environment”:“dev”,“environment”:“test”,“environment”:“prod”
架构标签:“tier”:“frontend”,“tier”:“backend”
Label的选择

标签定义完毕之后,还要考虑到标签的选择,这就要使用到Label Selector,即:

  • Label用于给某个资源对象定义标识

  • Label Selector用于查询和筛选拥有某些标签的资源对象

当前有两种Label Selector:

  • 基于等式的Label Selector

  1. name = slave: 选择所有包含Label中key="name"且value="slave"的对象

  2. env != prod: 选择所有包括Label中的key="env"且value不等于"prod"的对象

  • 基于集合的Label Selector

  1. name in (master, slave): 选择所有包含Label中的key="name"且value="master"或"slave"的对象

  2. name not in (frontend): 选择所有包含Label中的key="name"且value不等于"frontend"的对象

标签的选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号","进行分隔即可。例如:

  • name=slave,env!=prod

  • name not in (frontend),env!=prod

命令方式
#先创建3个nginx的pod(连带各自创建一些pod控制器)
kubectl run nginxpod1 --image=nginx --port=80 -n test
kubectl run nginxpod2 --image=nginx --port=80 -n test
kubectl run nginxpod3 --image=nginx --port=80 -n test
​
# 为pod资源打标签
[root@master ~]# kubectl label pod nginxpod名 version=1.0 -n test
pod/nginx-pod labeled
​
# 为pod资源更新标签--overwrite
[root@master ~]# kubectl label pod nginxpod名 version=2.0 -n test --overwrite
pod/nginx-pod labeled
​
# 为pod资源更新标签,可以用空格分割多个标签
[root@master ~]# kubectl label pod nginxpod名 tier=backend version=3.0 -n test --overwrite
pod/nginx-pod labeled
​
# 查看标签
[root@master ~]# kubectl get pod nginxpod名  -n test --show-labels
NAME        READY   STATUS    RESTARTS   AGE   LABELS
nginx-pod   1/1     Running   0          10m   version=2.0
​
# 筛选标签
[root@master ~]# kubectl get pod -n test -l version=2.0  --show-labels
NAME        READY   STATUS    RESTARTS   AGE   LABELS
nginx-pod   1/1     Running   0          17m   version=2.0
[root@master ~]# kubectl get pod -n test -l version!=2.0 --show-labels
No resources found in dev namespace.
​
#删除标签
[root@master ~]# kubectl label pod nginxpod名 version- -n test
pod/nginx-pod labeled
配置方式

创建一个yaml配置文件nginxpod-withlabel.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: prod
​
---
apiVersion: v1
kind: Pod
metadata:
  name: nginxpod
  namespace: prod
  labels:
    version: "3.0" 
    env: "prod"
spec:
  containers:
  - image: nginx
    name: pod
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP

然后就可以执行对应的更新命令了:kubectl apply -f nginxpod-withlabel.yaml

二、Deployment资源

Pod控制器是什么

在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。

Pod控制器的作用

Pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod。

Pod控制器的分类
  • deployments

  • replicasets

  • daemonsets

  • jobs

  • cronjobs

  • horizontalpodautoscalers

  • statefulsets

在kubernetes中Pod控制器的种类有很多,本章节只介绍一种:Deployment

命令操作
# 命令格式: kubectl run deployment名称  [参数] 
# --image  指定pod的镜像
# --port   指定端口
# --replicas  指定创建pod数量
# --namespace  指定namespace
# 前置执行kubectl delete namespace test    kubectl create namespace test
[root@master ~]# kubectl run nginx --image=nginx:latest --port=80 --replicas=3 -n test
deployment.apps/nginx created
​
# 查看创建的Pod
[root@master ~]# kubectl get pods -n test
NAME                     READY   STATUS    RESTARTS   AGE
nginx-5ff7956ff6-6k8cb   1/1     Running   0          19s
nginx-5ff7956ff6-jxfjt   1/1     Running   0          19s
nginx-5ff7956ff6-v6jqw   1/1     Running   0          19s
​
# 查看deployment的信息
[root@master ~]# kubectl get deploy -n test
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            3           2m42s
​
# UP-TO-DATE:成功升级的副本数量
# AVAILABLE:可用副本的数量
[root@master ~]# kubectl get deploy -n test -o wide
NAME    READY UP-TO-DATE  AVAILABLE   AGE     CONTAINERS   IMAGES              SELECTOR
nginx   3/3     3         3           2m51s   nginx        nginx   run=nginx
​
# 查看deployment的详细信息
[root@master ~]# kubectl describe deploy nginx -n test
Name:                   nginx
Namespace:              test
CreationTimestamp:      Wed, 08 Apr 2023 11:14:14 +0800
Labels:                 run=nginx
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               run=nginx
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  run=nginx
  Containers:
   nginx:
    Image:        nginx:1.14-alpine
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   nginx-5ff7956ff6 (3/3 replicas created)
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  5m43s  deployment-controller  Scaled up replicaset nginx-5ff7956ff6 to 3
​
# 删除 
[root@master ~]# kubectl delete deploy nginx -n test
deployment.apps "nginx" deleted
配置操作

创建一个nginx-deploy.yaml,内容如下:

其中selector需要与template中的labels有且需要一个标签相关联,不然会报错。而 deployment会给pod生成

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: test
spec:
  replicas: 3
  selector:
    matchLabels:  #与template的labels建立关系
      run: nginx  
  template:  #创建pod的模板,就类似于上面的container
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        ports:
        - containerPort: 80
          protocol: TCP

然后就可以执行对应的创建和删除命令了:

创建:kubectl create -f nginx-deploy.yaml

删除:kubectl delete -f nginx-deploy.yaml

下一篇文章,我们将对Kubernetes中的Service资源进行介绍

更多推荐