与Internet断开连接时Kubernetes无法使用(Windows)

时间:2018-10-11 06:35:33

标签: windows docker kubernetes local

我正在将Windows的Docker与Kubernetes结合使用。如果我断开与互联网的连接并重新启动计算机或重新启动Kubernetes,则它将陷入永久kubernetes is starting...模式。我可以运行kubectl proxy,但其他所有操作都会失败。

例如kubectl get pod给我Unable to connect to the server: EOF

编辑:解决方案

  • 在Kubernetes常规设置中取消选中Automatically check for updates框已为我修复。
  • (可选)将部署更改为使用imagePullPolicy: IfNotPresent。我是在kubernetes-dashboard部署中这样做的。

enter image description here

奇怪的是,即使我能够通过Kubernetes is starting...与它进行交互,kubernetes的状态仍然停留在kubectl中。

按照@aurleius的回答,我尝试修补composecompose-api部署,但是每当我通过docker右键单击菜单重置时,这些设置都会丢失。我写了一个Powershell脚本来修补部署,所以我把它放在这里以防万一。

# Patch compose
kubectl patch deployment compose -n docker -p "{ \`"spec\`": { \`"template\`": { \`"spec\`": { \`"containers\`": [{ \`"name\`": \`"compose\`", \`"imagePullPolicy\`": \`"IfNotPresent\`" }] } } } }"

# Patch compose-api
kubectl patch deployment compose-api -n docker -p "{ \`"spec\`": { \`"template\`": { \`"spec\`": { \`"containers\`": [{ \`"name\`": \`"compose\`", \`"imagePullPolicy\`": \`"IfNotPresent\`" }] } } } }"

1 个答案:

答案 0 :(得分:1)

我已经在Mac和Windows上测试了您的方案,对此的简短回答是,默认情况下,您需要Internet连接才能正确运行Kubernetes集群。

其原因在documentation中指定:

  

需要Internet连接。运行图片所需的图片   Kubernetes服务器被下载并实例化为容器,并且   安装了Program Files \ Docker \ Docker \ Resources \ bin \ kubectl.exe`命令。

文档未指定的是,用于在Docker上运行Kubernetes的映像可能会立即检查docker pod的更新和新映像。

在Windows上,您可以看到关闭互联网后,关闭Docker,然后再次运行它,您会看到:

PS C:\Users\Administrator> kubectl get pods --all-namespaces
NAMESPACE     NAME                                         READY   STATUS             RESTARTS   AGE
docker        compose-7447646cf5-hzdbl                     0/1     CrashLoopBackOff   0          21m
docker        compose-api-6fbc44c575-b5b47                 0/1     CrashLoopBackOff   1          21m
kube-system   etcd-docker-for-desktop                      1/1     Running            1          20m
kube-system   kube-apiserver-docker-for-desktop            1/1     Running            1          20m
kube-system   kube-controller-manager-docker-for-desktop   1/1     Running            1          20m
kube-system   kube-dns-86f4d74b45-chzdc                    3/3     Running            3          21m
kube-system   kube-proxy-xsksv                             1/1     Running            1          21m
kube-system   kube-scheduler-docker-for-desktop            1/1     Running            1          20m


> PS C:\Users\Administrator> kubectl get pods -n kube-system Unable to
> connect to the server: EOF

机器进入CrashLoopBackOffImagePullBackOff,因此Kubernetes Cluster无法运行,因为它无法根据其策略下载新映像。 我发现了如何防止此错误:

PS C:\Users\Administrator> kubectl get deployments --all-namespaces NAMESPACE NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE docker compose 1 1 1 1 33m docker compose-api 1 1 1 1 33m kube-system kube-dns 1 1 1 1 33m

您可以看到部署,现在我们可以将Image Pull Policy更改为IfNotPresent。请注意,我们必须对docker名称空间中的两个部署都执行此操作。  编辑它: PS C:\Users\Administrator> kubectl edit deployment compose -n docker

spec:
      containers:
      - args:
        - --kubeconfig
        - ""
        - --reconciliation-interval
        - 30s
        image: docker/kube-compose-controller:v0.3.9
        imagePullPolicy: Alwaysspec:
      containers:
      - args:
        - --kubeconfig
        - ""
        - --reconciliation-interval
        - 30s
        image: docker/kube-compose-controller:v0.3.9
        imagePullPolicy: IfNotPresent    

Mac和Windows之间的区别在于,当Windows循环结束时,Mac会在一段时间后显示错误。希望这可以帮助。

更新: 根据我所看到的,有几种情况。有趣的是,更新复选框对这些事件没有影响: 1)编辑部署和脱机重启(笔记本电脑重启)不会覆盖imagePullPolicy 2)编辑部署和在线笔记本电脑重新启动不会覆盖imagePullPolicy 3)如果通过重新启动了解了Docker菜单中的Cluster restart选项,则可以覆盖所有部署文件。 我在寻找这些yaml文件,但是在Windows文件系统中找不到它们,我也不知道这种方法是否可行,因为它将更改这些文件的校验和,而Docker无法使用它。另一个选择是,自Windows上的docker以来,这可能是不可能的:

  

运行Kubernetes服务器所需的图像已下载并   实例化为容器