如何让 LoadBalancer service 分配 ip 而不是 localhost

288 天前
 jiangzm

kubernetes 环境

ingress-nginx-controller

cert-manager

external-dns

应用部署流程

  1. 创建应用 Deployment 、Service 、Ingress 配置
  2. 安装应用配置
  3. cert-manager 签发证书
  4. external-dns 添加 DNS 记录

期望应用安装完,在本地能直接使用 https+域名访问应用,
以上 1 、2 、3 都没问题,第 4 步 external-dns 提示错误日志

Failed to create CNAME record named 'echo.mylabs.work' to 'localhost' with ttl 0 for Alibaba Cloud DNS: SDK.ServerError
ErrorCode: SubDomainInvalid.Value
Message: The DNS record is invalid or in the wrong format.

问题出在 ingress ip 分配的是 localhost

❯ kubectl get svc -n ingress-nginx
NAME                     TYPE         CLUSTER-IP   EXTERNAL-IP PORT(S)                   
ingress-nginx-controller LoadBalancer 10.101.27.87 localhost   80:30375/TCP,443:31539/TCP 
...

ingress service yaml

apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.9.4
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  externalTrafficPolicy: Local
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - appProtocol: http
    name: http
    port: 80
    protocol: TCP
    targetPort: http
  - appProtocol: https
    name: https
    port: 443
    protocol: TCP
    targetPort: https
  selector:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  type: LoadBalancer

部署完分配了一个 localhost, 本地也监听了对应端口

...`ingress service`
status:
  loadBalancer:
    ingress:
      - hostname: localhost

关于 LoadBalancer 问题

  1. 因为不是云环境也没有部署类似 MetalLB 服务,LoadBalancer service 是如何分配 host/ip 的?
  2. 如果想让 LoadBalancer service 绑定本机(宿主机)局域网 ip, 应该如何做?

尝试过给 service 配置了loadBalancerIP或者externalIPs没有产生效果

1252 次点击
所在节点    Kubernetes
2 条回复
token10086
288 天前
我也在学习阶段,说的不一定对。是这段时间学习的积累

1.
在 k8s 中 LoadBalancer service 要云服务商支持,或者自己装一个 Klipper LoadBalancer

在 k3s 里面是自带的
https://docs.k3s.io/zh/networking

2. Ingress controller 实际上也是一个 pod ,hostNetwork: true 或许能满足需求

因为都是遵循了统一开发标准这个配置也可以了解下,它能做的 NGINX Ingress 也能对应找稳定就行了

https://github.com/traefik/traefik-helm-chart/blob/master/traefik/VALUES.md
jiangzm
287 天前
@token10086 谢谢。好像没找到 klipper 在 k8s 的安装方法,官方没提供对应的 yaml 或者 helm 。Ingress controller 暴露端口其实没问题,在宿主机能访问到用 localhost 及 host ip 都行。另外就是 external-dns 支持 service 或者 ingress ,因为这两者都可以有 hostname 和 ip ,pod 应该没有 host 或者 externalName 配置。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/999798

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX