我正在将Windows的Docker与Kubernetes结合使用。如果我断开与互联网的连接并重新启动计算机或重新启动Kubernetes,则它将陷入永久kubernetes is starting...
模式。我可以运行kubectl proxy
,但其他所有操作都会失败。
例如kubectl get pod
给我Unable to connect to the server: EOF
编辑:解决方案
Automatically check for updates
框已为我修复。imagePullPolicy: IfNotPresent
。我是在kubernetes-dashboard
部署中这样做的。奇怪的是,即使我能够通过Kubernetes is starting...
与它进行交互,kubernetes的状态仍然停留在kubectl
中。
按照@aurleius的回答,我尝试修补compose
和compose-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\`" }] } } } }"
答案 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
机器进入CrashLoopBackOff
或ImagePullBackOff
,因此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服务器所需的图像已下载并 实例化为容器