K8S 的访问情况大致有分为3种
- 1、集群内部互访,PodA -> PodB
- 2、集群内部访问集群外部 PodA->外部 MySQL
- 3、集群外部访问集群内部
分情况说明方案:
1、集群内部互访
- 方案1:每个 Pod 都会被分配一个 ClusterIP,Pod 之间可以通过 IP 直接访问,但 Pod 重启后,IP 会变化,并且无法对 PodB 多个服务同时访问
- 方案2:DNS+ClusterIP利用 K8S 的 DNS 和 Service,将 PodB 处理为 Service,例如叫做 SerB,此时 PodA 可直接访问 SerB 来实现访问,K8S 的 DNS 会将 SerB 解析到对应的 IP, 并实现负载均衡
- 方案3:HeadlessService, 返回Pod列表,PodA拿到Pod列表后,自己进行负载均衡和其他的处理
2、集群内部访问集群外部
- 2.1:直接访问外部服务的 IP 和端口
- 2.2:通过 Service, 定义一个 ServiceMySQL,然后定义一个相同的 Endpoint ServiceMysql, Endpoint 中定义的是外部服务的具体地址,K8S 的 DNS 此时会将 ServiceMysql 解析到 Endpoint地址,外部 MySQL 地址如果有变化,修改 Endpoint 地址即可,对于客户端来说,跟访问内部 Service 没有区别
3、集群外部服务访问集群内部的服务
- 3.1 NodePort: Service 的一种类型,除了 cluseterIP 之外,会在每个 Worker 节点上暴露一个端口,若节点上没有运行内部Pod服务,NodePort 会将请求终转发会运行Pod服务的Worker节点去,NodePort 方式不太推荐
- 3.2 HostPort: Service 的另一种类型,只会在运行了 Pod 的 Worker 上启动端口,客户端必须访问指定的Worker的端口,访问其他的Worker不行
- 3.3 Ingress: Service 的另一种类型,Ingress 需要配置一下内容:
- 域名
- 域名的请求的路径
- 这个请求转发到的 Service 名称
- 最后由 IngressController 完成域名和请求的转发