【发布时间】:2019-01-13 23:51:50
【问题描述】:
我想在容器中运行“kubectl”命令,所以我想在容器中安装 kubectl,同时构建 Docker 映像。 任何帮助表示赞赏!
【问题讨论】:
-
到目前为止您尝试过什么?你有 Dockerfile 吗?从您正在使用的 pod 访问 Kubernetes API 的现有模式?
标签: docker kubernetes dockerfile
我想在容器中运行“kubectl”命令,所以我想在容器中安装 kubectl,同时构建 Docker 映像。 任何帮助表示赞赏!
【问题讨论】:
标签: docker kubernetes dockerfile
把它放在你的 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
【讨论】:
您只需将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
【讨论】:
/usr/bin/kubectl 对于配置 - /etc/kubernetes/config
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 图像的能力。
【讨论】:
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
【讨论】:
如果你有 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
【讨论】: