---
# System prepended metadata

title: Run CoreDNS with Podman Pod on Ubuntu
tags: [系統工程]

---

# Run CoreDNS with Podman Pod on Ubuntu
### 0. ubuntu 關閉 systemd-resolved 監聽 `127.0.0.53:53`
* ubuntu 預設有開啟 `systemd-resolved` 服務，負責處理 Linux 系統中的「名稱解析」工作，但他會霸佔本機 53 port。
* 停用 systemd-resolved 的 stub listener（只讓它不再監聽 127.0.0.53:53）
```
$ sudoedit /etc/systemd/resolved.conf
[Resolve]
......
DNSStubListener=no
......
```
```
$ sudo systemctl restart systemd-resolved
```


### 1. 下載 podman

```
$ curl -fsSL -o podman-linux-amd64.tar.gz https://github.com/mgoltzsche/podman-static/releases/latest/download/podman-linux-amd64.tar.gz

$ tar -zxvf podman-linux-amd64.tar.gz;cd podman-linux-amd64
```
* 使用 rsync 複製 podman 執行檔案，並且會把原本會被覆寫的檔案移到備份目錄
```
$ sudo rsync -aHAX --numeric-ids --info=progress2 \
  --backup --backup-dir="/root/usr-backup-$(date +%F_%H%M%S)" \
  ./usr/ /usr/
```

```
$ sudo mkdir -p /etc/containers

$ sudo rsync -aHAX --no-o --no-g --info=progress2 \
  --backup --backup-dir="/root/etc-containers-backup-$(date +%F_%H%M%S)}" \
  ./etc/containers/ /etc/containers/
```

```
$ which podman
/usr/local/bin/podman

$ sudo podman version
Client:       Podman Engine
Version:      5.6.0
API Version:  5.6.0
Go Version:   go1.24.6
Built:        Thu Jan  1 08:00:00 1970
OS/Arch:      linux/amd64
```

### 2. 設定 Corefile，作為 CoreDNS Server 的設定檔
```
$ mkdir -p "$HOME"/dns/{config,yaml}

$ nano "$HOME"/dns/config/Corefile
.:53 {
    forward . 8.8.8.8
    log
    errors
}

andy.com:53 {
    file /root/andy.db
    log
    errors
}
```

### 3. 設定 DNS zone file
```
$ nano "$HOME"/dns/config/andy.db
andy.com.        IN  SOA dns.andy.com. robbmanes.andy.com. 2015082541 7200 3600 1209600 3600
test.andy.com.   IN  A   192.168.80.21
```

* `andy.com.` refers to the zone in which this DNS server is responsible for.
* `SOA` refers to the type of record; in this case, a "Start of Authority"
* `dns.andy.com` refers to the name of this DNS server
* `robbmanes.andy.com` refers to the email of the administrator of this DNS server. Note that the `@` sign is simply noted with a period; this is not a mistake, but how it is formatted.
* `2015082541` refers to the serial number. This can be whatever you like, so long as it is a serial number that is not reused in this configuration or otherwise has invalid characters. There are usually rules to follow concerning how to set this, notably by setting a valid date concerning the last modifications, like `2019020822` for February 08, 2019, at 22:00 hours.
* `7200` refers to the Refresh rate in seconds; after this amount of time, the client should re-retrieve an SOA.
* `3600` is the Retry rate in seconds; after this, any Refresh that failed should be retried.
* `1209600` refers to the amount of time in seconds that passes before a client should no longer consider this zone as "authoritative". The information in this SOA expires ater this time.
* `3600` refers to the Time-To-Live in seconds, which is the default for all records in the zone.
* An A record indicates a name, in this case `test.andy.com`, which can be canonically mapped directly to an IP address, 192.168.80.21.

### 4. 編輯與設定 CoreDNS Pod YAML 檔
```
## spec.volumes.hostpath.path 每個環境會不同，需要修改。
$ nano ${HOME}/dns/yaml/coredns-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    app: coredns-pod
  name: coredns-pod
spec:
  containers:
  - args:
    - -conf
    - /root/Corefile
    image: docker.io/coredns/coredns:latest
    name: coredns
    volumeMounts:
    - mountPath: /root/
      name: config
  hostNetwork: true
  volumes:
  - hostPath:
      path: /home/bigred/dns/config
      type: Directory
    name: config
```
### 5. podman 啟動 CoreDNS Pod
```
$ sudo podman kube play ${HOME}/dns/yaml/coredns-pod.yaml
Pod:
cd21bbdee88d877ca4c8501867ef620b3de166d606cf1bcd0825195c9b4768a5
Container:
e214119e505edebd3f7ee001fc788d58fa4b1f1f6a13978347d79ffa4b1617df
```
### 6. 檢查 STATUS 是否為 Up
```
$ sudo podman ps -a --pod
CONTAINER ID  IMAGE                                    COMMAND               CREATED             STATUS             PORTS       NAMES
    POD ID        PODNAME
8758ac9989d3  localhost/podman-pause:5.0.3-1720373660                        2 minutes ago       Up About a minute              cd21bbdee88d-infra   cd21bbdee88d  coredns-pod
e214119e505e  docker.io/coredns/coredns:latest         -conf /root/Coref...  About a minute ago  Up About a minute              coredns-pod-coredns  cd21bbdee88d  coredns-pod
```
### 7. 使用本機 ip 測試查詢 A record
```
$ dig @172.20.7.50 test.andy.com +short
192.168.80.21
```
### 8. 設定 auto start pod after boot
```
## The following is systemd service
$ sudo nano /usr/lib/systemd/system/coredns.service
# pod-coredns-pod.service
# autogenerated by Podman 4.9.5
# Fri Jan 10 15:24:22 CST 2025

[Unit]
Description=Podman pod-coredns-pod.service
Documentation=man:podman-generate-systemd(1)
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=no
TimeoutStopSec=70
# 注意自己的 podman path
ExecStart=/usr/local/bin/podman pod start coredns-pod
ExecStop=/usr/local/bin/podman pod stop coredns-pod

[Install]
WantedBy=default.target
```
### 9. Enable Service
```
# 賦予執行權限
$ sudo chmod +x /usr/lib/systemd/system/coredns.service


$ sudo systemctl enable coredns.service

# 測試 Reboot
$ sudo reboot

# Check Pod Status
$ sudo podman ps -a --pod
CONTAINER ID  IMAGE                               COMMAND               CREATED        STATUS                       PORTS       NAMES                POD ID        PODNAME
a2e5acb3a1fd  localhost/podman-pause:4.9.3-0                            6 minutes ago  Up 34 seconds                            456479de0dc3-infra   456479de0dc3  coredns-pod
592b9591004d  docker.io/coredns/coredns:latest    -conf /root/Coref...  6 minutes ago  Up 34 seconds                            coredns-pod-coredns  456479de0dc3  coredns-pod
```

## 參考

https://hackmd.io/@QI-AN/Run-CoreDNS-with-Podman-Pod
