

# 각 subnet의 id가 필요하다.
# role/elb = 1 : Public subnet
# role/internal-elb =1 : Private subnet
# role/yslee-cluster = shared :public, private 모두
aws ec2 create-tags \
-- resources <<subnet-id-0>>, <<subnet-id-0>>, .. \
-- tags Key=kubernetes.io/role/elb,Value=1 \
Key=kubernetes.io/role/internal-elb,Value=1 \
Key=kubernetes.io/cluster/yslee-cluster,Value=shared
aws ec2 create-tags \
-- resources subnet-0d8f8b992c8739fde subnet-03ca1d569fe5571ba \
-- tags Key=kubernetes.io/role/elb,Value=1 \
Key=kubernetes.io/role/internal-elb,Value=1 \
Key=kubernetes.io/cluster/yslee-cluster,Value=shared


eksctl utils associate-iam-oidc-provider --cluster yslee-cluster --region ap-southeast-2 --approve



# IAM 정책 다운로드 - AWS Load Balancer Controller가 AWS API 호출을 허용하는 정책
curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.3.1/docs/install/iam_policy.json
# 부하분산 관련 정책 생성
aws iam create-policy \
--policy-name AWSLoadBalancerControllerIAMPolicy \
--policy-document file://iam_policy.json


eksctl create iamserviceaccount \
--region=ap-northeast-2 \
--cluster=xxx-cluster \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--attach-policy-arn=arn:aws:iam::xxxxxxxx:policy/AWSLoadBalancerControllerIAMPolicy \
--override-existing-serviceaccounts \
--approve



# 간략한 정보
kubectl get serviceaccount -n kube-system aws-load-balancer-controller
# 더욱 상세한 정보 - Annotation 부분을 봐야한다.
kubectl describe serviceaccount -n kube-system aws-load-balancer-controller





curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod +x get_helm.sh
./get_helm
helm repo add eks https://aws.github.io/eks-charts
helm repo update



helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
-n kube-system \
--set clusterName=xxx-cluster \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller \
--set image.repository=602401143452.dkr.ecr.ap-northeast-2.amazonaws.com/amazon/aws-load-balancer-controller \
--set region=ap-northeast-2 \
--set vpcId=vpc-xxxxxxxxxxxxxxxx

# 삭제 방법
helm uninstall aws-load-balancer-contoller -n kube-system
release "aws-load-balancer-contoller" uninstalled

kubectl get deploy -n kube-system aws-load-balancer-controller
kubectl get pod -n kube-system


aws-load-balancer-controller라고 만들어진 것이 2개 생성되어 있다.
# 첫번째
kubectl describe pod -n kube-system aws-load-balancer-controller-6d969cf4-kclbz
# 두번째
kubectl describe pod -n kube-system aws-load-balancer-controller-6d969cf4-wcwwd


# nginx-00.yaml delete
kubectl delete -f nginx-00.yaml
# nginx-01.yaml
cp nginx-00.yaml nginx-01.yaml

vi nginx-01.yaml
# 작성한 내용
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: docker.io/yslee4050/yslee-nginx:v1.0
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
annotations:
service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
spec:
type: LoadBalancer
selector:
app: nginx
ports:
- port: 80
targetPort: 80




# 파드 안으로 접속
kubectl exec -it nginx-deploy-7cb4cc88f8-brv68 -- /bin/sh
# 현재 index.html 확인
cat /usr/share/nginx/html/index.html
# pod1이라는 문자로 대체
echo "pod1" > /usr/share/nginx/html/index.html
# 확인
curl localhost
kubectl exec -it nginx-deploy-7cb4cc88f8-n4q49 -- /bin/sh
cat /usr/share/nginx/html/index.html
echo "pod2" > /usr/share/nginx/html/index.html
curl localhost






vi nginx-02.yaml
# 작성한 내용
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: docker.io/yslee4050/yslee-nginx:v1.0
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
type: ClusterIP
selector:
app: nginx
ports:
- port: 80
targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-alb
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
spec:
ingressClassName: alb
defaultBackend:
service:
name: nginx-svc
port:
number: 80
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-svc
port:
number: 80

kubectl apply -f nginx-02.yaml
kubectl get ingress







(1) deploy,svc 삭제
kubectl delete -f nginx-02.yaml
(2) helm 제거
helm uninstall aws-load-balancer-controller -n kube-system
(3) iamserviceaccount 삭제
eksctl delete iamserviceaccount \
--cluster yslee-cluster \
--namespace kube-system \
--region ap-southeast-2 \
--name aws-load-balancer-controller

(4) role & policy 삭제
# 정책 관련 arn 확인
aws iam list-policies --scope Local | grep AWSLoadBalancerControllerIAMPolicy
# 연결된 entity 확인
aws iam list-entities-for-policy \
--policy-arn arn:aws:iam::xxxxxxxxxxxx:policy/AWSLoadBalancerControllerIAMPolicy
# policy 삭제
aws iam delete-policy \
--policy-arn arn:aws:iam::xxxxxxxxxxxx:policy/AWSLoadBalancerControllerIAMPolicy


(참고)
# Role detach
aws iam detach-role-policy \
--role-name eksctl-xxx-cluster-addon-iamserviceaccount-kube-system-aws-load-balancer-controller-Role1-XXXXXX \
--policy-arn arn:aws:iam::xxxxxxxxxxxxx:policy/AWSLoadBalancerControllerIAMPolicy
# 연결된 entity 확인
aws iam list-entities-for-policy \
--policy-arn arn:aws:iam::xxxxxxxxxxxx:policy/AWSLoadBalancerControllerIAMPolicy