DevOps

Terraform์„ ์ด์šฉํ•œ EKS ํด๋Ÿฌ์Šคํ„ฐ ์ƒ์„ฑ ๋ฐ ์„œ๋น„์Šค ๋ฐฐํฌ

์šฐ์ œํ˜ 2023. 12. 18. 16:15
๐Ÿ’ก ์‚ฌ์ „์ค€๋น„
  1. Terraform ์‚ฌ์šฉ์„ ์œ„ํ•œ ํ™˜๊ฒฝ์„ธํŒ…์„ ์ง„ํ–‰ํ•ด์ค€๋‹ค.
  2. EKS ํด๋Ÿฌ์Šคํ„ฐ ์ƒ์„ฑ Terraform ์ฝ”๋“œ ์ค€๋น„

#1 ํ…Œ๋ผํผ ์‹คํ–‰

eks-terraform-final ์••์ถ•์„ ํ‘ผ๋’ค eks-terraform-final๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋“ค์–ด๊ฐ€์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…๋ น์„ ์ง„ํ–‰

terraform init

terraform plan 

terraform apply →< yes

15~20๋ถ„์ •๋„ IAM ๋ฐ VPC์™€ ํด๋Ÿฌ์Šคํ„ฐ๋“ฑ ๋ฆฌ์†Œ์Šค๋“ค์ด ์ƒ์„ฑ๋œ๋‹ค.

 

๐Ÿ’ก Trouble Shooting

kubernetes ์ฝ˜์†” ์ ‘๊ทผ ๊ถŒํ•œ ์ด์Šˆ

#2 AWS Load Balancer ์ปจํŠธ๋กค๋Ÿฌ ์ƒ์„ฑ

https://catalog.us-east-1.prod.workshops.aws/workshops/9c0aa9ab-90a9-44a6-abe1-8dff360ae428/ko-KR/60-ingress-controller/100-launch-alb

v2_5_4_full.yaml
0.03MB
v2_5_4_ingclass.yaml
0.00MB
iam_policy.json
0.01MB

์„ค์น˜ ๊ณผ์ •

IAM OIDC(OpenID Connect) identity Provider๋ฅผ ์ƒ์„ฑ

eksctl utils associate-iam-oidc-provider  --region us-east-2   --cluster eks-JaeHyuk  --approve

AWS Load Balancer Controller์— ๋ถ€์—ฌํ•  IAM Policy๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ž‘์—…

aws iam create-policy   --policy-name AWSLoadBalancerControllerIAMPolicy  --policy-document file://iam_policy.json

AWS Load Balancer Controller๋ฅผ ์œ„ํ•œ ServiceAccount๋ฅผ ์ƒ์„ฑ

eksctl create iamserviceaccount   --cluster eks-JaeHyuk  --namespace kube-system  --name aws-load-balancer-controller  --attach-policy-arn arn:aws:iam::871065065486:policy/AWSLoadBalancerControllerIAMPolicy --override-existing-serviceaccounts  --approve 

์ธ์ฆ์„œ ๊ตฌ์„ฑ์„ ์›นํ›…์— ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋„๋ก TLS์ธ์ฆ์„œ๋ฅผ ์ž๋™์œผ๋กœ ํ”„๋กœ๋น„์ €๋‹ ๋ฐ ๊ด€๋ฆฌํ•˜๋Š” ์˜คํ”ˆ ์†Œ์Šค ์„ค์น˜

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.12.0/cert-manager.yaml 

ํด๋Ÿฌ์Šคํ„ฐ์— ์ปจํŠธ๋กค๋Ÿฌ ์ถ”๊ฐ€

kubectl apply -f v2_5_4_full.yaml 
kubectl apply -f v2_5_4_ingclass.yaml 

์„ค์น˜ ํ™•์ธ

kubectl get deployment -n kube-system aws-load-balancer-controller 
kubectl get sa aws-load-balancer-controller -n kube-system -o yaml

์ข…ํ•ฉ ์Šคํฌ๋ฆฝํŠธ

aws eks update-kubeconfig --region us-east-2   --name eks-JaeHyuk 

eksctl utils associate-iam-oidc-provider  --region us-east-2   --cluster eks-JaeHyuk  --approve
aws iam create-policy   --policy-name AWSLoadBalancerControllerIAMPolicy  --policy-document file://iam_policy.json
eksctl create iamserviceaccount   --cluster eks-JaeHyuk  --namespace kube-system  --name aws-load-balancer-controller  --attach-policy-arn arn:aws:iam::871065065486:policy/AWSLoadBalancerControllerIAMPolicy --override-existing-serviceaccounts  --approve 

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.12.0/cert-manager.yaml 
kubectl apply -f v2_5_4_full.yaml 
kubectl apply -f v2_5_4_ingclass.yaml 

kubectl get deployment -n kube-system aws-load-balancer-controller 
kubectl get sa aws-load-balancer-controller -n kube-system -o yaml
๐Ÿ’ก Trouble Shooting

 

aws-load-balancer-controller ๊ฐ€ ์ž˜ ์ด๋ค„์กŒ๋Š”์ง€๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ๊ฐ™์ด ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€์•ผํ•˜์ง€๋งŒ ๊ฐ„ํ˜น ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋‹ค ๋ณด๋ฉด 0/1 ์ด ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข…์žˆ๋‹ค.

์ •์ƒ์ ์ธ ๋ชจ์Šต

#3 ECR ์ด๋ฏธ์ง€ ํ‘ธ์‰ฌ

๐Ÿ’ก ๋จผ์ € ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ์œ„ํ•ด ๋ฐฐํฌํ•  ์„œ๋น„์Šค๋ฅผ ๋ฏธ๋ฆฌ ๋„์ปคํ™”ํ•ด๋ณด๋ฉด์„œ ๋„์ปคํ™” ๊ณผ์ •์—์„œ ์ด๋ฏธ์ง€ ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š”์ง€ ๋จผ์ € ํ™•์ธํ•˜๋Š”๊ฒƒ์ด ์ข‹๋‹ค.

์„œ๋น„์Šค ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ aws ecr ์ €์žฅ์†Œ๋ฅผ ์ด์šฉํ•  ๊ฒƒ์ด๋ฉฐ ๋‹ค์Œ๊ณผ๊ฐ™์€ ๋ช…๋ น์–ด๋กœ ์‰ฝ๊ฒŒ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

์„œ๋น„์Šค ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ ์ด๋™

cd ์„œ๋น„์Šค ๋””๋ ‰ํ† ๋ฆฌ

ecr ๋ ˆํผ์ง€ํ† ๋ฆฌ ์ƒ์„ฑ

aws ecr create-repository --repository-name osint-flask --image-scanning-configuration scanOnPush=true --region us-east-2

์ธ์ฆ ํ† ํฐ์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋Œ€ํ•ด Docker ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ธ์ฆ

aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin 871065065486.dkr.ecr.us-east-2.amazonaws.com

๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œ(์ด๋ฏธ์ง€๋ฅผ ์ด๋ฏธ ๋นŒ๋“œํ•œ ๊ฒฝ์šฐ์—๋Š” ์ด ๋‹จ๊ณ„๋ฅผ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ๋‹ค.)

docker build -t jenkinsflask .

๋นŒ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ด๋ฏธ์ง€์— ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ํ‘ธ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

docker tag jenkinsflask:latest 871065065486.dkr.ecr.us-east-2.amazonaws.com/jenkinsflask:latest

๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ์ด ์ด๋ฏธ์ง€๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•œ AWS ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋กœ ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค.

docker push 871065065486.dkr.ecr.us-east-2.amazonaws.com/jenkinsflask:latest

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด๋ฏธ์ง€ ๋ฐฐํฌ๊ฐ€ ์™„๋ฃŒ๋˜์–ด์žˆ๋‹ค.

์ข…ํ•ฉ ์Šคํฌ๋ฆฝํŠธ

cd ์„œ๋น„์Šค ๋””๋ ‰ํ† ๋ฆฌ

aws ecr create-repository --repository-name osint-flask --image-scanning-configuration scanOnPush=true --region us-east-2
aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin 871065065486.dkr.ecr.us-east-2.amazonaws.com

docker build -t osint-flask .
docker tag osint-flask:latest 871065065486.dkr.ecr.us-east-2.amazonaws.com/osint-flask:latest
docker push 871065065486.dkr.ecr.us-east-2.amazonaws.com/osint-flask:latest

#4 ์„œ๋น„์Šค ๋ฐฐํฌ

๋‹ค์Œ๊ณผ ๊ฐ™์ด EKS ํด๋Ÿฌ์Šคํ„ฐ์— ์„œ๋น„์Šค๋ฅผ ๋ฐฐํฌํ•˜๊ธฐ์œ„ํ•ด YAML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.

ํ•„์ž๋Š” FALSK๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค๋ฅผ ๋ฐฐํฌํ•œ๋‹ค.

  1. flask-deployment.yaml:
    • ์ด ํŒŒ์ผ์€ Kubernetes Deployment๋ฅผ ์ •์˜
    • Deployment๋Š” Pod์˜ ๋ ˆํ”Œ๋ฆฌ์นด๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
    • Flask ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํฌํ•จ๋œ Pod์ด ๋ฐฐํฌ
  2. flask-service.yaml:
    • ์ด ํŒŒ์ผ์€ Kubernetes Service๋ฅผ ์ •์˜
    • Service๋Š” ์—ฌ๋Ÿฌ Pod ๊ฐ„์˜ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ œ๊ณต
    • Flask ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ๋ฐ ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑ๋œ ์„œ๋น„์Šค๋ฅผ ์ •
  3. flask-ingress.yaml:
    • ์ด ํŒŒ์ผ์€ Kubernetes Ingress๋ฅผ ์ •์˜
    • Ingress๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์˜ ์„œ๋น„์Šค๋กœ์˜ HTTP ๋ฐ HTTPS ๋ผ์šฐํŒ… ๊ทœ์น™์„ ์ •์˜
    • Flask ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ์™ธ๋ถ€์—์„œ์˜ HTTP ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ํŠน์ • ๊ฒฝ๋กœ์— ๋”ฐ๋ผ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋น„์Šค๋กœ ๋ผ์šฐํŒ…ํ•˜๋Š” ๊ทœ์น™์„ ์ •์˜

flask-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: osint-flask
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: osint-flask
  template:
    metadata:
      labels:
        app: osint-flask
    spec:
      containers:
        - name: osint-flask
          image: 871065065486.dkr.ecr.us-east-2.amazonaws.com/osint-flask:latest
          imagePullPolicy: Always
          ports:
            - containerPort: 5000

flask-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: 'osint-flask-ingress'
  namespace: default
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/group.name: eks-demo-group
    alb.ingress.kubernetes.io/group.order: '1'
spec:
  ingressClassName: alb
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: 'osint-flask'
                port:
                  number: 5000

flask-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: osint-flask
  annotations:
    alb.ingress.kubernetes.io/healthcheck-path: '/'
spec:
  selector:
    app: osint-flask
  type: NodePort
  ports:
    - port: 5000 # ์„œ๋น„์Šค๊ฐ€ ์ƒ์„ฑํ•  ํฌํŠธ
      targetPort: 5000 # ์„œ๋น„์Šค๊ฐ€ ์ ‘๊ทผํ•  pod์˜ ํฌํŠธ
      protocol: TCP

 

๋ฐฐํฌ ๋ช…๋ น์–ด

aws eks update-kubeconfig --region us-east-2 --name eks-JaeHyuk
kubectl apply -f flask-deployment.yaml
kubectl apply -f flask-service.yaml
kubectl apply -f flask-ingress.yaml

#1 ~ #4 ์Šคํฌ๋ฆฝํŠธ (ecr ์ด๋ฏธ์ง€ ๋ฐฐํฌ ๋˜์—ˆ๋‹ค๋Š” ๊ฐ€์ •)

์ฝ”๋“œ ๊ตฌ์„ฑ

eks-terraform-final
    โ””โ”€โ”€ script
        โ”œโ”€โ”€ ingrass
        โ”‚   โ”œโ”€โ”€ iam_policy.json
        โ”‚   โ”œโ”€โ”€ v2_5_4_full.yaml
        โ”‚   โ””โ”€โ”€ v2_5_4_ingclass.yaml
        โ”œโ”€โ”€ service
        โ”‚   โ”œโ”€โ”€ flask-deployment.yaml
        โ”‚   โ”œโ”€โ”€ flask-ingress.yaml
        โ””โ”€โ”€ โ””โ”€โ”€ flask-service.yaml
@REM aws-auth ------------------

eksctl create iamidentitymapping  --cluster eks-JaeHyuk --arn arn:aws:iam::871065065486:user/JaeHyuk --username JaeHyuk  --group system:masters

@REM ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ ๋งŒ๋“ค๊ธฐ -----------------------------------------------------
cd script\ingrass

aws eks update-kubeconfig --region us-east-2   --name eks-JaeHyuk 
eksctl utils associate-iam-oidc-provider  --region us-east-2   --cluster eks-JaeHyuk  --approve
aws iam create-policy   --policy-name AWSLoadBalancerControllerIAMPolicy  --policy-document file://iam_policy.json
eksctl create iamserviceaccount   --cluster eks-JaeHyuk  --namespace kube-system  --name aws-load-balancer-controller  --attach-policy-arn arn:aws:iam::871065065486:policy/AWSLoadBalancerControllerIAMPolicy --override-existing-serviceaccounts  --approve 

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.12.0/cert-manager.yaml 
kubectl apply -f v2_5_4_full.yaml 
kubectl apply -f v2_5_4_ingclass.yaml 

kubectl get deployment -n kube-system aws-load-balancer-controller 
kubectl get sa aws-load-balancer-controller -n kube-system -o yaml 

@REM ์‚ญ์ œ
pause
kubectl delete -f v2_5_4_ingclass.yaml
kubectl delete -f v2_5_4_full.yaml
kubectl delete -f cert-manager.yaml

eksctl delete iamserviceaccount  --cluster eks-JaeHyuk  --namespace kube-system  --name aws-load-balancer-controller
aws iam delete-policy  --policy-arn arn:aws:iam::871065065486:policy/AWSLoadBalancerControllerIAMPolicy
eksctl utils disassociate-iam-oidc-provider  --region us-east-2  --cluster eks-JaeHyuk

@REM ์žฌ์„ค์น˜

eksctl utils associate-iam-oidc-provider  --region us-east-2   --cluster eks-JaeHyuk  --approve
aws iam create-policy   --policy-name AWSLoadBalancerControllerIAMPolicy  --policy-document file://iam_policy.json
eksctl create iamserviceaccount   --cluster eks-JaeHyuk  --namespace kube-system  --name aws-load-balancer-controller  --attach-policy-arn arn:aws:iam::871065065486:policy/AWSLoadBalancerControllerIAMPolicy --override-existing-serviceaccounts  --approve 

kubectl get deployment -n kube-system aws-load-balancer-controller 
kubectl get sa aws-load-balancer-controller -n kube-system -o yaml 

cd ../../

@REM ์„œ๋น„์Šค ๋ฐฐํฌ ----------------------------------------------------------------------
pause

cd D:\wpgur\terraform\eks-terraform-final\JUNGSINT_menifest

aws eks update-kubeconfig --region us-east-2 --name eks-JaeHyuk
kubectl apply -f flask-deployment.yaml
kubectl apply -f flask-service.yaml
kubectl apply -f flask-ingress.yaml

powershell -Command "echo http://$(kubectl get ingress/osint-flask-ingress -o jsonpath='{.status.loadBalancer.ingress[*].hostname}')/"

cd ../