【k8s】Kubernetes ~ kube-proxy ~

◾️はじめに

k8s のコンポーネントの一つであるkube-proxyに関して
徐々にメモってしていく

目次

【1】kube-proxy
【2】立ち位置
 1)DaemonSet
【3】プロキシモード
【4】iptablesプロキシモード
 1)使用上の注意
 2)補足:readinessProbe
【5】kube-proxyに関わるコマンド
 1)コマンド例
【6】kube-proxyコマンドのオプション
 1)--nodeport-addresses strings
【7】AWS EKSのkube-proxy

【1】kube-proxy

* Pod への通信を可能にするためにワーカーノード内のネットワーク設定を担う
 Kubernetes のコンポーネントの1つ

https://kubernetes.io/docs/reference/command-line-tools-reference/kube-proxy/

【2】立ち位置

* Worker Nodeで動作
* 以下の公式ドキュメントの図の「k-proxy」で各ノードで1つずつ Pod として動作

https://kubernetes.io/ja/docs/concepts/overview/components/

* DaemonSet としてデプロイされている

コマンド

kubectl get daemonset -n kube-system

kubectl describe daemonset kube-proxy -n kube-system

1)DaemonSet

* ノードログ収集などのクラスターに存在するバックグラウンドプログラムを
 デプロイするために使用
 => そのようにして、全て(またはいくつか)のNodeが単一のPodのコピーを稼働させることを保証

https://kubernetes.io/ja/docs/concepts/workloads/controllers/daemonset/
https://kubernetes.io/ja/docs/tasks/manage-daemon/create-daemon-set/

参考文献
https://cstoku.dev/posts/2018/k8sdojo-13/

【3】プロキシモード

* kube-proxyにも種類がある
 => 日本語サイトだとちょっと古い(nftables の記述がない)

https://kubernetes.io/docs/reference/networking/virtual-ips/#proxy-modes
日本語版
https://kubernetes.io/ja/docs/concepts/services-networking/service/

Proxy mode Explanations Memo
iptables iptablesルールを使用してトラフィックをPodにルーティング Default
ipvs Linux の netfilter サブシステムをベースに実装 Kubernetes 1.8 で導入。Kubernetes 1.11 で GA
nftables nftablesベースに実装 1.30 時点でアルファ機能
kernelspace Windows 限定
userspace Kubernetes 1.26 で削除済

【4】iptablesプロキシモード

* iptablesルールを使用してトラフィックをPodにルーティング

https://kubernetes.io/ja/docs/concepts/services-networking/service/#proxy-mode-iptables

より抜粋
~~~~
デフォルトでは、iptablesモードにおけるkube-proxyは
バックエンドPodをランダムで選択します。
~~~~

=> iptables に関しては、以下の関連記事を参照の事

iptablesコマンド
https://dk521123.hatenablog.com/entry/2025/03/18/003023

1)使用上の注意

https://kubernetes.io/ja/docs/concepts/services-networking/service/#proxy-mode-iptables

より抜粋
~~~~
kube-proxyがiptablesモードで稼働し、最初に選択されたPodが応答しない場合、
そのコネクションは失敗します。 
...
iptablesモードのkube-proxyが正常なバックエンドPodのみをリダイレクト対象とするために、
PodのReadinessProbeを使用してバックエンドPodが正常に動作しているか確認できます。
これは、ユーザーがkube-proxyを介して、コネクションに失敗したPodに対して
トラフィックをリダイレクトするのを除外することを意味します。
~~~~

2)補足:readinessProbe

詳細は、以下の関連記事を参照

Kubernetes ~ Health check / Probe ~
https://dk521123.hatenablog.com/entry/2025/03/27/182147

とりあえず、公式ドキュメント

https://kubernetes.io/ja/docs/concepts/workloads/pods/pod-lifecycle/#types-of-probe

より抜粋
~~~~
コンテナがリクエスト応答する準備ができているかを示します。 
readinessProbeに失敗すると、エンドポイントコントローラーにより、
ServiceからそのPodのIPアドレスが削除されます。 
initial delay前のデフォルトのreadinessProbeの初期値はFailureです。
 コンテナにreadinessProbeが設定されていない場合、デフォルトの状態はSuccessです。
~~~~

【5】kube-proxyに関わるコマンド

1)コマンド例

$ kubectl get pod -n kube-system -o wide

$ kubectl describe pods kube-proxy-2n7b2 -n kube-system
# mode: "" だったら、デフォルトの「iptables」

# kube-proxy設定を表示
$ kubectl exec -it demo_kube_proxy -n kube-system -- iptables -n -t nat -L > itables.txt

【6】kube-proxyコマンドのオプション

1)--nodeport-addresses strings

https://kubernetes.io/docs/reference/command-line-tools-reference/kube-proxy/

より抜粋
~~~~
A list of CIDR ranges that contain valid node IPs, or alternatively, the single string 'primary'.
If set to a list of CIDRs, connections to NodePort services will only be accepted on node IPs
 in one of the indicated ranges.
If set to 'primary', NodePort services will only be accepted on the node's primary IP(s)
 according to the Node object.
If unset, NodePort connections will be accepted on all local IPs.
This parameter is ignored if a config file is specified by --config.
~~~~

[1] 設定されている場合

* NodePortサービスがNodeオブジェクトに従って、
 NodeのPrimary IDでのみ受け入れられる

[2] 設定されていない場合

* NodePort接続は全てのローカルIPアドレスで受け入れられる
 => 以下の『「設定されていない」時のエラー内容』が表示されるかも、、、

「設定されていない」時のエラー内容
https://dk521123.hatenablog.com/entry/2025/03/15/231209

より抜粋

E0314 12:34:56.123456   1 server.go:234 "Kube-proxy configuration may be incomplete or incorrect"
err="nodePortAddresses is unset; NodePort connections will be accepted on all local IPs. 
Consider using `--nodeport-addresses primary`"
 => nodePortAddresses が設定されていない場合に発生する

【7】AWS EKSのkube-proxy

* Amazon EKS では、kube-proxyをアドオンとしてクラスターに追加することを推奨

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/managing-kube-proxy.html

参考文献

https://qiita.com/nozmiz/items/9a74433258a79be26c36
https://zenn.dev/toversus/articles/dcb888d73f0615

関連記事

Kubernetes ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2020/04/27/224624
KubernetesWindows / 環境構築編 ~
https://dk521123.hatenablog.com/entry/2020/05/01/000000
Kubernetes ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/05/04/013529
Kubernetes ~ Health check / Probe ~
https://dk521123.hatenablog.com/entry/2025/03/27/182147
kubectlコマンド ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2022/01/12/110555
デバッグに役立つkubectlコマンド ~ kubectl debug ~
https://dk521123.hatenablog.com/entry/2025/03/13/003015
デバッグに役立つkubectlコマンド ~ kubectl logs ~
https://dk521123.hatenablog.com/entry/2025/03/15/231209
Kubernetes ~ ConfigMap ~
https://dk521123.hatenablog.com/entry/2025/03/11/000418
Kubernetes ~ トラブルシュート方法 ~
https://dk521123.hatenablog.com/entry/2025/02/13/233043
screenコマンド
https://dk521123.hatenablog.com/entry/2024/01/03/015517
tmuxコマンド ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/11/13/020744
tmuxコマンド ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2024/01/08/171950
screenコマンド
https://dk521123.hatenablog.com/entry/2024/01/03/015517
watchコマンド
https://dk521123.hatenablog.com/entry/2024/03/24/232633
iptablesコマンド
https://dk521123.hatenablog.com/entry/2025/03/18/003023
tcpdumpコマンド 〜 パケットキャプチャ 〜
https://dk521123.hatenablog.com/entry/2017/07/03/233336
Wireshark ~パケットキャプチャ~
https://dk521123.hatenablog.com/entry/2013/04/18/234813
ネットワーク系コマンド ~ firewall編 ~
https://dk521123.hatenablog.com/entry/2025/03/17/005508