我目前正在学习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属性并已阅读有关入口和负载均衡器的文档,但我的云提供商并未拥有这些后端功能,因此这些命令最终会无限期地终止。
答案 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)
要公开窗格或部署,您必须执行以下操作。
nodeport
标志将所有节点上的相同端口分配给应用程序。 Kubernetes将创建一个ServiceIP,您的应用程序将在其中公开。 kubectl expose <deployment> --nodeport=<common-port> --port=<container-port>
创建曝光服务后,您可以使用kubectl get services
使用nginx或其他负载均衡器将代理反转到您的节点。我通过在/etc/nginx/sites-enabled
服务器{ 听80;
location / { proxy_pass http://ServiceIP:ApplicationPort; } }
此方法允许唯一路由甚至循环负载平衡。