我正在尝试在我的计算机上使用 Docker 本地运行 Kubernetes(Hyperkube):
我运行此命令来运行 kubelet 容器:
docker run \
--volume=/:/rootfs:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:rw \
--volume=/var/lib/kubelet/:/var/lib/kubelet:rw \
--volume=/var/run:/var/run:rw \
--net=host \
--pid=host \
--privileged=true \
--name=kubelet \
-d \
gcr.io/google_containers/hyperkube-amd64:${K8S_VERSION} \
/hyperkube kubelet \
--containerized \
--hostname-override="127.0.0.1" \
--address="0.0.0.0" \
--api-servers=http://localhost:8080 \
--config=/etc/kubernetes/manifests \
--cluster-dns=10.0.0.10 \
--cluster-domain=cluster.local \
--allow-privileged=true --v=2
运行所有其他 Kubernetes 组件。但有些组件(api 服务器、控制器管理器……)会立即退出。
控制器管理器容器(退出)日志
I0425 13:47:27.265926 1 plugins.go:71] No cloud provider specified.
I0425 13:47:27.266077 1 replication_controller.go:208] Starting RC Manager
I0425 13:47:27.266208 1 nodecontroller.go:143] Sending events to api server.
E0425 13:47:27.273153 1 nodecontroller.go:229] Error monitoring node status: Get http://127.0.0.1:8080/api/v1/nodes: dial tcp 127.0.0.1:8080: connection refused
E0425 13:55:55.950012 1 controllermanager.go:216] Failed to start service controller: ServiceController should not be run without a cloudprovider.
我尝试使用--cloud-provider=""
上面的运行命令中的选项,但它仍然不起作用。
答案1
在该命令中添加 --cloud-provider 无法解决您看到的“无法启动服务控制器”错误消息。
从技术上讲,该命令正在启动 kubelet(它也具有相同的标志),但不是发出抱怨的组件。
在此示例中,它提供了一种启动 k8s 集群的简单方法 - 在某种程度上牺牲了可配置性。启动控制器管理器(出现问题的组件)的实际清单位于 /etc/kubernetes/manifests在 hyperkube docker 容器中——并且不容易被覆盖。
综上所述,您看到的错误(启动服务控制器失败)实际上不应该是致命的,它会继续超过这一点(因为云提供商 + 服务控制器不是严格要求的)。很可能这里发生了其他事情。建议查看该点之后是否还有其他日志,和/或检查 kubelet 日志。
答案2
是的,我看不出传递该标志的方法。请注意,您需要在此处将标志传递给 kube-controller-manager:https://github.com/kubernetes/kubernetes/blob/6c195a4923421f756bf13b2a3b2147c4b242aeed/cluster/images/hyperkube/static-pods/master.json#L16。将其传递给 kubelet 将不会产生任何效果。
我已经提交https://github.com/kubernetes/kubernetes/issues/27085修复此问题。请随时订阅并添加有关该问题的更多信息。