‫今回は､ DNSとKubernetesについて簡単にお話ししたいと思います｡
‫DockerやSwarm､
‫Kubernetesでは､ DNSが当たり前のように動作していることがあります｡
‫このまま進む前に､ その背景を簡単に説明したいと思います｡
‫これまで経験したのは､ コンテナの中で､ サービス名をcURLしたりpingを打ったりすると､
‫応答が返ってくるということです｡
‫つまり､ 明らかにDNSサーバーが存在し､
‫サービスをDNS名と照合しているのです｡
‫信じられないかもしれませんが､
‫DNSはKubernetesクラスタ内のサービス､ またはアドオンとしてオプションで提供されています｡
‫でも､ みんな1個は入れているんですよ｡
‫実際､ kubeadmでもDocker Desktopでも､
‫何を使っていても､ インストールするとDNSサーバーが入ることになるんです｡
‫1から始まる｡ 11 リリースでは､ CoreDNSがデフォルトです｡
‫ある意味､ スタンダードなんです｡
‫KubeDNSという先行するものがありますが､ これは現時点では非推奨で､
‫今はみんなCoreDNSを使っているはずです｡
‫これが知られているのは､ DNSベースのサービスディスカバリーである｡
‫Dockerで持っていたんですね｡ スウォームで持っていたんですね｡
‫基本的には､ Kubernetesでサービスを作成するときに､ そのサービスにマッチしたホスト名を取得するのと同じ仕組みです｡
‫しかし､
‫このホスト名は､ より大きな名前である完全修飾ドメイン名の一部なのです｡
‫DockerやSwarmでは得られなかったものです｡
‫ホストネームのことだけを考えていたのです｡
‫Kubernetesを使うと､ 選択肢が増えますよね｡
‫つまり､ すぐに使えるのは､ ホスト名を使ってあるサービスから別のサービスへ話しかけることだけです｡
‫名前空間を使い始めると､ 後で少し説明します｡
‫ネームスペースとは､ 異なるアプリケーションの異なる部分を､
‫同じクラスタ内で互いにぶつからないように区分けするための方法だと考えてください｡
‫同じPod､ 同じService､ 同じDeploymentを､
‫同じ名前､ 同じnamespaceで作ることは技術的にできないのです｡
‫他の名前空間を作れば（上級者になれば作るかもしれませんが）､
‫同じものを別の名前空間で命名しても､ ぶつかることはありません｡
‫その中にはDNSも含まれます｡
‫実際､ ここで完全修飾ドメイン名の規格を見ると､
‫これまで使ってきたホスト名が書かれていることがわかります｡
‫次に､ 名前空間名｡
‫もし､ このフルネームを打ち出すとしたら､ 名前空間を指定する必要がある｡
‫デフォルトで､ あなたは仕事をしてきました｡
‫これは､ アプリのデフォルトの名前空間です｡
‫コマンドラインでkubectl get namespacesをクイックコマンドで実行すると､
‫ここにリストが表示されます｡
‫私はDocker Desktopを使っているので､ Dockerと書かれたものが追加されています｡
‫これはDocker Desktopの一部で､ DockerがKubernetesクラスタで提供するマジックの一部を実行する､ 特別なDockerサービスを実行します｡
‫デフォルトは､
‫基本的なクラスタでダンプされるものです｡ あとは､ Kubernetesに標準で搭載されているものですね｡
‫システム1は､ 明らかにコントロールプレーンを実行しています｡
‫それが､ そこのシステムです｡
‫一般の方は､ あまり使わないですね｡
‫しか入っていません｡
‫それから､ node-leaseは新しいKubernetesの環境では新しいものです｡
‫これらは本当に高度なトピックで､ 最初のうちは必要ないでしょう｡
‫これらの名前空間をあまりいじらずに､
‫クラスターを運用することも十分可能です｡
‫通常､
‫扱うのはデフォルトのネームスペースで､ 規模が大きくなると､
‫同じ名前を持つ可能性のある異なるアプリケーション用に複数のネームスペースを作成することになります｡
‫あるいは､ 同じものを複数回デプロイする場合､ 同じサービス名､
‫ポッド名､ デプロイメント名で､ それらが衝突しないように､
‫それらのために異なる名前空間を作成することもあるでしょう｡
‫Swarmのスタックと少し似ていますが､
‫名前空間の仕組みとスタックの仕組みは大きく異なるので､
‫全く同じだと思わないでほしいです｡
‫Namespacesは単なる組織的なパラメータであり､
‫ネットワークのセグメンテーションを制御したりするものではありません｡
‫それがより高度になる｡ そんなことは後で考えればいいんです｡
‫そこで､
‫この完全修飾ドメイン名に戻りましょう｡ ホスト名とネームスペースの部分がわかったので､
‫あとは. svcはserviceのことで､ ここで調べているのはsvcだからです｡
‫そのクラスターです｡ ローカルの末尾に表示されるのは､
‫クラスタの作成時やスピンアップ時に指定されるデフォルトのサービスDNS名です｡
‫kubeadmのようなものを使ってクラスタを構築している場合は､
‫クラスタを構築する前にこの名前を変更することができます｡
‫デフォルトではこれです｡
‫複数のKubernetesクラスターを作成する場合や､ アプリの検索方法について何らかの外部要件がある場合､
‫それを基に変更する必要があるかどうかを知ることができます｡
‫繰り返しになりますが､
‫このDNSはすべてクラスタ内だけのものです｡
‫Kubernetes APIとリモートで会話しない限り､
‫外部のサービスが見ることも使うこともできないDNSサービスなのです｡