如何将k8 pod暴露给公共互联网?

时间:2018-01-20 22:44:38

标签: docker networking kubernetes

我目前正在学习docker和kubernetes。我遇到问题的一个问题是将我的nginx pod暴露给公共互联网。我想从我的网络浏览器访问我的serverIP并查看nginx页面,就像在服务器上安装了nginx一样。

来自kubernetes网站的

pod-nginx.yml

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.7.9
    ports:
    - containerPort: 80

我可以从pod端口向前移动,然后通过curl访问默认的nginx页面。 sudo kubectl port-forward nginx 80:80

curl http://localhost返回nginx页面,而curl http://<serverIP>返回failed to connect <serverIP> port:80 Connection refused

我是否需要通过修改iptables和防火墙规则在我的公共网络接口和我的集群网络接口之间移植?我觉得我错过了一些非常明显的东西。

我已尝试使用nodeport属性并已阅读有关入口和负载均衡器的文档,但我的云提供商并未拥有这些后端功能,因此这些命令最终会无限期地终止。

2 个答案:

答案 0 :(得分:5)

有多种方法可以公开您的服务:

  • 使用NodePort:这将在您可以访问服务的主机中打开一个端口。例如192.168.100.99:37843之类的东西,是192.168.100.99安装集群的HOST系统之一。

  • 使用LoadBalancer:如果您的群集位于像Google这样的云中,那么您可以使用底层基础架构为您的服务生成外部IP。我坚持认为底层云必须支持它。

  • 使用Ingress rules:LoadBalancers的正确替代方法是使用反向代理。 Kubernetes允许您在端口80和443中侦听此反向代理,并使用Ingress规则将流量转发到您的不同服务。

考虑一下您的情况,我认为Ingress Rules选项可以满足您的需求。如果您的群集没有安装Ingress控制器,您可以根据nginx安装this one

答案 1 :(得分:-1)

要公开窗格或部署,您必须执行以下操作。

  1. 使用nodeport标志将所有节点上的相同端口分配给应用程序。 Kubernetes将创建一个ServiceIP,您的应用程序将在其中公开。
  2. kubectl expose <deployment> --nodeport=<common-port> --port=<container-port>

    创建曝光服务后,您可以使用kubectl get services

    获取ServiceIP
    1. 使用nginx或其他负载均衡器将代理反转到您的节点。我通过在/etc/nginx/sites-enabled

      中创建默认文件,将nginx配置为proxy_pass到我的应用程序

      服务器{ 听80;

      location / {   proxy_pass http://ServiceIP:ApplicationPort;   } }

    2. 此方法允许唯一路由甚至循环负载平衡。