阿里云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"
相关推荐
老刘莱国瑞4 小时前
STM32 与 AS608 指纹模块的调试与应用
python·物联网·阿里云
小林coding6 小时前
阿里云 Java 后端一面,什么难度?
java·后端·mysql·spring·阿里云
Anna_Tong6 小时前
云原生大数据计算服务 MaxCompute 是什么?
大数据·阿里云·云原生·maxcompute·odps
花晓木7 小时前
k8s etcd 数据损坏处理方式
容器·kubernetes·etcd
运维&陈同学7 小时前
【模块一】kubernetes容器编排进阶实战之基于velero及minio实现etcd数据备份与恢复
数据库·后端·云原生·容器·kubernetes·etcd·minio·velero
花晓木7 小时前
k8s备份 ETCD , 使用velero工具进行备份
容器·kubernetes·etcd
☆凡尘清心☆8 小时前
CentOS上安装NTP并配置时间同步
linux·阿里云·centos
liuxuzxx9 小时前
Istio-2:流量治理之简单负载均衡
云原生·kubernetes·istio
上海运维Q先生10 小时前
面试题整理14----kube-proxy有什么作用
运维·面试·kubernetes
怡雪~10 小时前
Kubernetes使用Ceph存储
ceph·容器·kubernetes