iT邦幫忙

2025 iThome 鐵人賽

DAY 5
1
DevOps

牧場主的 K8s 放牧日記系列 第 5

Day 5: 搭建牧場基礎設施 - PowerDNS 服務建置

  • 分享至 

  • xImage
  •  

牧場主今日工作

昨天我們把虛擬牧場的圍欄都搭好了,今天要開始建造牧場裡最重要的基礎設施了!就像真實牧場需要水井、飼料庫和道路指示牌一樣,我們的數位牧場也需要 DNS 服務來當導航系統。

今天我們要在 bastion-infra-server 這個萬能工具人上面建置 PowerDNS,讓它成為我們牧場的專屬 GPS 系統,確保所有的牛羊(Pod)都能找到回家的路!

技術背景與概念

為什麼需要內部 DNS?

在 Kubernetes 多叢集環境中,服務發現是個關鍵問題。我們需要一個穩定的內部 DNS 服務來解決以下需求:

主要需求:

  • 跨叢集通訊:Rancher Server 需要與管理的叢集通訊
  • 服務抽象化:使用域名而非 IP,方便維護和變更
  • 負載均衡整合:DNS 記錄指向 Load Balancer
  • SSL 憑證管理:需要穩定的域名來申請憑證

為什麼選擇 PowerDNS + MariaDB?

經過評估,我選擇 PowerDNS 搭配 MariaDB 後端,而不使用複雜的 PowerDNS Admin:

主要優勢:

  • 高效能:MariaDB 支援多用戶並發存取,查詢效能比 SQLite 檔案資料庫更好
  • 簡單維護:直接透過 SQL 管理 DNS 記錄,不需要額外的 Web 管理介面
  • DNSSEC 支援:PowerDNS 內建數位簽章功能,提升 DNS 安全性
  • 擴展性佳:MariaDB 支援主從複製,可建立高可用 DNS 架構

參考資料: https://phoenixnap.com/kb/powerdns-ubuntu

PowerDNS 詳細建置步驟

第一步:MariaDB 資料庫建置

安裝 MariaDB 並建立 PowerDNS 專用資料庫:

# 更新系統並安裝 MariaDB
sudo apt update -y
sudo apt install mariadb-server mariadb-client -y

# 啟動並啟用 MariaDB 服務
sudo systemctl start mariadb
sudo systemctl enable mariadb

# 進入 MariaDB 建立資料庫
sudo mysql -u root

建立 PowerDNS 專用資料庫和使用者:

-- 建立 PowerDNS 資料庫
CREATE DATABASE pda;

-- 建立使用者並授權 (請務必修改密碼!)
GRANT ALL PRIVILEGES ON pda.* TO 'pda'@'localhost' IDENTIFIED BY 'YOUR_SECURE_PASSWORD_HERE';
FLUSH PRIVILEGES;

-- 切換到 PowerDNS 資料庫
USE pda;

CREATE TABLE domains (
  id                    INT AUTO_INCREMENT,
  name                  VARCHAR(255) NOT NULL,
  master                VARCHAR(128) DEFAULT NULL,
  last_check            INT DEFAULT NULL,
  type                  VARCHAR(6) NOT NULL,
  notified_serial       INT UNSIGNED DEFAULT NULL,
  account               VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL,
  PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE UNIQUE INDEX name_index ON domains(name);
CREATE TABLE records (
  id                    BIGINT AUTO_INCREMENT,
  domain_id             INT DEFAULT NULL,
  name                  VARCHAR(255) DEFAULT NULL,
  type                  VARCHAR(10) DEFAULT NULL,
  content               VARCHAR(64000) DEFAULT NULL,
  ttl                   INT DEFAULT NULL,
  prio                  INT DEFAULT NULL,
  change_date           INT DEFAULT NULL,
  disabled              TINYINT(1) DEFAULT 0,
  ordername             VARCHAR(255) BINARY DEFAULT NULL,
  auth                  TINYINT(1) DEFAULT 1,
  PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE INDEX nametype_index ON records(name,type);
CREATE INDEX domain_id ON records(domain_id);
CREATE INDEX ordername ON records (ordername);
CREATE TABLE supermasters (
  ip                    VARCHAR(64) NOT NULL,
  nameserver            VARCHAR(255) NOT NULL,
  account               VARCHAR(40) CHARACTER SET 'utf8' NOT NULL,
  PRIMARY KEY (ip, nameserver)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE TABLE comments (
  id                    INT AUTO_INCREMENT,
  domain_id             INT NOT NULL,
  name                  VARCHAR(255) NOT NULL,
  type                  VARCHAR(10) NOT NULL,
  modified_at           INT NOT NULL,
  account               VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL,
  comment               TEXT CHARACTER SET 'utf8' NOT NULL,
  PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE INDEX comments_name_type_idx ON comments (name, type);
CREATE INDEX comments_order_idx ON comments (domain_id, modified_at);
CREATE TABLE domainmetadata (
  id                    INT AUTO_INCREMENT,
  domain_id             INT NOT NULL,
  kind                  VARCHAR(32),
  content               TEXT,
  PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE INDEX domainmetadata_idx ON domainmetadata (domain_id, kind);
CREATE TABLE cryptokeys (
  id                    INT AUTO_INCREMENT,
  domain_id             INT NOT NULL,
  flags                 INT NOT NULL,
  active                BOOL,
  content               TEXT,
  PRIMARY KEY(id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE INDEX domainidindex ON cryptokeys(domain_id);
CREATE TABLE tsigkeys (
  id                    INT AUTO_INCREMENT,
  name                  VARCHAR(255),
  algorithm             VARCHAR(50),
  secret                VARCHAR(255),
  PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);

-- 確認所有資料表建立成功
SHOW TABLES;

-- 離開 MariaDB
EXIT;

第二步:PowerDNS 服務安裝

停用 systemd-resolved 並安裝 PowerDNS:

# 停用 systemd-resolved 避免埠號衝突
sudo systemctl disable --now systemd-resolved

# 設定暫時 DNS 解析
sudo rm -rf /etc/resolv.conf
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf

# 安裝 PowerDNS 和 MySQL 後端
sudo apt-get install pdns-server pdns-backend-mysql -y

第三步:PowerDNS MySQL 後端設定

建立 PowerDNS MySQL 後端設定檔:

sudo vim /etc/powerdns/pdns.d/pdns.local.gmysql.conf

設定檔內容:

# MySQL Configuration
#
# Launch gmysql backend
launch+=gmysql

# gmysql parameters
gmysql-host=127.0.0.1
gmysql-port=3306
gmysql-dbname=pda
gmysql-user=pda
gmysql-password=YOUR_SECURE_PASSWORD_HERE
gmysql-dnssec=yes
# gmysql-socket=

第四步:啟動與測試 PowerDNS

設定檔案權限並啟動服務:

# 修正設定檔權限 (不要使用 777,太危險!)
sudo chmod 640 /etc/powerdns/pdns.d/pdns.local.gmysql.conf
sudo chown root:pdns /etc/powerdns/pdns.d/pdns.local.gmysql.conf

# 先停止服務進行測試
sudo systemctl stop pdns

# 前端測試模式,檢查設定是否正確
sudo pdns_server --daemon=no --guardian=no --loglevel=9
# 如果看到 "UDP server bound to 0.0.0.0:53" 就代表成功,按 Ctrl+C 停止

# 正式啟動服務
sudo systemctl start pdns
sudo systemctl enable pdns

# 檢查服務狀態
sudo systemctl status pdns
sudo ss -alnp4 | grep pdns

驗證安裝

完成安裝後,確認 PowerDNS 服務運作正常:

# 檢查 PowerDNS 服務狀態
sudo systemctl status pdns

# 確認監聽 53 埠
sudo ss -tulnp | grep :53

今日總結與明日預告

今天我們成功在 bastion-infra-server 上建置了 PowerDNS 權威 DNS 伺服器,使用 MariaDB 作為後端儲存。這個 DNS 服務將成為我們實驗環境的核心基礎設施。

重點回顧:

  • 完成 MariaDB 資料庫建置與 PowerDNS 資料表結構
  • 成功安裝並設定 PowerDNS Authoritative Server
  • 解決 systemd-resolved 埠號衝突問題
  • 學會正確的權限設定,避免安全風險
  • PowerDNS 服務已準備好,後續可透過 SQL 管理 DNS 記錄

明天我們將繼續在同一台 bastion-infra-server 上部署 HAProxy 負載均衡器和 NFS 共享儲存服務,完成整個基礎設施層的建置。


💡 牧場主小提示:PowerDNS 安裝完成後就是一個空的 DNS 伺服器,可以透過 SQL 指令或 pdnsutil CLI 工具管理域名和記錄。記得定期備份 MariaDB 資料庫!


上一篇
Day 4: Proxmox 實驗環境建置
下一篇
Day 6: 負載均衡器與儲存服務實作
系列文
牧場主的 K8s 放牧日記20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言