Jak skonfigurować klaster EKS, aby móc w pełni korzystać z Application Load Balancer? W poniższym wpisie, przedstawię proces instalacji oraz konfiguracji kontrollera ALB, a na koniec sprawdzimy czy wszystko działa jak powinno.
Co potrzebne na start?
Aby zacząć pracę, potrzebujemy trzech rzeczy.
1. Utworzony klaster AWS EKS, jak go postawić opisywałem cały proces w innym poście: https://cloud-devops.pl/tworzenie-klastra-kubernetes-przy-pomocy-aws-eks/
2. Musimy utworzyć IAM OIDC provider dla naszego klastra, jak to zrobić odysłam do dokumentacji AWS: https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html
3. Dodatkowo potrzebujemy mieć skonfigurowane lokalnie AWS CLI, kubectx oraz zainstalowany Helm, który użyjemy do instalacji aws-load-balancer-controller
Zaczynamy!
W pierwszej kolejności, musimy uzyskać OIDC provider URL, uzyskamy go za pomocą polecenia
aws eks describe-cluster --name LearningCluster --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5
Adres z wyniku zapiszcie sobie gdziekolwiek, ponieważ będzie nam potrzebny za chwilę do dalszych prac.
Tworzenie IAM Role
Tworzymy sobie plik load-balancer-role-trust-policy.json, w którym będzie opisana nasza polityka
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::111111111111:oidc-provider/oidc.eks.eu-central-1.amazonaws.com/id/0F8A4524FB37048572277D14560C421C"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"oidc.eks.eu-central-1.amazonaws.com/id/0F8A4524FB37048572277D14560C421C:aud": "sts.amazonaws.com",
"oidc.eks.eu-central-1.amazonaws.com/id/0F8A4524FB37048572277D14560C421C:sub": "system:serviceaccount:kube-system:aws-load-balancer-controller"
}
}
}
]
}
- Identyfikator 111111111111 – zamieniamy na swój account ID.
- Natomiast wszystkie wystąpienia oidc.eks.eu-central-1.amazonaws.com/id/0F8A4524FB37048572277D14560C421C zamieniamy na adres, który otrzymaliśmy w poprzednim kroku 🙂
Tworzymy rolę, przy pomocy polecenia
aws iam create-role --role-name AmazonEKSLoadBalancerControllerRole --assume-role-policy-document file://"load-balancer-role-trust-policy.json"
Teraz musimy sobie pobrać najnowszę politykę IAM dla kontrolera, pobieramy ją przy pomocy polecenia
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.11.0/docs/install/iam_policy.json
A następnie tworzymy na podstawie pobranego pliku polityję IAM na AWS przy pomocy polecenia
aws iam create-policy --policy-name AWSLoadBalancerControllerIAMPolicy --policy-document file://iam_policy.json
Powyżej utworzoną politykę, musimy przypisać do wcześniej utworzonej roli, robimy to przy pomocy polecenia
aws iam attach-role-policy --policy-arn arn:aws:iam::177394270612:policy/AWSLoadBalancerControllerIAMPolicy --role-name AmazonEKSLoadBalancerControllerRole
Przedostatnim krokiem jest utworzenie service account dla ALB, więc utwórzmy sobie plik aws-load-balancer-controller-service-account.yaml, a w nim
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: aws-load-balancer-controller
name: aws-load-balancer-controller
namespace: kube-system
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::111111111111:role/AmazonEKSLoadBalancerControllerRole
Jeżeli robiłeś wszystko zgodnie z tym co opisywałem, to w powyższym pliku wystarczy zmienić 111111111111, na swoje AccountId. Ostatnim krokiem jest dodanie powyższego manifestu, poprzez wykonanie polecenia
kubectl apply -f aws-load-balancer-controller-service-account.yaml
I na tym etapie, ostatnia rzecz jaka nam została, to instalacja kontrolera oraz test, czy wszystko działa.
Instalacja AWS Load Balancer Controller przy pomocy Helm
Zanim przejdziemy do instalacji kontrolera, musimy wykonać bardzo ważną rzecz, aby kontroler wiedział, jakich subnetów ma używać, dokładnie chodzi o otagowanie subnetów. Dokładnie chodzi o ty, aby publiczne subnety otagować w poniższy sposób
kubernetes.io/role/elb 1 or ``
kubernetes.io/cluster/nazwa_klastra owned or shared
Natomiast prywatne
kubernetes.io/role/internal-elb 1 or ``
kubernetes.io/cluster/nazwa_klastra owned or shared
Tag z nazwą klastra, jest zależny od tego jakiej wersji będziecie używać, zgodnie z dokumentacją:
The cluster tag is not required in versions v2.1.2 to v2.4.1, unless a cluster tag for another cluster is present.
W naszym wypadku jest to wersja v2.11.0, więc musimy dodać ten tag. Więcej informacji znajdziecie pod tym adresem https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/deploy/subnet_discovery/ oraz https://docs.aws.amazon.com/eks/latest/userguide/alb-ingress.html
Ok, ostatnim krokiem do sukcesu jest instalacji kontrolera przy pomocy Helm, robimy to z pomocą polecenia
helm install aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=LearningCluster --set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controller --set vpcId=vpc-0a106d2b28f0a1b5c --set region=eu-central-1
Tutaj bardzo ważna rzecz, musimy ustawić swoje vpcId oraz region, aby instalacja przeszła pomyślnie. Jeżeli zrobiliśmy wszystko poprawnie, to poniższe polecenie
k get po -n kube-system | grep aws-load-balancer-controller
Powinno nam zwrócić 2 rekordy ze statusem running, jak poniżej
Test kontrolera AWS Load Balancer
Ostatni krok jaki nam został to test, czy wszystko poprawnie skonfigurowaliśmy. W tym celu potrzebujemy utworzyć 3 pliki
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
selector:
matchLabels:
app: nginx-deploy
template:
metadata:
labels:
app: nginx-deploy
spec:
containers:
- name: nginx-deploy
image: nginx
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 80
service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-deploy
spec:
selector:
app: nginx-deploy
type: NodePort
ports:
- port: 80
targetPort: 80
ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/tags: Environment=Dev
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'
alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:eu-central-1:177394270612:certificate/e4550623-fd28-4152-a303-d49a153effff
alb.ingress.kubernetes.io/ssl-redirect: '443'
labels:
name: nginx-ingress
spec:
ingressClassName: alb
rules:
- host: ingress.cloud-devops.eu
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: nginx-deploy
port:
number: 80
W powyższym ingresie trzba dokonać kilku zmian:
alb.ingress.kubernetes.io/certificate-arn – tutaj należy podać ARN do certyfikatu AWS waszej domeny
host: ingress.cloud-devops.eu – w tym miejscu należy podać domenę, na której ma otworzyć Wam się deploy
Jeżeli wszystko ok, to po wykonaniu polecenia
k get ingress
Powinniście zobaczyć podobny wynik do mojego
Dodawania LB chwilę trwa, więc trzeba się uzbroić w cierpliwość i międzyczasie, w Route53 o ile macie tam swoją domenę, trzeba dodać alias tzn przekierować domenę ustawioną w ingress, na DNS load balancera. Po tych wszystkich zabiegach, po wejściu pod adres domeny, powinniście zobaczyć poniższy ekran
To by było na tyle, odnośnie instalacji oraz konfiguracji kontrolera ALB na klastrze EKS. Mam nadzieję, że mój post komuś się przyda 🙂