如何在没有外部 IP 的情况下访问 K8s 中的 LoadBalancer 类型的 Service?
如何在没有外部 ip 的情况下访问 k8s 中的 loadbalancer 类型的 service?
本文主要介绍在 kubernetes (k8s) 集群中,当 loadbalancer 类型的 service 没有外部 ip 时如何访问其后端 pod。
问题尝试和方案
在 k8s 集群中部署了以下 service 和 deployment:
# service apiversion: v1 kind: service metadata: name: my-nginx-svc labels: app: nginx spec: type: loadbalancer ports: - port: 80 selector: app: nginx # deployment apiversion: apps/v1 kind: deployment metadata: name: my-nginx labels: app: nginx spec: replicas: 3 selector: matchlabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerport: 80
由于 service 没有外部 ip,因此无法通过外部网络访问。尝试使用内部 ip 访问失败,因为 pod 中无法使用 curl 等命令访问外部互联网。
解决方案
1. 修改 service 类型
将 loadbalancer 类型的 service 更改为 nodeport 类型。nodeport 类型会为 service 分配一个内部和外部端口,可以通过节点的 ip 和端口访问。
修改 service 清单如下:
apiVersion: v1 kind: Service metadata: name: my-nginx-svc labels: app: nginx spec: type: NodePort ports: - port: 80 selector: app: nginx
2. 部署 metallb 负载均衡器
metallb 是一个为 kubernetes 集群提供 loadbalancer ip 的开源项目。它与 kubernetes 的 service api 集成,自动为 loadbalancer 类型的 service 分配 ip 地址。
安装并配置 metallb 后,service 将自动分配 loadbalancer ip,并可以通过此 ip 访问。
3. 确保 pod 能够访问外部网络
如果 pod 无法访问外部网络,则需要检查 coredns 配置。coredns 是负责在 kubernetes 集群中进行 dns 解析的组件。
检查 coredns 配置中的上游 dns 解析服务器配置,确保它可以解析外部域名的 dns 记录。
以上就是如何在没有外部 IP 的情况下访问 K8s 中的 LoadBalancer 类型的 Service?的详细内容,更多请关注硕下网其它相关文章!