はじめに
この記事は、Oracle Cloud Infrastructure Advent Calender 2024 シリーズ 1 Day17の記事として書いています。
前回はNGINX Gateway Fabricを利用したGateway APIの利用について書きました。
今回はその関連として、払い出されたLBのIPと自分が保持するドメインを動的にDNSサーバに登録するというのをやってみます。
ExternalDNS
k8sにはExternalDNSという仕組みがあります。
この仕組みはk8s上のServiceリソースやIngressリソースを監視しつつDNSレコードを動的に管理できるというものです。
今回はGateway APIを利用してExternalDNSでの動的なDNSレコードの登録をやってみたいと思います。
k8sとしてOKE、DNSサーバとしてOCI DNSを利用します。
ExternalDNSのデプロイ
今回はOCI DNSを利用するので、こちらの設定に従います。
今回利用するManifestは以下になります。
apiVersion: v1
kind: ServiceAccount
metadata:
name: external-dns
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: external-dns
rules:
- apiGroups:
- ""
resources:
- services
- endpoints
- pods
- nodes
- namespaces
verbs:
- get
- watch
- list
- apiGroups:
- extensions
- networking.k8s.io
resources:
- ingresses
verbs:
- get
- list
- watch
- apiGroups:
- gateway.networking.k8s.io
resources:
- gateways
- httproutes
- tlsroutes
- tcproutes
- udproutes
verbs:
- get
- watch
- list
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: external-dns-viewer
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: external-dns
subjects:
- kind: ServiceAccount
name: external-dns
namespace: kube-system
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: external-dns
namespace: kube-system
spec:
strategy:
type: Recreate
selector:
matchLabels:
app: external-dns
template:
metadata:
labels:
app: external-dns
spec:
serviceAccountName: external-dns
containers:
- name: external-dns
image: registry.k8s.io/external-dns/external-dns:v0.15.0
args:
- --source=gateway-httproute
- --source=ingress
- --source=service
- --log-level=debug
- --provider=oci
- --policy=create-only
- --txt-owner-id=my-identifier
- --oci-zone-scope=
- --oci-auth-instance-principal
- --oci-compartment-ocid=ocid1.compartment.oc1..aaamlvfoscnamvmrzgdq
コンテナのargsでの以下の設定が注目ポイントです。
- --source=gateway-httproute
- --source=ingress
- --source=service
これはDNSレコードを登録する際の対象となるリソースを示しています。
今回は、前回の記事でも紹介したGateway APIのHTTPRoute、Ingress、Serviceを対象としています。
- --provider=oci
今回はDNSサーバとしてOCI DNSを利用するので、oci
とします。
- --oci-auth-instance-principal
- --oci-compartment-ocid=ocid1.compartment.oc1..aaamlvfoscnamvmrzgdq
DNSレコードを動的に登録する際の認可の手法を記載します。
--oci-auth-instance-principal
はインスタンスプリンシパルを利用した認可を示します。
別の手法としてユーザプリンシパル(APIキー)を利用した認可もあります。
--oci-compartment-ocid
は対象のDNSゾーンが存在するコンパートメントを示します。
これをデプロイします。
kubectl get deploy external-dns -n kube-system
NAME READY UP-TO-DATE AVAILABLE AGE
external-dns 1/1 1 1 61s
HTTPRouteのデプロイ
Gateway APIのHTTPRouteを作成します。
kubectl get httproute
NAME HOSTNAMES AGE
cafe ["gateway.ochacafe.jp"] 29s
ocha ["gateway.ochacafe.jp"] 29s
OCI DNSの画面を見てみます。
最初は以下の状態です。
ExternalDNSを利用すると、HTTPRouteをデプロイした後に以下のように更新があります。
リフレッシュ
をクリックすると
このようにプロビジョニングされたLoadBalancerのIPがAレコードとして登録されていることが確認できます。
おわりに
ExternalDNSを利用するとDNSサーバへのレコード登録が自動化できます。
これを利用することで、デプロイされたアプリケーション環境構築がより迅速にできるようになりますね!!
参考