[Kubernetes]NodePortサービスの動作を確認する 2

#はじめに
[前回](https://qiita.com/dingtianhongjie/items/d3dda4583ae013c9d6eb)はNodePortの動作を確認しました。
NodePortのパラメータに「externalTrafficPolicy」があります。今回はこのパラメータの動作を確認してみたいと思います。

#概要
マニュアルには、Load Balancerの記載の中に書かれていますが、NodePortでも使用可能なパラメータです。

> [Create an External Load Balancer](https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip)

設定できる値は以下の2つです。

|設定値|概要
|:---|:---
|Cluster（デフォルト）|通信がノード到達後に、そのノード以外にデプロイされているPodにもロードバランシングし、Podへの負荷を均等にします。
|Local|通信がノード到達後に、そのノードにデプロイされているPodにのみバランシングします。ノードをまたいだバランシングはしません。

#設定
[前回](https://qiita.com/dingtianhongjie/items/d3dda4583ae013c9d6eb)作成したNodePortサービスのマニフェストを書き換えて設定します。
「spec.externalTrafficPolicy」の一行を追記して、「Local」に設定しています。

```sampleNodePort.yaml
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でないと制御できませんので、あまり利用シーンはないのかなと思いました。機能として理解しておいて利用シーンが出てきたら思い出せるようにしておこうと思います。