阿里云k8s服务之间偶尔获取不到dns解析安装ACK NodeLocal DNSCache

1.背景

feign.RetryableException: No route to host (Host unreachable) executing POST http://osale-thirdparty/empty/detect

服务突然会中断,开发在看日志的时候会出现host找不到的情况,阿里云技术推荐安装dns缓存组件,加上这个组件会解决这种问题。一般是因为网络波动才会出现这个问题,参考文档 https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/configure-nodelocal-dnscache?spm=a2c4g.11186623.0.0.210c10baNQdY3T

2.操作步骤

方式一:配置DNSConfig自动注入

DNSConfig动态注入控制器可用于自动注入DNSConfig至新建的Pod中,避免您手工配置Pod YAML进行注入。本应用默认会监听包含node-local-dns-injection=enabled标签的命名空间中新建Pod的请求,您可以通过以下命令给命名空间打上Label标签。

bash 复制代码
kubectl label namespace default node-local-dns-injection=enabled
kubectl label namespace yxyw node-local-dns-injection=enabled
kubectl label namespace yxyw-uat node-local-dns-injection=enabled
kubectl get ns --show-labels
kubectl get pods -o yaml osale-open-api-69f856757f-ngqgb -n yxyw-uat

说明

上述命令仅会开启default命名空间的自动注入,如需对其它命名空间开启自动注入,则需要替换default为目标命名空间名称。

在命名空间DNSConfig自动注入开启的情况下,如需对部分Pod进行豁免(即不进行注入),可以调整其Pod Template中Labels标签字段,加上node-local-dns-injection=disabled标签。

ECI不支持NodeLocal DNSCache。当Deployment动态弹性扩容至ECI节点时,ECI上Pod会因无法连通NodeLocal DNSCache导致域名解析超时,此时必须对整个Deployment进行注入豁免,可以调整其Pod Template中的Labels标签字段加上node-local-dns-injection=disabled。

开启自动注入后,您创建的Pod会被增加以下字段,为了最大程度上保证业务DNS请求高可用,nameservers中会额外加入kube-dns的ClusterIP地址作为备份的DNS服务器。

bash 复制代码
dnsConfig:
    nameservers:
    - 169.254.20.10
    - 172.21.0.10
    options:
    - name: ndots
      value: "3"
    - name: attempts
      value: "2"
    - name: timeout
      value: "1"
    searches:
    - default.svc.cluster.local
    - svc.cluster.local
    - cluster.local
  dnsPolicy: None

Pod在同时满足以下条件时,才会自动注入DNS缓存。如果您的Pod容器未注入DNS缓存服务器的IP地址,请检查Pod是否未满足以下条件。

新建Pod不位于kube-system和kube-public命名空间。

新建Pod所在命名空间的Labels标签包含node-local-dns-injection=enabled。

新建Pod所在命名空间的Labels不包含ECI Pod相关标签,例如virtual-node-affinity-injection、eci、alibabacloud.com/eci等。

新建Pod没有被打上eci、alibabacloud.com/eci等ECI相关标签,或打上禁用DNS注入node-local-dns-injection=disabled标签。

新建Pod的网络为hostNetwork且DNSPolicy为ClusterFirstWithHostNet,或Pod为非hostNetwork且DNSPolicy为ClusterFirst。

注意验证是否注入成功要看pod的yaml,因为dnsconfig是直接注入了pod里面

3.如果有些服务有特殊的dns配置要求,就会覆盖掉,所以要设置一下,禁用掉dns缓存配置,打上禁用DNS注入node-local-dns-injection=disabled标签

bash 复制代码
apiVersion: apps/v1
kind: Deployment  
metadata:  
  name: @APP_NAME@
  labels:  
    app: @APP_NAME@
spec:  
  replicas: @REPLICAS@
  revisionHistoryLimit: 10
  selector:  
    matchLabels:  
      app: @APP_NAME@
  template:  
    metadata:  
      labels:  
        app: @APP_NAME@
        armsPilotAutoEnable: "on"
        armsPilotCreateAppName: @APP_NAME@
        one-agent.jdk.version: "OpenJDK11"
        node-local-dns-injection: "disabled"
相关推荐
一直学下去2 分钟前
K8S中构建双架构镜像-从零到成功
容器·kubernetes·cicd·多架构
hnlucky1 小时前
《基于 Kubernetes 的 WordPress 高可用部署实践:从 MariaDB 到 Nginx 反向代理》
运维·数据库·nginx·云原生·容器·kubernetes·mariadb
_板栗_2 小时前
livenessProbe 和 readinessProbe 最佳实践
云原生·容器·kubernetes
Johny_Zhao3 小时前
Ubuntu安装部署Zabbix网络监控平台和设备配置添加
linux·网络·mysql·网络安全·信息安全·云计算·apache·zabbix·shell·yum源·系统运维·itsm
luck_me55 小时前
K8s 图形界面管理kubesphere
云原生·容器·kubernetes
李恒-聆机智能专精数采5 小时前
从零开始了解数据采集(二十七)——什么IIOT平台
大数据·人工智能·云计算·制造·数据采集·数据可视化
uesowys7 小时前
阿里云人工智能大模型通义千问Qwen3开发部署
人工智能·阿里云·qwen3
GreatNXY8 小时前
【阿里云】阿里云 Ubuntu 服务器无法更新 systemd(Operation not permitted)的解决方法
服务器·阿里云·云计算
Lw老王要学习10 小时前
Linux架构篇、第五章git2.49.0部署与使用
linux·运维·git·云计算·it
alden_ygq12 小时前
Kubernetes容器运行时:Containerd vs Docker
docker·容器·kubernetes