首页 > 解决方案 > kube-apiserver 没有使用 docker-dns

问题描述

我正在使用 kubespray 2.14 部署 k8s 集群。大多数配置是默认的。我已经为 kubectl 配置了 OIDC 身份验证。我使用 Keycloak 作为本地部署的身份验证服务器。流量由自签名证书保护,域 keycloak.example.com 由本地 dns 服务器解析。我为 example.com 域添加了一个 CoreDNS 外部区域。

kube-apiserver 使用主机网络,因此默认情况下 CoreDNS 不解析名称。

只要我使用resolvconf_mode: host_resolvconf. 然后将 coredns 地址添加到 hosts/etc/resolv.conf文件中,kube-apiserver 使用 CoreDNS 解析自定义域。但是这种模式使我的集群非常不稳定。我不想深入研究这个问题,因为我已经花了太多时间。

为了解决稳定性问题,我回到了默认设置resolvconf_mode: docker_dns,但后来我遇到了 OIDC 问题。

oidc authenticator: initializing plugin: Get https://keycloak.example.com/auth/realms/test/.well-known/openid-configuration: dial tcp: lookup keycloak.example.com on 8.8.8.8:53: no such host

kube-apiserver 无法解析 keycloak.example.com 域,因为它从主机 (8.8.8.8) 查询名称服务器。我认为它应该查询 docker_dns,正如 kubespray 文档中所述:

https://github.com/kubernetes-sigs/kubespray/blob/master/docs/dns-stack.md

但是,对于 hostNetwork: true POD,k8s 将让 docker 设置 DNS 设置。不是由 k8s 启动/管理的 Docker 容器也将使用这些 docker 选项。

有没有办法配置 kubespray 库存来解决这个问题,而无需手动向每个主节点添加名称服务器?这是我的库存配置部分:

kube_oidc_url: https://keycloak.example.com/auth/realms/test
kube_oidc_client_id: cluster

resolvconf_mode: docker_dns

upstream_dns_servers:
- 192.168.30.47

coredns_external_zones: &external_zones
- zones:
  - example.com:53
  nameservers:
  - 192.168.30.47
  cache: 5

nodelocaldns_external_zones: *external_zones

docker-dns.conf

[Service]
Environment="DOCKER_DNS_OPTIONS=\
    --dns 10.233.0.3 --dns 192.168.30.47 --dns 8.8.8.8  \
    --dns-search default.svc.cluster.local --dns-search svc.cluster.local  \
    --dns-opt ndots:2 --dns-opt timeout:2 --dns-opt attempts:2  \
"

标签: kuberneteskubespray

解决方案


推荐阅读