EKS 관련 배포 정리

Glen·2023년 8월 21일
0
post-thumbnail

회사에서 eks로 컨테이너 기반 인프라 구축을 맡게 되었다.
정리 겸 구축했던걸 작성하고자 한다.

구성

  • argocd 전용 eks 구성(a account)
  • 서비스는 다른 어카운트(b account)에 eks 생성
  • b account에 k8s 정보를 확인하기 위해 배스천 생성

EKS

EKS 배포는 테라폼 모듈이 있어서 그걸로 진행했다.(정리 생략)

  • 만약 eks에 수정이 필요할때 helm 관련 리소스 가 모듈에 포함되어있는데 그거 때문에 테라폼으로 수정/삭제가 안됨.
  • 추후 모듈에서 helm 리소스 관련을 제거하고 별도 모듈로 묶어야 될거같다.

Terraform 문제점

  • 테라폼으로 eks 생성할때 complete가 뜨지 않고 오류 발생으로 제거해야할때
  • 이때 iam,sg가 테라폼으로 제거되지 않음. 수동으로 꼭 제거해주고 나서 plan,apply해야됨.

ArgoCD

  • eks를 먼저 배포함
  • 이후 helm으로 argocd 배포 진행

helm 배포

  • 아래 참고

  • helm으로 배포 하기 전, 네임스페이스 생성

    k create ns argocd
  • value.yaml의 ingress 확인

    ingress:
        enabled: true
        annotations:
          alb.ingress.kubernetes.io/force-ssl-redirect: 'false'
          alb.ingress.kubernetes.io/inbound-cidrs: <내부 ip로 설정>
          alb.ingress.kubernetes.io/scheme: internet-facing
          alb.ingress.kubernetes.io/target-type: instance
          alb.ingress.kubernetes.io/subnets: subnet~~
          alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'
          alb.ingress.kubernetes.io/ssl-redirect: '443'
          alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-northeast-2:123123123:certificate/1123123123123
          alb.ingress.kubernetes.io/backend-protocol: HTTP
          alb.ingress.kubernetes.io/healthcheck-port: traffic-port
          alb.ingress.kubernetes.io/healthcheck-protocol: HTTP
          alb.ingress.kubernetes.io/healthcheck-path: /
          alb.ingress.kubernetes.io/success-codes: '200-499'
        labels: {}
        ingressClassName: alb
    
        # -- List of ingress hosts
        ## Argo Ingress.
        hosts:
          - <사용할 도메인 지정>
          # eks 배포할때 external-dns도 같이 배포했기 때문에
            aws 계정에 같은 도메인이 존재한다면 알아서 route53적용됨
  • 앞서 생성한 네임스페이스에 배포 진행

    helm install prod-argocd . -n argocd

깜빡하고 ns를 지정하지않아 제거후 다시 배포할때 아래와같은 문제가 발생
Error: INSTALLATION FAILED: rendered manifests contain a resource that already exists. Unable to continue with install: CustomResourceDefinition "applications.argoproj.io" in namespace "" exists and cannot be imported into the current release: invalid ownership metadata; annotation validation error: key "meta.helm.sh/release-namespace" must equal "argocd": current value is "default"

  • 이때는 crd를 제거하고 다시 ns 지정해서 생성하면 된다.

     k delete crd applicationsets.argoproj.io  applications.argoproj.io appprojects.argoproj.io
  • 배포 후 admin 계정 초기 패스워드 확인

    k -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
  • 패스워드 변경

    #변경할 id로 argocd cli 로그인 후 
    argocd account update-password
    

클러스터 등록

  • argocd에 서비스를 배포할 eks 클러스터 등록하기 전 iam 권한 설정이 필요

IAM

  • aws a,b account가 있다.

조건

  • a bastion(ec2)에서 iam assume이 진행된다.
    1)a ec2의 인스턴스 프로파일이 a thanos-role을 받아온다.
    2)a ec2의 인스턴스 프로파일이 b thanos-role을 받아온다.
    3)a thanos-role일때 b thanos-role을 받아올수있다.
    4)b thanos-role일때 a thanos-role을 받아올수있다.

해당 iam role에 "신뢰할 수 있는 엔터티"를 각각 추가해준다.

  • a thanos-role
    • a ec2 인스턴스 role arn, b thanos-role arn
  • b thanos-role
    • a ec2 인스턴스 role arn, a thanos-role arn

Assume

  • 스크립트를 활용해서 bastion에서 iam assume을 진행한다.
    • 해당 스크립트를 alias등록 하면 편함~
    • a라고 등록해놨을때, a prod 하면 첫번째, a 입력하면 두번째 자격 받아옴.
#!/bin/bash
if [ "prod" == "$1" ]; then
        session=$(aws sts assume-role --role-arn arn:aws:iam::<b account>:role/thanos-role --role-session-name dex-thanos-role)
else
        session=$(aws sts assume-role --role-arn arn:aws:iam::<a account>:role/thanos-role --role-session-name ops-thanos-role)
fi

access=$( jq -r '.Credentials.AccessKeyId' <<< "$session" )
secret=$( jq -r '.Credentials.SecretAccessKey' <<< "$session" )
sts=$( jq -r '.Credentials.SessionToken' <<< "$session" )

export AWS_ACCESS_KEY_ID=$access
export AWS_SECRET_ACCESS_KEY=$secret
export AWS_SESSION_TOKEN=$sts

aws sts get-caller-identity

cluster add

  • iam 임시자격증명을 얻었으면 cluster 정보를 kube config에 업데이트 해준다
aws eks --region ap-northeast-2 update-kubeconfig --name <cluster name> --alias <config에 지정할 이름>
  • 이후 argocd에 클러스터를 등록 한다
argocd cluster add <kube config alias>
# 오류가 난다면 자격증명 새로받고 update-kubeconfig 진행후 재시도

timeout으로 클러스터 등록이 안된다면

  • 등록할 eks 보안그룹에 argocd를 등록해주거나 ip대역을 모르면 all open...
    • 저는 못찾아서 allopen 했...

Subnet Tag 추가

  • ingress를 alb로 사용하고있는데 이때 subnet에 아래와 같은 태그가 있어야 생성 가능.
    • elb : 외부 / internal-alb : 내부
    • 참고

k9s

  • k8s의 리소스 CRUD를 보다 간편하게 해주는 유틸리티 도구
    • 원래는 lens가 있었지만 현재는 유료라 고려대상에서 제외.
  • 먼저 get context로 확인
    • current에 *가 현재 사용하기로 설정된 값.

  • 자격증명이 만료됐으면 다시 신규로 받고나서 실행해야됨.
  • 사용하려면 아래 명령어로 진행
    k config use-context <context alias>
  • "k9s"로 아래와 같은 화면 확인 가능

pod에 shell 접속 하려는데 shell exec failed가 발생한다.

  • 확인해보니 k9s는 kubectl로 동작하는데, 배스천에서는 kubectl을 특정 경로에 두고 bashrc에 alias로 사용하고 있었다.
  • /usr/bin 밑에 kubectl을 복사해주고 해결함.

kubectx/kubens

  • context 빠르게 변경하는 도구 / ns 확인하는 도구

  • 원래라면...

    k config get-contexts...
    k config use-context <context >
    이후 k9s 실행
    
  • 설치방법

    sudo git clone https://github.com/ahmetb/kubectx /opt/kubectx
    sudo ln -s /opt/kubectx/kubectx /usr/local/bin/kubectx
    sudo ln -s /opt/kubectx/kubens /usr/local/bin/kubens
  • 실행

    kubectx / kubens
  • 저것도 길어서 alias 등록해서 kc / kns 로 사용중

  • kc만 입력하면 get-contexts

  • kc <context 명> : use-context

  • kc -이라고 입력하면 이전에 사용한 context로 변경해줌

  • kns로 현재 context에서의 ns를 모두 보여준다.

To be continue....

profile
어제보다 더 나은 엔지니어가 되자

0개의 댓글