著者は、 Write for DOnations プログラムの一環として、 Free and Open SourceFundを選択して寄付を受け取りました。

序章

ウェブアプリをKubernetesにデプロイする場合、通常は Services とIngressesを使用して、目的のドメインのクラスターを超えてアプリを公開します。 これには、入力だけでなく、プロバイダーでDNSレコードも手動で構成することが含まれます。これは、時間がかかり、エラーが発生しやすいプロセスになる可能性があります。 アプリケーションが複雑になるにつれて、これは障害になる可能性があります。 外部IPが変更された場合は、それに応じてDNSレコードを更新する必要があります。

これを克服するために、 Kubernetes sig-network team は、Kubernetesクラスター内から外部DNSレコードを自動的に管理する目的でExternalDNSを作成しました。 デプロイされると、ExternalDNSはバックグラウンドで動作し、追加の構成はほとんど必要ありません。 ServiceまたはIngressが作成または変更されるたびに、ExternalDNSはレコードをすぐに更新します。

このチュートリアルでは、Helmを介して DigitalOcean Kubernetes クラスターにExternalDNSをインストールし、DNSプロバイダーとしてDigitalOceanを使用するように構成します。 次に、Ingressを使用してサンプルWebアプリをデプロイし、ExternalDNSを使用してドメイン名を指定します。 最終的には、サービスとイングレスの両方に自動化されたDNSレコード管理システムが導入されます。

前提条件

  • 接続が次のように構成されたDigitalOceanKubernetesクラスター kubectl デフォルト。 設定方法の説明 kubectl クラスターを作成すると、クラスターに接続ステップの下に表示されます。 DigitalOceanでKubernetesクラスタを作成するには、 KubernetesQuickstartをお読みください。

  • ローカルマシンにインストールされているHelm3パッケージマネージャー。 Helm 3 PackageManagerチュートリアルを使用してKubernetesクラスターにソフトウェアをインストールする方法のステップ1を完了します。

  • IngressリソースでExternalDNSを使用するために、Helmを使用してクラスターにインストールされたNginxIngressController。 これを行うには、Helmを使用してDigitalOceanKubernetesでNginxIngressを設定する方法に従ってください。 を設定する必要があります publishService プロパティに true 手順2の手順に従います。

  • 読み取りおよび書き込み権限を持つDigitalOceanAPIキー(パーソナルアクセストークン)。 作成するには、パーソナルアクセストークンの作成方法にアクセスしてください。

  • 完全に登録されたドメイン名。 このチュートリアルでは、 echo.your_domain 全体を通して。 Namecheap でドメイン名を購入するか、 Freenom で無料でドメイン名を取得するか、選択したドメイン登録事業者を使用できます。

ステップ1—Helmを使用したExternalDNSのインストール

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

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

  1. nano externaldns-values.yaml

次の行を追加します。

externaldns-values.yaml
provider: digitalocean

digitalocean:
  apiToken: your_api_token

interval: "1m"

policy: sync # or upsert-only

# domainFilters: [ 'your_domain' ]

最初のブロックでは、DNSサービスプロバイダーをDigitalOceanに設定します。 次に、次のブロックで、次のように置き換えてDigitalOceanAPIトークンを定義します your_api_token.

次の行は、ExternalDNSがIngressesおよびServicesへの変更をポーリングする間隔を設定します。 これを低い値に設定すると、DNSへの変更をより速く伝播できます。デフォルト値は1分です。

The policy 設定により、ExternalDNSがDNSレコードのみを挿入するかどうかが決まります(upsert-only)または必要に応じて作成および削除します(sync). 幸い、バージョン0.3以降、ExternalDNSは、作成したドメインに関する情報を格納する付随する TXT レコードを作成することで所有権の概念をサポートし、アクションの範囲を作成したドメインのみに制限します。

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

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

ExternalDNS Helmチャートは、Bitnamiチャートライブラリの一部です。 次のコマンドを実行して、Helmインストールに追加します。

  1. helm repo add bitnami https://charts.bitnami.com/bitnami

次に、Helmのキャッシュを更新して、その内容をダウンロードします。

  1. helm repo update

最後に、以下を実行して、ExternalDNSをクラスターにインストールします。

  1. helm install external-dns bitnami/external-dns -f externaldns-values.yaml

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

Output
NAME: external-dns LAST DEPLOYED: ... NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: ** Please be patient while the chart is being deployed ** To verify that external-dns has started, run: kubectl --namespace=default get pods -l "app.kubernetes.io/name=external-dns,app.kubernetes.io/instance=external-dns"

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

  1. kubectl --namespace=default get pods -l "app.kubernetes.io/name=external-dns,app.kubernetes.io/instance=external-dns"
Output
NAME READY STATUS RESTARTS AGE external-dns-56c85ff66b-2vm88 1/1 Running 0 24s

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

ステップ2—サンプルWebアプリのデプロイと公開

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

デプロイするダミーのWebアプリは、Hashicorpのhttp-echoです。 これは、指定したメッセージをエコーバックするメモリ内Webサーバーです。 Kubernetesマニフェストをという名前のファイルに保存します echo.yaml. それを作成し、編集のために開きます。

  1. nano echo.yaml

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

echo.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: echo-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: "echo.your_domain"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: echo
            port:
              number: 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

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

交換 echo.your_domain ドメインを使用して、ファイルを保存して閉じます。

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

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

  1. kubectl create -f echo.yaml

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

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

ExternalDNSが変更に気づき、適切なDNSレコードを作成するまで、少し待つ必要があります。 The interval ヘルムチャートの設定は、DNSレコードの作成を待つ必要がある時間の長さを管理します。 の externaldns-values.yaml、間隔の長さはデフォルトで1分に設定されています。

DigitalOceanコントロールパネルにアクセスして、AおよびTXTレコードを見つけることができます。

指定された時間間隔が経過するか、コントロールパネルでレコードを見つけたら、次を使用してドメインにアクセスします。 curl:

  1. curl echo.your_domain

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

Output
Echo!

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

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

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

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

注:この手順を実行すると、作成したDNSレコードが削除されます。

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

  1. kubectl delete ing echo-ingress

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

Output
ingress.extensions/echo-ingress deleted

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

次に、 echo.yaml 編集用ファイル:

  1. nano echo.yaml

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

echo.yaml
apiVersion: v1
kind: Service
metadata:
  name: echo
  annotations:
    external-dns.alpha.kubernetes.io/hostname: echo.your_domain
spec:
  type: LoadBalancer
  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のドメイン名を指定するアノテーションを追加しました。

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

  1. kubectl apply -f echo.yaml

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

Output
... service/echo configured deployment.apps/echo configured

次のコマンドを実行して、サービスのロードバランサーが使用可能になることを確認できます。

  1. kubectl get svc echo -w
Output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE echo LoadBalancer 10.245.81.235 <pending> 80:31814/TCP 8s ...

前の手順と同様に、DNSレコードが作成されて伝達されるまでしばらく待つ必要があります。 それが終わったら、 curl 指定したドメイン:

  1. curl echo.your_domain

出力は前のステップと同じになります。

Output
Echo!

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

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

結論

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

ExternalDNSの真の力は、継続的デリバリーシステムからテスト環境を作成するときに明らかになります。 Kubernetesクラスタにこのようなシステムをセットアップする場合は、 DigitalOceanKubernetesでSpinnakerを使用してCDパイプラインをセットアップする方法にアクセスしてください。