【探索 Kubernetes|作业管理篇 系列 9】Pod 的服务对象(下)

简介: 【探索 Kubernetes|作业管理篇 系列 9】Pod 的服务对象(下)

三、ConfigMap

ConfigMap 与 Secret 类似,区别就是 ConfigMap 保存的是不需要加密的、应用所需的配置文件信息。

ConfigMap 的用法几乎与 Secret 完全相同,可以使用 kubectl create configmap 从文件或者目录创建 ConfigMap,也可以直接编写 ConfigMap 对象的 YAML 文件。

[root@master01 yaml]# cat test-db.text
database.host=localhost
database.port=3306
database.username=admin
database.password=secret
# 从 test-db.text 文件中,创建 configmap。
[root@master01 yaml]# kubectl create configmap my-config --from-file=test-db.text
configmap/my-config created

查看 configmap 中 data 数据信息,可以看到是和 test-db.text 配置文件中一致的,后期也是可以通过环境变量和 Voluem 卷的方式使用(同上述 Secret)。

[root@master01 yaml]# kubectl get configmap my-config -o yaml

例:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: my-image
      env:
        - name: DATABASE_HOST
          valueFrom:
            configMapKeyRef:
              name: my-config
              key: database.host
        - name: DATABASE_PORT
          valueFrom:
            configMapKeyRef:
              name: my-config
              key: database.port
        - name: DATABASE_USERNAME
          valueFrom:
            configMapKeyRef:
              name: my-config
              key: database.username
        - name: DATABASE_PASSWORD
          valueFrom:
            configMapKeyRef:
              name: my-config
              key: database.password

四、Downward API

Downward API 是一种特性,它允许容器在运行时获取关于自身和它所在 Pod 的一些元数据信息。这些信息可以作为环境变量或卷挂载提供给容器使用。

如果按照 Downward(下载)这个单词意思理解就是: 将 Pod 或容器自身的元数据信息下载到是运行状态的容器中使用。

Downward API 提供了以下作用:

总的来说,Downward API 提供了一种在容器运行时获取 Pod 和容器自身元数据的机制,使容器能够动态获取并使用这些信息。这对于编写灵活且适应性强的应用程序非常有用,并能够在 Kubernetes 环境中提供更多的自动化和配置选项。

可用字段

只有部分 Kubernetes API 字段可以通过 Downward API 使用。

  • fieldRef:传递 Pod 级字段的信息
  • resourceFieldRef:传递 Container 级字段的信息

1.可通过 fieldRef 获得的信息

  • metadata.name:Pod 的名称
  • metadata.namespace:Pod 的命名空间
  • metadata.uid:Pod 的唯一 ID

2.可通过 resourceFieldRef 获得的信息

  • limits.cpu:容器的 CPU 限制值
  • requests.cpu:容器的 CPU 请求值
  • requests.memory:容器的内存请求值
  • limits.memory:容器的内存限制值

Kubernetes 官网:更多可用字段信息

举个例子:

我们定义了一个 Pod 名为 projected-buxybox,并创建了一个名为 app 的容器。我们使用了一个 Projected Volume,并将其挂载到了 /etc/config 目录下。 并使用 fieldRef 来获取 Pod 的元数据信息,使用 resourceFieldRef 来获取容器的元数据信息。

  • items.path:定义元数据信息的目录是什么。
  • fieldRef.fieldPath:定义 Pod 元数据信息的值是什么。
  • resourceFieldRef.resource:定义 容器 元数据信息的值是什么。
apiVersion: v1
kind: Pod
metadata:
  name: projected-buxybox
spec:
  containers:
    - name: app
      image: busybox
      imagePullPolicy: IfNotPresent
      args:
      - sleep
      - "3600"
      resources:
        limits:
          cpu: "2"
        requests:
          cpu: "1"
      volumeMounts:
        - name: config-volume
          mountPath: /etc/config
  volumes:
    - name: config-volume
      projected:
        sources:
          - downwardAPI:
              items:
                - path: "pod_name"
                  fieldRef:
                    fieldPath: metadata.name
                - path: "pod_namespace"
                  fieldRef:
                    fieldPath: metadata.namespace
                - path: "cpu_limits"
                  resourceFieldRef:
                    containerName: app
                    resource: limits.cpu
                - path: "cpu_request"
                  resourceFieldRef:
                    containerName: app
                    resource: requests.cpu

验证:部署 Pod ,并查看 /etc/config 目录下,获取的值是否正确。

[root@master01 yaml]# kubectl apply -f projected-buxybox-pod.yaml
[root@master01 yaml]# kubectl get -f projected-buxybox-pod.yaml
NAME                READY   STATUS    RESTARTS   AGE
projected-buxybox   1/1     Running   0          3m11s
[root@master01 yaml]# kubectl exec -it projected-buxybox -- /bin/sh
/ # ls /etc/config/
cpu_limits     cpu_request    pod_name       pod_namespace
/ # cat /etc/config/cpu_limits
2
/ # cat /etc/config/cpu_request
1
/ # cat /etc/config/pod_name
projected-buxybox
/ # cat /etc/config/pod_namespace
default

小结

注意Downward API 能够获取到的信息,一定是 Pod 里的容器进程启动之前就能够确定下来的信息。而如果你想要获取 Pod 容器运行后才会出现的信息,比如,容器进程的 PID,那就肯定不能使用 Downward API 了,而应该考虑在 Pod 里定义一个 sidecar 容器。

Secret、ConfigMap,以及 Downward API 这三种 Projected Volume 定义的信息,大多还可以通过环境变量的方式出现在容器里。但是,通过环境变量获取这些信息的方式,不具备自动更新的能力。所以,一般情况下,我都建议你使用 Volume 文件的方式获取这些信息

五、ServiceAccountToken

如果我有一个 Pod,而且在 Pod 中安装 Kubernetes 的 Clinet,想实现可以从容器里直接访问并且操作这个 Kubernetes 的 API ?这种方式是可行的,不过,你首先要解决 API Server 的授权问题,这就需要 ServiceAccount 服务对象了。

1.Service Account 是什么?

  • Service Account(服务账号)是 Kubernetes 中用于身份验证和授权的实体,进行权限分配的对象。它是为 Pod 提供访问 Kubernetes API 的身份凭据。每个 Service Account 都有一个唯一的名称和对应的身份令牌(Token)。
  • Service Account 可以与 Pod 关联,使 Pod 具有与 Kubernetes API 进行交互的权限。它允许 Pod 在运行时进行身份验证,并根据其配置的权限来执行操作,例如创建、更新或删除资源。

比如,Service Account A,可以只被允许对 Kubernetes API 进行 GET 操作,而 Service Account B,则可以有 Kubernetes API 的所有操作权限。

2.ServiceAccountToken 是什么?

像上述这样的权限分配操作,实际上是通过一种它所绑定的一个 ServiceAccountToken。任何运行在 Kubernetes 集群上的应用,都必须使用这个 ServiceAccountToken 里保存的授权信息,也就是 Token,才能访问 kube-apiserver

另外,为了方便使用,Kubernetes 已经为你提供了一个默认“服务账户”(default Service Account)。如图:

并且,任何一个运行在 Kubernetes 里的 Pod,都可以直接使用这个默认的 Service Account,而无需显示地声明挂载它,因为是默认自动挂载(可以设置不挂载,默认挂载)靠 Projected Volume 机制实现。

你可以查看任意一个运行中的 Pod,你会发现一个 类型为 Projected 并且包含来自多个源的注入数据的卷(Service Account 的身份令牌),然后自动挂载在每个容器的一个固定目录上 /var/run/secrets/kubernetes.io/serviceaccount,容器可以通过该路径访问令牌,并将其用于与 Kubernetes API 的安全通信。

这里提供了两种查看方式,如下图:

kubectl describe pod mysql-pod

下图我们可以看到,这个 Projected 包含来自多个源的注入数据的卷,使用了 ServiceAccountToken、ConfigMap、DownwardAPI。

kubectl get pod -o yaml mysql-pod

所以 Pod 中的容器应用,就可以直接使用这个目录下的授权信息和文件与 kube-apiserver 访问, Projected 目录下的内容,如图所示:

这种把 Kubernetes 客户端以容器的方式运行在集群里,然后使用 default Service Account 自动授权的方式,被称作 “InClusterConfig”(内部集群配置),也是我最推荐的进行 Kubernetes API 编程的授权方式。

除了默认的 ServiceAccount 还可以自定义 ServiceAccount 来对应不同的权限设置。这样 Pod 在使用这个 Service Account 对应的 ServiceAccountToken 时权限就更加灵活。

总结

今天,介绍了 Pod 的 Volume 的 Projected 服务对象。

你还应该认真体会一下 Kubernetes “一切皆对象” 的设计思想:比如,应用是 Pod 对象,应用的配置是 ConfigMap 对象,应用要访问的密码则是 Secret 对象。

最后:技术交流、博客互助,点击下方或主页推广加入哦!!

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
6月前
|
运维 Kubernetes 持续交付
ACK One GitOps:让全球化游戏服务持续交付更简单
ACK One GitOps 致力于提供开箱即用的多集群 GitOps 持续交付能力,简化游戏等服务的多集群/多地域统一部署,让您更加专注于业务开发。
|
10月前
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
378 25
|
10月前
|
人工智能 分布式计算 调度
打破资源边界、告别资源浪费:ACK One 多集群Spark和AI作业调度
ACK One多集群Spark作业调度,可以帮助您在不影响集群中正在运行的在线业务的前提下,打破资源边界,根据各集群实际剩余资源来进行调度,最大化您多集群中闲置资源的利用率。
|
Prometheus Kubernetes 监控
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
|
10月前
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
359 12
|
存储 Kubernetes Docker
【赵渝强老师】Kubernetes中Pod的基础容器
Pod 是 Kubernetes 中的基本单位,代表集群上运行的一个进程。它由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。基础容器负责维护 Pod 的网络空间,对用户透明。文中附有图片和视频讲解,详细介绍了 Pod 的组成结构及其在网络配置中的作用。
249 1
【赵渝强老师】Kubernetes中Pod的基础容器
|
存储 Kubernetes 网络协议
k8s的无头服务
Headless Service 是一种特殊的 Kubernetes 服务,其 `spec:clusterIP` 设置为 `None`,不会分配 ClusterIP,通过 DNS 解析提供服务发现。与普通服务不同,Headless Service 不提供负载均衡功能,每个 Pod 都有唯一的 DNS 记录,直接映射到其 IP 地址,适用于有状态应用的场景,如与 StatefulSet 一起部署数据库。示例中通过创建 Nginx 的 StatefulSet 和 Headless Service,展示了如何直接访问单个 Pod 并进行内容修改。
357 3
|
存储 Kubernetes Devops
Kubernetes集群管理和服务部署实战
Kubernetes集群管理和服务部署实战
259 0
|
应用服务中间件 调度 nginx
Kubernetes-项目中pod调度使用法则
前言kubernetes中部署的pod默认根据资源使用情况自动调度到某个节点。可在实际项目的使用场景中都会有更细粒度的调度需求,比如:某些pod调度到指定主机、某几个相关的服务的pod最好调度到一个节点上、Master节点不允许某些pod调度等。
2177 0
|
Kubernetes 应用服务中间件 调度
Kubernetes之Pod调度
Kubernetes调度器根据特定的算法与策略将pod调度到工作节点上。在默认情况下,Kubernetes调度器可以满足绝大多数需求,例如调度pod到资源充足的节点上运行,或调度pod分散到不同节点使集群节点资源均衡等。
1576 0

推荐镜像

更多