#はじめに
前回はNodePortの動作を確認しました。
NodePortのパラメータに「externalTrafficPolicy」があります。今回はこのパラメータの動作を確認してみたいと思います。
#概要
マニュアルには、Load Balancerの記載の中に書かれていますが、NodePortでも使用可能なパラメータです。
設定できる値は以下の2つです。
設定値 | 概要 |
---|---|
Cluster(デフォルト) | 通信がノード到達後に、そのノード以外にデプロイされているPodにもロードバランシングし、Podへの負荷を均等にします。 |
Local | 通信がノード到達後に、そのノードにデプロイされているPodにのみバランシングします。ノードをまたいだバランシングはしません。 |
#設定
前回作成したNodePortサービスのマニフェストを書き換えて設定します。
「spec.externalTrafficPolicy」の一行を追記して、「Local」に設定しています。
apiVersion: v1
kind: Service
metadata:
name: node-port
spec:
type: NodePort
externalTrafficPolicy: Local
ports:
- name: node-port
protocol: TCP
port: 8080
targetPort: 80
nodePort: 30001
selector:
app: nginx-dep
##設定変更
このマニフェストをapplyします。
$ kubectl apply -f sampleNodePort.yaml
service/node-port configured
$ kubectl describe svc node-port
Name: node-port
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"node-port","namespace":"default"},"spec":{"externalTrafficPolicy"...
Selector: app=nginx-dep
Type: NodePort
IP: 10.101.179.255
Port: node-port 8080/TCP
TargetPort: 80/TCP
NodePort: node-port 30001/TCP
Endpoints: 192.168.69.243:80,192.168.79.101:80
Session Affinity: None
External Traffic Policy: Local
Events: <none>
#動作確認
##事前準備
Podは2つのworkerノードに1つずつデプロイされていますので、ReplicaSetの値を4に変えて2つずつに変えておきます。
$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-6c4975c9f5-jrtn7 1/1 Running 0 7s 192.168.79.103 k8s-worker01 <none> <none>
nginx-6c4975c9f5-kv9vx 1/1 Running 0 7s 192.168.69.248 k8s-worker02 <none> <none>
nginx-6c4975c9f5-v5ljf 1/1 Running 4 4d6h 192.168.69.243 k8s-worker02 <none> <none>
nginx-6c4975c9f5-x4bwq 1/1 Running 4 4d6h 192.168.79.101 k8s-worker01 <none> <none>
また、各Pod(コンテナ)のindex.htmlにそれぞれ目印をつけておきます。
##確認
外部(gateway)から疎通できること、またノード間でまたがってバランシングされて”いない”ことを確認します。
[gateway ~]$ for i in 1 2 3 4 5 6 7 8 9 10 ;do curl -s http://k8s-worker01:30001 | grep pod; sleep 5;done
pod1
pod1-2
pod1
pod1
pod1
pod1-2
pod1-2
pod1
pod1
pod1-2
[gateway ~]$ for i in 1 2 3 4 5 6 7 8 9 10 ;do curl -s http://k8s-worker02:30001 | grep pod; sleep 5;done
pod2
pod2
pod2-2
pod2-2
pod2-2
pod2-2
pod2-2
pod2
pod2
pod2-2
5回だと偏ることもあるかなと思いましたので、10回にしています。
worker01のときは、worker01にデプロイされているPod(pod1/pod1-2)に、worker02のときは、pod2/pod2-2にリクエストがバランシングされていることがわかりますね。
想定通りの動作を確認できました。
#まとめ
今回はNodePortの「externalTrafficPolicy」の動作を確認しました。
ユースケースとしては、クラスタ内のある特定のノードにのみデプロイするPodに対してリクエストする場合でしょうか。まあ、それでしたらLabelでも制御できますね。
例えば、4ノードのクラスタのうち、2ノードにのみデプロイするPodがあるとしたら、Labelでないと制御できませんので、あまり利用シーンはないのかなと思いました。機能として理解しておいて利用シーンが出てきたら思い出せるようにしておこうと思います。