---
# System prepended metadata

title: Run CoreDNS with Podman Pod on Alpine

---

# Run CoreDNS with Podman Pod on Alpine


```bash
# 1. 建立工作目錄
$ mkdir -p "$HOME"/dns/{config,yaml}

# 2. 設定 Corefile，作為 CoreDNS Server 的設定檔
$ nano "$HOME"/dns/config/Corefile
.:53 {
    forward . 8.8.8.8
    log
    errors
}

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

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

* `antony.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.antony.com` refers to the name of this DNS server
* `robbmanes.antony.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 `suma5.example.com`, which can be canonically mapped directly to an IP address, `192.168.80.21`.


```bash!
# 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. 啟動 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. 查詢 A record
$ dig @192.168.80.11 suma5.antony.com +short
192.168.80.21
```

```
# 8. auto start pod after boot
## The following is openRC service
$ sudo nano /etc/init.d/pod-coredns
#!/sbin/openrc-run

name=$RC_SVCNAME
command="/usr/bin/podman"
#networks_=''
pod_name="coredns-pod"
command_user="root"
command_args="pod start ${pod_name} &> /dev/null &"

depend() {
        after network-online
        use net
}

exists() {
        /sbin/runuser -u ${command_user} -- ${command} pod exists ${pod_name} 2> /dev/null
        result=$?
        if [ $result -ne 0 ]; then
          einfo "${pod_name} doesn't existed"
          return 3
        fi
}

stop() {
        ebegin "Stopping $RC_SVCNAME"
        exists
        Status=$(/sbin/runuser -u ${command_user} -- ${command} pod ps -f name=${pod_name} --format "{{.Status}}")
        if [ $Status = Exited ]; then
          einfo "${pod_name} $Status"
          exit 0
        fi
        /sbin/runuser -u ${command_user} -- ${command} pod stop ${pod_name} #2> /dev/null
        result=$?
        if [ $result -eq 0 ]; then
          einfo "status: stopped"
          return 0
        fi
}

status() {
        exists
        Status=$(/sbin/runuser -u ${command_user} -- ${command} pod ps -f name=${pod_name} --format "{{.Status}}")
        if [ $Status = Running ]; then
          einfo "status: started"
          return 0
        else
          einfo "status: stopped"
          return 3
        fi
}
```

```
# 9. 賦予執行權限
$ sudo chmod +x /etc/init.d/pod-coredns

# 10. Enable Service
$ sudo rc-update add pod-coredns default

# 11. Reboot
$ sudo reboot

# 12. Check Pod Status
$ sudo podman ps -a --pod
CONTAINER ID  IMAGE                                    COMMAND               CREATED      STATUS        PORTS       NAMES                POD ID        PODNAME
11b8e349c74b  localhost/podman-pause:5.0.3-1720373660                        8 hours ago  Up 5 minutes              a30a257c2f50-infra   a30a257c2f50  coredns-pod
50b063ed9107  docker.io/coredns/coredns:latest         -conf /root/Coref...  8 hours ago  Up 5 minutes              coredns-pod-coredns  a30a257c2f50  coredns-pod
```













