가시다님의 PKOS 스터디를 진행하면서 작성을 합니다.
스터디는 AWS에서 KOPS를 이용하여 쿠버네티스를 설치하고 테스트를 진행합니다.
스터디에서는 Cloudformation을 이용하여 KOPS 배포를 진행하기에 Terraform & ansible로 배포하는 스크립트를 작성해 봤습니다.
스크립트를 시작하기 전에 AWS에서 다음의 작업을 필요합니다.
- Route53에 DNS 도메인 ( KOPS Cluster Name으로 사용됨 )
- 구축 및 테스트의 편의성을 위해 administraotr 권한을 가진 IAM User 생성
- 생성된 유저에 Access Key 생성
- Default VPC는 삭제
생성된 AWS Access Key와 Secret Key는 Ansible에서 사용이 됩니다.
Terraform을 이용하여 다음 서비스들을 배포합니다.
- VPC
- KOPS Client용 EC2
- KOPS에서 k8s 설정을 저장할 S3
Ansible을 이용하여 다음 작업들이 가능합니다.
생성된 AWS Access Key 및 Secre Key는 다음 위치에 작성합니다. 아래의 파일은 .gitignore로 git에는 올라가지 않으니 만드셔야 합니다.
roles/kops/vars/.secret
roles/test-deploy/vars/.secret
AWS_AccessKey: <생성된 Access Key>
AWS_SecretKey: <생성된 Secret Key>
-
install-kops : KOPS Client Ec2에 kubectl, kops 설치
-
create-cluster : KOPS를 이용한 K8S 생성
-
install-addons : K8S Plugin 설치
A. krew : k8s 패키지 매니저
B. kube-ctx : 멀티 클러스터에서 클러스터간 전환을 쉽게 해주는 플러그인
C. kube-ns : k8s에서 namespace 전환을 쉽게 해주는 플러그인
D. df-pv : k8s에서 PV가 실제로 사용하는 Disk 사용량을 쉽게 볼 수 있는 플러그인
E. get-all : k8s의 모든 리소스를 확인 할 수 있는 플러그인 ( 기본적인 get all은 ingress는 보여주지 않음 )
F. ktop : linux의 top처럼 k8s 자원을 확인 할 수 있는 플러그인
G. neat : yaml 형식을 가독성있게 출력해 주는 플러그인
H. oomd : Out of Memory로 죽은 pod 정보를 보여주는 플러그인
I. view-secret : k8s secret 정보를 복호화 해주는 플러그인
J. community-images : 이미지 저장소 신규 변경 점검 플러그인
K. kube-ps1 : bash or zsh 환경에서 context와 namespace를 표시해주는 플러그인
L. kubescape : DevOps를 위한 k8s 보안 플랫폼
-
info-cluster: K8S 정보 ( KOPS(Cluster Info, Instance Group, Instance, Node IP), K8S(Cluster Info, Nodes, pods) )
-
delete-cluster : 생성된 K8S 삭제
-
install-externaldns : External DNS Addon 설치
-
install-awslbcontroller : AWS Load Balancer Controller Addon 설치
-
update-kops : Kops 설정 업데이트 ( 업데이트에 사용되는 변수들은 다음 경로의 파일을 사용합니다. roles/kops/vars/update.yaml)
A. workerNodeSize : Worker Node Size 변경
- Worker Node Size 변경은 다음값들을 변경후에 실행하면 됩니다.
targetZone: nodes-ap-northeast-2a workerMinSize: 1 workerMaxSize: 1
B. nodeLocalDNSCache: Node Local DNS Cache 설정
- Node Local DNS Cach는 다음값을 변경후에 실행하면 됩니다.
nodeLocalDNSCache: true or false
C. maxPod: Max Pod 변경 ( 예정 )
-
install-harbor : Harbor 설치
- region의 ACM에 인증서가 미리 발급되어 있어야 합니다.
- Aws Load Balancer Controller 가 설치됩니다.
- ExternalDNS 가 설치됩니다.
- install-gitlab : Gitlab 설치
- region의 ACM에 인증서가 미리 발급되어 있어야 합니다.
- Aws Load Balancer Controller 가 설치됩니다.
- ExternalDNS 가 설치됩니다.
- install-argocd : Argocd 설치
- region의 ACM에 인증서가 미리 발급되어 있어야 합니다.
- Aws Load Balancer Controller 가 설치됩니다.
- ExternalDNS 가 설치됩니다.
- install-prometheus: Prometheus & AlertManager & Grafana 설치
- region의 ACM에 인증서가 미리 발급되어 있어야 합니다.
- Aws Load Balancer Controller 가 설치됩니다.
- ExternalDNS 가 설치됩니다.
- install-kwatch : Kwatch 설치
- secret yaml에 다음 정보가 있어야 합니다.
slack_webhook: <Slack Webhook URL>
-
install-loki : Loki & Promtail 설치
-
install-polaris : Polaris 설치
- Aws Load Balancer Controller 가 설치됩니다.
- ExternalDNS 가 설치됩니다.
-
mario-deploy : Mario 게임을 배포합니다.
-
mario-deploy-with-externaldns : Mario 게임을 ExternalDNS를 사용해서 보유한 도메인의 mario.<<도메인>> 으로 배포합니다.
-
netshoot-network-dump : aws vpc cni network 테스트를 할 수 있는 netshoot을 배포합니다.
-
deploy-nlb-http : http 테스트를 nlb를 사용하여 배포합니다.
-
deploy-nlb-https : https 테스트를 nlb를 사용하여 배포합니다.
-
deploy-nlb-proxyprotocol : proxyprotocol을 적용한 nlb를 배포합니다.
-
deploy-alb : http / https 테스트가 가능한 alb를 배포합니다.
-
deploy-alb-externaldns : http /https 테스트가 가능하며, ExternalDNS를 사용해서 보유한 도메인으로 접속 가능하게 배포합니다.
- Terraform으로 AWS 프로비저닝 진행
- 실행후 나온 EC2 Public IP 확인
- Ansible playbook 실행 (* 주의사항 : IP 마지막에 ,를 꼭 써줘야 합니다.)
예> ansible-playbook --private-key=<ec2 key pair location> -i ec2-user@<terraform에서 확인한 ip>, kops.yaml
Cluster 생성과 삭제를 빠르게 진행하면 AWS의 내부 DNS에서 도메인 갱신에 시간이 걸려 Cluster 생성이 되어도 Validate가 제대로 되지 않는 현상이 발생합니다.