kubernetes介绍如何从现有的pod创建新的pod



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

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

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

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

在内部,当kubectl用于创建pod时,kubectl还调用kubernetes API服务器公开的REST API。

在我看来,这里有两个选项:

  1. 如前面回答中所建议的,使用客户端库。

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

这将如何解决您的问题:

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

主容器中的应用程序可以通过HTTP(而不是HTTPS(连接到大使,并让大使代理处理到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(这太棒了!(

最新更新