如何为裸机配置 kubespray DNS

如何解决如何为裸机配置 kubespray DNS

我对 kubernetes 比较陌生,我的大学课程有一个项目,要在裸机上构建 kubernetes 集群。

为此,我设置了一个 PoC 环境,在 6 台机器(其中 3 台是一个节点上的 KVM 机器)中,所有管理都由 MAAS 完成,即 DHCP,而 DNS 由那台机器管理。我有一个委托给 MAAS DNS 服务器 k8s.example.com 的 DNS 区域,所有机器都在其中。整个网络在自己的 VLAN 10.0.10.0/24 中,从 DHCP 保留 metallb IPRange。 这是一张说明简单集群的图片:

k8s overview

软件方面,所有主机都使用 ubuntu 20.04,我使用 kubespray 部署所有内容,即 kubernetes、metallb 和 nginx-ingress-controller。我对应的 kubespray 值是:

dashboard_enabled: false
ingress_nginx_enabled: true
ingress_nginx_host_network: true

kube_proxy_strict_arp: true

metallb_enabled: true
metallb_speaker_enabled: true
metallb_ip_range:
  - "10.0.10.100-10.0.10.120"

kubeconfig_localhost: true

我的问题是,我无法将 DNS 从集群中移出到 Internet 进行工作。 我有一个通配符 A Record set for *.k8s.example.com 到 nginx-Ingress 外部 ip,这对于每个 pod 都可以从外部访问。 问题是,集群内的每个容器都无法再访问 Internet。每个请求都通过入口路由。意思是,如果我尝试到达 www.google.net,它会尝试到达 www.google.net.k8s.example.com,这是有道理的。删除通配符 A 记录后,只有每个 .com 域都可以毫无问题地访问(例如 www.google.com),它工作正常。集群内的所有 Pod 相互访问都没有问题。

我看到有几种配置可能性,在那里进行调整是有意义的,但在 2 周后,我真的更喜欢基于最佳实践并正确完成的解决方案。

我真的很想能够使用通配符 A 记录,但我担心这可能是不可能的。

我希望我提供了所需的所有信息,以使您能够充分了解我的问题。

编辑: 我使用了标准的 kubespray DNS 配置,因为我被告知它就足够了:

DNS configuration.
# Kubernetes cluster name,also will be used as DNS domain
cluster_name: cluster.local
# Subdomains of DNS domain to be resolved via /etc/resolv.conf for hostnet pods
ndots: 2
# Can be coredns,coredns_dual,manual or none
dns_mode: coredns
# Set manual server if using a custom cluster DNS server
# manual_dns_server: 10.x.x.x
# Enable nodelocal dns cache
enable_nodelocaldns: true
nodelocaldns_ip: 169.254.25.10
nodelocaldns_health_port: 9254
# nodelocaldns_external_zones:
# - zones:
#   - example.com
#   - example.io:1053
#   nameservers:
#   - 1.1.1.1
#   - 2.2.2.2
#   cache: 5
# - zones:
#   - https://mycompany.local:4453
#   nameservers:
#   - 192.168.0.53
#   cache: 0
# Enable k8s_external plugin for CoreDNS
enable_coredns_k8s_external: false
coredns_k8s_external_zone: k8s_external.local
# Enable endpoint_pod_names option for kubernetes plugin
enable_coredns_k8s_endpoint_pod_names: false

# Can be docker_dns,host_resolvconf or none
resolvconf_mode: docker_dns
# Deploy netchecker app to verify DNS resolve as an HTTP service
deploy_netchecker: false
# Ip address of the kubernetes skydns service
skydns_server: "{{ kube_service_addresses|ipaddr('net')|ipaddr(3)|ipaddr('address') }}"
skydns_server_secondary: "{{ kube_service_addresses|ipaddr('net')|ipaddr(4)|ipaddr('address') }}"
dns_domain: "{{ cluster_name }}"

我注意到的是,pods 的 etc resolv.conf 看起来像这样:

/ $ cat /etc/resolv.conf 
nameserver 169.254.25.10
search flux-system.svc.cluster.local svc.cluster.local cluster.local k8s.example.com maas
options ndots:5

例如在由 MAAS 管理的节点上,它是:

# This file is managed by man:systemd-resolved(8). Do not edit.
#
# This is a dynamic resolv.conf file for connecting local clients to the
# internal DNS stub resolver of systemd-resolved. This file lists all
# configured search domains.
#
# Run "resolvectl status" to see details about the uplink DNS servers
# currently in use.
#
# Third party programs must not access this file directly,but only through the
# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,# replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.

nameserver 127.0.0.53
options edns0 trust-ad
search k8s.example.com maas

解决方法

正如评论中所讨论的,问题在于您的 Kubernetes 节点上的 resolv.conf,以及您使用的通配符记录与该 resolv.conf search 条目中的名称之一匹配的事实。

您可以从节点或 Pod 中调用的任何名称将首先被搜索为 ${input}.${search-entry},而 ${input} 仅在与您的 search 的连接没有返回时才会被查询已经有一些记录了。在域搜索列表中包含通配符记录将导致任何名称解析为该记录。

承认在这种情况下,k8s.example.com 记录是由 MAAS 推送的,并且我们无法真正持久地删除它,下一个最佳解决方案是使用另一个名称服务于您的 Ingress - 子域,或者不相关的东西。通常,更改 DHCP 服务器中的选项就足够了 - 或者可以说更好:不要使用 DHCP 托管 Kubernetes 节点。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res