【问题标题】:Kubernetes on openstack, applications launched are not accessibleKubernetes on openstack,启动的应用程序无法访问
【发布时间】:2017-05-23 07:03:54
【问题描述】:

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

虚拟机 IP:10.120.20.227(来自外部)
etcd 版本 3.0.16
kubectl --version 1.5.7
法兰绒版本 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 有问题?

【问题讨论】:

    标签: kubernetes openstack kube-proxy


    【解决方案1】:

    我尝试过类似的事情。所以我确实使用kubeadm 设置了一个单节点k8s 集群。要使用 kubeadm 设置 k8s 集群,请阅读更多 here

    在启动集群时,我注意公开公共 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 启动集群时看到我使用了10 系列的这个IP 地址。

    # 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 上启动应用程序时,我通过 service 公开它,然后将 servicetypeClusterIP 更改为 NodePort

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

    在最后一个命令中将servicetype 更改为NodePort

    现在在这个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 中创建了一个安全组,并允许从 3000060000 的 tcp 端口。并将这个安全组添加到机器上。

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

    $ 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">
    ...
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-06
        • 1970-01-01
        • 2015-05-22
        • 2019-04-06
        • 2022-07-21
        • 1970-01-01
        • 2019-12-14
        相关资源
        最近更新 更多