0

OpenStack VM 上的单节点 kubernetes 的方式是:

虚拟机 IP:10.120.20.227(来自外部)
etcd 版本 3.0.16
kubectl --version 1.5.7
Flannel 版本 0.6.1

当我 ssh 进入机器时,我可以看到 ip 192.168.0.5 所以 etcd 服务正在 192.168.0.5 上运行,我可以从 VM 本身访问在 VM 中启动的每个应用程序。但是从外部 openstack 集群我无法使用虚拟机公共 IP 访问应用程序。

kube-proxy 错误是

May 22 18:38:16 poc-desktop kube-proxy[1246]: I0522 18:38:16.293261    1246 server.go:215] Using iptables Proxier.  
May 22 18:38:16 poc-desktop kube-proxy[1246]: W0522 18:38:16.293629    1246 server.go:468] Failed to retrieve node info: Get http://192.168.0.5:8080/api/v1/nodes/poc-desktop: dial tcp 192.168.0.5:8
May 22 18:38:16 poc-desktop kube-proxy[1246]: W0522 18:38:16.293761    1246 proxier.go:249] invalid nodeIP, initialize kube-proxy with 127.0.0.1 as nodeIP
May 22 18:38:16 poc-desktop kube-proxy[1246]: W0522 18:38:16.293773    1246 proxier.go:254] clusterCIDR not specified, unable to distinguish between internal and external traffic

如果在任何随机端口上的 VM 上启动任何 Web 服务,我将访问 Web 应用程序。但是如果我使用 kubectl 启动应用程序,我将无法从其他区域访问这是否需要任何特殊路由?或者 kube-proxy 有什么问题?

4

2 回答 2

1

我尝试过类似的事情。所以我确实使用kubeadm. 要设置 k8s 集群,请在此处kubeadm阅读更多内容。

在启动集群时,我注意要公开公共 IP。现在,如果您查看这台机器的默认网关地址,即172.17.133.24.

$ ip a sh eth0 | grep inet
    inet 172.17.133.24/24 brd 172.17.133.255 scope global dynamic eth0

但是这个 IP 地址是机器内部的,你不能从外部访问这个 IP 地址。在 OpenStack 控制台上,我可以看到另一个与实例关联的地址,这是我可以(从外部)ping 这台机器的地址,它是10.3.8.95.

现在,如果您在使用kubeadm我使用此 IP 地址10系列启动集群时看到。

# kubeadm init --skip-preflight-checks --apiserver-advertise-address=10.3.8.95                                                              
...
[addons] Created essential addon: kube-proxy
[addons] Created essential addon: kube-dns

Your Kubernetes master has initialized successfully!

To start using your cluster, you need to run (as a regular user):

  sudo cp /etc/kubernetes/admin.conf $HOME/
  sudo chown $(id -u):$(id -g) $HOME/admin.conf
  export KUBECONFIG=$HOME/admin.conf

...

现在,当我在 k8s 上启动一个应用程序时,我通过 a 公开它service,然后将service'stype从更改ClusterIPNodePort.

kubectl run web --image centos/httpd
kubectl expose deployment web --port 80
kubectl edit svc web

在最后一个命令中将service's更改为typeNodePort

现在在svc暴露的机器上找到端口:

$ kubectl get svc web
NAME      CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
web       10.105.242.27   <nodes>       80:31628/TCP   19m

在上面的命令中,您可以看到服务web暴露在两个端口8031628. 当您公开服务时,因为NodePort它在超过30000.

现在要从外部访问这个端口,我在 OpenStack 中创建了一个安全组,并允许从30000to 的tcp 端口60000。并将这个安全组添加到机器上。

现在从我的笔记本电脑我可以在机器上卷曲

$ curl 10.3.8.95:31628
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
                <title>Apache HTTP Server Test Page powered by CentOS</title>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
...
于 2017-05-28T11:57:44.163 回答
0

检查你的安全组,可能你的包从外面被丢弃。

于 2017-06-11T09:07:25.667 回答