外网如何访问 Service — Kubernetes(26)steemCreated with Sketch.

in #kubernetes7 years ago

除了 Cluster 内部可以访问 Service,很多情况我们也希望应用的 Service 能够暴露给 Cluster 外部。Kubernetes 提供了多种类型的 Service,默认是 ClusterIP。

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 的配置文件修改如下:

685.png

添加 type: NodePort,重新创建 httpd-svc

686.png

Kubernetes 依然会为 httpd-svc 分配一个 ClusterIP,不同的是:

  1. EXTERNAL-IPnodes,表示可通过 Cluster 每个节点自身的 IP 访问 Service。

  2. PORT(S)8080:323128080 是 ClusterIP 监听的端口,32312 则是节点上监听的端口。Kubernetes 会从 30000-32767 中分配一个可用的端口,每个节点都会监听此端口并将请求转发给 Service。

687.png

下面测试 NodePort 是否正常工作。

688.png

通过三个节点 IP + 32312 端口都能够访问 httpd-svc

接下来我们深入探讨一个问题:Kubernetes 是如何将 <NodeIP>:<NodePort> 映射到 Pod 的呢?

与 ClusterIP 一样,也是借助了 iptables。与 ClusterIP 相比,每个节点的 iptables 中都增加了下面两条规则:

689.png

规则的含义是:访问当前节点 32312 端口的请求会应用规则 KUBE-SVC-RL3JAE4GN7VOGDGP,内容为:

690.png

其作用就是负载均衡到每一个 Pod。

NodePort 默认是的随机选择,不过我们可以用 nodePort 指定某个特定端口。

691.png

现在配置文件中就有三个 Port 了:
nodePort 是节点上监听的端口。
port 是 ClusterIP 上监听的端口。
targetPort 是 Pod 监听的端口。

最终,Node 和 ClusterIP 在各自端口上接收到的请求都会通过 iptables 转发到 Pod 的 targetPort

应用新的 nodePort 并验证:

692.png

nodePort: 30000 已经生效了。

小结

本章我们讨论访问应用的机制 Service,学习了如何创建 Service;Service 的三种类型 ClusterIP、NodePort 和 LoadBalancer,以及它们各自的适用场景。

下一节我们开始学习 Rolling Update。

Sort:  

TIM截图20180125104442.png

我在我这里试验了一下发现这里external-ip仍为<none>但是也可以通过外网ip访问,这可能是什么原因呢~

你的Service类型是NodePort,当然可以通过 NodeIP:NodePort 访问

Coin Marketplace

STEEM 0.21
TRX 0.20
JST 0.034
BTC 90159.45
ETH 3082.42
USDT 1.00
SBD 2.98