在图像中需要一个有效的 Kubectl 二进制文件
Need a working Kubectl binary inside an image
我的目标是拥有一个内部包含工作 Kubectl 二进制文件的 pod。
不幸的是,我使用基本 yaml 启动的 docker 集线器中的每个 kubectl 映像都会导致 CrashLoopbackOff 或其他。
有没有人有一些 yaml(部署、pod 等)可以让我得到我的 kubectl?
我用这个基本的 yaml 尝试了一堆图像:
apiVersion: apps/v1
kind: Deployment
metadata:
name: kubectl-demo
labels:
app: deploy
role: backend
spec:
replicas: 1
selector:
matchLabels:
app: deploy
role: backend
template:
metadata:
labels:
app: deploy
role: backend
spec:
containers:
- name: kubectl-demo
image: <SOME_IMAGE>
ports:
- containerPort: 80
感谢
正如 Suren 已经在评论中解释的那样 kubectl
不是守护进程,因此 kubectl 将 运行 退出并导致容器重新启动。
对此有几个解决方法。其中之一是使用带有 infinity
参数的 sleep
命令。这将使 Pod 保持活动状态,防止它重新启动并允许您执行它。
这是一个如何做到这一点的例子:
spec:
containers:
- image: bitnami/kubectl
command:
- sleep
- "infinity"
name: kctl
如果这有帮助,请告诉我。
或者,您可以这样做。它在我的上下文中工作,在 VM 上使用 kubernetes,我知道 kubeconfig
文件在哪里。您需要进行必要的更改,以使其在您的环境中运行。
apiVersion: apps/v1
kind: Deployment
metadata:
name: kubectl
spec:
replicas: 1
selector:
matchLabels:
role: kubectl
template:
metadata:
labels:
role: kubectl
spec:
containers:
- image: viejo/kubectl
name: kubelet
tty: true
securityContext:
privileged: true
volumeMounts:
- name: kube-config
mountPath: /root/.kube/
volumes:
- name: kube-config
hostPath:
path: /home/$USER/.kube/
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-role.kubernetes.io/master
operator: Exists
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/master
operator: Exists
这是结果:
$ kubectl get po
NAME READY STATUS RESTARTS AGE
kubectl-cb8bfc6dd-nv6ht 1/1 Running 0 70s
$ kubectl exec kubectl-cb8bfc6dd-nv6ht -- kubectl get no
NAME STATUS ROLES AGE VERSION
kubernetes-1-17-master Ready master 16h v1.17.3
kubernetes-1-17-worker Ready <none> 16h v1.17.3
我的目标是拥有一个内部包含工作 Kubectl 二进制文件的 pod。
不幸的是,我使用基本 yaml 启动的 docker 集线器中的每个 kubectl 映像都会导致 CrashLoopbackOff 或其他。
有没有人有一些 yaml(部署、pod 等)可以让我得到我的 kubectl?
我用这个基本的 yaml 尝试了一堆图像:
apiVersion: apps/v1
kind: Deployment
metadata:
name: kubectl-demo
labels:
app: deploy
role: backend
spec:
replicas: 1
selector:
matchLabels:
app: deploy
role: backend
template:
metadata:
labels:
app: deploy
role: backend
spec:
containers:
- name: kubectl-demo
image: <SOME_IMAGE>
ports:
- containerPort: 80
感谢
正如 Suren 已经在评论中解释的那样 kubectl
不是守护进程,因此 kubectl 将 运行 退出并导致容器重新启动。
对此有几个解决方法。其中之一是使用带有 infinity
参数的 sleep
命令。这将使 Pod 保持活动状态,防止它重新启动并允许您执行它。
这是一个如何做到这一点的例子:
spec:
containers:
- image: bitnami/kubectl
command:
- sleep
- "infinity"
name: kctl
如果这有帮助,请告诉我。
或者,您可以这样做。它在我的上下文中工作,在 VM 上使用 kubernetes,我知道 kubeconfig
文件在哪里。您需要进行必要的更改,以使其在您的环境中运行。
apiVersion: apps/v1
kind: Deployment
metadata:
name: kubectl
spec:
replicas: 1
selector:
matchLabels:
role: kubectl
template:
metadata:
labels:
role: kubectl
spec:
containers:
- image: viejo/kubectl
name: kubelet
tty: true
securityContext:
privileged: true
volumeMounts:
- name: kube-config
mountPath: /root/.kube/
volumes:
- name: kube-config
hostPath:
path: /home/$USER/.kube/
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-role.kubernetes.io/master
operator: Exists
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/master
operator: Exists
这是结果:
$ kubectl get po
NAME READY STATUS RESTARTS AGE
kubectl-cb8bfc6dd-nv6ht 1/1 Running 0 70s
$ kubectl exec kubectl-cb8bfc6dd-nv6ht -- kubectl get no
NAME STATUS ROLES AGE VERSION
kubernetes-1-17-master Ready master 16h v1.17.3
kubernetes-1-17-worker Ready <none> 16h v1.17.3