阿里云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"
相关推荐
Johny_Zhao43 分钟前
Ubuntu系统安装部署Pandawiki智能知识库
linux·mysql·网络安全·信息安全·云计算·shell·yum源·系统运维·itsm·pandawiki
庸子2 小时前
基于Jenkins和Kubernetes构建DevOps自动化运维管理平台
运维·kubernetes·jenkins
云资源服务商3 小时前
阿里云Flink:开启大数据实时处理新时代
大数据·阿里云·云计算
数据与人工智能律师5 小时前
数字资产革命中的信任之锚:RWA法律架构的隐形密码
大数据·网络·人工智能·云计算·区块链
Connie14515 小时前
k8s多集群管理中的联邦和舰队如何理解?
云原生·容器·kubernetes
伤不起bb9 小时前
Kubernetes 服务发布基础
云原生·容器·kubernetes
国际云,接待11 小时前
微软服务器安全问题
运维·服务器·云原生·云计算·azure
m0_6948455712 小时前
服务器需要备案吗?在哪些地区需要备案?
linux·运维·服务器·云计算
别骂我h12 小时前
Kubernetes服务发布基础
云原生·容器·kubernetes
weixin_3993806914 小时前
k8s一键部署tongweb企业版7049m6(by why+lqw)
java·linux·运维·服务器·云原生·容器·kubernetes