‫さて､ 4種類のKubernetesサービスについて説明しましたが､
‫コマンドラインからいくつか作成してみましょう｡
‫まず､ これらのサービスを指定するためのDeploymentを作成する必要があります｡
‫そして､
‫このDeploymentを指すように､ さまざまな種類のサービスを作成します｡
‫このデモでは､ Kubernetes環境に2つの異なるシェル､
‫つまり異なるウィンドウを作成し､ あるウォッチコマンドで何が起こっているかを､
‫他のコマンドで実行しながら確認できるようにするものです｡
‫わかりました｡ 私の場合､ 2つのウィンドウを重ね合わせています｡
‫そんなことはどうでもいいんです｡
‫私がやっていることを見てもらうために､ 使いやすくしたものです｡
‫今回は､ kubectl get podsを使用します｡
‫wを追加することになりました｡
‫これは時計コマンドのようなもので､ 実行し続けることで時間の経過とともに変化するものを示してくれます｡
‫これは､ 複数の異なるkubectlコマンドのオプションであることに気づくでしょう｡
‫ここでは､
‫バックグラウンドで何が起こっているかを確認するために､ それを行います｡
‫-w でポッドを取得します｡
‫次に､ 別のウィンドウで､ Deploymentを作成します｡
‫デプロイメントを作成します｡ これをhttpenvと呼ぶことにします｡
‫これは非常にシンプルなHTTPウェブサーバーで､
‫cURLでアクセスすると､ コマンドラインで取得した環境変数をすべて吐き出すだけなのです｡
‫これは非常にシンプルで初歩的な方法で､ 動作していることを確認するだけでなく､
‫ポッドの名前など興味深い値を取得することができます｡
‫そんな感じです｡
‫これで作成できたので､ 上部にコンテナの作成が表示されているのがわかると思います｡
‫ログファイルのように､ 何か状態が変わったり､
‫ステータスが変わったりするたびに､ 新しい行がページに印刷されるようなものだと考えてください｡
‫最後の行で､ そのポッドが実行中の状態であることがわかります｡
‫これらのポッドをさらにスピンアップして､
‫2番目に作成するサービスの背後で複数のコンテナを実行できるようにしましょう｡
‫scaleコマンドは､ Deploymentで有用なコマンドです｡
‫もちろん､
‫Kubernetesのすべてにおいて､ これを行う方法は複数ありますが､
‫今回の状況ではこれが最も簡単な方法です｡
‫わかりました｡ これで､ さらに4つのポッドが作成され､
‫それらが実行中であることが表示されていることがわかります｡
‫では､ そのサービスを作成します｡
‫そのために､ exposeコマンドを使用します｡
‫この場合､ どのDeploymentを公開するか､ そのDeploymentがリッスンしているポートを教えているのです｡
‫これは､ ポッド自体に関係のない追加機能を作成しているため､
‫どのポッドも変更されていないことがわかると思います｡
‫これは実際には､ デフォルトでクラスタIPを作成することになります｡
‫それがクラスタIP型のサービスです｡
‫Deploymentの前に作成されます｡
‫それでは､ 先ほど作成したサービスを確認してみましょう｡
‫ここで2つ見ておいてください｡
‫1つ目はKubernetesのエンドポイントになります｡
‫それはAPIのためです｡
‫すると､ 先ほど作成したサービスが表示され､ そのタイプがクラスタIPであることがわかります｡
‫クラスタIPは､
‫ノードや他のポッドがアクセスできるように､ クラスタ内でのみ使用可能であることを忘れないでください｡
‫このIPアドレスは私たちが到達できるものですが､ 私たちがいる場所によって､
‫到達できるかどうかが異なります｡
‫このIPアドレスは､ ノード自身またはクラスタ内の他のポッドからしかアクセスできないためです｡
‫Docker Desktopの時は､ これがMacやWindowsのホストOS上で動いているわけではないことを覚えておいていただければと思います｡
‫これは技術的には小さなLinuxのVMで動いています｡
‫この場合､ そのクラスタ上で動作している別のポッドを実行して､
‫それをcURLできるようにする必要があります｡
‫レプリカセットでDeploymentを実行するのは避けたい｡
‫この場合､ 本当に1つのポッドを走らせたいだけなのです｡
‫最も簡単な方法は､ kubectl runを使うことです｡
‫代替発電機で対応する
‫先ほどのエラーで覚えているかもしれませんね｡
‫ジェネレーターとは何かについては､ もう少し詳しく説明します｡
‫このコマンドにはいろいろなことが書かれているので､ 分解して説明しましょう｡
‫見たことあるようなkubectlの実行｡
‫ジェネレーターは､ runコマンドに使用させたいテンプレートの種類です｡
‫それについては､ 今後の講義でもう少し詳しくお話します｡
‫ポッドだけを実行したいので､ ポッドテンプレートを選んでいます｡
‫レプリカセットのある完全なデプロイメントなどは望んでいません｡
‫ここでは､ tmp-shellと呼ぶことにします｡
‫これらのオプションの中には､ docker runと似たようなものがあることにお気づきでしょう｡
‫それはわざとです｡
‫kubectlのrunコマンドの将来の目標の一つは､
‫よりdockerのrunコマンドに近い動作をすることです｡
‫実際､
‫最終的にはデフォルトでポッドを作成するようになり､ このジェネレーター・オプションを使用する必要がなくなることは､
‫後で説明します｡
‫ここでは--rmを使用します｡ つまり､ ポッドが止まったら､ 先にそれを取り出してください､
‫という意味です｡
‫enterコマンドを打つと､ -itでそのポッドにシェルが入る｡
‫それから､
‫--imageは､ どのような画像を好むかを教えてくれているのです｡
‫今回は､ 私が作ったnetshootイメージを使っています｡ このイメージには､ さまざまなネットワークとLinuxのユーティリティがたくさん入っています｡
‫そのひとつがcURLです｡
‫次に､ 実行コマンドで､ コンテナの中で実行されるcmdを変更します｡
‫それをスペース--宇宙で行うのです｡
‫これは､ runコマンドにオプションの検索をやめさせ､ ダブルダッシュの後にあるものは､
‫このコンテナを実行するときに実行するコマンドであると伝えるものです｡
‫上の方に temp shell pod が表示され､ running というステータスになっているのがわかると思いますが､
‫この pod の中に入って bash プロンプトを表示しています｡
‫作成したサービス名は､ このサービスのDNS名の一部になるということを､
‫もう少し詳しく説明します｡
‫使える... は､ 先ほどDockerやSwarmでやったことと非常に似ていて､
‫サービス名を使ってDNSで取得することができます｡
‫ポート8888で動作していることを忘れないでください｡
‫そうすると､ 期待通りの反応が返ってくるんです｡
‫このhttpenvユーティリティは､
‫そのユニークなポッドの中にあるマシンの環境変数をすべてダンプするだけなんですね｡
‫Pod名がホスト名などKubernetesのデフォルトがそのまま出ているのがわかると思います｡
‫この方法は､ kubectlコマンドラインがAPIと対話できる限り､
‫どのクラスタでも動作します｡ このコマンドを実行すると､ シェル内でそのイメージを実行している新しいポッドに入ることができます｡
‫それは素晴らしいことです｡
‫でも､ Linuxならもっと簡単な方法がありますよ｡
‫なぜなら､ Kubernetesの仕組みは､ デフォルトですべてのノードとコンテナが､
‫すぐに互いに会話できるようになっているからです｡
‫あなたがいるノードは､
‫そのローカルマシンでKubernetesを実行していると仮定すると､ これらのすべてのプライベートIPアドレスにアクセスすることができます｡
‫サービスIPをcURLすればいいはずです｡
‫殻を破って､ もう一度kubectl get serviceをやってみます｡
‫クラスタIPのそのIPアドレスは､ あなたのホストから解決可能であるべきです｡
‫DNS名はクラスタ内だけのものなので､
‫ポッド内のようにホストが知ることはできません｡
‫しかし､ IPアドレスを知っているので､ アクセスすることは可能です｡
‫ネットワーク上の他のマシンと同じように､ IPアドレス:8888をcURLで取得することができます｡
‫Docker
‫Desktopからではうまくいかない理由は､ コマンドを入力するときにMacやWindowsに座っていて､ Linux
‫VMがあなたのためにKubernetesを実行しているのと同じKubernetesのクラスタにいないからです｡
‫わかりました｡ このまま､ 次の講義でさらにサービスを作っていくので､
‫このままにしておきましょう｡