(EKS) ServiceのLoadBalancerにNLBを使う
EKSでServiceリソースを作成する際にLoadBalancerタイプを選択すると、デフォルトでCLB (Clasic Load Balancer)が作成されます。
これはAWS cloud provider load balancer controllerにより作成されるようになっているようです。
AWS cloud provider load balancer controllerではCLBだけではなくNLB (Network Load Balancer)も作成できるようなので、実際にNLBを使ってServiceに対してクラスター外からトラフィックを受けられるようにしてみます。
各リソースの作成
Serviceの作成
上記でも説明があるように、LoadBalancerタイプを指定すると、デフォルトではCLBが作成されるのですが、アノテーションservice.beta.kubernetes.io/aws-load-balancer-type
でnlb
と指定することで、作成される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が作成されていることが確認できます。
トラフィックを受ける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にアクセスできていることがわかります。
まとめ
AWS Load Balancer Controllerを使わずともServiceのLoadBarancerを作成する際にNLBを指定することができるようですが、ドキュメントにもあるようにこちらは非推奨っぽいので、AWS Load Balancer Controllerを使うようにしましょう。
Discussion