gpt4 book ai didi

docker - 在 docker 镜像中运行 kubectl

转载 作者:行者123 更新时间:2023-12-02 19:22:07 24 4
gpt4 key购买 nike

我有带有 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"]

script.sh 文件包含curl 命令和kubectl 命令。

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

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

谁能帮我解决这个问题吗?

最佳答案

您可以下载任何您想要的二进制位置并使用它,而不是使用 apt-get 安装。

这将使您能够更好地控制它,并减少将来出现问题的机会。

如何从官方存储库下载它的步骤可以在 documentation 中找到。 .

在 Linux 上使用 curl 安装 kubectl 二进制文件

  1. 使用以下命令下载最新版本:

    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 -s https://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
  2. 使 kubectl 二进制可执行文件。

    chmod +x ./kubectl
  3. 将二进制文件移至您的 PATH 中。

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

    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

之后我们可以使用以下 list 创建一个 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 会给您带来错误,而发生这种情况是因为您没有必要的 RBAC创建规则。

告诉 Kubernetes 我们希望这个 Pod 有一个可以列出 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。但我们需要一种方法将新服务帐户与新角色关联起来。角色绑定(bind)是桥梁......

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

此角色绑定(bind)将我们的服务帐户连接到具有我们所需权限的角色。现在我们只需修改 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

关于docker - 在 docker 镜像中运行 kubectl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62903444/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com