记一次kubernetes使用hostnetwork网络相关问题及解决。

在kubernetes中使用了hostnetwork后, pod内无法解析域名

post thumb
Kubernetes
作者 Louis 发表于 2021年5月10日

[TOC]

由于集群的kubernetes内网负载均衡和阿里云的SLB(loadblancer)存在bug. 详细请看这个知乎回答

因此,我们采用pod的hostnetwork模式来常驻在两台ecs上做SLB的固定后端server。

hostNetwork

hostNetwork设置适用于Kubernetes pod。当pod配置为hostNetwork:true时,在此类pod中运行的应用程序可以直接查看启动pod的主机的网络接口。配置为侦听所有网络接口的应用程序,又可以在主机的所有网络接口上访问.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  template:
    metadata:
      labels:
        app: nginx
    spec:
      hostNetwork: true
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

这个刚好符合我们的策略。启动pod后,进入容器。 发现dns和我们的k8s集群的不对应。

bash-5.0# nslookup prod-ngx-gw-svc.prod.svc.cluster.local
Server:		100.100.2.136
Address:	100.100.2.136:53

** server can't find prod-ngx-gw-svc.prod.svc.cluster.local: NXDOMAIN

** server can't find prod-ngx-gw-svc.prod.svc.cluster.local: NXDOMAIN

bash-5.0# cat /etc/resolv.conf 
nameserver 100.100.2.136
nameserver 100.100.2.138

经过google后,在k8s官方网站查找得知pod的DNS策略。

DNS 策略可以逐个 Pod 来设定。目前 Kubernetes 支持以下特定 Pod 的 DNS 策略。 这些策略可以在 Pod 规约中的 dnsPolicy 字段设置:

  • “Default”: Pod 从运行所在的节点继承名称解析配置。
  • “ClusterFirst”: 与配置的集群域后缀不匹配的任何 DNS 查询(例如 “www.kubernetes.io”) 都将转发到从节点继承的上游名称服务器。集群管理员可能配置了额外的存根域和上游 DNS 服务器。
  • “ClusterFirstWithHostNet”:对于以 hostNetwork 方式运行的 Pod,应显式设置其 DNS 策略 “ClusterFirstWithHostNet”。
  • “None”: 此设置允许 Pod 忽略 Kubernetes 环境中的 DNS 设置。Pod 会使用其 dnsConfig 字段 所提供的 DNS 设置。。

因此在kubernetes集群使用 hostNetwork 时候, 需要添加dnsPolicy

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  template:
    metadata:
      labels:
        app: nginx
    spec:
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

再次进入容器。解析ok。

bash-5.0# cat /etc/resolv.conf 
nameserver 172.19.0.10
search infras.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
bash-5.0# nslookup prod-ngx-gw-svc.prod.svc.cluster.local
Server:		172.19.0.10
Address:	172.19.0.10:53

Name:	prod-ngx-gw-svc.prod.svc.cluster.local
Address: 172.19.9.7

记录一下。

上一篇
kubernetes 调度策略