ClusterIP
Service 通过 Cluster 内部的 IP 对外提供服务,只有 Cluster 内的节点和 Pod 可访问,这是默认的 Service 类型,前面实验中的 Service 都是 ClusterIP。
NodePort
Service 通过 Cluster 节点的静态端口对外提供服务。Cluster 外部可以通过 <NodeIP>:<NodePort>
访问 Service。
LoadBalancer
Service 利用 cloud provider 特有的 load balancer 对外提供服务,cloud provider 负责将 load balancer 的流量导向 Service。目前支持的 cloud provider 有 GCP、AWS、Azur 等。
下面我们来实践 NodePort,Service httpd-svc
的配置文件修改如下:
添加 type: NodePort
,重新创建 httpd-svc
。
Kubernetes 依然会为 httpd-svc
分配一个 ClusterIP,不同的是:
EXTERNAL-IP
为 nodes
,表示可通过 Cluster 每个节点自身的 IP 访问 Service。
PORT(S)
为 8080:32312
。8080
是 ClusterIP 监听的端口,32312
则是节点上监听的端口。Kubernetes 会从 30000-32767 中分配一个可用的端口,每个节点都会监听此端口并将请求转发给 Service。
下面测试 NodePort 是否正常工作。
通过三个节点 IP + 32312 端口都能够访问 httpd-svc
。
接下来我们深入探讨一个问题:Kubernetes 是如何将 <NodeIP>:<NodePort>
映射到 Pod 的呢?
与 ClusterIP 一样,也是借助了 iptables。与 ClusterIP 相比,每个节点的 iptables 中都增加了下面两条规则:
规则的含义是:访问当前节点 32312
端口的请求会应用规则 KUBE-SVC-RL3JAE4GN7VOGDGP
,内容为:
其作用就是负载均衡到每一个 Pod。
NodePort 默认是的随机选择,不过我们可以用 nodePort
指定某个特定端口。
现在配置文件中就有三个 Port 了:nodePort
是节点上监听的端口。port
是 ClusterIP 上监听的端口。targetPort
是 Pod 监听的端口。
最终,Node 和 ClusterIP 在各自端口上接收到的请求都会通过 iptables 转发到 Pod 的 targetPort
。
应用新的 nodePort
并验证:
nodePort: 30000
已经生效了。
本章我们讨论访问应用的机制 Service,学习了如何创建 Service;Service 的三种类型 ClusterIP、NodePort 和 LoadBalancer,以及它们各自的适用场景。
下一节我们开始学习 Rolling Update。
书籍:
1.《每天5分钟玩转Docker容器技术》
https://item.jd.com/16936307278.html
2.《每天5分钟玩转OpenStack》
https://item.jd.com/12086376.html
外网如何访问 Service?- 每天5分钟玩转 Docker 容器技术(139)
原文:http://blog.51cto.com/cloudman/2084432