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 会立即“翻脸不认人”。