👋

(EKS) ServiceのLoadBalancerにNLBを使う

2022/02/20に公開

EKSでServiceリソースを作成する際にLoadBalancerタイプを選択すると、デフォルトでCLB (Clasic Load Balancer)が作成されます。

これはAWS cloud provider load balancer controllerにより作成されるようになっているようです。
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/network-load-balancing.html

AWS cloud provider load balancer controllerではCLBだけではなくNLB (Network Load Balancer)も作成できるようなので、実際にNLBを使ってServiceに対してクラスター外からトラフィックを受けられるようにしてみます。

各リソースの作成

Serviceの作成

上記でも説明があるように、LoadBalancerタイプを指定すると、デフォルトではCLBが作成されるのですが、アノテーションservice.beta.kubernetes.io/aws-load-balancer-typenlbと指定することで、作成されるELBがNLBとなります。

apiVersion: v1
kind: Service
metadata:
  name: service-nlb
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
    name: http
  selector:
    app: nginx

kubectlで確認すると、作成されたServiceのEXTERNAL-IPにNLBのエンドポイントが表示されるようになります。

$ kubectl get service
NAME          TYPE           CLUSTER-IP       EXTERNAL-IP                                                                          PORT(S)        AGE
kubernetes    ClusterIP      10.100.0.1       <none>                                                                               443/TCP        153m
service-nlb   LoadBalancer   10.100.101.183   a8f8c9c2381444028aec6eec562ebe39-a47a7be587f23933.elb.ap-northeast-1.amazonaws.com   80:32582/TCP   4m24s

AWSコンソールから確認してみると、NLBが作成されていることが確認できます。
NLB

トラフィックを受けるPodの作成

ここではnginxのイメージをそのまま使用し、Podの作成を行います。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

実際にNLBのエンドポイントに対してブラウザからHTTPでリクエストしてみると、nginxのPodにアクセスできていることがわかります。

nginx

まとめ

AWS Load Balancer Controllerを使わずともServiceのLoadBarancerを作成する際にNLBを指定することができるようですが、ドキュメントにもあるようにこちらは非推奨っぽいので、AWS Load Balancer Controllerを使うようにしましょう。

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/aws-load-balancer-controller.html
https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/

Discussion