如何让局域网内其他机器通过子域名访问MicroK8s应用
问题解决步骤
一、核心问题定位
你遇到的DNS_PROBE_FINISHED_NXDOMAIN是局域网其他设备无法解析子域名导致的;而访问my-hostname.local返回myapp1内容,是因为无匹配Host规则时,K8s会路由到第一个创建的Ingress资源。
二、解决DNS解析问题
1. 临时方案:单设备hosts映射
在局域网其他机器的hosts文件中添加子域名与MicroK8s机器IP的映射:
- Windows路径:
C:\Windows\System32\drivers\etc\hosts(需管理员权限编辑) - Linux/macOS路径:
/etc/hosts(执行sudo nano /etc/hosts编辑)
添加内容(替换<MicroK8s机器局域网IP>为实际IP):
<MicroK8s机器局域网IP> app1.my-hostname.local <MicroK8s机器局域网IP> app2.my-hostname.local
2. 长期方案:局域网DNS配置
如果你的路由器支持自定义DNS记录(多数家用路由器有「静态DNS」「域名解析」选项),添加两条A记录:
- 主机名:
app1,域名:my-hostname.local,指向IP:<MicroK8s机器局域网IP> - 主机名:
app2,域名:my-hostname.local,指向IP:<MicroK8s机器局域网IP>
三、修正Ingress配置
将现有Ingress的Host规则替换为你需要的app1.my-hostname.local和app2.my-hostname.local:
myapp1的Ingress配置(更新后)
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: labels: app: myapp1 name: myapp1-ingress spec: ingressClassName: public rules: - host: myapp1.localhost http: paths: - path: / pathType: Prefix backend: service: name: myapp1 port: number: 80 # 新增目标子域名规则 - host: app1.my-hostname.local http: paths: - path: / pathType: Prefix backend: service: name: myapp1 port: number: 80
myapp2的Ingress配置(更新后)
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: labels: app: myapp2 name: myapp2-ingress spec: ingressClassName: public rules: - host: myapp2.localhost http: paths: - path: / pathType: Prefix backend: service: name: myapp2 port: number: 80 # 新增目标子域名规则 - host: app2.my-hostname.local http: paths: - path: / pathType: Prefix backend: service: name: myapp2 port: number: 80
应用更新后的配置:
microk8s kubectl apply -f myapp1-ingress.yaml microk8s kubectl apply -f myapp2-ingress.yaml
四、验证Ingress控制器状态
- 确认Ingress addon已启用:
microk8s status
若ingress未显示enabled,执行启用命令:
microk8s enable ingress
- 测试Ingress规则有效性(在MicroK8s机器上执行):
# 验证app1规则 curl -H "Host: app1.my-hostname.local" http://localhost # 验证app2规则 curl -H "Host: app2.my-hostname.local" http://localhost
分别返回对应应用内容,说明规则配置正确。
五、优化:解决根域名默认路由问题
若不想让my-hostname.local默认返回myapp1内容,可添加一个默认Ingress,设置无匹配时返回404:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: default-ingress spec: ingressClassName: public defaultBackend: service: name: default-http-backend port: number: 80
若没有default-http-backend服务,可创建一个简单的404服务,或忽略此步骤(不影响子域名访问)。
内容的提问来源于stack exchange,提问作者Passella
相关产品推荐
相关产品推荐

