0

我有以下疑问,假设我有一个 n=1 副本的 kubernetes pod A,我希望它每 x 分钟创建一个类型为“Job”的新 pod B,我可以从 kubectl 创建一个作业 pod 而不会出现问题,但是如何让一个 pod 从另一个 pod 实例化?

我可以尝试在父 pod 上使用 kubectl,但我认为这不是最优雅的方式。

4

2 回答 2

3

在 pod 中,您可以使用任何受支持的 kubernetes 客户端库来调用 kubernetes API 服务器公开的 REST API 来创建一个 pod。

客户端库需要经过身份验证才能调用 Kubernetes API。客户端库可以为此使用服务帐户,并且服务帐户需要具有 RBAC 才能通过调用 kubernetes API 服务器来创建 pod。

在使用 kubectl 创建 pod 时,kubectl 内部也会调用 kubernetes API 服务器公开的 REST API。

于 2020-04-30T11:42:14.223 回答
2

在我看来,您有两个选择:

  1. 如上一个答案中所建议,使用客户端库。

  2. 使用大使容器模式:大使容器代理与世界的本地连接,您可以在此处阅读有关此模式的更多信息。

这将如何解决您的问题:

kubectl您可以kubectl proxy在主容器旁边的大使容器中运行,并通过它与 API 服务器通信,而不是直接从您的 pod与 API 服务器通信。

主容器中的应用程序可以通过 HTTP(而不是 HTTPS)连接到大使,而不是直接与 API 服务器对话,并让大使代理处理与 API 服务器的 HTTPS 连接,透明地处理安全性。它通过使用默认令牌的秘密卷中的文件来做到这一点(请参阅下面的脚本)。

因为 pod 中的所有容器共享相同的环回网络接口,所以您的应用可以通过 localhost 上的端口访问代理。

如何构建这样的容器?

Dockerfile(使用 v1.8):

FROM alpine
RUN apk update && apk add curl && curl -L -O https://dl.k8s.io/v1.8.0/kubernetes-client-linux-amd64.tar.gz && tar zvxf kubernetes-client-linux-amd64.tar.gz kubernetes/client/bin/kubectl && mv kubernetes/client/bin/kubectl / && rm -rf kubernetes && rm -f kubernetes-client-linux-amd64.tar.gz
ADD kubectl-proxy.sh /kubectl-proxy.sh
ENTRYPOINT /kubectl-proxy.sh

kubectl-proxy.sh以下脚本在哪里:

#!/bin/sh

API_SERVER="https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_SERVICE_PORT"
CA_CRT="/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
TOKEN="$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"

/kubectl proxy --server="$API_SERVER" --certificate-authority="$CA_CRT" --token="$TOKEN" --accept-paths='^.*'

剩下要做的就是构建此映像(将其推送到注册表),将其作为容器添加到您的应用程序 pod,并通过环回直接与其通信。

默认情况下,kubectl 代理绑定到 8001 端口,并且由于 pod 中的两个容器共享相同的网络接口,包括环回,您可以将您的请求指向localhost:8001

这要归功于 Kubernetes in Action这本书(太棒了!)

于 2020-04-30T13:00:57.503 回答