在 Kubernetes 集群中通过 dns-admission-controller 来调整 Pod dns 配置

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 本文介绍 dns-admission-controller 组件,通过 mutating webhook 机制能够在集群级别自动调整 pod 的 dns 配置,灵活性强、侵入性低。

上文介绍了 Kubernetes 集群 DNS 服务发现原理

但在某些场景下,我们希望能够更灵活调整 Pod 默认的 dns 配置,如:

  1. 调小 ndots 的值以减少冗余的域名查询请求,以提高查询效率。
  2. 集群部署了 local-dns,调整 Pod 的 nameserver 接入 local-dns。

通常,你需要重配置集群 kubelet 的启动参数,或者给应用 YAML 配置 dnsConfig 来达到目的,但是侵入性较强。

本文会介绍 dns-admission-controller 组件,通过 mutating webhook 机制能够在集群级别自动调整 pod 的 dns 配置,灵活性强、侵入性低。

手动部署 dns-admission-controller

参数确定

设定集群的 kube-dns 服务 IP 为 172.21.0.10,集群主域名后缀为 cluster.local。首先,需要确定需要调整的 dns 配置。

参数 说明
nameserver dns 服务的 IP。如果不希望调整,则需要为集群 kube-dns 服务 IP
clusterDomain 集群主域名后缀
ndots ndots 值,默认为 3

部署

  1. 以调小 ndots 值到 2 为目的示范部署流程,通过下载 helm chart 应用来一键部署应用。
export clusterDomain=cluster.local
export nameserver=172.21.0.10
export ndots=2

curl https://node-local-dns.oss-cn-hangzhou.aliyuncs.com/install_dns-admission-controller.sh -o install_dns-admission-controller.sh;chmod 744 install_dns-admission-controller.sh;bash install_dns-admission-controller.sh $clusterDomain $nameserver $ndots
  1. 查看是否安装成功:
$ helm list -n kube-system
NAME                            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                                             APP VERSION
dns-admission-controller        kube-system     1               2020-11-29 22:39:56.833004 +0800 CST    deployed        ack-node-local-dns-admission-controller-0.0.1                
$ kubectl get deployment dns-admission-controller -n kube-system
NAME                                      READY   UP-TO-DATE   AVAILABLE   AGE
dns-admission-controller   1/1     1            1           109s

接入

  1. 给需要接入的命名空间打标(以 default 为例)
kubectl label namespace default node-local-dns-injection=enabled

注:admission-controller 会忽略 kube-system 和 kube-public 命名空间下的应用。

  1. 在集群的 default 命名空间下部署以下测试应用
apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1
kind: Deployment
metadata:
  name: ubuntu
  labels:
    app: ubuntu
spec:
  replicas: 2
  selector:
    matchLabels:
      app: ubuntu
  template:
    metadata:
      labels:
        app: ubuntu
    spec:
      containers:
      - name: ubuntu
        image: ubuntu
        command: ["sh", "-c"]
        args: ["sleep 100000"]
$ kubectl apply -f ubuntu-deployment.yaml
deployment.apps/ubuntu created

$ kubectl get deployment ubuntu
NAME     READY   UP-TO-DATE   AVAILABLE   AGE
ubuntu   2/2     2            2           7s
  1. 查看 dnsConfig 是否注入成功
$ kubectl get pods
NAME                      READY   STATUS    RESTARTS   AGE
ubuntu-766448f68c-mj8qk   1/1     Running   0          4m39s
ubuntu-766448f68c-wf5hw   1/1     Running   0          4m39s
$ kubectl get pod ubuntu-766448f68c-mj8qk -o=jsonpath='{.spec.dnsConfig}'
map[nameservers:[172.21.0.10] options:[map[name:ndots value:2]] searches:[default.svc.cluster.local svc.cluster.local cluster.local]]
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
15天前
|
存储 Kubernetes 调度
【赵渝强老师】什么是Kubernetes的Pod
Pod 是 Kubernetes 中的基本逻辑单位,代表集群上的一个应用实例。它可以由一个或多个容器组成,并包含数据存储和网络配置等资源。Pod 支持多种容器执行环境,如 Docker。Kubernetes 使用 Pod 管理容器,具有简化部署、方便扩展和调度管理等优点。视频讲解和图示详细介绍了 Pod 的组成结构和使用方式。
|
15天前
|
存储 Kubernetes Docker
【赵渝强老师】Kubernetes中Pod的基础容器
Pod 是 Kubernetes 中的基本单位,代表集群上运行的一个进程。它由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。基础容器负责维护 Pod 的网络空间,对用户透明。文中附有图片和视频讲解,详细介绍了 Pod 的组成结构及其在网络配置中的作用。
【赵渝强老师】Kubernetes中Pod的基础容器
|
9天前
|
Kubernetes 监控 Cloud Native
Kubernetes集群的高可用性与伸缩性实践
Kubernetes集群的高可用性与伸缩性实践
36 1
|
15天前
|
运维 Kubernetes Shell
【赵渝强老师】K8s中Pod的临时容器
Pod 是 Kubernetes 中的基本调度单位,由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。临时容器用于故障排查和性能诊断,不适用于构建应用程序。当 Pod 中的容器异常退出或容器镜像不包含调试工具时,临时容器非常有用。文中通过示例展示了如何使用 `kubectl debug` 命令创建临时容器进行调试。
|
15天前
|
Kubernetes 调度 容器
【赵渝强老师】K8s中Pod中的业务容器
Pod 是 Kubernetes 中的基本调度单元,由一个或多个容器组成。除了业务容器,Pod 还包括基础容器、初始化容器和临时容器。本文通过示例介绍如何创建包含业务容器的 Pod,并提供了一个视频讲解。示例中创建了一个名为 "busybox-container" 的业务容器,并使用 `kubectl create -f firstpod.yaml` 命令部署 Pod。
|
15天前
|
Kubernetes 容器 Perl
【赵渝强老师】K8s中Pod中的初始化容器
Kubernetes的Pod包含业务容器、基础容器、初始化容器和临时容器。初始化容器在业务容器前运行,用于执行必要的初始化任务。本文介绍了初始化容器的作用、配置方法及优势,并提供了一个示例。
|
15天前
|
存储 Kubernetes 调度
深入理解Kubernetes中的Pod与Container
深入理解Kubernetes中的Pod与Container
25 0
|
15天前
|
Kubernetes Java 调度
Kubernetes中的Pod垃圾回收策略是什么
Kubernetes中的Pod垃圾回收策略是什么
|
15天前
|
存储 Kubernetes 调度
深度解析Kubernetes中的Pod生命周期管理
深度解析Kubernetes中的Pod生命周期管理
|
30天前
|
JSON Kubernetes 容灾
ACK One应用分发上线:高效管理多集群应用
ACK One应用分发上线,主要介绍了新能力的使用场景

相关产品

  • 云解析DNS
  • 推荐镜像

    更多
    下一篇
    无影云桌面