K8S中Namespace(ns)、Pod、Service和ConfigMap(cm)四种重要的资源对象的关系

在Kubernetes中,Namespace(ns)、Pod、Service和ConfigMap(cm)是四种重要的资源对象,它们之间存在着紧密的关系。下面我将详细解释它们之间的关系以及它们是如何协同工作的。

1. 基本概念

  • Namespace(ns):命名空间,是Kubernetes中用于资源隔离的逻辑分组。可以将不同的资源划分到不同的命名空间中,从而实现多租户、环境隔离等。

  • Pod:是Kubernetes中最小的部署和管理单位。一个Pod可以包含一个或多个容器(通常是一个),这些容器共享网络、存储等资源。

  • Service:是Kubernetes中定义了一组Pod的访问策略的抽象。它为Pod提供了一个稳定的IP地址和DNS名称,并且可以负载均衡到后端的Pod。

  • ConfigMap(cm):是一种用于存储非机密数据的资源对象。它可以将配置数据以键值对的形式存储,然后注入到Pod中,使应用程序可以方便地使用这些配置。

  • text

    复制代码
    Namespace
        ├── Pods (运行容器)
        │       ├── 通过环境变量引用 ConfigMap
        │       ├── 通过Volume挂载 ConfigMap
        │       └── 被Service的Selector选择
        │
        ├── Services
        │       ├── 通过Selector选择Pods
        │       └── 为Pods提供稳定访问入口
        │
        └── ConfigMaps
                └── 被Pods引用作为配置数据

2. 关系描述

2.1 Namespace 与其他资源

  • Namespace 提供了一个逻辑上的边界,Pod、Service、ConfigMap 等资源都属于某个特定的 Namespace(除了少数集群级别的资源)。

  • 默认情况下,Kubernetes 有四个命名空间:default、kube-system、kube-public、kube-node-lease。用户也可以创建自己的命名空间。

  • 同一命名空间内的资源可以通过名称进行相互引用,而跨命名空间的资源引用需要加上命名空间名称(例如 service-name.namespace-name)。

2.2 Pod 与 Service

  • Service 通过标签选择器(Selector)与一组 Pod 关联。当创建 Service 时,需要定义标签选择器,Service 会动态地发现并关联具有匹配标签的 Pod。

  • Service 为这组 Pod 提供了一个统一的访问入口,客户端只需访问 Service 的集群IP(或NodePort、LoadBalancer等)即可,而不需要直接访问每个 Pod 的IP。

  • Service 还负责将请求负载均衡到后端的一个Pod上。

2.3 Pod 与 ConfigMap

  • ConfigMap 用于将配置数据与 Pod 解耦。Pod 可以通过两种方式使用 ConfigMap:

    1. 环境变量:将 ConfigMap 中的数据作为环境变量注入到 Pod 的容器中。

    2. 卷挂载:将 ConfigMap 中的键值对作为文件挂载到 Pod 的容器中,每个键成为文件名,值成为文件内容。

  • 这样,当配置数据发生变化时,可以更新 ConfigMap 而不需要重新构建镜像或重启 Pod(部分情况需要重启,取决于使用方式)。

2.4 Service 与 ConfigMap

  • Service 和 ConfigMap 之间没有直接的关系。但是,ConfigMap 中可能会存储一些配置,例如应用程序需要访问的 Service 的地址(通常通过环境变量或配置文件注入)。

  • 另外,ConfigMap 也可以用于存储其他服务的访问信息,但这不是强关联,而是通过应用程序的配置来间接关联。

2.5 四者之间的协同

在一个典型的应用部署中:

  1. 首先,我们创建一个命名空间(例如 my-namespace)来隔离资源。

  2. 然后,创建一个 ConfigMap,存储应用程序的配置数据(例如数据库连接字符串)。

  3. 接着,部署一个 Pod(通常通过 Deployment 等控制器),在 Pod 的定义中,通过环境变量或卷挂载引用 ConfigMap 中的配置。

  4. 最后,创建一个 Service,通过标签选择器与这个 Pod 关联,以便其他服务或外部客户端可以访问这个应用。

3. 示例

假设我们有一个简单的 Web 应用,它需要读取一个配置文件,并且我们希望其他服务能够访问它。

3.1 创建命名空间

yaml

复制代码
apiVersion: v1
kind: Namespace
metadata:
  name: my-namespace

3.2 创建 ConfigMap

yaml

复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
  namespace: my-namespace
data:
  app.properties: |
    database.url=jdbc:mysql://db-service:3306/mydb
    server.port=8080

3.3 创建 Pod(通过 Deployment)

yaml

复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  namespace: my-namespace
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-app:latest
        ports:
        - containerPort: 8080
        env:
        - name: DB_URL
          valueFrom:
            configMapKeyRef:
              name: my-config
              key: database.url
        volumeMounts:
        - name: config-volume
          mountPath: /etc/config
      volumes:
      - name: config-volume
        configMap:
          name: my-config

3.4 创建 Service

yaml

复制代码
apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: my-namespace
spec:
  selector:
    app: my-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  type: ClusterIP

4. 总结

  • Namespace 提供了资源隔离和分组。

  • Pod 是运行应用的容器组。

  • Service 提供了对一组 Pod 的稳定访问和负载均衡。

  • ConfigMap 提供了配置数据的管理,并可以将配置注入到 Pod 中。

它们之间的关系可以概括为:在同一个 Namespace 中,Service 通过标签选择器将流量路由到具有匹配标签的 Pod,而 Pod 可以通过 ConfigMap 获取配置数据。这样,我们就能够构建一个可配置、可访问且隔离的微服务应用。

相关推荐
鋆雨无欢丶2 小时前
docker证书认证问题
运维·docker·容器
阿杰 AJie2 小时前
Docker 容器启动的全方位方法汇总
运维·docker·容器
原神启动12 小时前
K8S(七)—— Kubernetes Pod 基础概念与实战配置
云原生·容器·kubernetes
我的golang之路果然有问题2 小时前
Docker 之常用操作(实习中的)
java·运维·笔记·docker·容器·eureka
牛奔2 小时前
Docker 容器无法停止的排障与解决全过程
运维·docker·云原生·容器·eureka
赵文宇(温玉)2 小时前
Docker的生态与商业化
docker·容器·eureka
不想画图2 小时前
Kubernetes(五)——rancher部署和Pod详解
linux·kubernetes·rancher
大都督老师2 小时前
配置 containerd 使用镜像加速器拉取 Docker Hub 镜像
容器·kubernetes·k8s
zyu6711 小时前
03-Docker存储和网络
网络·docker·容器
牛奔12 小时前
Docker Compose 两种安装与使用方式详解(适用于 Docker 19.03 版本)
运维·docker·云原生·容器·eureka