data engineering

rancher kubernetes add aws cluster (infrastructure)

qkqhxla1 2020. 1. 3. 14:14

저번에 aws를 처음으로 만지면서 인프라를 구축했었는데 글로 정리할만한 내용이 없었다. 이거 적어볼까? 하면 적을 내용이 그냥 aws gui에서 이거 하는거 찾아서 클릭하면 됨. 이런게 전부여서 저번에 내가 만든 쿠버네티스에 aws cluster를 추가한 내용을 어떻게 만들었는지 적어보겠다. 

infrastructure라는 단어가 뭔가 거창하다는 무게감을 주는데 주니어인 내가 만든 만큼 복잡한건 없다. aws는 책만보면 아 뭐야 간단하네? 그냥 gui에서 잘 찾아서 만들면 되는구나. 하는데 막상 실제로 해보면 어 뭐지...? 하면서 막힌다. 근데 한번만 해보면 많이 쉬워지니 공부를 위해서는 한번 직접 만들어보는걸 추천함.

 

우선 만들었던 인프라의 구성도다.

어떤 순서로 어떻게 만들었는지 대략적으로만 적겠다.

오른쪽 아래에 Rancher라는게 있는데, 이건 kubernetes를 gui로 쉽게 컨트롤할수 있는 orchestration툴이다. (그러니까 쿠버네티스가 이미 설치되어있다는거임.)

 

내가 할건 쿠버네티스에 aws cluster를 추가하는거다. aws cluster는 말 그대로 aws기반의 쿠버네티스 클러스터가 될거다. aws에는 쿠버네티스를 지원해주는 EKS란게 있다. 근데 EKS를 못 쓰는 이유가 있어서, aws가 아닌 idc에 설치하는것처럼 aws에서 ec2를 만들고 여기에 쿠버네티스를 설치하는 방식으로 진행했다.

 

0. 첫번째로 만든건 aws cluster의 핵심 control plane/etcd를 담당할 인스턴스 3개짜리 auto scaling이다. 무슨무슨 알고리즘에 의해서 control plane/etcd은 홀수갯수로 만들어야한다고 써있었다. 3개면 충분할거라 생각해서 3개를 생각해놓고, 

auto scaling그룹을 만들기 전에 랜쳐에서 aws-cluster를 생성한 후, control plane/etcd에 붙이는 스크립트를 가져왔다. (최근에 글적은 https://qkqhxla1.tistory.com/1025에 있는 아래 사진) 그리고 이 스크립트를 

요렇게 auto scaling만드는 도중 configure details탭에서 저기에 넣어주면 인스턴스가 올라가고 나서 저 스크립트가 자동으로 실행된다. 스케일을 3으로 설정해주면 알아서 3대의 인스턴스가 만들어지고, 저 스크립트에 의해서 자동으로 쿠버네티스에 붙게 되고 새 aws cluster의 control plane/etcd가된다.

이때 랜쳐에 붙으면서 저 ec2들이 ec2 관련 작업이 있으므로 저 인스턴스들에 적절한 iam롤이 붙어야 한다. 난 일단 모든 권한이 있는 만능 롤을 주긴 했는데 다음에 세부적인 롤로 설정해야할 시에는 잘 찾아보자.

control plane/etcd를 aws 인스턴스로 만들때 태그 넣는걸 잊지 말자. 여기를 보면 Key=kubernetes.io/cluster/<CLUSTERID>, Value=owned 이렇게 태그를 넣으라고 나와있다. 이게 없으면 실행이 제대로 안되니 주의하자.

 

1. 그다음은 worker이다. 쿠버네티스는 소수의 control plane/etcd와 다수의 worker가 필요하다. control plane/etcd는 master, worker는 slave개념은 아니고 서비스가 올라가는, 일하는 애들이다. 이것도 랜쳐에서 worker전용 스크립트를 가져와서 오토스케일링에 적어준 후 워커를 올렸다.(control plane/etcd이면서 동시에 worker일 수도 있음.)

worker가 잘 만들어졌으면 worker의 오토 스케일링에 target group이라는걸 붙여야 한다. 이유는 worker에 load balancer를 붙일건데, 이 load balancer를 붙이려면 target group이 필요하기 때문이다. 왜 바로 load balnacer에서 auto scaling group으로 바로 연결을 못하고 auto scaling group을 target group으로 묶어준 후 load balancer에서 target group을 봐야 하지..? 하는 의문이 있긴 한데 지금은 다른 이유가 있겠거니.. 하고 있다. 검색을 해봐도 검색을 잘 못해서인지 이유를 찾지 못하겠다. 시스템상으로 이런게 더 편한가보다.

 

target group을 만들때 하나의 포트를 지정할 수 있다. 이 타겟 그룹으로는 이 포트로만 들어올수 있다는 뜻이다. 특정 오토 스케일링 그룹으로 여러개의 포트를 열고 싶으면 타겟 그룹을 여러개 만들면 된다. 난 worker로 들어오는 포트가 80,443 포트 두개가 필요했으므로 저 포트 두개로 타겟그룹을 만든 후, auto scaling group에서 edit을 누른후 target group탭에 두개를 추가해준다. 

auto scaling group에 타겟 그룹을 지정한 후 aws에서 타겟 그룹 탭에서 해당 타겟 그룹을 보면 내가 만든 오토 스케일링 그룹들의 인스턴스로 보내지고있음을 확인할 수 있다.

 

2. 다음으로 만든건 Network load balancer다. 

로드밸런서는 alb(application load balancer)와 nlb(network load balancer)가 있다.(clb도 예전에 썼다고 하는데 요즘은 안쓴다고 들음) alb와 nlb의 차이는 만드는 페이지에서 나온다. http냐 tcp냐의 차이로 두개가 나뉘어진다. 나는 nlb가 필요해서 nlb를 만들었다. nlb에서는 여러개의 포트를 열 수 있다. 80번과 443번 두개를 열고, 각각 80,443번으로 들어올 경우 80,443번이 열린 target group으로 가도록 지정해준다.

처음에 nlb를 만들때

요렇게 Configure Routing에서 존재하는 target group을 지정해주고, 포트를 하나 넣어준다음 nlb를 만든다.

포트를 두개 이상 지정하고 싶으면 다 만들고 나와서 aws load balancer 탭에서 만든 로드밸런서를 검색한 후 Add listener에서 추가해준다.

만들어진 load balancer의 Description을 보면 Dns Name이 있다.

내가만든이름-9307fd5345345ea3433.elb.ap-northeast-2.amazonaws.com 뭐 이런 포맷인데 이 도메인을 통해서 80,443번으로 접속이 가능하다. worker에 서비스를 하나 올린 다음 Dns Name:80으로 접속해서 로드 밸런싱이 잘 되는지 체크해볼수 있다.

 

3. 잘 되는지 체크했으면 이제 route 53을 통한 새 url을 만들어야 한다. 위의 dns포맷은 가독성도 떨어지고 기억하기 너무 어렵기 때문이다. aws의 route 53페이지로 간다음 맞는 zone을 찾아들어간다. aws gui로도 url을 만들수 있는거로 아는데, 우리는 권한 문제 때문에 gui상으로는 못만들고, 특정 서버에 IAM role로 route 53을 수집할수 있는 권한을 주고, 그 서버로 ssh로 접속 후 거기서 cui로 작업해야 한다.

cui작업은 aws 공식 홈페이지(여기)에 잘 나와있다. hosted zone id는 모르면 따로 받은게 있는지 다른분에게 물어보자. 실행시키면 gui에서 확인할수 있고 도메인이 잘 추가되었는지는 아까 위에서 80,443번 포트를 열어놨으니 해당 도메인으로 웹 페이지에 접속해보거나 하면서 잘 되는지 테스트를 할 수 있다.

 

 

이상으로 간단하게 쿠버네티스에 aws cluster추가하기가 완료되었다.