# 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 ```