DNSとサービスディスカバリ
Kubernetes組み込みDNSを使ってPod同士が見つけ合う仕組みと、Serviceディスカバリの内部動作を理解します。
「DNSとサービスディスカバリ」はCoddyKit上の無料DevOps Bootcampレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDevOps Bootcamp学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 DevOps Bootcampコースには全4レッスンが含まれています。
Serviceディスカバリの問題
Podは作成と削除を繰り返し、IPアドレスも絶えず変化します。IPアドレスをハードコーディングすると、すぐに動作しなくなります。KubernetesはこれをDNSベースのServiceディスカバリで解決します。
IPアドレスの代わりに、安定した名前を使って接続します。
クラスタDNS
すべてのクラスタでは、DNSサービス(通常はCoreDNS)が実行されます。CoreDNSはServiceとPodのDNSレコードを自動的に作成し、名前を正しいClusterIPに解決します。
ServiceのDNS名
Serviceには、予測可能なパターンに従ったDNS名が割り当てられます。
service-name.namespace.svc.cluster.local
同じ名前空間内では、短いservice-nameだけを使用できます。
# from a Pod in the same namespace
curl http://payment-service:8080
# fully qualified, from any namespace
curl http://payment-service.shop.svc.cluster.local:8080名前空間と名前付け
名前空間は名前の一部です。別の名前空間にあるServiceへ接続するには、service.namespaceのように名前空間を含めてください。
# Pod in 'frontend' namespace calling 'backend' namespace
curl http://api.backend.svc.cluster.localPodからDNSをテストする
使い捨てのPodを起動して、名前解決をテストできます。
kubectl run dnstest --image=busybox:1.36 --rm -it --restart=Never -- nslookup payment-serviceCoreDNSが名前を解決する仕組み
Podが名前を問い合わせると、リクエストはCoreDNSに送られます。CoreDNSは対応するServiceを検索し、そのClusterIPを返します。Headless Serviceの場合は、PodのIPアドレスを直接返します。
Headless Service
Headless Service(clusterIP: None)は、単一の仮想IPを使用しません。代わりにDNSが個々のPodのIPアドレスを返します。これは、Podに直接アクセスするステートフルアプリケーションに不可欠です。
apiVersion: v1
kind: Service
metadata:
name: db
spec:
clusterIP: None
selector:
app: db
ports:
- port: 5432PodのDNSレコード
Headless Serviceでは、対応する各Podに独自のDNSレコードを割り当てることもできます。これは、db-0やdb-1のように安定した識別子を持つPodを使用するStatefulSetで役立ちます。
# stable per-Pod name in a StatefulSet
curl http://db-0.db.default.svc.cluster.local:5432Podのresolv.confを確認する
Kubernetesは各PodにDNS設定を注入します。検索ドメインにより、短い名前を正しく解決できます。
kubectl exec -it mypod -- cat /etc/resolv.conf
# nameserver 10.96.0.10
# search default.svc.cluster.local svc.cluster.local cluster.local環境変数とDNSの比較
KubernetesはServiceへの接続情報を環境変数としても注入しますが、対象となるのはPodの起動時に存在していたServiceだけです。DNSは常に現在の状態を反映するため、DNSの使用が推奨されます。
よくあるDNSの落とし穴
- 名前空間をまたいで呼び出す際に、名前空間を指定し忘れる
- 対応するPodがないService(エンドポイントがないService)にDNSがあると期待する
- 名前を再解決せず、古いIPアドレスをアプリケーション内にキャッシュする
クイックチェック
正しいDNS名の形式を選択します。
まとめ
KubernetesはCoreDNSを使って、service.namespace.svc.cluster.localという形式の安定したDNS名をServiceに提供することを学びました。名前空間内では短い名前を使用でき、Headless Serviceでは個々のPodのIPアドレスが公開されます。また、DNSは常に現在のクラスタ状態を反映します。
よくある質問
「DNSとサービスディスカバリ」レッスンは無料ですか?
はい。「DNSとサービスディスカバリ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、DevOps Bootcampコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 DevOps Bootcampコースには全4レッスンが含まれています。
「DNSとサービスディスカバリ」で何を学びますか?
Kubernetes組み込みDNSを使ってPod同士が見つけ合う仕組みと、Serviceディスカバリの内部動作を理解します。 ブラウザで直接実行するハンズオンコードでDevOps Bootcampを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
DevOps Bootcampを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのDevOps Bootcampは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「DNSとサービスディスカバリ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このDevOps Bootcampレッスンでコードを書いて実行できますか?
はい。すべてのDevOps Bootcampレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。