EC2上のKubernetesクラスタにロードバランサーを導入する
EC2上にkubeadmで構築したKubernetesクラスタ上でLoadBalancerタイプのServiceを動かすためにAWS Load Balancer Controllerを導入する手順です。
cf.
事前準備
下記を用意してください:
手順
ノードへのIAMロールのアタッチ
ワーカーノードがロードバランサーリソースを作成できるよう、ノードにIAMロールをアタッチします。
- IAMポリシーを作成します:
# IAMポリシー向けjsonをダウンロード
curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.17.0/docs/install/iam_policy.json
# IAMポリシーを作成
aws iam create-policy \
--policy-name AWSLoadBalancerControllerIAMPolicy \
--policy-document file://iam_policy.json
- IAMロールを作成します:
# 信頼ポリシーのjson作成
cat << EOF >> trust_policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sts:AssumeRole"
],
"Principal": {
"Service": [
"ec2.amazonaws.com"
]
}
}
]
}
EOF
# ロールの作成
aws iam create-role \
--role-name AWSCustomerRoleForEC2KubeWorkerNode \
--assume-role-policy-document file://trust_policy.json
- 作成したロールにポリシーをアタッチします:
aws iam attach-role-policy \
--role-name AWSCustomerRoleForEC2KubeWorkerNode \
--policy-arn {AWSLoadBalancerControllerIAMPolicyのArn}
- インスタンスプロファイルを作成します:
# インスタンスプロファイルを作成
aws iam create-instance-profile \
--instance-profile-name AWSCustomerRoleForEC2KubeWorkerNode
# インスタンスプロファイルにIAMロールをアタッチ
aws iam add-role-to-instance-profile \
--instance-profile-name AWSCustomerRoleForEC2KubeWorkerNode \
--role-name AWSCustomerRoleForEC2KubeWorkerNode
- ワーカーノードの インスタンスIDを確認します:
aws ec2 describe-instances \
--query 'Reservations[*].Instances[*].{Instance:InstanceId}' \
--filters Name=tag-value,Values={ワーカーノードのインスタンス名}
- IAMロールをワーカーノードにアタッチします:
aws ec2 associate-iam-instance-profile \
--iam-instance-profile Name=AWSCustomerRoleForEC2KubeWorkerNode \
--instance-id {ワーカーノードのインスタンスID}
- ロードバランサーがワーカーノードを認識できるよう、
providerIDをノード情報として付与します(cf. https://github.com/kubernetes-sigs/aws-load-balancer-controller/issues/3708):
kubectl patch node kube-w01 -p '{"spec":{"providerID":"aws:///{リージョン}/{ワーカーノードのインスタンスID}"}}'
AWS Load Balancer Controllerのデプロイ
eksリポジトリを追加します:
helm repo add eks https://aws.github.io/eks-charts
- AWS Load Balancer Controllerをデプロイします:
helm install aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=nob-cluster
動作確認
- ingressリソースを作成すると、ロードバランサーが自動で作成されます:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
namespace: default
annotations:
alb.ingress.kubernetes.io/load-balancer-name: nginx-ingress
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: instance
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /*
pathType: ImplementationSpecific
backend:
service:
name: nginx-service
port:
number: 80
kubectl apply -f nginx-ingress.yaml
- 疎通確認用にnginxをデプロイします:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: default
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:stable
ports:
- containerPort: 80
kubectl apply -f nginx-deploy.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: default
labels:
app: nginx
spec:
type: LoadBalancer
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
kubectl apply -f nginx-svc.yaml