K8S-Pod资源对象——标签

什么是标签?

标签其实就是分组

标签其实就一对 key/value ,被关联到对象上,比如Pod,标签的使用我们倾向于能够表示对象的特殊特点,就是一眼就看出了这个Pod是干什么的,标签可以用来划分特定的对象(比如版本,服务类型等),标签可以在创建一个对象的时候直接定义,也可以在后期随时修改,每一个对象可以拥有多个标签,但是,key值必须是唯一的。创建标签之后也可以方便我们对资源进行分组管理。如果对pod打标签之后就可以使用标签来查看、删除指定的pod。(慎重!!!)

在k8s中,大部分资源都可以打标签。

给pod资源打标签

cpp 复制代码
#对已经存在的pod打标签
[root@k8s-master01 ~]#  kubectl label pods pod-first  release=v1
#查看标签是否打成功
[root@k8s-master01 ~]#  kubectl get pods pod-first --show-labels
复制代码

查看资源标签

cpp 复制代码
#查看默认名称空间下所有pod资源的标签
[root@k8s-master01 ~]# kubectl get pods --show-labels
#查看默认名称空间下指定pod具有的所有标签
[root@k8s-master01 ~]# kubectl get pods pod-first --show-labels
#列出默认名称空间下标签key是release的pod,不显示标签
[root@k8s-master01 ~]# kubectl get pods -l release
#列出默认名称空间下标签key是release、值是v1的pod,不显示标签
[root@k8s-master01 ~]# kubectl get pods -l release=v1
#列出默认名称空间下标签key是release的所有pod,并打印对应的标签值
[root@k8s-master01 ~]# kubectl get pods -L release
#查看所有名称空间下的所有pod的标签
[root@k8s-master01 ~]# kubectl get pods --all-namespaces --show-labels

使用yaml文件生成标签

cpp 复制代码
#使用yaml文件生成标签

#yaml文件在更新时是不会中断业务的,所以使用很方便

#查看pod标签
[root@k8s-master pki]# kubectl get pods --show-labels 
NAME       READY   STATUS    RESTARTS   AGE   LABELS
pod-test   1/1     Running   0          9h    app=nginx129
#修改podyaml文件
[root@k8s-master ~]# vim nginx-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-test
  namespace: test
  labels:
    app: nginx129
    app1: nginx129  #添加一个标签
spec:
  containers:
  - name: nginx129
    ports:
    - containerPort: 80
    image: nginx:latest
    imagePullPolicy: IfNotPresent
    resources:
      limits:
        cpu: 0.5
        memory: 1024Mi

#更新配置文件
[root@k8s-master ~]# kubectl  apply  -f nginx-pod.yaml 
pod/pod-test configured
#会多出一个新添加的标签  app1=nginx129  (--show-labels显示所有标签)
#显示pod的所有标签
[root@k8s-master ~]# kubectl get pods --show-labels
NAME       READY   STATUS    RESTARTS   AGE   LABELS
pod-test   1/1     Running   0          9h    app1=nginx129,app=nginx129
#输出当前已经运行的,被系统的补齐的pod的yaml文件
[root@k8s-master ~]# kubectl get pod pod-test -o yaml
-----------------
restartPolicy: Always   #单一pod里的Always不生效,在pod控制器里边重启策略才生效
  schedulerName: default-scheduler
  securityContext: {}
  serviceAccount: default
  serviceAccountName: default
  terminationGracePeriodSeconds: 30
  tolerations:
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 300
    --------------------------
         - configMap:
          items:
          - key: ca.crt
            path: ca.crt
          name: kube-root-ca.crt   #所有pod都信任真证书
[root@k8s-master ~]# kubectl delete pod pod-test  #删除检测重启策略会不会生效
pod "pod-test" deleted
[root@k8s-master ~]# kubectl get pod   #不生效
No resources found in test namespace.
[root@k8s-master ~]# kubectl apply -f nginx-pod.yaml  #更新配置文件
pod/pod-test created
[root@k8s-master ~]# kubectl get pod
NAME       READY   STATUS    RESTARTS   AGE
pod-test   1/1     Running   0          20s
[root@k8s-master ~]# kubectl get pod -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
pod-test   1/1     Running   0          51s   10.244.36.73   k8s-node1   <none>           <none>

使用命令生成标签

cpp 复制代码
#使用命令生成标签
#添加新标签
[root@k8s-master ~]# kubectl  label pods pod-test  app2=nginx129 
pod/pod-test labeled
# (--show-labels显示所有标签)  
[root@k8s-master ~]# kubectl  get pod --show-labels 
NAME       READY   STATUS    RESTARTS   AGE     LABELS
pod-test   1/1     Running   0          4m36s   app1=nginx129,app2=nginx129,app=nginx129
创建一个新pod,并创建nginx129容器
cpp 复制代码
#创建一个新pod,并创建nginx129容器
[root@k8s-master ~]# vim nginx-pod.yaml 
---------------------------------------
apiVersion: v1
kind: Pod
metadata:
  name: pod-test1
  namespace: test
  labels:
    app: nginx129
    app1: nginx129
spec:
  containers:
  - name: nginx129
    ports:
    - containerPort: 80
    image: nginx:latest
    imagePullPolicy: IfNotPresent
    resources:
      limits:
        cpu: 0.5
        memory: 1024Mi
 ---------------------------------------       
        
[root@k8s-master ~]# kubectl apply -f nginx-pod.yaml 
pod/pod-test1 created
[root@k8s-master ~]# kubectl get pod
NAME        READY   STATUS    RESTARTS   AGE
pod-test    1/1     Running   0          20m
pod-test1   1/1     Running   0          11s
[root@k8s-master ~]# kubectl get pod -o wide 
NAME        READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
pod-test    1/1     Running   0          20m   10.244.36.73     k8s-node1   <none>           <none>
pod-test1   1/1     Running   0          25s   10.244.169.149   k8s-node2   <none>           <none>

#可以通过delete pod -l 指向标签来删除pod      (标签是app=nginx129)
[root@k8s-master ~]# kubectl delete pod -l app=nginx129
pod "pod-test" deleted
pod "pod-test1" deleted

#查看所有名称空间下的所有pod的标签
[root@k8s-master ~]# kubectl get pods --all-namespaces --show-labels

资源限制

节点资源不足,导致调度失败

cpp 复制代码
#节点资源不足,导致调度失败

[root@k8s-master ~]# vim nginx-pod2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod2
spec:
  containers:
  - name: nginx2
    image: nginx
    imagePullPolicy: IfNotPresent
    resources:
      limits:
        cpu: '8'
        memory: '8Gi'
      requests:
        cpu: '6'
 #更新配置会报错,因为我们给的是4核4G
[root@k8s-master ~]# kubectl apply -f nginx-pod2.yaml 
Error from server (Forbidden): error when creating "nginx-pod2.yaml": pods "nginx-pod2" is forbidden: exceeded quota: mem-cpu-quota, requested: limits.cpu=8,limits.memory=8Gi,requests.cpu=6,requests.memory=8Gi, used: limits.cpu=0,limits.memory=0,requests.cpu=0,requests.memory=0, limited: limits.cpu=4,limits.memory=4Gi,requests.cpu=2,requests.memory=2Gi
#当资源配额配置不符合,但是更新配置成功了,并不代表成功,是node节点无法连接

所在命名空间资源不足

cpp 复制代码
##创建命名空间并设置资源限制
[root@k8s-master ~]# vim c2409.txt
apiVersion: v1
kind: Namespace
metadata:
  name: c2409
---
apiVersion: v1
kind: ResourceQuota
metadata:
  name: mem-cpu-quota
  namespace: c2409
spec:
  hard:
    requests.cpu: '2'
    requests.memory: '2Gi'
    limits.cpu: '4'
    limits.memory: '4Gi'
###创建pod
[root@k8s-master ~]# vim nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod2
  namespace: c2409
spec:
  containers:
  - name: nginx2
    image: nginx
    imagePullPolicy: IfNotPresent
    resources:
      limits:
        cpu: '8'
        memory: '8Gi'
      requests:
        cpu: '6'
        memory: '2Gi'


##提交后的报错信息
[root@k8s-master ~]# kubectl apply -f nginx.yaml 
Error from server (Forbidden): error when creating "nginx.yaml": pods "nginx-pod2" is forbidden: exceeded quota: mem-cpu-quota, requested: limits.cpu=8,limits.memory=8Gi,requests.cpu=6, used: limits.cpu=0,limits.memory=0,requests.cpu=0, limited: limits.cpu=4,limits.memory=4Gi,requests.cpu=2