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 |