Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker 需要在图像中使用Kubectl二进制文件_Docker_Kubernetes_Kubectl_Dockerhub - Fatal编程技术网

Docker 需要在图像中使用Kubectl二进制文件

Docker 需要在图像中使用Kubectl二进制文件,docker,kubernetes,kubectl,dockerhub,Docker,Kubernetes,Kubectl,Dockerhub,我的目标是拥有一个内部装有可工作的Kubectl二进制文件的吊舱。 不幸的是,我使用基本yaml从docker hub引导的每个kubectl映像都会导致崩溃或其他问题 有人有一些yaml(部署、吊舱等)可以让我得到我的kubectl吗 我尝试了一系列基本yaml图像: apiVersion: apps/v1 kind: Deployment metadata: name: kubectl-demo labels: app: deploy role: backend s

我的目标是拥有一个内部装有可工作的Kubectl二进制文件的吊舱。

不幸的是,我使用基本yaml从docker hub引导的每个kubectl映像都会导致崩溃或其他问题

有人有一些yaml(部署、吊舱等)可以让我得到我的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
apiVersion:apps/v1 种类:部署 元数据: 名称:kubectl demo 标签: 应用程序:部署 角色:后端 规格: 副本:1份 选择器: 火柴标签: 应用程序:部署 角色:后端 模板: 元数据: 标签: 应用程序:部署 角色:后端 规格: 容器: -名称:kubectl demo 图片: 端口: -集装箱港口:80
Thx

正如Suren在评论中已经解释的那样,
kubectl
不是守护进程,因此kubectl将运行、退出并导致容器重新启动

对此,有两种变通方法。其中之一是使用
sleep
命令和
infinity
参数。这将使Pod保持活动状态,防止其重新启动,并允许您在其中执行

下面是一个如何做到这一点的示例:

spec:
 containers:
 - image: bitnami/kubectl
   command:
   - sleep 
   - "infinity"
   name: kctl

让我知道这是否有帮助

或者,您可以这样做。它在我的上下文中工作,在VMs上使用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获得订单
名称就绪状态重新启动
kubectl-cb8bfc6dd-nv6ht 1/1运行0 70秒
$kubectl执行官kubectl-cb8bfc6dd-nv6ht——kubectl获取编号
姓名状态角色年龄版本
kubernetes-1-17-master Ready master 16h v1.17.3
kubernetes-1-17-worker Ready 16h v1.17.3

因为
kubectl
不是守护进程,所以容器死亡。只要在容器中运行一个进程并使用kubectl。@当然,我认为我不能在crashLoopbackOff pod中执行,可以吗?您打算如何在内部运行流程?我明白了。因为所有图像都是从构建器
kubectl
复制的,不会离开shell或bash。让我来制作一个可以用的。使用此图像:
viejo/kubelet
。但你不能只运行它。Do
kubectl run-it kubectl--image viejo/kubectl sh
。然后退出容器。容器将重新启动并保持运行,因为它将自动运行
sh
?您将如何称呼kubectl?非常感谢!我需要几天时间,但我会测试一下,然后再给你回复。谢谢