V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jiangzm
V2EX  ›  Kubernetes

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

  •  
  •   jiangzm · 2023-12-12 19:39:48 +08:00 · 1326 次点击
    这是一个创建于 378 天前的主题,其中的信息可能已经有所发展或是发生改变。

    kubernetes 环境

    • system os: macOS
    • install tool: docker-desktop
    • docker: 24.0.7
    • kubernetes: v1.28.2
    • component: ingress-nginx-controller, cert-manager, external-dns

    ingress-nginx-controller

    • 提供访问入口、反向代理、卸载证书...

    cert-manager

    • 自动颁发应用域名证书(self-signed or let's encrypt)

    external-dns

    • 为应用新域名添加 DNS 记录到外部 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没有产生效果

    2 条回复    2023-12-13 13:31:32 +08:00
    token10086
        1
    token10086  
       2023-12-12 23:04:40 +08:00
    我也在学习阶段,说的不一定对。是这段时间学习的积累

    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
        2
    jiangzm  
    OP
       2023-12-13 13:31:32 +08:00
    @token10086 谢谢。好像没找到 klipper 在 k8s 的安装方法,官方没提供对应的 yaml 或者 helm 。Ingress controller 暴露端口其实没问题,在宿主机能访问到用 localhost 及 host ip 都行。另外就是 external-dns 支持 service 或者 ingress ,因为这两者都可以有 hostname 和 ip ,pod 应该没有 host 或者 externalName 配置。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1955 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:14 · PVG 00:14 · LAX 08:14 · JFK 11:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.