在dockerimage内运行kubectl

在dockerimage内运行kubectl,docker,shell,kubernetes,dockerfile,Docker,Shell,Kubernetes,Dockerfile,我有一份带DockerFile的申请。此DockerFile需要运行包含curl命令和kubectl命令的shell脚本 我将dockerFile设计为 FROM ubuntu:16.04 WORKDIR /build RUN apt-get update && apt-get install -y curl && apt-get install -y jq COPY ./ ./ RUN chmod +x script.sh ENTRYPOINT ["

我有一份带DockerFile的申请。此DockerFile需要运行包含curl命令和kubectl命令的shell脚本

我将dockerFile设计为

FROM ubuntu:16.04

WORKDIR /build

RUN apt-get update && apt-get install -y curl && apt-get install -y jq
COPY ./ ./
RUN chmod +x script.sh
ENTRYPOINT ["./script.sh"]
sh文件包含curl命令和kubectl命令

如果您看到我已经在docker容器中使用命令RUN apt get update&&apt get install-y curl安装了curl命令

运行kubectl命令需要做什么?因为当我构建并运行上面的图像时,它抛出一个错误,称为kubectl:command not found


有人能帮我吗?

您可以使用kubectl docker图像作为基础并添加您的个人脚本。检查它。

您可以使用kubectl docker图像作为基础,并添加您的个人脚本。检查它。

不必使用apt-get安装,您可以下载任意二进制位置并使用它

这将给你更多的控制权,减少将来出现问题的机会

有关如何从官方存储库下载的步骤,请参见

在Linux上安装带有curl的kubectl二进制文件 使用以下命令下载最新版本:

curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
要下载特定版本,请替换$curl-shttps://storage.googleapis.com/kubernetes-release/release/stable.txt 具有特定版本的命令的一部分

例如,要在Linux上下载v1.18.0版,请键入:

curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.18.0/bin/linux/amd64/kubectl
使kubectl二进制文件可执行

chmod +x ./kubectl
将二进制文件移动到您的路径中

sudo mv ./kubectl /usr/local/bin/kubectl
测试以确保您安装的版本是最新的:

kubectl version --client
考虑到这一点,您可以创建类似以下内容的Dockerfile:

FROM debian:buster
RUN apt update && \
      apt install -y curl && \
      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
CMD kubectl get po
在此之后,我们可以使用以下清单创建pod:

apiVersion: v1
kind: Pod
metadata:
  name: internal-kubectl
spec:
  containers:
    - name: internal-kubectl
      image: myrep/internal-kubectl:latest
      command: ['sh', '-c', "kubectl get pod; sleep 36000"]
运行这个pod会给你一个错误,这会发生,因为你没有创建必要的规则

告诉库伯内特斯我们希望这个豆荚有一个可以列出豆荚的身份的方法是通过组合一些不同的资源

apiVersion: v1
kind: ServiceAccount
metadata:
  name: internal-kubectl
我们要分配给pod的标识对象将是一个服务帐户。但它本身没有权限。这就是角色的作用所在

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: modify-pods
rules:
  - apiGroups: [""]
    resources:
      - pods
    verbs:
      - get
      - list
      - delete
上面的角色指定我们希望能够获取、列出和删除pod。但我们需要一种方法将我们的新服务客户与我们的新角色关联起来。角色绑定是这方面的桥梁

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: modify-pods-to-sa
subjects:
  - kind: ServiceAccount
    name: internal-kubectl
roleRef:
  kind: Role
  name: modify-pods
  apiGroup: rbac.authorization.k8s.io
此角色绑定将服务帐户连接到具有所需权限的角色。现在我们只需修改pod配置以包含服务帐户

apiVersion: v1
kind: Pod
metadata:
  name: internal-kubectl
spec:
  serviceAccountName: internal-kubectl
  containers:
    - name: internal-kubectl
      image: myrep/internal-kubectl:latest
      command: ['sh', '-c', "kubectl get pod; sleep 36000"]
通过指定spec.serviceAccountName,我们将从使用默认服务帐户更改为具有正确权限的新服务帐户。运行我们的新pod,我们应该看到正确的输出

$ kubectl logs internal-kubectl
NAME               READY   STATUS    RESTARTS   AGE
internal-kubectl   1/1     Running   1          5s

不用使用apt-get安装,您可以下载二进制文件并使用它

这将给你更多的控制权,减少将来出现问题的机会

有关如何从官方存储库下载的步骤,请参见

在Linux上安装带有curl的kubectl二进制文件 使用以下命令下载最新版本:

curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
要下载特定版本,请替换$curl-shttps://storage.googleapis.com/kubernetes-release/release/stable.txt 具有特定版本的命令的一部分

例如,要在Linux上下载v1.18.0版,请键入:

curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.18.0/bin/linux/amd64/kubectl
使kubectl二进制文件可执行

chmod +x ./kubectl
将二进制文件移动到您的路径中

sudo mv ./kubectl /usr/local/bin/kubectl
测试以确保您安装的版本是最新的:

kubectl version --client
考虑到这一点,您可以创建类似以下内容的Dockerfile:

FROM debian:buster
RUN apt update && \
      apt install -y curl && \
      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
CMD kubectl get po
在此之后,我们可以使用以下清单创建pod:

apiVersion: v1
kind: Pod
metadata:
  name: internal-kubectl
spec:
  containers:
    - name: internal-kubectl
      image: myrep/internal-kubectl:latest
      command: ['sh', '-c', "kubectl get pod; sleep 36000"]
运行这个pod会给你一个错误,这会发生,因为你没有创建必要的规则

告诉库伯内特斯我们希望这个豆荚有一个可以列出豆荚的身份的方法是通过组合一些不同的资源

apiVersion: v1
kind: ServiceAccount
metadata:
  name: internal-kubectl
我们要分配给pod的标识对象将是一个服务帐户。但它本身没有权限。这就是角色的作用所在

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: modify-pods
rules:
  - apiGroups: [""]
    resources:
      - pods
    verbs:
      - get
      - list
      - delete
上面的角色指定我们希望能够获取、列出和删除pod。但我们需要一种方法将我们的新服务客户与我们的新角色关联起来。角色绑定是这方面的桥梁

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: modify-pods-to-sa
subjects:
  - kind: ServiceAccount
    name: internal-kubectl
roleRef:
  kind: Role
  name: modify-pods
  apiGroup: rbac.authorization.k8s.io
此角色绑定将服务帐户连接到具有所需权限的角色。现在我们只需修改pod配置以包含服务帐户

apiVersion: v1
kind: Pod
metadata:
  name: internal-kubectl
spec:
  serviceAccountName: internal-kubectl
  containers:
    - name: internal-kubectl
      image: myrep/internal-kubectl:latest
      command: ['sh', '-c', "kubectl get pod; sleep 36000"]
通过指定spec.serviceAccountName,我们将从使用默认服务帐户更改为具有正确权限的新服务帐户。运行我们的新pod,我们应该看到正确的输出

$ kubectl logs internal-kubectl
NAME               READY   STATUS    RESTARTS   AGE
internal-kubectl   1/1     Running   1          5s

然后如何添加RUN-apt-get-update&&apt-get-install-y curl。如果我不使用ubuntu,这将抛出错误,因为基本imageCurl已经安装在此图像中。您可以检查Dockerfile,我还运行了chmod+x script.sh,如果我使用上面的基本映像,它将无法通过。我还需要安装apt
-获取安装-y jq。你能解释一下如何解决这个问题吗?这个映像是基于Debian的,所以你可以使用apt-get如果我这样做,我会遇到以下错误运行apt-get-update&&apt-get-install-y jq-->在40aa727c8dff读取包列表中运行。。。E:缺少列表目录/var/lib/apt/lists/partial。-获取2:没有这样的文件或目录命令“/bin/sh-c apt-get-update&&apt-get-install-y jq”返回一个非零代码:100然后如何添加运行apt-get-update&&apt-get-install-y curl。如果我不使用ubuntu,这将抛出错误,因为基本imageCurl已经安装在此图像中。您可以检查Dockerfile,我还运行了chmod+x script.sh,如果我使用上面的基本映像,它将无法通过。我还需要安装apt get install-y jq。你能解释一下如何解决这个问题吗?这个映像是基于Debian的,所以你可以使用apt-get如果我这样做,我会遇到以下错误运行apt-get-update&&apt-get-install-y jq-->在40aa727c8dff读取包列表中运行。。。E:缺少列表目录/var/lib/apt/lists/partial。-Acquire 2:没有这样的文件或目录命令“/bin/sh-c apt get update&&apt get install-y jq”返回一个非零代码:100为什么在Docker中需要它;为什么不直接获取kubectl二进制文件并运行它呢?为什么在Docker中需要它;为什么不直接获取kubectl二进制文件并运行它呢?谢谢你的回答。但是如果我得到了你提到的,我会在运行docker映像错误时得到以下错误:缺少或不完整的配置信息。请指向现有的完整配置文件:1。通过命令行标志-kubeconfig 2。通过KUBECONFIG环境变量3。在你的主目录~/.kube/config中,我更新了我的答案,包括更多信息,如果你有任何问题,请检查并让我知道。谢谢你的回答。但是如果我得到了你提到的,我会在运行docker映像错误时得到以下错误:缺少或不完整的配置信息。请指向现有的完整配置文件:1。通过命令行标志-kubeconfig 2。通过KUBECONFIG环境变量3。在你的主目录~/.kube/config中,我更新了我的答案,包括更多信息,如果你有任何问题,请检查并让我知道。