소소한개발팁
article thumbnail
반응형

인프라 구축 과정

Kubernates의 Pod에서 사용 할 Docker Image 생성

  • Kubernates에서 사용할 환경변수를 사용하여 프로젝트 수정
# java application.yml
${env}

# python
import os
os.getenv('env')

 

  • Docker Image를 Docker hub에 배포
docker build . -t wjdgns2/sqc-backend:latest 
docker build . -t wjdgns2/sqc-frontend:latest 
docker build . -t wjdgns2/sqc-ai:latest 

docker login 

docker push wjdgns2/sqc-backend:latest
docker push wjdgns2/sqc-frontend:latest
docker push wjdgns2/sqc-ai:latest

 

EKS 구축하기

  •  IAM에서 AmazonEKSClusterPolicy 권한을 가지는 규칙 설정

 

  • VPC 구성

 

  • IAM에서 설치된 EKS 공급자 URL로 자격 증명 관리자 생성

 

반응형

 

EKS에 적용할 Node Group 정의

  • Node Group에서 이용할 Node에 대한 IAM에서 생성

 

참고 : https://docs.aws.amazon.com/eks/latest/userguide/create-node-role.html#create-worker-node-role

 

Amazon EKS node IAM role - Amazon EKS

Amazon EKS node IAM role The Amazon EKS node kubelet daemon makes calls to AWS APIs on your behalf. Nodes receive permissions for these API calls through an IAM instance profile and associated policies. Before you can launch nodes and register them into a

docs.aws.amazon.com

 

  • VPC CNI에 대한 역할을 IAM에서 생성

 

  • 정책은 AmazonEKS_CNI_Policy를 선택해준다.

 

신뢰관계에서 아래와 같이 변경한다.

aud": "sts.amazonaws.com" → sub": "system:serviceaccount:kube-system:aws-node"

 

이제 이 역할을 VPC CNI에 부여한다.

 

 

  • Node에 대한 보안 그룹 생성

 

  • Control Plane 에 대한 보안 그룹 정의( Cluster 보안 그룹 ) 

 

AWS CLI을 활용하여  Kubernates Service 배포 

 

  • AWS Configure로 계정에 접근
AWS Access Key ID [None]: your-access-key-id
AWS Secret Access Key [None]: your-secret-access-key
Default region name [None]: ap-northeast-2
Default output format [None]: json

 

  • 접근 후 명령어를 통해 Node Group 의 Status Check
aws eks describe-nodegroup --cluster-name SQC --nodegroup-name sqc-node-group

 

  • AWS Cli를 통한 클러스터 내 kubeconfig와의 연결 설정
# kubernates 파일이 있는 경로에서 
kubectl apply -f ./  

# 아래 명령어로 로컬 kubeconfig를 Cluster에 반영
 aws eks update-kubeconfig --region ap-northeast-2 --name SQC

 

  • SSH 접속을 위한 pem권한 변경 ( Windows )

접속 시 pem에 관련되서 안전하지 않다고 문제가 발생하여 아래와 같이 권한을 변경해줬습니다.

icacls ---.pem /inheritance:r /grant:r "%USERNAME%":r

 

/inheritance:r: 상속된 권한을 제거합니다.

/grant:r "%USERNAME%":r: 현재 사용자에 대해 읽기 전용 권한을 부여합니다.

 

  • Helm 설치 후 Nginx Ingress Controller 설치
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install nginx-ingress ingress-nginx/ingress-nginx

# ALB로 변경하기로 하여 삭제
helm uninstall nginx-ingress

 

 

  • AWS LoadBalancer 도입 [1]
 

AWS Load Balancer Controller 추가 기능 설치 - Amazon EKS

배포된 차트는 보안 업데이트를 자동으로 수신하지 않습니다. 새 차트가 사용 가능해지면 수동으로 업그레이드해야 합니다. 업그레이드 시 이전 명령에서 install을 upgrade로 변경하되, 이전 명령

docs.aws.amazon.com

 

를 참고해서 생성하면 되는데 현재 로컬 PC의 OS가 Window이므로 아래와 같은 명령어를 사용했습니다.

# chocolatey 설치
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

# eksctl 설치
choco install eksctl

# IAM 정책 파일 다운로드
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.5.4/docs/install/iam_policy.json" -OutFile "iam_policy.json"

# IAM 정책 생성
aws iam create-policy --policy-name sqcElb --policy-document file://iam_policy.json
eksctl create iamserviceaccount `
  --cluster=[Cluster Name]`
  --namespace=kube-system `
  --name=aws-load-balancer-controller `
  --role-name AmazonEKSLoadBalancerControllerRole `
  --attach-policy-arn=arn:aws:iam::[userId]:policy/sqcElb `
  --approve
helm install aws-load-balancer-controller eks/aws-load-balancer-controller `
  -n kube-system `
  --set clusterName=[Cluster Name] `
  --set serviceAccount.create=false `
  --set serviceAccount.name=aws-load-balancer-controller

 

 

  • 로드 밸런스 테스트를 위한 kubernates 파일 작성
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      run: nginx
  replicas: 2
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          ports:
            - containerPort: 80

---

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    run: nginx
spec:
  ports:
    - port: 80
      protocol: TCP
  selector:
    run: nginx
    
    
---

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: sqc-ingress
  annotations:
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/scheme: internet-facing
spec:
  ingressClassName: alb
  rules:
    - host: sqcapp.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: nginx
              port:
                number: 80
        - path: /api
          pathType: Prefix
          backend:
            service:
              name: sqc-backend-service
              port:
                number: 80
        - path: /front
          pathType: Prefix
          backend:
            service:
              name: sqc-frontend-service
              port:
                number: 80

 

 

  • Kubernates 파일 생성 시 자동으로 로드 밸런서가 생성됩니다. 아래의 이미지는 로드밸런서의 리스너 규칙과 조건이 만족할 경우 전달되는 대상 그룹에 대한 이미지입니다.

 

 

AWS Route 53에서 도메인 구입 후 반영

 

  • nginx 서비스 실행 화면 

 

참조

 

[EKS] ① Private Cluster 생성 (AWS 콘솔)

Cluster 역할 생성 IAM 콘솔에서 역할만들기 → 사용 사례 선택 : EKS - Cluster EKS - Cluster를 선택하고 다음 버튼을 누르면 AmazonEKSClusterPolicy 라는 정책이 기본적으로 붙어있다. 검토가 나올 때까지 다음

velog.io

 

반응형
profile

소소한개발팁

@개발자 뱅

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!