1.6. Domain Name System (DNS)
Domain Name System (DNS) は、www.example.com などの人間が理解しやすいドメイン名を、ネットワーク上のコンピューターを識別する IP アドレスに変換するために使用される、階層型かつ分散型の命名システムです。DNS は、サービスディスカバリーと名前解決において重要な役割を果たします。
OpenShift Container Platform は、確実に DNS 名でサービスにアクセスできるようにするため、組み込みの DNS を提供しています。これにより、基盤となる IP アドレスが変更された場合でも、安定した通信を維持できます。Pod を起動すると、サービス名、IP アドレス、ポートの環境変数が自動的に作成され、Pod は他のサービスと通信できるようになります。
1.6.1. 重要な DNS 用語
- CoreDNS: CoreDNS は DNS サーバーであり、サービスと Pod の名前解決を提供します。
-
DNS 名: サービスには、namespace と名前に基づいて DNS 名が割り当てられます。たとえば、
default
namespace にあるmy-service
という名前のサービスの DNS 名はmy-service.default.svc.cluster.local
になります。 -
ドメイン名: ドメイン名は、
example.com
など、Web サイトやサービスにアクセスするために使用されるわかりやすい名前です。 -
IP アドレス: IP アドレスは、通信に IP を使用するコンピューターネットワークに接続された各デバイスに割り当てられる数値ラベルです。IPv4 アドレスの例は
192.0.2.1
です。IPv6 アドレスの例は2001:0db8:85a3:0000:0000:8a2e:0370:7334
です。 - DNS サーバー: DNS サーバーは、DNS レコードの保存に特化されたサーバーです。これらのレコードは、ドメイン名を IP アドレスにマッピングします。ブラウザーにドメイン名を入力すると、コンピューターは DNS サーバーに接続して対応する IP アドレスを見つけます。
-
解決プロセス: DNS クエリーが DNS リゾルバーに送信されます。次に、DNS リゾルバーは一連の DNS サーバーに接続して、ドメイン名に関連付けられた IP アドレスを見つけます。リゾルバーは、
<namespace>.svc.cluster.local
、svc.cluster.local
、cluster.local
などの一連のドメインで、名前の使用を試みます。このプロセスは、最初に一致した時点で停止します。IP アドレスはブラウザーに返され、その IP アドレスを使用して Web サーバーに接続します。
1.6.2. 例: DNS のユースケース
この例では、フロントエンドアプリケーションが 1 つの Pod セットで実行され、バックエンドサービスが別の Pod セットで実行されています。フロントエンドアプリケーションは、バックエンドサービスと通信する必要があります。バックエンド Pod に安定した IP アドレスと DNS 名を付与するサービスを作成します。フロントエンド Pod は、個々の Pod IP アドレスが変更されても、この DNS 名を使用してバックエンドサービスにアクセスします。
バックエンド Pod 用のサービスを作成することにより、フロントエンド Pod がバックエンドサービスと通信するために使用できる、安定した IP と DNS 名 (backend-service.default.svc.cluster.local
) が提供されます。この設定により、個々の Pod の IP アドレスが変更された場合でも、通信の一貫性と信頼性が維持されます。
次の手順は、DNS を使用してバックエンドサービスと通信するように、フロントエンド Pod を設定する方法の例を示しています。
バックエンドサービスを作成します。
バックエンド Pod をデプロイします。
apiVersion: apps/v1 kind: Deployment metadata: name: backend-deployment labels: app: backend spec: replicas: 3 selector: matchLabels: app: backend template: metadata: labels: app: backend spec: containers: - name: backend-container image: your-backend-image ports: - containerPort: 8080
バックエンド Pod を公開するサービスを定義します。
apiVersion: v1 kind: Service metadata: name: backend-service spec: selector: app: backend ports: - protocol: TCP port: 80 targetPort: 8080
フロントエンド Pod を作成します。
フロントエンド Pod を定義します。
apiVersion: apps/v1 kind: Deployment metadata: name: frontend-deployment labels: app: frontend spec: replicas: 3 selector: matchLabels: app: frontend template: metadata: labels: app: frontend spec: containers: - name: frontend-container image: your-frontend-image ports: - containerPort: 80
Pod 定義をクラスターに適用します。
$ oc apply -f frontend-deployment.yaml
フロントエンドをバックエンドと通信するように設定します。
フロントエンドアプリケーションコードでは、バックエンドサービスの DNS 名を使用して要求を送信します。たとえば、フロントエンドアプリケーションがバックエンド Pod からデータを取得する必要がある場合、アプリケーションには次のコードが含まれる可能性があります。
fetch('http://backend-service.default.svc.cluster.local/api/data') .then(response => response.json()) .then(data => console.log(data));