Kubernetesでのkube-proxyずノヌドのアクセス䞍胜性の実隓

ご泚意 perev。 この蚘事は、Kubernetesの技術コンサルタント兌認定管理者であるDaniele Polencicによっお曞かれ、ナヌザヌ芁求を炉床に配信する際にkube-proxyが果たす圹割ず、クラスタヌノヌドの1぀で問題が発生したずきに䜕が起こるかに぀いお説明したす。

Kubernetesにデプロむされたアプリケヌションのコヌドは、1぀以䞊の䜜業ノヌドで実行されたす。 ノヌドは、物理マシンたたは仮想マシン、たたはAWS EC2たたはGoogle Compute Engineのいずれかに配眮できたす。このようなサむトが倚数存圚するため、アプリケヌションを効果的に起動およびスケヌリングできたす。 たずえば、クラスタヌが3぀のノヌドで構成されおおり、アプリケヌションを4぀のレプリカにスケヌリングする堎合、Kubernetesは次のようにノヌド間でそれらを均等に分散したす。



そのようなアヌキテクチャはうたく機胜したす。 1぀のノヌドが䜿甚できない堎合、アプリケヌションは他の2぀のノヌドで匕き続き動䜜したす。 䞀方、Kubernetesは4番目のレプリカを別の䜿甚可胜なノヌドに再割り圓おしたす。



さらに、すべおのノヌドが分離されおいおも、リク゚ストを凊理できたす。 たずえば、アプリケヌションレプリカの数を2぀に枛らしたす。



各ノヌドがアプリケヌションを提䟛できるため、3番目ノヌド3は、アプリケヌションが実行されおおらず、他のノヌドの1぀にトラフィックをリダむレクトする必芁があるこずをどのように知るのですか



Kubernetesには、各ノヌドで実行されるkube-proxyバむナリがあり、トラフィックを特定のサブにルヌティングしたす。 ホテルの受付係ず比范できたす。 Kube-proxyは、ノヌドに着信するすべおのトラフィックを受け入れ、正しいトラフィックに転送したす。

しかし、 kube-proxyは、すべおのポッドがどこにあるかをどのように知るのでしょうか


圌は知りたせん。

しかし、圌はすべおのルヌティングルヌルのリストを䜜成するメむンマスタヌノヌドのすべおに぀いお知っおいたす。 そしおkube-proxyはこれらのルヌルをチェックし、それらを実斜kube-proxyたす。 䞊蚘の簡単なシナリオでは、ルヌルのリストは次のずおりです。


トラフィックのkube-proxyノヌドは関係ありたせんkube-proxy 、このルヌルのリストに埓っおトラフィックをリダむレクトする堎所を認識しおいたす。



しかし、kube-proxyがクラッシュするずどうなりたすか


そしお、ルヌルのリストが消えたらどうしたすか


トラフィックを転送するルヌルがない堎合はどうなりたすか


酒井孊も同じ質問をしたした。 そしお圌はそれを理解するこずにしたした。

GCPに2぀のノヌドのクラスタヌがあるずしたす。

 $ kubectl get nodes NAME STATUS ROLES AGE VERSION node1 Ready <none> 17h v1.8.8-gke.0 node2 Ready <none> 18h v1.8.8-gke.0 

そしお、あなたはManabuアプリをデプロむしおいたす

 $ kubectl create -f https://raw.githubusercontent.com/manabusakai/k8s-hello-world/master/kubernetes/deployment.yml $ kubectl create -f https://raw.githubusercontent.com/manabusakai/k8s-hello-world/master/kubernetes/service.yml 

これは、珟圚の囲炉裏のホスト名をWebペヌゞに衚瀺する単玔なアプリケヌションです。



10個のレプリカにスケヌルしたす Deployment 

 $ kubectl scale --replicas 10 deployment/k8s-hello-world 

10個のレプリカが2぀のノヌド node1およびnode2 に均等に分散されおいたす 。

 $ kubectl get pods NAME READY STATUS NODE k8s-hello-world-55f48f8c94-7shq5 1/1 Running node1 k8s-hello-world-55f48f8c94-9w5tj 1/1 Running node1 k8s-hello-world-55f48f8c94-cdc64 1/1 Running node2 k8s-hello-world-55f48f8c94-lkdvj 1/1 Running node2 k8s-hello-world-55f48f8c94-npkn6 1/1 Running node1 k8s-hello-world-55f48f8c94-ppsqk 1/1 Running node2 k8s-hello-world-55f48f8c94-sc9pf 1/1 Running node1 k8s-hello-world-55f48f8c94-tjg4n 1/1 Running node2 k8s-hello-world-55f48f8c94-vrkr9 1/1 Running node1 k8s-hello-world-55f48f8c94-xzvlc 1/1 Running node2 



サヌビスは、10個のレプリカにわたる芁求からの負荷を分散するために䜜成されたす。

 $ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE k8s-hello-world NodePort 100.69.211.31 <none> 8080:30000/TCP 3h kubernetes ClusterIP 100.64.0.1 <none> 443/TCP 18h 

NodePortを介しお倖郚に転送され、ポヌト30000でアクセス可胜です。぀たり、各ノヌドで、倖郚むンタヌネット甚にポヌト30000が開き、着信トラフィックの受信を開始したす。



しかし、トラフィックはどのようにしおポヌト30,000から炉床にルヌティングされたすか


kube-proxyは、ポヌト30000から10個のポッドの1぀ぞの着信トラフィックのルヌルを蚭定したす。

いずれかのノヌドのポヌト30,000にリク゚ストを送信しおみおください。

 $ curl <node ip>:30000 

泚 ホストIPアドレスは、 kubectl get nodes -o wideコマンドでkubectl get nodes -o wideできたす。

アプリケヌションは「Hello world」で応答し、アプリケヌションが実行されおいるコンテナのホスト名 Hello world! via <hostname> Hello world! via <hostname> 。

同じURLを再リク゚ストするず、同じ回答が衚瀺される堎合ず、倉曎される堎合がありたす。 その理由は、 kube-proxyロヌドバランサヌずしお機胜し、ルヌティングをチェックし、10個のセクションにトラフィックを分散させるためです。

興味深いこずに、あなたがどのノヌドを参照しおいるかは関係ありたせん。答えはどのポッドからでも-他のノヌドにあるものあなたが向けたものではないからのものです。

最終構成では、倖郚ロヌドバランサヌを䜿甚する必芁がありたす。これにより、ノヌド間でトラフィックが分散されたすポヌト30000䞊。 最終的なク゚リフロヌスキヌムは次のようになりたす。



぀たり、ロヌドバランサヌは、むンタヌネットからの着信トラフィックを2぀のノヌドのいずれかにリダむレクトしたす。 このスキヌム党䜓を明確にしたす-その動䜜の原理を芁玄したす

  1. むンタヌネットからのトラフィックは、メむンのロヌドバランサヌに向けられたす。
  2. このバランサヌは、2぀のノヌドのいずれかのポヌト30000にトラフィックを転送したす。
  3. kube-proxyによっお蚭定されたルヌルは、ホストからサブにトラフィックをリダむレクトしたす。
  4. トラフィックが䞋に萜ちる。

これが党䜓のスキヌムです

それをすべお分解する時です


すべおが盞互䜜甚する方法がわかったので、元の質問に戻りたしょう。 ルヌティングルヌルを倉曎するずどうなりたすか クラスタヌは匕き続き機胜したすか ポッドはリク゚ストに察応したすか

ルヌティングルヌルを削陀し、別のタヌミナルで-アプリケヌションの応答時間ず芁求の欠萜を監芖したす。 埌者の堎合、1秒ごずに珟圚の時刻を衚瀺しおアプリケヌションに芁求を行うルヌプを䜜成するだけで十分です。

 $ while sleep 1; do date +%X; curl -sS http://<your load balancer ip>/ | grep ^Hello; done 

出力では、囲炉裏から時間ず応答テキストを含む列を取埗したす。

 10:14:41 Hello world! via k8s-hello-world-55f48f8c94-vrkr9 10:14:43 Hello world! via k8s-hello-world-55f48f8c94-tjg4n 

それでは、ホストからルヌティングルヌルを削陀したしょうが、最初にこれを行う方法を考えたしょう。

kube-proxyは、 userspace 、 iptablesおよびipvsの 3぀のモヌドで動䜜できたす。 Kubernetes 1.2以降のデフォルトモヌドはiptablesです。  泚 最埌のモヌドipvsは、 K8s 1.8リリヌスで登堎し、 1.9でベヌタステヌタスを受け取りたした。

iptablesモヌドでは、 kube-proxyはiptablesルヌルを䜿甚しおホスト䞊のルヌティングルヌルをリストしたす。 したがっお、 iptables -Fコマンドを䜿甚しお、任意のノヌドに移動しおこれらのルヌルを削陀できたす。

泚  iptables -Fを呌び出すず、SSH接続が切断される可胜性があるこずに泚意しおください。

すべおが蚈画どおりに進んだ堎合、次のようなものが衚瀺されたす。

 10:14:41 Hello world! via k8s-hello-world-55f48f8c94-xzvlc 10:14:43 Hello world! via k8s-hello-world-55f48f8c94-tjg4n #      `iptables -F` 10:15:10 Hello world! via k8s-hello-world-55f48f8c94-vrkr9 10:15:11 Hello world! via k8s-hello-world-55f48f8c94-vrkr9 

すぐにわかるように、iptablesルヌルがリセットされおから次の回答たで玄27秒10:14:43から10:15:10たでかかりたした。

この間に䜕が起きたしたか 27秒埌にすべおが正垞になったのはなぜですか たぶんこれは単なる偶然でしょうか

再びルヌルをリセットしたしょう。

 11:29:55 Hello world! via k8s-hello-world-55f48f8c94-xzvlc 11:29:56 Hello world! via k8s-hello-world-55f48f8c94-tjg4n #      `iptables -F` 11:30:25 Hello world! via k8s-hello-world-55f48f8c94-npkn6 11:30:27 Hello world! via k8s-hello-world-55f48f8c94-vrkr9 


11:29:56から11:30:25たでの29秒の䞀時停止が衚瀺されたす。 しかし、クラスタヌは再び機胜するようになりたした。

応答に30秒かかるのはなぜですか ルヌティングテヌブルがなくおも、芁求はノヌドに届きたすか

この30秒間にノヌドで䜕が起こるかを確認できたす。 別のタヌミナルで、アプリケヌションに毎秒リク゚ストを行うルヌプを実行したすが、今回は、ロヌドバランサヌではなくノヌドにアクセスしたす。

 $ while sleep 1; printf %"s\n" $(curl -sS http://<ip of the node>:30000); done 

そしお、iptablesルヌルを再床リセットしたす。 次のログを取埗したす。

 Hello world! via k8s-hello-world-55f48f8c94-xzvlc Hello world! via k8s-hello-world-55f48f8c94-tjg4n #      `iptables -F` curl: (28) Connection timed out after 10003 milliseconds curl: (28) Connection timed out after 10004 milliseconds Hello world! via k8s-hello-world-55f48f8c94-npkn6 Hello world! via k8s-hello-world-55f48f8c94-vrkr9 

ルヌルをリセットした埌、ホストぞの接続がタむムアりトするこずは驚くこずではありたせん。 しかし、 curlが10秒の応答を埅぀のは興味深いこずです。

しかし、前の䟋でロヌドバランサヌが新しい接続を埅機しおいる堎合はどうでしょうか。 これは30秒の遅延を説明したすが、十分に長い埅機の埌、ノヌドが接続を受け入れる準備ができおいる理由は明確ではありたせん。

では、なぜ30秒埌に再びトラフィックが流れるのでしょうか 誰がiptablesルヌルを埩元したすか

iptablesルヌルをリセットする前に、それらを芋るこずができたす

 $ iptables -L 

ルヌルをリセットし、このコマンドの実行を続けたす-数秒でルヌルが埩元されるこずがわかりたす。

あなたはkube-proxyですか はい 公匏のkube-proxyドキュメントには、2぀の興味深いフラグがありたす。


぀たり、 kube-proxy iptablesルヌルを10〜30秒ごずに曎新したす。 iptablesルヌルをリセットするず、 kube-proxyがこれを認識しお埩元するたでに最倧30秒かかりたす。

そのため、ノヌドが再び機胜するたでに玄30秒かかりたした。 たた、ルヌティングテヌブルがマスタヌノヌドからワヌカヌノヌドに到達する方法に぀いおも説明したす。 それらはkube-proxyによっお定期的に同期されたす。 ぀たり、炉床を远加たたは削陀するたびに、メむンノヌドはルヌトのリストをやり盎し、 kube-proxyは芏則を珟圚のノヌドず定期的に同期したす。

そのため、ホスト䞊のiptablesルヌルを誰かが台無しにした堎合にKubernetesずkube-proxyどのように埩元されるかをたずめたす。

  1. iptablesルヌルはホストから削陀されたした。
  2. 芁求はロヌドバランサヌに送信され、ノヌドにルヌティングされたす。
  3. ノヌドは着信芁求を受け入れないため、バランサヌは埅機しおいたす。
  4. 30秒埌、 kube-proxyはiptablesルヌルを埩元したす。
  5. ホストは再びトラフィックを受信できたす。 Iptablesルヌルは、バランサヌ芁求をsubにリダむレクトしたす。
  6. Underは、30秒の合蚈遅延でロヌドバランサヌを満たしたす。

30秒の埅機は、アプリケヌションでは受け入れられない堎合がありたす。 この堎合、 kube-proxy暙準曎新間隔の倉曎を怜蚎する必芁がありたす。 これらの蚭定はどこにあり、どのように倉曎するのですか

ノヌドに゚ヌゞェント-kubelet-があり、各ノヌドで静的炉床ずしおkube-proxyを起動するのは圌です。 静的な提出に関するドキュメントは、kubeletが特定のディレクトリの内容をチェックし、そこからすべおのリ゜ヌスを䜜成するこずを瀺唆しおいたす。

ノヌドで実行されおいるkubeletプロセスを芋るず、フラグ--pod-manifest-path=/etc/kubernetes/manifests実行されおいるこずがわかりたす。 小孊校のlsは秘密のベヌルを開きたす

 $ ls -l /etc/kubernetes/manifests total 4 -rw-r--r-- 1 root root 1398 Feb 24 08:08 kube-proxy.manifest 

このkube-proxy.manifestは䜕が含たれおいたすか

 apiVersion: v1 kind: Pod metadata: name: kube-proxy spec: hostNetwork: true containers: - name: kube-proxy image: gcr.io/google_containers/kube-proxy:v1.8.7-gke.1 command: - /bin/sh - -c -> echo -998 > /proc/$$$/oom_score_adj && exec kube-proxy --master=https://35.190.207.197 --kubeconfig=/var/lib/kube-proxy/kubeconfig --cluster-cidr=10.4.0.0/14 --resource-container="" --v=2 --feature-gates=ExperimentalCriticalPodAnnotation=true --iptables-sync-period=30s 1>>/var/log/kube-proxy.log 2>&1 

泚 簡単にするために、ファむルの内容はここでは完党ではありたせん。

謎は解決したした ご芧のずおり、 --iptables-sync-period=30sオプションは30秒ごずに䜿甚され、iptablesルヌルを曎新したす。 ここで、特定のノヌドでルヌルを曎新するための最小時間ず最倧時間を倉曎できたす。

結論


iptablesルヌルをリセットするず、ホストにアクセスできなくなりたす。 トラフィックは匕き続きノヌドに送信されたすが、それ以䞊぀たり、サブに転送するこずはできたせん。 Kubernetesは、ルヌティングルヌルを監芖し、必芁に応じお曎新するこずにより、このような問題から回埩できたす。

このテキストに倚くの点でむンスピレヌションを䞎えたブログ投皿の酒井孊 、およびりィザヌドから他のサむトぞのiptablesルヌルの転送の問題を研究しおくれたValentin Ouvrardに感謝したす。

翻蚳者からのPS


ブログもご芧ください。

Source: https://habr.com/ru/post/J359120/


All Articles