pageKubernetesドキュメントコンセプトService、負荷分散とネットワーキングサービスとアプリケーションの接続サービスとアプリケーションの接続コンテナを接続するためのKubernetesモデル継続的に実行され、複製されたアプリケーションの準備ができたので、ネットワーク上で公開することが可能になります。Kubernetesのネットワークのアプローチについて説明する前に、Dockerの「通常の」ネットワーク手法と比較することが重要です。デフォルトでは、Dockerはホストプライベートネットワーキングを使用するため、コンテナは同じマシン上にある場合にのみ他のコンテナと通信できます。Dockerコンテナがノード間で通信するには、マシンのIPアドレスにポートを割り当ててから、コンテナに転送またはプロキシする必要があります。これは明らかに、コンテナが使用するポートを非常に慎重に調整するか、ポートを動的に割り当てる必要があることを意味します。コンテナを提供する複数の開発者やチーム間でポートの割り当てを調整することは、規模的に大変困難であり、ユーザが制御できないクラスターレベルの問題にさらされます。Kubernetesでは、どのホストで稼働するかに関わらず、Podが他のPodと通信できると想定しています。すべてのPodに独自のクラスタープライベートIPアドレスを付与するため、Pod間のリンクを明示的に作成したり、コンテナポートをホストポートにマップしたりする必要はありません。これは、Pod内のコンテナがすべてlocalhostの相互のポートに到達でき、クラスター内のすべてのPodがNATなしで相互に認識できることを意味します。このドキュメントの残りの部分では、このようなネットワークモデルで信頼できるサービスを実行する方法について詳しく説明します。このガイドでは、シンプルなnginxサーバーを使用して概念実証を示します。Podをクラスターに公開する前の例でネットワークモデルを紹介しましたが、再度ネットワークの観点に焦点を当てましょう。Podを作成し、コンテナポートの仕様を指定していることに注意してください。80これにより、クラスター内のどのノードからでもアクセスできるようになります。10.244.2.5クラスター内の任意のノードにSSH接続し、両方のIPにcurl接続できるはずです。コンテナはノードでポート80を使用していないことに注意してください。Podにトラフィックをルーティングする特別なNATルールもありません。Podを実行し、IPを使用してクラスター内の他のPodやノードからそれらにアクセスできます。Dockerと同様に、ポートは引き続きホストノードのインターフェースに公開できますが、ネットワークモデルにより、この必要性は根本的に減少します。興味があれば、これをどのように達成するかについて詳しく読むことができます。Serviceを作成するそのため、フラットでクラスター全体のアドレス空間でnginxを実行するPodがあります。Podはそれで死に、Deploymentは異なるIPを持つ新しいものを作成します。これは、Serviceが解決する問題です。Serviceは、クラスター内のどこかで実行されるPodの論理セットを定義する抽象化であり、すべて同じ機能を提供します。作成されると、各Serviceには一意のIPアドレス(clusterIPとも呼ばれます)が割り当てられます。このアドレスはServiceの有効期間に関連付けられており、Serviceが動作している間は変更されません。Podは、Serviceと通信するように構成でき、Serviceへの通信は、ServiceのメンバーであるPodに自動的に負荷分散されることを認識できます。my-nginxこの仕様は、run:my-nginxラベルを持つ任意のPodのTCPポート80をターゲットとするサービスを作成し、抽象化されたサービスポートでPodを公開します(targetPort:はコンテナがトラフィックを受信するポート、port:は抽象化されたServiceのポートであり、他のPodがServiceへのアクセスに使用する任意のポートにすることができます)。APIオブジェクトを参照してください。21s前述のように、ServiceはPodのグループによってサポートされています。これらのPodはエンドポイントを通じて公開されます。Serviceのセレクターは継続的に評価され、結果はmy-nginxという名前のEndpointsオブジェクトにPOSTされます。Podが終了すると、エンドポイントから自動的に削除され、Serviceのセレクターに一致する新しいPodが自動的にエンドポイントに追加されます。Serviceにcurl接続できるようになりました。IPは完全に仮想的なもので、ホスト側のネットワークには接続できないことに注意してください。この仕組みに興味がある場合は、サービスプロキシの詳細をお読みください。ServiceにアクセスするKubernetesは、環境変数とDNSの2つの主要なService検索モードをサポートしています。前者はそのまま使用でき、後者はCoreDNSクラスターアドオンを必要とします。備考:サービス環境変数が望ましくない場合(予想されるプログラム変数と衝突する可能性がある、処理する変数が多すぎる、DNSのみを使用するなど)、Pod仕様でenableServiceLinksフラグをfalseに設定することでこのモードを無効にできます。環境変数ノードでPodが実行されると、kubeletはアクティブな各サービスの環境変数のセットを追加します。これにより、順序付けの問題が発生します。SERVICEKUBERNETES_SERVICE_HOST=10.0.0.1KUBERNETES_SERVICE_PORT=443KUBERNETES_SERVICE_PORT_HTTPS=443サービスに言及がないことに注意してください。これは、サービスの前にレプリカを作成したためです。これのもう1つの欠点は、スケジューラーが両方のPodを同じマシンに配置し、サービスが停止した場合にサービス全体がダウンする可能性があることです。2つのPodを強制終了し、Deploymentがそれらを再作成するのを待つことで、これを正しい方法で実行できます。今回は、サービスはレプリカの「前」に存在します。kubernetes-minion-905mPodは強制終了されて再作成されるため、異なる名前が付いていることに気付くでしょう。SERVICEKUBERNETES_SERVICE_PORT=443MY_NGINX_SERVICE_HOST=10.0.162.149KUBERNETES_SERVICE_HOST=10.0.0.1MY_NGINX_SERVICE_PORT=80KUBERNETES_SERVICE_PORT_HTTPS=443DNSKubernetesは、DNS名を他のServiceに自動的に割り当てるDNSクラスターアドオンサービスを提供します。8mこのセクションの残りの部分は、寿命の長いIP(my-nginx)を持つServiceと、そのIPに名前を割り当てたDNSサーバーがあることを前提にしています。使用してクラスター内の任意のPodからServiceに通信できます。CoreDNSを参照し、有効にする事ができます。curlアプリケーションを実行して、これをテストしてみましょう。10.0.162.149Serviceを安全にするこれまでは、クラスター内からnginxサーバーにアクセスしただけでした。サービスをインターネットに公開する前に、通信チャネルが安全であることを確認する必要があります。httpsの例から取得できます。これにはツールをインストールする必要があります。これらをインストールしたくない場合は、後で手動の手順に従ってください。base64前のコマンドの出力を使用して、次のようにyamlファイルを作成します。base64でエンコードされた値はすべて1行である必要があります。secret-volumenginx-secure-appマニフェストに関する注目すべき点:同じファイルにDeploymentとServiceの両方が含まれています。Serviceは両方のポートを公開します。各コンテナは/etc/nginx/sslにマウントされたボリュームを介してキーにアクセスできます。これは、nginxサーバーが起動する前にセットアップされます。./nginx-secure-app.yamlこの時点で、任意のノードからnginxサーバーに到達できます。nginx!</h1>最後の手順でcurlに-kパラメーターを指定したことに注意してください。これは、証明書の生成時にnginxを実行しているPodについて何も知らないためです。CNameの不一致を無視するようcurlに指示する必要があります。Serviceを作成することにより、証明書で使用されるCNameを、Service検索中にPodで使用される実際のDNS名にリンクしました。これをPodからテストしましょう(簡単にするために同じシークレットを再利用しています。nginx!</title>...Serviceを公開するアプリケーションの一部では、Serviceを外部IPアドレスに公開したい場合があります。Kubernetesは、NodePortとLoadBalancerの2つの方法をサポートしています。HTTPSレプリカはインターネット上のトラフィックを処理する準備ができています。nginx!</h1>クラウドロードバランサーを使用するようにサービスを再作成しましょう。nginx!</title>EXTERNAL-IP列のIPアドレスは、パブリックインターネットで利用可能なものです。CLUSTER-IPは、クラスター/プライベートクラウドネットワーク内でのみ使用できます。LoadBalancerはIPではなく(長い)ホスト名を使用するELBが作成されます。my-nginxを実行する必要があります。京ICP备17074266号-3。