k8s动手任务4:label & selector 专属练习任务

49 阅读2分钟

0 目标

学会 kubectl label 命令 & 查看标签; 掌握标签的等值选择器

1 前置准备(一次性)

# 创建命名空间
kubectl create ns label-demo
# 把当前 kubeconfig 上下文的默认命名空间改成 `label-demo`
kubectl config set-context --current --namespace=label-demo

2 给 Pod 打多组 label

启动 3 个 Pod

# pod-labels.yaml
apiVersion: v1
kind: Pod
metadata:
  name: alpha
spec:
  containers:
  - name: box
    image: docker.io/library/nginx:latest
    imagePullPolicy: Never
    command: ["sleep", "3600"]
---
apiVersion: v1
kind: Pod
metadata:
  name: beta
spec:
  containers:
  - name: box
    image: docker.io/library/nginx:latest
    imagePullPolicy: Never
    command: ["sleep", "3600"]
---
apiVersion: v1
kind: Pod
metadata:
  name: gamma
spec:
  containers:
  - name: box
    image: docker.io/library/nginx:latest
    imagePullPolicy: Never
    command: ["sleep", "3600"]

启动

kubectl apply -f pod-labels.yaml

批量打标签

kubectl label pod alpha  env=prod  team=web  rel=1.0
kubectl label pod beta   env=test  team=api  rel=2.0
kubectl label pod gamma  env=prod  team=api  rel=1.0

查看标签

hw@host2:~/istack$ kubectl get pod --show-labels
NAME    READY   STATUS    RESTARTS   AGE     LABELS
alpha   1/1     Running   0          9m35s   env=prod,rel=1.0,team=web
beta    1/1     Running   0          9m35s   env=test,rel=2.0,team=api
gamma   1/1     Running   0          9m35s   env=prod,rel=1.0,team=api

3 用 = 与 != 筛选 Pod

选出 env=prod 的 Pod

hw@host2:~/istack$ kubectl get pod -l env=prod
NAME    READY   STATUS    RESTARTS   AGE
alpha   1/1     Running   0          10m
gamma   1/1     Running   0          10m

选出 env!=prod 的 Pod

kubectl get pod -l env!=prod
# NAME   READY   STATUS    RESTARTS   AGE
# beta   1/1     Running   0          11m

4 用 in / notin 做集合筛选

选出 team 是 web 或 api 的 Pod

kubectl get pod -l 'team in (web,api)'
# 结果:alpha、beta、gamma(全中)

选出 env 不是 prod 且 team 不是 web 的 Pod

kubectl get pod -l 'env notin (prod),team notin (web)'
# 结果:beta

5 Service 按 selector 代理不同版本

体会“标签不同 → 流量不同”

给 alpha、gamma 再加一个统一标签 tier=frontend

# --overwrite` 的作用是:如果该 Pod 已经存在同名标签 `tier`,强制覆盖成新值;否则命令会报错
kubectl label pod alpha gamma tier=frontend --overwrite

创建 Service,只挑 tier=frontend

# frontend-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: frontend
spec:
  selector:
    tier: frontend   # 只有 alpha、gamma
  ports:
  - port: 80
    targetPort: 80
kubectl apply -f frontend-svc.yaml

查看 endpoints

kubectl get endpoints frontend
# NAME       ENDPOINTS                     AGE
# frontend   10.0.0.146:80,10.0.0.179:80   24s

6 清理

kubectl delete ns label-demo
kubectl config set-context --current --namespace=default

7 小结一句话

label 是“贴条”,selector 是“按条找人” ——把条贴错或撕掉,Service & Deployment 会立即“翻脸不认人”。