昨天我們把虛擬牧場的圍欄都搭好了,今天要開始建造牧場裡最重要的基礎設施了!就像真實牧場需要水井、飼料庫和道路指示牌一樣,我們的數位牧場也需要 DNS 服務來當導航系統。
今天我們要在 bastion-infra-server 這個萬能工具人上面建置 PowerDNS,讓它成為我們牧場的專屬 GPS 系統,確保所有的牛羊(Pod)都能找到回家的路!
在 Kubernetes 多叢集環境中,服務發現是個關鍵問題。我們需要一個穩定的內部 DNS 服務來解決以下需求:
主要需求:
經過評估,我選擇 PowerDNS 搭配 MariaDB 後端,而不使用複雜的 PowerDNS Admin:
主要優勢:
參考資料: https://phoenixnap.com/kb/powerdns-ubuntu
安裝 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;
停用 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 後端設定檔:
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=
設定檔案權限並啟動服務:
# 修正設定檔權限 (不要使用 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 服務將成為我們實驗環境的核心基礎設施。
重點回顧:
明天我們將繼續在同一台 bastion-infra-server 上部署 HAProxy 負載均衡器和 NFS 共享儲存服務,完成整個基礎設施層的建置。
💡 牧場主小提示:PowerDNS 安裝完成後就是一個空的 DNS 伺服器,可以透過 SQL 指令或
pdnsutil
CLI 工具管理域名和記錄。記得定期備份 MariaDB 資料庫!