【问题标题】:kubernetes how to create new pod from an existing podkubernetes 如何从现有的 pod 创建新的 pod
【发布时间】:2020-08-14 17:50:39
【问题描述】:

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

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

【问题讨论】:

    标签: kubernetes kubernetes-jobs


    【解决方案1】:

    在 pod 中,您可以使用任何受支持的kubernetes client library 调用 kubernetes API 服务器公开的 REST API 来创建 pod。

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

    在使用 kubectl 创建 Pod 时,kubectl 内部也会调用 kubernetes API server 暴露的 REST API。

    【讨论】:

    • 您可能还需要查看角色绑定、角色和服务帐户,以授予您的 pod 必要的权限来创建所需的内容(如果您的 kubernetes 集群支持 RBAC)..
    【解决方案2】:

    在我看来你有两个选择:

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

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

    这将如何解决您的问题:

    您可以在主容器旁边的大使容器中运行kubectl proxy,而不是直接从您的 pod 与 API 服务器通信(就像您使用 kubectl 一样,并通过它与 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 book(太棒了!)

    【讨论】:

      猜你喜欢
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-02
      • 1970-01-01
      • 2016-02-04
      相关资源
      最近更新 更多