当前位置: 首页 > 知识库问答 >
问题:

如何在docker容器中操作k8s群集

彭飞虎
2023-03-14

在docker机器上运行的docker容器而不是k8s吊舱如何操作k8s群集。例如,如果我需要在容器内执行类似操作:

kubectl得到豆荚

在我的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

因此,我在docker run命令中将config装入docker容器

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配置文件中的当前上下文:minikube

然后再次装载身份验证文件,它将成功运行。

现在,我可以调用kubectl get pods命令,或者在挂载-v/root/时,在容器外操纵集群。kube/config:/root/。kube/config-v/root/。minikube/:/root/。但是,这不适用于由kubeadm或其他创建的集群装载。

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

总之,我想为k8s集群的所有情况装载一组统一的文件或目录,例如-v file:file-v dir:dir,以便在以任何方式创建的k8s集群上实现操作,例如获取pod状态、创建、删除各种类型的资源,等等

我需要获得在k8s上操作的最大权限

有人能告诉我我需要做什么吗?


共有1个答案

黄修永
2023-03-14

我认为在运行容器时可以设置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运行,这是通过bash命令替换动态获得的,方法是运行"id-u"和"id-g"并传递它们的值。

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

"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-容器。

您可以使用此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管理docker,docker共享权限。

 类似资料:
  • 问题内容: 我对Google Cloud平台和Docker相当陌生,并设置了一个节点集群,制作了一个Dockerfile,该文件可复制存储库并在公共端口上运行Clojure REPL。我可以从IDE连接到它,然后播放我的代码,太棒了! 但是该REPL应该应该通过SSH进行隧道传输,但这是我的问题开始的地方。 我找不到合适的SSH位置来 更改Docker在其上运行REPL的存储库: 公开的IP仅公开

  • 注: 内容翻译自 Run etcd clusters inside containers 下列指南展示如何使用 static bootstrap process 来用rkt和docker运行 etcd 。 rkt 运行单节点 etcd 下列 rkt 运行命令将在端口 2379 上暴露 etcd 客户端API,而在端口 2380上暴露伙伴API。 当配置 etcd 时使用 host IP地址。 ex

  • 问题内容: 我试图在docker容器中运行cron作业 但对我没有用 我的容器只有cron.daily和cron.weekly文件 crontab,cron.d,cron.hourly …在我的容器中不存在 crontab -e也无法正常工作 我的容器使用/ bin / bash运行 问题答案: 这是我运行我的cron容器之一的方法。 Dockerfile: crontab.txt entry.s

  • 问题内容: 我正在尝试在调用shell脚本的docker容器中运行cronjob。 昨天我一直在网上搜索和堆栈溢出,但是我找不到真正可行的解决方案。 我怎样才能做到这一点? 编辑: 我已经创建了一个(带注释的)github存储库,上面有一个工作的docker cron容器,该容器以给定的时间间隔调用shell脚本。 问题答案: 您可以将crontab复制到映像中,以使从该映像启动的容器运行该作业。

  • 我创建了一个(有注释的)github存储库,其中有一个工作的docker cron容器,它以给定的时间间隔调用一个shell脚本。

  • 问题内容: 我有一个运行Node.js的api服务器,该服务器正在使用它的集群模块,并且测试看起来还不错。现在,我们的IT部门希望转而使用令我感到高兴的Docker容器,但除了玩转之外,我从未真正使用过它。但是我有一个想法,Node.js应用程序在单个Docker进程中运行,因此集群模块并不是最好的,因为单个Docker进程可能是安装过程中的一个慢点,直到在该进程中拆分请求为止通过集群模块。 因此