「KUBERNETES」- 部署 PowerDNS、PowerDNS-Admin 服务

  CREATED BY JENKINSBOT

问题描述

在客户环境中需要部署我们的软件产品,但是客户的环境网络隔离,无法访问公网网;

但是我们的服务依赖于 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