我正在使用 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 \
"