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 名が割り当てられます。たとえば、
defaultnamespace にある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: 80Pod 定義をクラスターに適用します。
$ 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));