我一直在建立一个小型的kubernetes集群。我有3个CentOS VM,一个主人和两个小兵。 Kubernetes在码头工人的容器中运行。我在以下两篇文章的帮助下进行了设置:
现在我正在尝试安装nginx入口控制器。我在修订版6c87fed上使用github.com/kubernetes/contrib/tree/master/ingress/controllers/nginx(我也尝试过标签0.6.0和0.6.3 - 相同的行为)。
我根据上面链接中的README.md运行以下命令:
kubectl create -f examples/default-backend.yaml
kubectl expose rc default-http-backend --port=80 --target-port=8080 --name=default-http-backend
kubectl create -f examples/default/rc-default.yaml
现在,入口控制器的pod最初正常启动,但在大约30秒左右后失败。日志说
kubectl logs nginx-ingress-controller-ttylt
I0615 11:21:20.641306 1 main.go:96] Using build: https://github.com/bprashanth/contrib.git - git-afb16a4
F0615 11:21:50.643748 1 main.go:125] unexpected error getting runtime information: timed out waiting for the condition
听起来像试图连接到不存在的主机左右。有什么想法我可以检查或如何解决它?
此致
编辑:因为这似乎是一个常见的问题:我应该补充一点,我检查了端口80和443在节点上是否可用。
答案 0 :(得分:0)
我没有为nginx入口控制器找到解决方案 - 也许它现在刚刚被打破。
虽然我做了两件事来实现我的初始目标(有一个入口控制器):
1 使用--proxy-mode = userspace作为默认代理启动kube-proxy 模式不适用于我使用的CentOS版本(CentOS Linux版本7.2.1511(核心版))。
2 我正在使用。使用traefik
docker run -d -p 1080:80 traefik \
--kubernetes \
--kubernetes.endpoint=http://my.kubernetes.master:8080
请注意,my.kubernetes.master是kubernetes master的公共IP - 即不群集ip,但是真实网络接口上的真实IP。
我使用的端点是由于traefik在默认端点上遇到ca证书问题。虽然它可以证明我的概念,但这不是一个干净的解决方案。
答案 1 :(得分:0)
错误信息实际上掩盖了其原因。至于我已经能够确定使用strace
什么不是,基本错误是TLS握手失败。入口控制器将重复尝试连接到端口443上的主设备,这将失败,因为它没有提供正确的TLS证书。
如果你查看kube-api-server.log,你可能会发现其中的一堆:
I0705 04:16:17.150073 9521 logs.go:41] http: TLS handshake error from 172.20.1.3:39354: remote error: bad certificate
我还没有找到解决方案。但是,还有一点:我尝试使用--kubelet-client-certificate
,--kubelet-client-private-key
和--kubelet-certificate-authority
启动API服务器,然后使用指向相同文件的TLS选项启动Kubelet,此时Nginx控制器因新错误而失败,这次关于证书名称不匹配。我相信,如果您在每个工作节点上生成正确的证书,并使用正确的IP地址,它将起作用。
编辑:我找到了解决方案。首先,Kubelet需要一个kubeconfig
文件。它需要指向CA证书以及自己的证书/密钥对,我们称之为kubelet.crt
和kubelet.key
。生成这些文件时,您需要明确列出主服务器的IP,以及主服务器的集群IP 。为什么?因为这是它与之交谈的知识产权。
所以当我为Kubernetes生成证书时,我使用了(通过Google's patched version of EasyRSA):
easyrsa --batch "--req-cn=${public_ip}@`date +%s`" build-ca nopass
easyrsa --subject-alt-name="IP:${public_ip},IP:${private_ip},IP:172.16.0.1,DNS:kubernetes.default,DNS:kubernetes.default.svc,DNS:kubernetes.default.svc.cluster.local,DNS:kubernetes-master" build-server-full kubernetes-master nopass
easyrsa build-client-full kubelet nopass
easyrsa build-client-full kubecfg nopass
现在,您最终会得到pki/ca.crt
,pki/issued/kubernetes-master.crt
,pki/private/kubernetes-master.key
,pki/issued/kubelet.crt
,pki/private/kubelet.key
,pki/issued/kubecfg.crt
和{{1} }。 pki/private/kubecfg.key
必须以:
kube-apiserver
您需要根据the docs创建指向--client-ca-file=/srv/kubernetes/ca.crt
--tls-cert-file=/srv/kubernetes/kubernetes-master.crt
--tls-private-key-file=/srv/kubernetes/kubernetes-master.key
,/var/lib/kubelet/kubeconfig
和kubelet.crt
的{{1}}。
答案 2 :(得分:0)
我们也遇到了这个问题并修复了它将'nginx-ingress-controller'和'default-http-backend'放入kube-system命名空间。 我认为问题在于入口控制器无法访问另一个名称空间中的API服务器。 试试吧。