【问题标题】:How to operate the k8s cluster in the docker container如何在docker容器中操作k8s集群
【发布时间】:2020-08-18 08:45:34
【问题描述】:

docker容器running on a docker machine instead of a k8s pod如何操作k8s集群。例如,如果我需要在容器内做这样的事情:

kubectl 获取 pod

在我的 dockerfile 中,我安装了 kubectl

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 sudo mv ./kubectl /usr/local/bin/kubectl

当我运行kubectl get pods时,结果如下:

kubectl get pod
error: no configuration has been provided, try setting KUBERNETES_MASTER environment variable

所以我将config 安装到docker 容器docker runcommand

docker run -v /root/.kube/config:/root/.kube/config my-images

结果如下:

kubectl get pod
Error in configuration: 
* unable to read client-cert /root/.minikube/profiles/minikube/client.crt for minikube due to open /root/.minikube/profiles/minikube/client.crt: no such file or directory
* unable to read client-key /root/.minikube/profiles/minikube/client.key for minikube due to open /root/.minikube/profiles/minikube/client.key: no such file or directory
* unable to read certificate-authority /root/.minikube/ca.crt for minikube due to open /root/.minikube/ca.crt: no such file or directory

这似乎是由于 k8s 配置文件中的current-context: minikube

然后再次挂载认证文件,运行成功。

现在,当我挂载-v /root/.kube/config:/root/.kube/config -v /root/.minikube/:/root/.minikube/ 时,我可以调用kubectl get pods 命令或otherwise 操作容器外的集群,但是,这不适用于@987654334 创建的集群挂载 @。

但我希望能够以统一的方式将所需的配置文件等挂载到容器中,以便我可以使用相同的命令 操作k8s集群,可以由minikuberancher k3skubeadm创建

综上,我想为k8s集群的所有情况挂载一套统一的文件或目录,比如-v file: file -v dir:dir实现在k8s集群以任何方式创建,比如获取pod状态、创建、删除各类资源等

我需要有最大权限才能在k8s上操作

谁能告诉我我需要做什么?

【问题讨论】:

  • 您在容器内但在 Kubernetes 之外运行 kubectl 的具体用例是什么?在 Kubernetes 中,你会 use a service account;对于像安装部署这样的常规操作,您只需从主机运行 kubectl
  • @DavidMaze docker 容器可以被视为我在 k8s 集群上的项目组件的代理。在前端操作系统之后,将命令发送到docker容器代理,然后解析,最后调用kubectl执行或者其他执行方式。就像创建一个应用组件一样。

标签: docker kubernetes kubectl kubeconfig


【解决方案1】:

我认为您可以在运行容器时设置 Docker 用户

您可以使用明确的用户 ID 和组 ID 运行(在本示例中为 ubuntu 映像)。

$ docker run -it --rm \
  --mount "type=bind,src=$(pwd)/shared,dst=/opt/shared" \
  --workdir /opt/shared \
  --user "$(id -u):$(id -g)" \
  ubuntu bash

区别是'--user “$(id -u):$(id -g)”' - 它们告诉容器以当前用户id和组id运行,这些用户id和组id是通过bash命令替换动态获得的“id -u”和“id -g”并传递它们的值。

这已经足够好了。这里的问题是,用户和组实际上并不存在于容器中。这种方法适用于终端命令,但会话看起来已损坏,您会看到一些丑陋的错误消息,例如:

"groups: cannot find name for group ID"
"I have no name!"
  - your container, complaining

虽然 bash 有效,但如果这些配置看起来可疑,某些应用程序可能会拒绝运行。

接下来,您必须正确配置和运行 Docker 容器,这样您就不必解决权限错误并轻松访问您的文件。

在任何情况下,您都应该在 Dockerfile 中创建一个非 root 用户,这是一件好事。您不妨明确设置用户 ID 和组 ID。

下面是一个最小的 Dockerfile,它期望接收构建时参数,并创建一个名为“user”的新用户:

FROM ubuntu

ARG USER_ID
ARG GROUP_ID

RUN addgroup --gid $GROUP_ID user
RUN adduser --disabled-password --gecos '' --uid $USER_ID --gid $GROUP_ID user
USER user

看看:add-user-to-container.

您可以使用此 Dockerfile 来构建具有主机 uid 和 gid 的新映像。此映像需要专门为其运行的每台机器构建,以确保一切正常。

然后,您可以运行使用此图像作为我们的命令。用户id和组id是正确的,运行容器时无需指定。

$ docker build -t your-image \
  --build-arg USER_ID=$(id -u) \
  --build-arg GROUP_ID=$(id -g) .
$ docker run -it --rm \
  --mount "type=bind,src=$(pwd)/shared,dst=/opt/shared" \
  --workdir /opt/shared \
  your-image bash

无需使用“chown”,您将摆脱烦人的权限错误。 请看看这篇非常有趣的文章:kubernetes-management-dockerdocker-shared-permissions

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-09
    • 2020-10-17
    • 2022-10-14
    • 2015-04-22
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 2015-04-17
    相关资源
    最近更新 更多