【问题标题】:How to install kubectl in kubernetes container through docker image如何通过docker镜像在kubernetes容器中安装kubectl
【发布时间】:2019-01-13 23:51:50
【问题描述】:

我想在容器中运行“kubectl”命令,所以我想在容器中安装 kubectl,同时构建 Docker 映像。 任何帮助表示赞赏!

【问题讨论】:

  • 到目前为止您尝试过什么?你有 Dockerfile 吗?从您正在使用的 pod 访问 Kubernetes API 的现有模式?

标签: docker kubernetes dockerfile


【解决方案1】:

把它放在你的 Dockerfile 中

RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
RUN chmod +x ./kubectl
RUN mv ./kubectl /usr/local/bin

【讨论】:

    【解决方案2】:

    您只需将kubectl(例如/usr/local/bin/kubectl)二进制文件和kubeconfig(例如/root/.kube/config)映射到您的容器中。

    例如(部署的 yaml 文件):

          containers:
          - image: container-image-name
            name: container-name
            volumeMounts:
            - name: kubectl-binary
              mountPath: /usr/local/bin/kubectl
              readOnly: true
            - name: kubectl-config
              mountPath: /root/.kube/config
              readOnly: true
          volumes:
          - name: kubectl-binary
            hostPath:
              path: /usr/local/bin/kubectl
          - name: kubectl-config
            hostPath:
              path: /root/.kube/config
    

    附言

    使用以下命令在每个节点上下载kubectl二进制文件,并将/root/.kube/config复制到每个节点:

    $ curl -L https://dl.k8s.io/v1.10.6/bin/linux/amd64/kubectl -o /usr/local/bin/kubectl
    

    【讨论】:

    • 谢谢,在我的情况下,路径略有不同,但工作正常。对于 kubectl - /usr/bin/kubectl 对于配置 - /etc/kubernetes/config
    【解决方案3】:

    kubectl 是用 go 写的,所以是完全独立的。

    因此,您可以从另一个已经包含它的容器中复制它。就像我在这里一样,从bitnami/kubectl:1.20.9复制它:

    FROM bitnami/kubectl:1.20.9 as kubectl
    
    FROM ubuntu-or-whatever-image:tag
    
    # Do whatever you need to with the
    # ubuntu-or-whatever-image:tag image, then:
    
    COPY --from=kubectl /opt/bitnami/kubectl/bin/kubectl /usr/local/bin/
    

    比起摆弄curl,我更喜欢这个,因为现在您可以利用 Docker 缓存bitnami/kubectl:1.20.9 图像的能力。

    【讨论】:

    • 比其他答案好多了 - 谢谢彼得
    【解决方案4】:

    Weike 的解决方案对我来说适用于不同的 kubectl 路径,无论如何,如果有人正在寻找在 Docker 映像中安装 kubectl 的解决方案,那么这里是 Docker 文件(如果我们想要,它还安装 python 和 kubernetes python 客户端 api通过python客户端api访问集群):

    FROM base_image
    
    WORKDIR /tmp
    
    
    RUN  /usr/bin/curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl \
         && chmod +x ./kubectl  \
         &&  mv ./kubectl /usr/local/bin/kubectl \
         && zypper install -y python2 \
         && zypper install -y python2-pip \
         && pip install kubernetes \
         && zypper install -y git \
         && zypper clean -a \
         && git clone --recursive https://github.com/kubernetes-client/python.git \
         && cd python \
         && python setup.py install
    

    这也是我的部署文件,用于将 kubectl 二进制文件和配置映射到容器,以便在 pod 中访问 kubernetes 容器中的 kubectl:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: support
      labels:
        app: support
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: support
      template:
        metadata:
          labels:
            app: support
        spec:
          terminationGracePeriodSeconds: 3
          imagePullSecrets:
          - name: mysecret
          containers:
            - name: support
              image: image-name
              command:
                - "/bin/sh"
                - "-c"
                - "sleep infinity"
              volumeMounts:
              - name: kubectl-binary
                mountPath: /usr/bin/kubectl
                readOnly: true
              - name: kubectl-config
                mountPath: /etc/kubernetes/config
                readOnly: true
          volumes:
            - name: kubectl-binary
              hostPath:
                path: /usr/bin/kubectl
            - name: kubectl-config
              hostPath:
                path: /etc/kubernetes/config
    

    【讨论】:

      【解决方案5】:

      如果你有 docker,你可以做任何你想做的事情,因为你可以拉取和启动任何图像。因此,如果您想构建和部署:

      docker login
      docker build foo/bar .
      docker push
      docker run -v ~/.kube:/root/.kube lachlanevenson/k8s-kubectl set image deploy bar app=foo/bar
      

      【讨论】:

        猜你喜欢
        • 2020-03-20
        • 1970-01-01
        • 1970-01-01
        • 2020-11-26
        • 2021-05-11
        • 1970-01-01
        • 2017-12-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多