首页 > 其他分享 >Kubernetes:使用 K3s 为 CoreDNS 提供独立的 resolv.conf

Kubernetes:使用 K3s 为 CoreDNS 提供独立的 resolv.conf

时间:2024-08-09 16:31:35浏览次数:4  
标签:kubectl Kubernetes K3s -- resolv k3s conf CoreDNS

 Pod DNS 解析的默认设置是 CoreDNS 使用worker节点底层操作系统的设置。如果您的 Kubernetes VM 已加入多个网络或search domains,这可能会导致意外结果以及性能问题。

如果您正在使用K3s,则可以为 Kubelet 提供一个独立的 resolv.conf 文件,该文件将由 CoreDNS 使用,并且不会与 操作系统级别的dns设置冲突。

解决方案概述

在没有任何明确 DNS 策略或选项的情况下创建的 pod 使用“ ClusterFirst ”策略,该策略将非集群资源转发到工作节点的上游,并且让 pod 继承worker节点的 DNS 搜索后缀。

对于 Kubernetes 集群内解析来说,这可能并不理想,我们可以选择创建仅用于集群 DNS 解析的自定义 resolv.conf。

为了实现这一点,我们需要创建一个自定义的“/etc/k3s-resolv.conf”,更新resolv-conf 的kubelet 参数,重新启动 K3s 服务,最后重新启动 CoreDNS pod 以使更改生效。

创建自定义 resolv.conf

我们将创建一个名为“/etc/k3s-resolv.conf”的简单自定义 resolv.conf 文件,其中包含任何外部domain的上游 DNS 服务器。

echo "nameserver 192.168.1.1" | sudo tee /etc/k3s-resolv.conf

由于 CoreDNS pod 可以从任何节点运行,因此应该在所有master和worker节点上创建它。

更新 kubelet 参数

我们不会使用flags,而是使用标准的“/etc/rancher/k3s/config.yaml”,K3s 将在启动时自动读取它。

# append kubelet arg
echo 'kubelet-arg:' | sudo tee -a /etc/rancher/k3s/config.yaml
echo '- "resolv-conf=/etc/k3s-resolv.conf"' | sudo tee -a /etc/rancher/k3s/config.yaml

# check values
sudo cat /etc/rancher/k3s/config.yaml

# restart k3s service
sudo systemctl stop k3s
sleep 10
sudo systemctl start k3s
systemctl status k3s

重启 CoreDNS pod

CoreDNS pod需要重新启动。

# enable CoreDNS logging if not found
kubectl get cm -n kube-system coredns -o=json | grep -q log | kubectl get cm -n kube-system coredns -o=json | jq 'del(.metadata.resourceVersion,.metadata.uid,.metadata.selfLink,.metadata.creationTimestamp,.metadata.annotations,.metadata.generation,.metadata.ownerReferences,.status)' | sed 's#\.:53 {#\.:53 {\\n    log#' | kubectl replace -f -

# restart all CoreDNS pods
kubectl get pod -n kube-system -l k8s-app=kube-dns --no-headers | awk '{print $1}' | xargs -I{} kubectl delete pod -n kube-system {}

# wait to be available again
kubectl wait deployment -n kube-system coredns --for condition=Available=True --timeout=90s

# tail CoreDNS logs
kubectl logs deployment/coredns -n kube-system -f

验证上游DNS

首先测试内部的“kubernetes”服务,该 pod 内部以“.default.svc.cluster.local”作为后缀。

# try alpine based image with musl library which can act differently than libc
kubectl run -ti --rm alpine-musl --image=giantswarm/tiny-tools:3.12 --restart=Never --timeout=5s -- nslookup kubernetes

# try libc based library
kubectl run -ti --rm busybox-libc --image=busybox:1.35.0-glibc --restart=Never --timeout=5s -- nslookup kubernetes

The DNS queries will be output in the CoreDNS logs tailed earlier.

DNS 查询将输出在之前跟踪的 CoreDNS 日志中。

Then test an external name like ‘google.com’ that must use the upstream from /etc/k3s-resolv.conf

然后测试一个外部名称,例如“google.com”,该名称必须使用来自 /etc/k3s-resolv.conf 的上游

# alpine musl image
kubectl run -ti --rm alpine-musl --image=giantswarm/tiny-tools:3.12 --restart=Never --timeout=5s -- nslookup google.com

# libc image
kubectl run -ti --rm busybox-libc --image=busybox:1.35.0-glibc --restart=Never --timeout=5s -- nslookup google.com

The DNS queries will be output in the CoreDNS logs tailed earlier.

DNS 查询将输出在之前跟踪的 CoreDNS 日志中。

标签:kubectl,Kubernetes,K3s,--,resolv,k3s,conf,CoreDNS
From: https://www.cnblogs.com/gongzb/p/18350950

相关文章

  • Kubernetes对象YAML文件的基本格式详解
    简介  Kubernetes(K8s)作为云原生时代的基础设施核心,其配置文件通常采用YAML格式来定义和管理各种资源对象。YAML(YAMLAin'tMarkupLanguage)因其简洁、易读和易写的特性,在Kubernetes中得到了广泛应用。本文将详细探讨Kubernetes对象YAML文件的基本格式,重点解析GVK(Group、Ve......
  • 【Kubernetes】pod状态与故障排查
    一、Pod启动阶段(相位phase)pod创建完之后,一直到持久运行起来,中间有很多步骤,也就有很多出错的可能,因此会有很多不同的状态。Pod的启动过程如下:0)controller-manager管理的控制器创建Pod资源1)scheduler调度器根据调度算法选择最适合的node节点调度Pod2)kubelet拉取镜像3)kubel......
  • 《Kubernetes企业级云原生运维实战》(李振良).pdf
    本书是一本实用性很强的Kubernetes运维实战指南,旨在为容器云平台的建设、应用和运维过程提供全面的指导。作者结合丰富的生产环境经验,深入探讨作为一名Kubernetes工程师必备的核心技能,包括部署、存储、网络、安全、日志、监控、CI/CD等方面的技术。本书结合大量的实际案例,......
  • kubernetes集群部署postgre 12.6数据库服务
    背景:因业务上线需要,研发中心要求在kubernetes测试集群部署一个postgre12.6的数据库,用于业务功能调试。一、实施部署postgre数据库: 1、拉取postgre12.6的镜像:[root@harbor-02~]#dockerpullregistry.cn-hangzhou.aliyuncs.com/images-speed-up/postgres:12.62017-l......
  • kubernetes 核心实战 - 存储 - 3
    Kubernetes核心实战-存储介绍1.Kubernetes存储概念及其关系在Kubernetes中,存储的几个核心概念及其关系如下:Volume:在Pod内部使用的一块存储,生命周期与Pod一致。不同类型的Volumes提供不同的存储功能,例如emptyDir、hostPath、configMap等。PersistentV......
  • LangChain与Kubernetes的协奏曲:解锁容器编排的新境界
    LangChain与Kubernetes的协奏曲:解锁容器编排的新境界在云计算和微服务架构的浪潮中,Kubernetes已成为容器编排和管理的事实标准。LangChain,作为一个假设的编程辅助工具,如果存在,它可能会支持与Kubernetes集群的集成,以实现代码生成、部署和自动化管理的无缝对接。本文将探讨La......
  • kubernetes笔记-4-kubernetes资源管理
    一、、kubernetes资源分类:工作负载、发现与负载均衡、配置与存储、集群、和元数据1、工作负载型资源分为:有状态和无状态两种类型;无状态:每个pod均可被其它其他同类所取代;有状态:有其独特性,必须单独标识和管理;ReplicaSet、Deployment负责无状态应用管理;StatefulSet负责有状态应用管......
  • 【Kubernetes】k8s集群资源调度
    目录一.k8s的List-Watch机制二.scheduler的调度过程三.指定节点调度Pod1.通过nodeName调度Pod2.通过节点标签选择器调度Pod3.通过亲和性调度Pod3.1.节点亲和性硬策略软策略当软、硬策略同时存在3.2.Pod亲和性Pod亲和性(podAffinity)Pod反亲和性(podAntiAffinity)......
  • 如何在 Kubernetes 中实现应用的无损上线和下线
    转载:https://mp.weixin.qq.com/s/LdquOPS34mLFqYjfI4J6fQ 在日常工作中,经常会接收到开发团队这样的反馈:为什么应用发布或重启的期间会出现少量的5xx异常,应该如何解决?在深入分析后,我们发现导致流量有损的原因有很多,比如:上线时,应用在就绪前收到流量,导致请求无法被处理;下线......
  • Kubernetes Pod之间的通信
    Pod之间的通信可以通过以下几种方式实现:1.同一Pod内的容器通信:在同一个Pod内的容器可以通过localhost或者127.0.0.1进行通信,因为它们通过pause容器共享相同的网络命名空间和IP地址。2.Pod之间的通信:Pod之间的通信可以通过Service或者Endpoint来实现。Service是一个抽象的逻辑概......