4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Oracle Cloud InfrastructureAdvent Calendar 2024

Day 17

ExternalDNSでOCI DNSにDNSレコードを動的に登録してみよう

Posted at

はじめに

この記事は、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の画面を見てみます。

最初は以下の状態です。

CleanShot 2024-12-17 at 21.53.03@2x.png

ExternalDNSを利用すると、HTTPRouteをデプロイした後に以下のように更新があります。

CleanShot 2024-12-17 at 21.54.10@2x.png

リフレッシュをクリックすると

CleanShot 2024-12-17 at 21.55.11@2x.png

このようにプロビジョニングされたLoadBalancerのIPがAレコードとして登録されていることが確認できます。

おわりに

ExternalDNSを利用するとDNSサーバへのレコード登録が自動化できます。
これを利用することで、デプロイされたアプリケーション環境構築がより迅速にできるようになりますね!!

参考

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?