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)的前提。

相关推荐
吹牛不交税18 分钟前
vue3项目部署到阿里云Alibaba Cloud Linux3系统的docker
docker·容器·.netcore
Elastic 中国社区官方博客1 小时前
使用 Azure SRE Agent 和 Elasticsearch 提升 SRE 生产力
大数据·人工智能·elasticsearch·microsoft·搜索引擎·云原生·azure
cyber_两只龙宝8 小时前
【Haproxy】Haproxy的算法详解及配置
linux·运维·服务器·云原生·负载均衡·haproxy·调度算法
火车叼位10 小时前
Docker Compose 网络原理与实战:同一 Compose 服务间如何稳定通信
运维·docker·容器
D愿你归来仍是少年13 小时前
Kubernetes(K8s)系统学习指南
容器·kubernetes
D愿你归来仍是少年14 小时前
Docker 深入学习指南
docker·容器
岁岁种桃花儿14 小时前
kubenetes从入门到上天系列第十九篇:Kubernetes安装Nginx ingress controller
java·nginx·kubernetes
阿里云云原生14 小时前
打通智能体孤岛:用 AgentRun 构建生产级 A2A 多 Agent 管理协作系统
云原生·agent
liliangcsdn15 小时前
centos7 docker镜像库国内加速
云原生·eureka
AI攻城狮15 小时前
长上下文不是长期记忆:为什么 1M Context 也不会淘汰 RAG
人工智能·云原生·aigc