问题描述
在客户环境中需要部署我们的软件产品,但是客户的环境网络隔离,无法访问公网网;
但是我们的服务依赖于 DNS 解析,所以需要部署 DNS 服务,需要解决如下问题:
1)集群外部主机提供 DNS 解析服务:外部主机能够通过该 DNS 服务完成域名解析;
2)集群内部容器提供 DNS 解析服务:内部容器能够通过该 DNS 服务完成域名解析;
该笔记将记录:在 Kubernetes Cluster 中,部署 DNS Server 的方法,以及相关问题的解决办法;
解决方案
我们使用 PowerDNS 服务,其原因如下:
1)具有 PowerDNS Admin 图形化界面来管理 DNS 解析;
2)具有 Helm Chart 使其能够运行在 Kubernetes 中;
第一步、部署 PowerDNS 服务
halkeye-docker/powerdns: Dockerized, pgsql-enabled PowerDNS
powerdns 0.4.0 · halkeye/halkeye
#1 初始化数据库
该容器并未提供数据库初始化功能,所以我们需要手动初始化数据库:
1)我们使用 PostgreSQL 数据库,需要创建数据库、用户、密码,并授权;
2)参考 Generic PostgreSQL backend/Default schema 文档,建表;
#2 部署容器服务
helm repo add halkeye https://halkeye.github.io/helm-charts/ helm repo update helm pull halkeye/powerdns # powerdns-0.4.0.tgz helm show values ./powerdns-0.4.0.tgz > powerdns-0.4.0.helm-values.yaml vim powerdns-0.4.0.helm-values.yaml ...(1)修改 service.loadBalancerIP 参数:指定负载均衡地址; ...(2)修改 powerdns.postgres 参数:指定数据库信息; ...(3)修改 powerdns.api_key 参数:指定 HTTP API 凭证; helm --namespace infra-dns \ install powerdns \ ./powerdns-0.4.0.tgz -f powerdns-0.4.0.helm-values.yaml \ --create-namespace ... 1. Get the application URL by running these commands: NOTE: It may take a few minutes for the LoadBalancer IP to be available. You can watch the status of by running 'kubectl get --namespace infra-dns svc -w powerdns' export SERVICE_IP=$(kubectl get svc --namespace infra-dns powerdns --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}") echo http://$SERVICE_IP:53 # kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE powerdns-tcp LoadBalancer 10.106.130.14 172.31.120.11 53:32221/TCP 53m powerdns-udp LoadBalancer 10.107.155.224 172.31.120.11 53:30615/UDP 53m powerdns-webserver ClusterIP 10.97.78.209 <none> 8081/TCP 4m55s
#3 验证服务正常
# dig @172.31.120.11 ; <<>> DiG 9.16.1-Ubuntu <<>> @172.31.120.11 ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 64832 ;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1 ;; WARNING: recursion requested but not available ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ;; QUESTION SECTION: ;. IN NS ;; Query time: 11 msec ;; SERVER: 172.31.120.11#53(172.31.120.11) ;; WHEN: Tue Sep 13 16:03:22 CST 2022 ;; MSG SIZE rcvd: 28 # kubectl logs -f powerdns-d97bd4b65-x24t7 ...
第二步、部署 PowerDNS-Admin 服务
PowerDNS-Admin/PowerDNS-Admin: A PowerDNS web interface with advanced features
powerdnsadmin 0.3.1 · halkeye/halkeye
#1 初始化数据库
该容器并未提供数据库初始化功能,所以我们需要手动初始化数据库:
1)我们使用 PostgreSQL 数据库,需要创建数据库、用户、密码,并授权;
2)参考 Generic PostgreSQL backend/Default schema 文档,建表;
#2 部署容器服务
helm repo add halkeye https://halkeye.github.io/helm-charts/ helm repo update helm pull halkeye/powerdnsadmin # powerdnsadmin-0.3.1.tgz helm show values ./powerdnsadmin-0.3.1.tgz > powerdnsadmin-0.3.1.helm-values.yaml vim powerdnsadmin-0.3.1.helm-values.yaml ...(1)修改 ingress 参数:暴露 Web 界面,以提供给外部访问; ...(2)修改 db 参数:该数据库用于存储 powerdns-admin 的数据; helm --namespace infra-dns \ install powerdns-admin \ ./powerdnsadmin-0.3.1.tgz -f powerdnsadmin-0.3.1.helm-values.yaml \ --create-namespace
#3 配置访问服务
1)firefox https://ingress-host.example.com/
2)注册用户,首个注册的用户将具有 Administrator 权限;
3)配置服务,填写 PDNS Settings 相关配置内容;
4)添加域名,然后根据界面提示,进行配置域名解析即可;
第三步、集群引入 PowerDNS 服务
# kubectl edit configmaps coredns -n kube-system ... data: Corefile: | ... example.com:53 { errors cache 30 forward . 10.96.111.245 } ... ... # 其中 example.com 为 PowerDNS 负责解析的域名; # 其中 10.96.111.245 为 PowerDNS 的 Service 地址;
参考文献
Open source DNS server with database backend
Host your own DNS with PowerDNS on CentOS 7
Default admin password? · Issue #646 · PowerDNS-Admin/PowerDNS-Admin
HTTP API – Introduction