k8s 之 Kubernetes服务发布基础

标签和选择器

1. 标签(Labels)

标签是附着在 k8s 资源(Pod、Node、Service、Deployment 等)上的键值对,用于对资源进行标识和分类,本身不具备任何语义,仅用于筛选和分组。

特点:

  • 键值对形式:key=value,键名需符合规范(如不能超过 63 个字符,只能包含字母、数字、-、_、.,且不能以 kubernetes.io/ 开头)。
  • 可动态添加 / 修改:无需重启资源即可更新标签。
  • 多标签:一个资源可绑定多个标签(如 app=nginx,env=prod,region=cn-north)。

2. 选择器(Selectors)

选择器是筛选标签的规则,k8s 通过选择器找到匹配标签的资源,是实现资源关联、调度控制的核心手段。

类型:

  • 等值选择器:精确匹配,支持 =/==(相等)、!=(不等)。
  • 集合选择器:模糊匹配,支持 in(在集合内)、notin(不在集合内)、exists(标签存在)。

二、核心使用场景与实操案例

场景 1:给资源打标签(以 Node 和 Pod 为例)

1. 给 Node 打标签(用于 Pod 调度到指定节点)
复制代码
# 查看集群所有 Node
kubectl get nodes

# 给指定 Node 打标签:key=env, value=prod
kubectl label nodes <node-name> env=prod

# 覆盖已存在的标签(添加 --overwrite)
kubectl label nodes <node-name> env=test --overwrite

# 查看 Node 的标签
kubectl describe node <node-name> | grep Labels
2. 定义 Pod 时直接指定标签
复制代码
# pod-with-labels.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:          # 给 Pod 打标签
    app: nginx
    env: test
    tier: frontend
spec:
  containers:
  - name: nginx
    image: nginx:1.24

执行创建:

复制代码
kubectl apply -f pod-with-labels.yaml

场景 2:通过选择器筛选资源(核心调度 / 关联逻辑)

1. 基础筛选:kubectl 命令行用选择器查资源
复制代码
# 等值选择器:查所有 env=test 的 Pod
kubectl get pods -l env=test

# 多条件:查 app=nginx 且 env=test 的 Pod
kubectl get pods -l app=nginx,env=test

# 集合选择器:查 env 为 test 或 prod 的 Pod
kubectl get pods -l 'env in (test,prod)'

# 查没有 env 标签的 Pod
kubectl get pods -l 'env notin (test,prod)'
2. 调度核心:NodeSelector(Pod 调度到指定标签的 Node)

通过 Pod 的 nodeSelector 字段,指定只调度到带有某标签的 Node 上,这是最基础的 k8s 调度策略。

复制代码
# pod-node-selector.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-prod
  labels:
    app: nginx
    env: prod
spec:
  containers:
  - name: nginx
    image: nginx:1.24
  nodeSelector:          # 选择器:只调度到 env=prod 的 Node
    env: prod

执行创建后,Pod 只会被调度到之前打了 env=prod 标签的 Node 上:

3. 资源关联:Service 通过选择器关联 Pod

Service 是 k8s 中暴露 Pod 网络的核心资源,它通过 selector 字段匹配 Pod 标签,实现对 Pod 的流量转发(即使 Pod 重建,IP 变化,Service 也能自动关联)。

复制代码
# service-with-selector.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: ClusterIP
  selector:              # 选择器:匹配 app=nginx 的所有 Pod
    app: nginx
  ports:
  - port: 80
    targetPort: 80

执行创建后,Service 会自动关联所有带有 app=nginx 标签的 Pod:

复制代码
kubectl apply -f service-with-selector.yaml
# 查看 Service 关联的 Endpoints(即匹配的 Pod IP)
kubectl get endpoints nginx-service
4. 控制器关联:Deployment 通过选择器管理 Pod

Deployment 是管理 Pod 副本的控制器,它的 spec.selector 匹配 Pod 模板的标签,确保控制器能精准管理自己创建的 Pod。

复制代码
# deployment-with-selector.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:              # 选择器:匹配 app=nginx 的 Pod
    matchLabels:
      app: nginx
  template:              # Pod 模板:创建的 Pod 带 app=nginx 标签
    metadata:
      labels:
        app: nginx
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx:1.24

执行后,Deployment 会创建 3 个带 app=nginx 标签的 Pod,且能通过选择器监控、管理这些 Pod:

复制代码
kubectl apply -f deployment-with-selector.yaml
# 查看 Deployment 管理的 Pod
kubectl get pods -l app=nginx

三、高级用法:集合选择器(更灵活的筛选)

当需要更复杂的筛选逻辑时,可使用集合选择器(主要用于资源定义中,如 Deployment、Service):

复制代码
# 示例:Deployment 使用集合选择器
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-multi-env
spec:
  replicas: 2
  selector:
    matchExpressions:    # 集合选择器规则
    - key: env
      operator: In       # 匹配 env 在 (test,prod) 中的 Pod
      values: [test, prod]
    - key: app
      operator: Exists   # 匹配带有 app 标签的 Pod(无论值是什么)
  template:
    metadata:
      labels:
        app: nginx
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx:1.24

总结

  1. 标签是 k8s 资源的 "标识",键值对形式,可动态修改,用于分类和筛选资源。
  2. 选择器是匹配标签的规则,分为等值(=/!=)和集合(in/notin/exists)两类,是调度、资源关联的核心。
  3. 核心应用:NodeSelector 实现 Pod 调度到指定 Node、Service 关联 Pod、Deployment 管理 Pod,都是通过标签 + 选择器实现。

标签和选择器是 k8s 调度的基础,掌握它们是理解后续高级调度策略(如 NodeAffinity、Taints/Tolerations)的前提。

相关推荐
Joren的学习记录2 小时前
【Linux运维大神系列】k8s项目部署实战
linux·运维·kubernetes
小二·2 小时前
Go 语言系统编程与云原生开发实战(第18篇)
云原生·golang·log4j
only_Klein2 小时前
Kubernetes-Service实现
云原生·容器·kubernetes·service
小二·2 小时前
Go 语言系统编程与云原生开发实战(第19篇)
开发语言·云原生·golang
A-刘晨阳2 小时前
K8S部署kube-state-metrics + CAdvisor 并使用 Prometheus 监控 Kubernetes 指标
运维·云原生·kubernetes·云计算·prometheus·cadvisor·state-metrics
江畔何人初2 小时前
MySQL 服务器进程的三层结构
linux·运维·服务器·云原生·mysal
陈桴浮海2 小时前
MySQL 主从复制与 GTID 环形复制
linux·mysql·云原生
码农老J3 小时前
【十六】容器化技术:Docker与Kubernetes实战
docker·容器·kubernetes
sryyd_023 小时前
云原生-高可用集群keepalived
服务器·网络·云原生