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 服务
应用部署流程
- 创建应用 Deployment 、Service 、Ingress 配置
- 安装应用配置
- cert-manager 签发证书
- 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 问题
- 因为不是云环境也没有部署类似 MetalLB 服务,LoadBalancer service 是如何分配 host/ip 的?
- 如果想让 LoadBalancer service 绑定本机(宿主机)局域网 ip, 应该如何做?
尝试过给 service 配置了loadBalancerIP或者externalIPs没有产生效果