‫わかりました｡ 今回の講義は､ 前回の講義が終わったところからのスタートとなります｡
‫もし､
‫この作品に飛び入り参加しようとしていて､
‫前回の作品をスキップしてしまった場合は､ 前回の作品に戻ってください｡
‫kubectl get allを実行すると､
‫5つのレプリカセットを持つDeploymentが1つあることがわかります｡
‫5つのポッドが表示されます｡
‫そうすると､ Kubernetesのデフォルトサービスが常に存在することになります｡
‫次に､
‫httpenv クラスタ IP サービス｡
‫もちろん､ お客様は異なるIPアドレスや異なるポッド名をお持ちの場合もあります｡
‫それが､ 私たちの目指すべき姿です｡
‫このDeploymentがあります｡
‫他の人がアクセスできるように､ クラスタ内にIPアドレスを作成し､
‫それがサービス名なので､ httpenvというフレンドリーな名前にしています｡
‫ホストIPで外部に公開されるものを作ってみましょう｡
‫これは､
‫データセンターなどでロードバランサーを持たない場合､
‫ロードバランサー・サービスで制御することができます（後ほど説明します）｡
‫基本的には､ この場合､ Kubernetesクラスタの高域にあるポートを取得し､
‫外部との通信に使用するNodePortを作成したいだけなのですが､ このポートを使用すると､
‫Kubernetesクラスタの高域にあるポートを取得することができます｡
‫つまり､ 外部の何らかのサービスからアクセスすることができるようになるわけですね｡
‫デフォルトで80番ポートになるわけではないのです｡
‫NodePortsは高いポートであることを意味しているので､
‫通常はその前に外部のロードバランサーや自動化されたサービスなど､
‫何かを置いて管理します｡
‫この場合､
‫もう一度kubectlのexposeをすればいいんです｡
‫前作と同じような感じになりそうですね｡
‫デプロイメント httpenv.
‫それこそ暴露しないといけない｡
‫また8888番ポートを入れる｡
‫しかし､ すでに httpenv という名前のものがあるので､
‫新しい名前をつけることにします｡
‫ということで､ こちらはポートなしでhttpenv-npと呼ぶことにします｡
‫そうすれば､ すでにあるクラスタIPのものと並べて使えるようになります｡
‫そして､ タイプをNodePortに変更します｡
‫NodePortのタイプは､ デフォルトのタイプなので､ 必要であれば手動で指定することができることに気がつくでしょう｡
‫デフォルトのタイプはクラスタIPです｡
‫戻って kubectl get services
‫を実行すると､ NodePort タイプの新しいものが表示されます｡
‫右側のポートについて説明します｡
‫それらのポートは､ 真ん中にコロンがあると､ DockerやSwarmとは逆になります｡
‫左側のポートは､ この場合､ クラスタの中､
‫つまりリストアップされているコンテナ自体の中のポートです｡
‫そして､ 右側のポートが､ 外部に公開されているノードのポートです｡
‫右側のポートがどこから来たのか気になりますよね｡
‫このポートは､ コンテナ・クラスタ内でプリセットされているNodePortsのデフォルト範囲から選択されます｡
‫高域ですね｡ ここでの希望は､ コンフリクトがないこと､
‫ですね｡ あなたのシステムには､ デフォルトでこれらのポートで動作しているものが他にないこと｡
‫なぜなら､ 8888のような低いポートは､ 他の何かで使われているかもしれないほど一般的であることが多いからです｡
‫そして､
‫本当に低いレンジのポートは､ 通常､ rootによってのみアクセス可能です｡
‫ポート1024以下
‫ここで､ いくつか注意点があります｡
‫まず､ クラスタIPが表示されます｡
‫このNodePortサービスを作るときに､ クラスタIPを言ってないのに｡
‫NodePortと言いました｡
‫これらのサービスは付加的なものです｡
‫つまり､ クラスタIPから始まり､ NodePort､ ロードバランサーのオプションサービスに至るということです｡
‫それぞれがこのリストの上のサービスを作成することになります｡
‫つまり､ NodePortを作成すると､ それが接続方法なので､
‫クラスタIPエンドポイントが作成されるのです｡
‫ノードのハイポートでそのポートに入ってきた接続を､
‫そのサービス用のクラスタIPにリダイレクトするのです｡
‫もちろん､ Kubernetesのほとんどのものがそうであるように､ これらすべては変更可能であり､
‫カスタマイズ可能です｡
‫変更できるのは､ ポート範囲です｡
‫その1つは､ クラスタIPを回避できることです｡
‫多くのことは可能ですが､ そのほとんどはYAMLでしか行えません｡
‫このようにコマンドラインで何かをする場合､
‫使えるオプションの数は限られています｡
‫これらのオプションで許可される範囲を超える場合は､ YAMLを使い始める必要があります｡
‫それについては､
‫講座の後半でお話しします｡ OKです｡ Linuxであれば､ このNodePortは現在localhostでアクセス可能です｡
‫そこで､ このポートをcURLするために､ localhost､ またはホストIPそのものを使用することができます｡
‫どんなポートでもいい｡
‫私のは32334なので､ おそらく同じポートにはならないでしょう｡
‫Docker Desktopを使用している場合は､
‫Docker Desktopに組み込まれているvpnkitというものを使って､
‫WindowsやMacマシンのローカルホストに接続することで､ 便利なレイヤーを提供します｡
‫MacでcURL localhost 32334にアクセスすることができます｡
‫クラスタIPを直接cURLしたときと同じ応答が返ってくるのです｡
‫このようにDocker
‫Desktop上にあるのは､ 先ほどのようにサービスにアクセスするためだけにポッドに飛び込む必要がないようにするためです｡
‫これは､
‫Kubernetesのサービスを自分のマシンに表示させ､ いろいろとテストできるようにするための1つの方法ですね｡
‫Kubernetesの中で開発やテストをしている場合は､
‫NodePortを実行して､ ホスト上で少しランダムになるポートにアクセスすればいいわけです｡
‫ここでも正確なポートを指定することができますが､
‫それはYAMLで行う必要があります｡
‫もうひとつは､ Docker Desktopであれば､ ロードバランサーサービスが内蔵されていることです｡
‫先ほど4種類のサービスについて説明したときに､
‫ロードバランサーはデフォルトでは組み込まれておらず､
‫外部サービス（通常はクラウドサービス）を通じて使用するしかないという話をしましたね｡
‫AmazonだとELBとALBになりますね｡
‫DigitalOceanの場合､ ロードバランサーを利用することになります｡
‫Kubernetesにそのプラグインを追加して､ 外部のロードバランサーで動作するようにする必要があります｡
‫基本的に､ kube APIは彼らのAPIと対話し､ そのロードバランサーを制御します｡
‫Docker Desktopを使用している場合は､ このコマンドを試してみてください｡
‫このサービスでは､
‫httpenv-lbと呼び､ タイプをロードバランサーに変更します｡
‫kubectl get serviceを実行すると､ このDeploymentのロードバランサーが3つ表示されるはずです｡
‫繰り返しになりますが､ Docker Desktopを利用している場合は､
‫3つとも表示されるようになっています｡ LinuxやMinikubeなどを使っている場合は､
‫2つしか表示されないと思います｡
‫ロードバランサーは､ 技術的にはリモートAPIのサードパーティプラグインやサービスのようなものなので､ ロードバランサーによって機能やサポートされるものが異なります｡
‫ドキュメントを見れば､
‫何をやってくれるかはなんとなくわかる｡
‫今回のDocker Desktopでは､ Deploymentの一部である8888番ポートを伝えるだけで､
‫Dockerのロードバランサーサービスプラグインが8888番ポートにパブリッシュしてくれるのです｡
‫ここでいいのは､ Kubernetesをデフォルトのセット以外の特定のポートで利用するための1つの方法だということですね｡
‫だから､ NodePortをやったときに､ そのセットを30000の範囲で定義､
‫つまり制限していたんです｡
‫ComposeやSwarm､
‫Dockerをローカルで実行し､ 80などのポートで実行したい場合､
‫Docker Desktopでは､ 内蔵のKubernetesを使って､ ロードバランサーで､ そのポートを入力するだけで､
‫そこで応答するようにできます｡
‫MacやWindowsでは､ cURL localhost 8888と入力すると､
‫その応答が返ってくるようになりました｡
‫ロードバランサーにはまだ別のポートがあることにお気づきでしょう｡
‫繰り返しになりますが､ 少なくとも私の場合は､ 32の範囲が内蔵のNodePortで作成されるからです｡
‫技術的にはバックグラウンドで､
‫これらは3つの異なるレイヤーであることを思い出してください｡ ロードバランサーが私のパケットを受け入れ､
‫それをノードポートに渡し､ ノードポートがそれをクラスタIPに渡しています｡
‫ロードバランサーの4つの8の隣に､
‫常にノードポートが表示されています｡
‫次の講義に行く前に､ 今やったことを全部片付けましょう｡
‫いろいろなものを作りました｡
‫これらのコマンドは､ 複数のオブジェクトに対して同時にdeleteコマンドを使用できることを示すものです｡
‫関連するオブジェクトである必要はありません｡
‫実際､ 1つのコマンドでやろうと思えば､ 大きなリストを作ることもできるんです｡