쿠버네티스 일반

온프렘 아재의 eks 사용기

Jerry_이정훈 2022. 3. 6. 13:34
728x90

KANS 졸업 과제로 쿠버네티스 관련 내용 포스팅합니다. 가시다 님 감사합니다.

 

20년 차 아재로 온프렘, 쿠버네티스, Ansible만 하다가 아틀라스랩스 이직 후 1달 동안 aws, eks, 테라폼에 생존기 및 작업한 내역을 공유합니다.
 

아재도 적응할 수 있는 스타트업, 아틀라스랩스 회사 좋아요 ^^ 아틀라스랩스 많이 지원해 주세요. DevOps 엔지니어가 저 혼자라 힘듭니다. 저랑 같이 일할 수 있는 분 찾고 있습니다. 아이폰 통화녹음 텍스트 변환 1위 회사 아틀라스랩스. 넷플릭스의 규칙없음이 문화로 지켜지고 있는 회사입니다. 

 

https://www.atlaslabs.ai/7ec66638-7041-4d98-a52b-dbb16f841ea3 

 

온프렘 네이티브 k8s와 퍼블릭 eks는 정말 다르다는 걸 많이 느끼고 있습니다. 온프렘에 당연한 것들이 eks는 안되어 당황스럽네요. kubespray가 아니라 테라폼으로 설치해야 하고 서비스 타입은 로드밸런서가 아니라 인그레스를 계속 찍어내야 하고(로드밸런서 타입 만들면 그게 다 돈이니) kubeconfig 파일 형식도 다르고, 하나하나가 비용이라 어떤 인스턴스 타입, spot 인스턴스를 사용해야 할지 고민도 되고.

 

무엇보다 다양한 security group(방화벽 rule) iam role, policy, user, group 설정하는게 가장 까다롭네요. 같은 클러스터 내에서 컨트롤 플레인과 워커 노드 간 서로 방화벽 설정이 되어있어 별도 security group 열어주어야 합니다. metrics server의 api 응답을 안해서 찾아보니 방화벽이 막혀 api 응답을  못하고 있었습니다. 4443 port 오픈하고 해결하였습니다. ebs-csi-driver도 실행을 안해서 찾아보면 iamrole이 제대로 적용되지 않아서 였습니다. iamrole, iampolicy가 헷갈린 저는 문서를 보아도 이해가 잘 안되어 어려웠습니다.

 

1. 테라폼 이용 EKS 설치. 22년 3월 현재 최신 eks 모듈 버전(18.8.1) 이용 설치.

. 테라폼은 처음 사용하는데 module을 사용하면 나름 편리하게 사용할 수 있습니다.. locals, data 이런 게 잘 이해 안되어 고생했는데 다행히 구글링 해서 조금은 이해가 됩니다. 제 주요 설정 내역 공유합니다.

 

주요 설정 내역

 

  eks_managed_node_groups = {

    gpu = {

# gpu 인스턴스 사용하면 ami_type을 반드시 아래와 같이 변경합니다.

      ami_type      = "AL2_x86_64_GPU"

# GPU g5.2xlarge 인스턴스 사용. 현재는 오레곤 리전만 가능합니다.

      instance_types = ["g5.2xlarge"]

 

    worker = {

# 일반 인스턴스 ami type      

      ami_type      = "AL2_x86_64"

      instance_types = ["t3.xlarge"]

}

 

 eks_managed_node_group_defaults = {

(생략)
    disable_api_termination = false

    enable_monitoring       = true

 

    # iam_role_attach_cni_policy = false

    ebs_optimized           = true

 

    block_device_mappings = {

      xvda = {

        device_name = "/dev/xvda"

        ebs = {

          volume_size           = 50

# gp3 타입 볼륨 사용

          volume_type           = "gp3"

          iops                  = 3000

          throughput            = 150

          # encrypted             = true

          # kms_key_id            = aws_kms_key.ebs.arn

          delete_on_termination = true

        }

      }

    }

 

기타  vpc_nci_irsa, vpc module,  subnet module 등을 사용해서 새롭게 네트워크를 구성했습니다.

 

2. 아르고시디 App of Apps 사용

. 현재 아틀라스랩스는 아르고시디를 사용 중입니다. 전체 헬름 차트를 한번에 배포하기 위해서 app of apps 설정을 추가하였습니다. 아래 apps path를 추가하면 apps 디렉토리 밑에 있는 헬름 차트를 아르고시디가 한번에 배포합니다.

 

이런 형태로 한번에 여러 helm 차트를 한번에 설치 할 수 있습니다.

 

app of apps YAML 파일

 

apiVersion: argoproj.io/v1alpha1

kind: Application

metadata:

  name: root-apps

  namespace: argocd

  finalizers:

  - resources-finalizer.argocd.argoproj.io

spec:

  destination:

    namespace: argocd

    name: in-cluster

  project: default

  source:

# applications YAML 파일이 저장된 디렉토리 경로를 지정합니다..

    path: 06.argocd/01.app-of-apps/apps

    repoURL: https://github.com/XXX

    targetRevision: HEAD

  syncPolicy:

    automated:

      selfHeal: true

 

3. 원격 eks 클러스터 로컬 관리 설정

. configmap aws-auth에 iam user를 추가하고 로컬 pc의 kubeconfig 파일 ~/.kube/config 파일에 원격 클러스터 정보를 등록하면 원격 eks(온프렘도 포함하여) 클러스터 관리 가능합니다. 
. k ctx, k ns, kubeps1 3총사를 사용할 수 있고 자동완성, k alias for kubectl 클러스터 관리 작업 생산성이 3배는 증가합니다.

 

$ (⎈ |kr-prod:zeroth-ee) k describe cm aws-auth -n kube-system

Name:         aws-auth

Namespace:    kube-system

Labels:       <none>

Annotations:  <none>

(생략)

mapUsers:

----

- userarn: arn:aws:iam::(생략)

  username: jerry-admin

  groups:

    - system:masters

 

kubeconfig 파일 설정 내역

$ (⎈ |kr-prod:zeroth-ee) cat ~/.kube/config

apiVersion: v1

clusters:

- cluster:

    certificate-authority-data: (생략)

    server: (생략)

  name: kr-dev

contexts:

- context:

    cluster: kr-dev

    namespace: argocd

    user: kr-dev

# 이름은 임의로 지정하여 사용할 수 있습니다.

  name: kr-dev

kind: Config

preferences: {}

users:

- name: kr-dev

  user:

    exec:

      apiVersion: client.authentication.k8s.io/v1alpha1

      args:

      - --region

      - ap-northeast-2

      - eks

      - get-token

      - --cluster-name

      - kr-dev

      command: aws

      env: null

      interactiveMode: IfAvailable

      provideClusterInfo: false

4. ingress-nginx 로드밸런서를 default classic lb가 아닌 Network LoadBalancer 설정하고 인증서를  enable 하고 https to http로 변경하여 http port disable 하였습니다.

 

5. 온프렘 환경에서는 사설 IP, 사설 도메인/인증서를 사용하였는데 aws에서는 공짜 혹은 저렴하게 도메인을 사용할 수 있어 외부에서 접속되는게 편리하였습니다.

반응형

'쿠버네티스 일반' 카테고리의 다른 글

Strimzi Kafka Operator - Kafka 토픽 생성  (0) 2022.06.12
Strimzi Kafka Operator 실습  (0) 2022.06.10
스테이트풀셋 on Kubernetes  (0) 2022.02.06
Pause 컨테이너 정리  (0) 2022.01.12
Flannel CNI  (0) 2022.01.12