ExternalDNSを使用してDigitalOcean KubernetesからDNSレコードを自動的に管理する方法

著者はhttps://www.brightfunds.org/funds/foss-nonprofits [無料およびオープンソース基金]を選択して、https://do.co/w4do-cta [Donationsのために書く]の一部として寄付を受け取りましたプログラム。

前書き

WebアプリをKubernetesにデプロイするときは、通常https://www.digitalocean.com/community/tutorials/an-introduction-to-kubernetes#other-kubernetes-components [サービス]とIngressesを使用して、アプリをクラスター以外の場所に公開します目的のドメイン。 これには、イングレスだけでなく、プロバイダーのDNSレコードも手動で構成する必要があります。これは、時間がかかり、エラーが発生しやすいプロセスです。 アプリケーションが複雑になると、これが障害になる可能性があります。外部IPが変更されると、それに応じてDNSレコードを更新する必要があります。

これを克服するために、https://github.com/kubernetes/community/tree/master/sig-network [Kubernetes sig-network team]がhttps://github.com/kubernetes-incubator/external-dns[ExternalDNS]を作成しましたKubernetesクラスター内から外部DNSレコードを自動的に管理するため。 展開すると、ExternalDNSはバックグラウンドで動作し、追加の構成はほとんど必要ありません。 サービスまたはイングレスが作成または変更されるたびに、ExternalDNSはすぐにレコードを更新します。

このチュートリアルでは、Helmを介してExternalDNSをhttps://www.digitalocean.com/products/kubernetes/[DigitalOcean Kubernetes]クラスターにインストールし、DigitalOceanをDNSプロバイダーとして使用するように構成します。 次に、Ingressを使用してサンプルWebアプリをデプロイし、ExternalDNSを使用してドメイン名をポイントします。 最終的に、サービスとイングレスの両方に対して、自動化されたDNSレコード管理システムが配置されます。

前提条件

  • 接続が `+ kubectl `デフォルトとして設定されたDigitalOcean Kubernetesクラスター。 ` kubectl +`を設定する方法の手順は、クラスターを作成するときに[* Connect to the cluster *]ステップの下に表示されます。 DigitalOceanでKubernetesクラスターを作成するには、https://www.digitalocean.com/docs/kubernetes/quickstart/ [Kubernetes Quickstart]を参照してください。

  • ローカルマシンにインストールされたHelmパッケージマネージャー、およびクラスターにインストールされたTiller。 これを行うには、https://www.digitalocean.com/community/tutorials/how-to-install-software-on-kubernetes-clusters-with-the-helm-package-manager [How Helm Package Managerを使用してKubernetesクラスターにソフトウェアをインストールするには]チュートリアル。

  • IngressリソースでExternalDNSを使用するためにHelmを使用してクラスターにインストールされたNginx Ingress Controller。 これを行うには、https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nginx-ingress-on-digitalocean-kubernetes-using-helm [Nginx Ingressを設定する方法ヘルムを使用したDigitalOcean Kubernetesで]。 手順2の手順に従って、「+ publishService 」プロパティを「 true +」に設定する必要があります。

  • 読み取りおよび書き込み権限を持つDigitalOcean APIキー(パーソナルアクセストークン)。 作成するには、https://www.digitalocean.com/docs/api/create-personal-access-token/ [パーソナルアクセストークンの作成方法]にアクセスしてください。

  • 完全に登録されたドメイン名。 このチュートリアルでは、全体で「++」を使用します。 Namecheapでドメイン名を購入するか、https://www.freenom.com/en/index.html?lang = en [Freenom]で無料で入手できます。または選択したドメインレジストラーを使用します。

手順1-Helmを使用したExternalDNSのインストール

このセクションでは、Helmを使用してクラスターにExternalDNSをインストールし、DigitalOcean DNSサービスと連携するように構成します。

ExternalDNS Helmチャートのデフォルト設定の一部を上書きするには、インストール中にHelmに渡す `+ values.yaml +`ファイルを作成する必要があります。 前提条件でクラスターにアクセスするために使用するマシンで、次を実行してファイルを作成します。

nano externaldns-values.yaml

次の行を追加します。

externaldns-values.yaml

rbac:
 create: true

provider: digitalocean

digitalocean:
 apiToken:

interval: "1m"

policy: sync # or upsert-only

# domainFilters: [ '' ]

最初のブロックでは、https://kubernetes.io/docs/reference/access-authn-authz/rbac/ [RBAC](Role Based Access Control)マニフェストの作成を有効にします。これは、RBAC対応のKubernetesクラスタで有効にする必要があります。 DigitalOcean。 次の行では、DNSサービスプロバイダーをDigitalOceanに設定します。 次に、次のブロックで、「++」を置き換えてDigitalOcean APIトークンを追加します。

次の行は、ExternalDNSがIngresses and Servicesの変更をポーリングする間隔を設定します。 DNSにより速く反映するために、より低い値に設定できます。

+ policy +`設定は、ExternalDNSがDNSレコードのみを挿入するか( `+ upsert-only +)、または必要に応じて作成および削除するか( + sync +)を決定します。 幸いなことに、バージョン0.3以降、ExternalDNSは、作成するドメインに関する情報を格納するhttps://en.wikipedia.org/wiki/TXT_record[TXT]レコードを作成することにより所有権の概念をサポートします。それらが作成したもの。

`+ domainFilters +`パラメーターは、ExternalDNSが管理できるドメインを制限するために使用されます。 コメントを解除して、文字列配列の形式でドメインを入力できますが、これは必須ではありません。

編集が終了したら、ファイルを保存して閉じます。

次のコマンドを実行して、クラスターにExternalDNSをインストールします。

helm install stable/external-dns --name external-dns -f externaldns-values.yaml

出力は次のようになります。

OutputNAME:   external-dns
LAST DEPLOYED: ...
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Pod(related)
NAME                           READY  STATUS             RESTARTS  AGE
external-dns-69c545655f-xqjjf  0/1    ContainerCreating  0         0s

==> v1/Secret
NAME          TYPE    DATA  AGE
external-dns  Opaque  1     0s

==> v1/Service
NAME          TYPE       CLUSTER-IP    EXTERNAL-IP  PORT(S)   AGE
external-dns  ClusterIP    <none>       7979/TCP  0s

==> v1/ServiceAccount
NAME          SECRETS  AGE
external-dns  1        0s

==> v1beta1/ClusterRole
NAME          AGE
external-dns  0s

==> v1beta1/ClusterRoleBinding
NAME          AGE
external-dns  0s

==> v1beta1/Deployment
NAME          READY  UP-TO-DATE  AVAILABLE  AGE
external-dns  0/1    1           0          0s


NOTES:
...

次のコマンドを実行して、ExternalDNSの作成を確認できます。

kubectl --namespace=default get pods -l "app=external-dns,release=external-dns" -w
OutputNAME                            READY   STATUS              RESTARTS   AGE
external-dns-69bfcf8ccb-7j4hp   0/1        0          3s

ExternalDNSをKubernetesクラスターにインストールしました。 次に、サンプルのWebアプリをデプロイし、Nginx Ingressを使用して公開し、ExternalDNSでドメイン名が適切なロードバランサーを自動的に指すようにします。

手順2-サンプルWebアプリの展開と公開

このセクションでは、Ingressを使用して公開するために、クラスターにダミーのWebアプリをデプロイします。 次に、ExternalDNSをセットアップして、DNSレコードを自動的に構成します。 最終的に、イングレスのロードバランサーを指すドメインのDNSレコードが作成されます。

デプロイするダミーWebアプリは、Hashicorpによるhttps://hub.docker.com/r/hashicorp/http-echo/ [+ http-echo +]です。 これは、指定したメッセージをエコーバックするインメモリWebサーバーです。 Kubernetesマニフェストを `+ echo.yaml +`という名前のファイルに保存します。 作成して編集用に開きます。

nano echo.yaml

ファイルに次の行を追加します。

echo.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
 name: echo-ingress
spec:
 rules:
 - host:
   http:
     paths:
     - backend:
         serviceName: echo
         servicePort: 80
---
apiVersion: v1
kind: Service
metadata:
 name: echo
spec:
 ports:
 - port: 80
   targetPort: 5678
 selector:
   app: echo
---
apiVersion: apps/v1
kind: Deployment
metadata:
 name: echo
spec:
 selector:
   matchLabels:
     app: echo
 replicas: 3
 template:
   metadata:
     labels:
       app: echo
   spec:
     containers:
     - name: echo
       image: hashicorp/http-echo
       args:
       - "-text=Echo!"
       ports:
       - containerPort: 5678

この構成では、展開、イングレス、およびサービスを定義します。 デプロイは、カスタムメッセージ( + Echo!+)が渡された3つの `+ http-echo `アプリのレプリカで構成されます。 サービスは、ポート「+80」を介してデプロイメント内のポッドにアクセスできるように定義されています。 Ingressは、ドメインでサービスを公開するように構成されています。

`++`をドメインに置き換え、ファイルを保存して閉じます。

これで、ドメインのDNSレコードを手動で構成する必要がなくなりました。 Kubernetesに構成を適用するとすぐに、ExternalDNSは自動的にこれを行います。

構成を適用するには、次のコマンドを実行します。

kubectl create -f echo.yaml

次の出力が表示されます。

Outputingress.extensions/echo-ingress created
service/echo created
deployment.apps/echo created

ExternalDNSが変更を認識して適切なDNSレコードを作成するまで、少し待つ必要があります。 Helmチャートの「+ interval 」設定は、DNSレコードの作成を待つ必要がある時間の長さを管理します。 ` values.yaml +`では、間隔の長さはデフォルトで1分に設定されています。

DigitalOceanコントロールパネルにアクセスして、AおよびTXTレコードを確認できます。

image:https://assets.digitalocean.com/articles/kubernetes_externaldns/externaldns.png [コントロールパネル-生成されたDNSレコード]

指定した時間間隔が経過したら、 `+ curl +`を使用してドメインにアクセスします。

curl

次の出力が表示されます。

OutputEcho!

このメッセージは、ExternalDNSを設定し、Nginx Ingress Controllerのロードバランサーを指すために必要なDNSレコードを作成したことを確認します。 エラーメッセージが表示された場合は、しばらくお待ちください。 または、「+ Echo!+」が表示されるブラウザからドメインにアクセスしてみてください。

Ingressでサンプルアプリをデプロイすることにより、ExternalDNSをテストしました。 DigitalOceanコントロールパネルで新しいDNSレコードを確認することもできます。 次のステップでは、ドメイン名でサービスを公開します。

ステップ3-(オプション)サービスを使用してアプリを公開する

このオプションセクションでは、Ingressの代わりにExternalDNSでサービスを使用します。 ExternalDNSを使用すると、DNSサーバーでさまざまなKubernetesリソースを利用できるようになります。 サービスの使用は、この代替リソース用に構成が変更されたイングレスと同様のプロセスです。

`+ echo.yaml `に含まれるサービスをカスタマイズするので、 ` echo-ingress +`はもう必要ありません。 次のコマンドを使用して削除します。

kubectl delete ing echo-ingress

出力は次のようになります。

Outputingress.extensions/echo-ingress deleted

ExternalDNSは、前の手順で作成した既存のDNSレコードを削除します。 手順の残りの部分では、以前に使用したのと同じドメインを使用できます。

次に、編集のために `+ echo.yaml +`ファイルを開きます:

nano echo.yaml

ファイルの内容を次の行に置き換えます。

echo.yaml

apiVersion: v1
kind: Service
metadata:
 name: echo


spec:

 ports:
 - port: 80
   targetPort: 5678
 selector:
   app: echo
---
apiVersion: apps/v1
kind: Deployment
metadata:
 name: echo
spec:
 selector:
   matchLabels:
     app: echo
 replicas: 3
 template:
   metadata:
     labels:
       app: echo
   spec:
     containers:
     - name: echo
       image: hashicorp/http-echo
       args:
       - "-text=Echo!"
       ports:
       - containerPort: 5678

前の設定のファイルからIngressを削除し、サービスタイプを `+ LoadBalancer +`に変更しました。 さらに、ExternalDNSのドメイン名を指定する注釈を追加しました。

次のコマンドを実行して、クラスターに変更を適用します。

kubectl apply -f echo.yaml

出力は次のようになります。

Outputservice/echo configured
deployment.apps/echo configured

以下を実行すると、サービスのロードバランサーが利用可能になるのを見ることができます。

kubectl get svc echo -w

次のような出力が表示されます。

OutputNAME   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
echo   LoadBalancer   10.245.81.235   <pending>     80:31814/TCP   8s
...

前の手順と同様に、DNSレコードが作成および伝達されるまでしばらく待つ必要があります。 それが完了したら、指定したドメインを「+ curl +」します。

curl

出力は前の手順と同じになります。

OutputEcho!

エラーが発生した場合は、もう少し待つか、別のドメインを試すことができます。 DNSレコードはクライアントシステムにキャッシュされるため、変更が実際に反映されるまでに時間がかかる場合があります。

このステップでは、サービス(タイプ + LoadBalancer +)を作成し、ExternalDNSを使用してドメイン名を指定しました。

結論

ExternalDNSはバックグラウンドで静かに動作し、摩擦のないエクスペリエンスを提供します。 Kubernetesクラスターは、ドメインに関する真の中心的な情報源になりました。 DNSレコードを手動で更新する必要はもうありません。

ExternalDNSの真の力は、Continuous Deliveryシステムからテスト環境を作成するときに明らかになります。 Kubernetesクラスターにこのようなシステムをセットアップする場合は、https://www.digitalocean.com/community/tutorials/how-to-set-up-a-cd-pipeline-with-spinnaker-on-digitaloceanにアクセスしてください。 -kubernetes [DigitalOcean KubernetesでSpinnakerを使用してCDパイプラインをセットアップする方法]。

Related