Kubernetes:Nginx Ingress Controller无法正常启动

时间:2016-06-15 11:43:38

标签: nginx load-balancing kubernetes

我一直在建立一个小型的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在节点上是否可用。

3 个答案:

答案 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.crtkubelet.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.crtpki/issued/kubernetes-master.crtpki/private/kubernetes-master.keypki/issued/kubelet.crtpki/private/kubelet.keypki/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/kubeconfigkubelet.crt的{​​{1}}。

答案 2 :(得分:0)

我们也遇到了这个问题并修复了它将'nginx-ingress-controller'和'default-http-backend'放入kube-system命名空间。 我认为问题在于入口控制器无法访问另一个名称空间中的API服务器。 试试吧。