LoginSignup
2
2

More than 3 years have passed since last update.

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

Posted at

はじめに

前回はNodePortの動作を確認しました。
NodePortのパラメータに「externalTrafficPolicy」があります。今回はこのパラメータの動作を確認してみたいと思います。

概要

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

Create an External Load Balancer

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

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

設定

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

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2