이번 글에서는 kops를 활용하여 AWS 내에 쿠버네티스 클러스터를 구축하는 실습을 해볼것이다.
처음에는 쿠버네티스 클러스터를 public network로 구축해 볼 것이고, 그 다음에는 private network로 구축하고 바스티온(bastion) 인스턴스를 만들어서 클러스터에 접근해 볼 것이다.
이 글의 순서는 다음과 같다.
- kops란 무엇인가?
- 실습 전 준비사항
- kops로 AWS에 쿠버네티스 클러스터 구축하기(public)
- 쿠버네티스 private 클러스터 구축 후 바스티온 서버 구축하기
- 쿠버네티스 클러스터 테스트
1. kops란 무엇인가?
kops(Kubernetes Operation)이란 쿠버네티스 생성 및 관리를 쉽게 하도록 도와주는 오픈소스 툴로서, 프로덕션 레벨의 쿠버네티스 클러스터를 간단한 CLI 명령을 통해 생성, 관리, 업그레이드, 삭제할 수 있도록 지원한다. 또한 쿠버네티스 클러스터의 마스터노드 HA구성 등 다양한 옵션을 간단한 명령어로 손쉽게 설정할 수 있으며, terraform을 통해 프로비저닝 할 수 있다는 장점도 있다. kops는 설치대상으로 AWS를 공식 지원하고 GCE와 OpenStack은 베타, vSphere는 알파버전을 지원한다.
요즘에는 AWS EKS가 나와서 굳이 kops를 활용해서 AWS에 쿠버네티스 클러스터를 구축할 필요가 있냐고 생각할 수도 있다. 하지만 지금 테스트 프로젝트를 준비하고 있는데, EKS는 가격적으로도 부담이 많이 되기도 하고(시간당 0.1USD), 쿠버네티스 마스터노드는 1개만 띄울 생각에 kops로 쿠버네티스 클러스터 구축을 진행하기로 했다(마스터노드의 수는 Raft알고리즘 특성 상 홀수로 유지하는 것이 좋으며, 두 개의 마스터노드는 한개만도 못한 결과를 초래한다). 또한 kops로 쿠버네티스 구축을 해보면서 AWS에서는 어떤 방식으로 쿠버네티스 클러스터가 구축되고 동작을 하는지에 대한 이해를 해보면 좋을 것 같아서 시작하게 되었다.
2. 실습 전 준비사항
실습을 진행하기 위해서는 다음과 같은 준비사항이 필요하다.
- 실습을 진행할 EC2 인스턴스(t3a.nano) 생성
- 실습을 진행할 IAM계정 및 권한 생성
2-1. 실습을 진행할 EC2 인스턴스(t3a.nano) 생성
로컬PC에서 쿠버네티스 설치 및 관리를 진행해도 되지만, 그렇게 되면 쿠버네티스를 여러 장비에서 관리하게 될 경우 각 장비들마다 AWS CLI를 설치해야하고, 해당 장비들에서 접속을 직접하기 때문에 보안상으로도 문제가 있을 수 있다. 따라서 필자는 쿠버네티스 설치를 진행하고 관리를 할 EC2 인스턴스를 생성하였다. 하지만 해당 EC2 인스턴스 내에 쿠버네티스 클러스터가 생성되는건 아니기 때문에 높은 사양의 인스턴스는 필요없어서 t3a.nano로 생성하였다.
2-2. 실습을 진행할 IAM계정 및 권한
kops로 쿠버네티스를 설치하고 관리하기 위해서는 다음과 같은 5개의 권한이 필요하다.
AmazonEC2FullAccess
AmazonRoute53FullAccess
AmazonS3FullAccess
IAMFullAccess
AmazonVPCFullAccess
따라서 5개의 권한을 가진 IAM 계정을 만들어야 한다. 필자는 계정을 직접 만들진 않고 5개의 권한을 가진 그룹을 만든 후 해당 그룹에 계정을 포함시켰다(IAM 계정명 kops, IAM 그룹명 kops-group)
계정이 생성되면 엑세스키ID와 비밀 엑세스키는 꼭 기억해두도록 하자(EC2 인스턴스에서 kops를 설치하기 위해 해당 계정으로 접속할 때 쓰인다).
3. kops로 AWS에 쿠버네티스 클러스터 구축하기(public)
이제 kops를 활용하여 쿠버네티스 클러스터를 구축해보도록 하자.
쿠버네티스 구축은 다음과 같은 순서로 진행할 것이다.
- kops 및 kubectl 설치
- 쿠버네티스 클러스터 구축을 위한 환경설정
- kops를 활용한 쿠버네티스 클러스터 구축
3-1. kops 및 kubectl 설치
우선 EC2 인스턴스에 kops 및 kubectl을 설치해보자.
kubectl은 kops와 마찬가지로 쿠버네티스를 관리하기 위한 툴이다.
kops 설치 명령어 :
# wget -O kops https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)/kops-linux-amd64
# chmod +x ./kops
# sudo mv ./kops /usr/local/bin/
kubectl 설치 명령어 :
# wget -O kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
# chmod +x ./kubectl
# sudo mv ./kubectl /usr/local/bin/
설치 후 정상적으로 설치가 되었는지 확인해보자.
# kops version
# kubectl version
3-2. 쿠버네티스 클러스터 구축을 위한 환경설정
다음으로 쿠버네티스 클러스터 구축을 위한 환경설정을 진행할 것이다. EC2 인스턴스 접속한 후 aws configure 명령어로 조금 전 만든 IAM 계정정보를 입력하자. 해당 계정정보를 입력해야 AWS CLI 명령어를 통해 KOPS 설정 등을 진행할 수 있다.
[ec2-user@ ~]$ aws configure
AWS Access Key ID [None]: [엑세스 키 ID]
AWS Secret Access Key [None]: [비밀 엑세스 키]
Default region name [None]: ap-northeast-2
Default output format [None]:
[ec2-user@ ~]$
다음으로 AWS CLI 명령어를 통해 클러스터 정보를 저장할 S3 bucket을 생성하고, Versioning 기능을 활성화시키자.
# aws s3api create-bucket \
--bucket gajoa-k8s-bucket \
--region ap-northeast-2 \
--create-bucket-configuration LocationConstraint=ap-northeast-2
# aws s3api put-bucket-versioning \
--bucket gajoa-k8s-bucket \
--versioning-configuration Status=Enabled
[AWS Management Console] -> [S3]로 가면 명령어를 통해 생성한 S3 bucket을 확인할 수 있다.
다음으로 KOPS를 설치할 때 필요한 환경변수를 ~/.bash_profile에 작성하고 ~/.bash_profile을 적용한다. NAME 변수에는 쿠버네티스 클러스터 이름을 넣는데, Gossip 기반의 클러스터를 사용할 것이기 때문에 클러스터 이름은 .k8s.local로 끝나야 한다. Gossip 기반의 클러스터를 사용하게 되면 별도의 외부 도메인 등록 없이 클러스터를 생성할 수 있다.
~/.bash_profile 작성 :
export AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id)
export AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key)
export NAME=[Cluster NAME]
export KOPS_STATE_STORE=s3://[Bucket-NAME]
.bash_profile 적용 :
# . ~/.bash_profile
그리고 SSH Key Pair를 생성한다. SSH Key Pair가 없다면, 쿠버네티스 클러스터를 구축한 후 클러스터 내로 접속을 할 수가 없다.
[ec2-user@ ~]$ cd .ssh
[ec2-user@ .ssh]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa): k8s_rsa
Enter passphrase (empty for no passphrase): [비밀번호 입력]
Enter same passphrase again: [비밀번호 재입력]
Your identification has been saved in k8s_rsa.
Your public key has been saved in k8s_rsa.pub.
The key fingerprint is:
SHA256:F7Fl9tuJNts/kxcxdPMOzudpVdyZqhZk7ndzIz1LMU4 ec2-user@ip-192-168-1-92.ap-northeast-2.compute.internal
The key's randomart image is:
+---[RSA 2048]----+
| . + |
| * . o.|
| o o.B|
| + oB*|
| S = *oE=|
| . o..O.*|
| . o..*=|
| + o.%=|
| . . +.@|
+----[SHA256]-----+
[ec2-user@ .ssh]$ ls -al
total 12
drwx------ 2 ec2-user ec2-user 63 Mar 1 11:09 .
drwx------ 4 ec2-user ec2-user 123 Mar 1 11:09 ..
-rw------- 1 ec2-user ec2-user 391 Feb 29 14:00 authorized_keys
-rw------- 1 ec2-user ec2-user 1766 Mar 1 11:09 k8s_rsa
-rw-r--r-- 1 ec2-user ec2-user 438 Mar 1 11:09 k8s_rsa.pub
3-3. kops를 활용한 쿠버네티스 클러스터 구축
쿠버네티스 클러스터 구축 준비가 끝났으니 이제 kops를 활용하여 쿠버네티스 클러스터를 구축해보도록 하겠다.
kops create 명령어로 쿠버네티스 클러스터 생성을 위한 설정을 만들어보자. 해당 명령어를 수행한다고 해서 바로 클러스터가 만들어지는 것은 아니고 설정만 만들어진다(클러스터 생성은 kops update를 수행해야 한다). mater-size를 처음에는 t3a.micro로 했지만 메모리가 부족해서 클러스터 내 필수 리소스들이 계속 재기동이 되어 클러스터 접속 등에 문제가 있어 t3a.small로 변경하였다. 글을 보다보면 캡쳐 이미지에 마스터 노드가 t3a.micro로 되어 있는 경우가 간혹 있는데 이런 이유 때문이다.
# kops create cluster \
--master-zones ap-northeast-2a \
--zones ap-northeast-2a,ap-northeast-2c \
--state s3://gajoa-k8s-bucket \
--topology public \
--networking calico \
--master-size t3a.small \
--master-count 1 \
--node-size t3a.micro \
--node-count 1 \
--cloud aws \
$NAME
옵션값에 대한 간단 설명
- master-zones : 마스터가 사용할 AZ
- zones : 노드가 사용할 AZ
- state : 쿠버네티스 상태를 관리하는 S3 버킷명
- topology : 클러스터를 public network or private network 중 어떻게 오픈할지. public network일 경우 각 노드에 public ip가 할당되어 해당 ip를 통해 ssh로 접속할 수 있지만, private network인 경우는 public ip가 할당되지 않기 때문에 bastion 서버를 별도로 생성해서 bastion 서버를 통해 접속해야 함
- networking : calico, kopeio-vxlan, weave 등 cni 선택
- master-size : 마스터 노드의 인스턴스 타입
- master-count : 마스터 노드의 개수. 홀수로 작성해야 한다(Raft알고리즘)
- node-size : 워커 노드의 인스턴스 타입. 이 글은 클러스터 생성만을 위해 node-size를 작게 했는데 실제로 테스트기나 운영기에서 사용할 때는 메모리 4G 이상은 되야 무난하게 서비스가 굴러갈 것이다.
- node-count: 워커 노드의 인스턴스 개수
- cloud : cloud 종류
- $NAME : 클러스터 이름
이 외에도 master-volume, master-security-group, api-loadbalancer-type, admin-access, vpc, network-cidr, subnets, utility-subnets, image, cloud-labels 등 여러 파라미터가 있지만 이 글에서는 생략한다.
다음으로 조금 전 생성한 SSH Key Pair를 등록하자.
# kops create secret --name [클러스터명] sshpublickey admin -i ~/.ssh/k8s_rsa.pub
그 외에 클러스터 및 인스턴스그룹 정보 확인 및 수정을 위한 명령어는 다음과 같다. kops create 후 정보 확인 및 수정이 필요하면 사용하도록 하(예를 들면 인스턴스 타입이나 개수 등)
# kops get cluster --name [클러스터명] #클러스터 리스트 확인
# kops edit cluster --name [클러스터명] #클러스터의 설정 및 수정
# kops get ig --name [클러스터명] #클러스터 내 인스턴스그룹(ig) 리스트 확인
# kops edit ig --name [클러스터명] [인스턴스그룹명] #클러스터 내 인스턴스그룹(ig) 설정 및 수정
설정 정보를 확인 및 수정했으면 클러스터를 생성하자. kops update 명령어를 통해 클러스터를 생성한다.
클러스터 생성이 완료되기까지 시간이 조금 걸린다(대략 10분 정도)
# kops update cluster --name [클러스터명] #어떤 리소스가 변경될지 화면에 출력만 됨
# kops update cluster --name [클러스터명] --yes #실제 클러스터 반영(생성)
명령어를 수행하면 다음과 같이 마스터노드 및 워커노드용 EC2 인스턴스 & 로드밸런서 & VPC & 서브넷 & 보안그룹 등이 생성된다.
쿠버네티스 클러스터 생성이 완료되었는지 체크하고 싶으면 kops validate cluster 명령을 수행하면 된다.
# kops validate cluster --name [클러스터명] #클러스터 상태 확인
# watch -n 5 kops validate cluster --name [클러스터명] #클러스터 상태를 5초마다 확인
클러스터 생성이 완료되지 않았을 경우 VALIDATION ERRORS가 발생한다.
클러스터 생성이 완료되면 다음과 같이 출력된다.
클러스터 생성이 완료되면 kubectl 명령을 사용해서 쿠버네티스 클러스터 정보를 확인할 수 있다.
# kubectl get nodes #노드 목록 확인
# kubectl get pod --all-namespaces #파드 전체 목록 확인
클러스터 생성이 완료되었으니 클러스터에 SSH를 활용하여 접속해보자. 쿠버네티스 클러스터 topology 옵션값을 public으로 했기 때문에 쿠버네티스 클러스터는 public으로 생성되었고, 마스터노드 및 워커노드에 public ip가 할당되었기 때문에 해당 ip로 ssh를 통해 접속하면 된다.
ssh key를 ssh agent에 등록 :
[ec2-user@ ~]$ eval `ssh-agent -s`
Agent pid 3399
[ec2-user@ ~]$ ssh-add ~/.ssh/k8s_rsa #ssh 비밀키
Enter passphrase for /home/ec2-user/.ssh/k8s_rsa:[패스워드]
Identity added: /home/ec2-user/.ssh/k8s_rsa (/home/ec2-user/.ssh/k8s_rsa)
마스터노드에 접속 :
[ec2-user@ ~]$ ssh admin@[마스터노드 public ip]
The authenticity of host '[마스터노드 public ip]' can't be established.
ECDSA key fingerprint is SHA256:Rc+MlNJhqGOS92qflPeQk5SYqTJKpI8H5mINULAO+Ng.
ECDSA key fingerprint is MD5:57:2a:68:3b:9d:da:f0:d8:d1:83:b9:b7:b5:6a:d5:d6.
Are you sure you want to continue connecting (yes/no)? yes
마스터노드에서 도커 컨테이너 상태 확인 :
# sudo docker ps -a
만약 ssh agent를 활용해서 접속하는 것이 번거롭다면 다음과 같이 접속도 가능하다
# ssh -i ~/.ssh/k8s_rsa admin@[마스터노드 public ip]
위와 같이 진행하면 kops를 활용하여 aws에 쿠버네티스 클러스터를 구축할 수 있다. 쿠버네티스 클러스터를 public network로 구축하고 싶다면 위와 같이 진행하면 끝이다(바로 "5. 쿠버네티스 클러스터 테스트" 로 넘어가면 된다). 하지만 만약 쿠버네티스 클러스터를 private network로 구축하고 싶다면 아래 4장을 보면 된다.
만약 4장을 진행하고 싶다면 다음 명령어를 통해 쿠버네티스 클러스터를 삭제해주자.
# kops delete cluster --name [클러스터명] --yes
그리고 쿠버네티스 클러스터 상태 관리를 위해 만들어줬던 S3 버킷도 삭제해주자.
# aws s3 rb s3://[버킷명] --force #비어있지 않은 버킷 삭제
# aws s3 rb s3://[버킷명] #비어있는 버킷 삭제
원래는 위와 같은 방법으로 버킷 삭제가 가능하나, Versioning 기능 덕분에 버킷이 삭제되지 않는다. 그냥 [AWS Management Console]에서 삭제를 해주자.
4. 쿠버네티스 private 클러스터 구축 후 바스티온 서버 구축하기
쿠버네티스 클러스터를 public network로 구축하는 경우도 있지만 private network 클러스터로 구축할 경우도 분명히 존재한다(사내 시스템 개발 등).
그럼 쿠버네티스 클러스터를 private network로 구축하는 방법에 대해 알아보자.
쿠버네티스 클러스터를 private network를 구축하는 방법은 public network로 구축하는 방법과 크게 다르진 않다. 환경설정 등은 모두 동일하며(위 글 참고), kops create 시 --topology만 private으로 해주고 private network로 접속하는 통로인 바스티온(bastion) 서버만 추가로 구축해주면 된다.
여기서 주의해야 할 것이 있다. 만약 쿠버네티스 클러스터를 private network로 구축하게 되면, private subnet이 생성되며 그에 맞는 NAT게이트웨이가 생성되게 된다. 그렇게 되면 EC2 인스턴스 요금 외 추가요금이 발생할 수 있으니 한번 확인해보고 진행하도록 하자(NAT게이트웨이 시간당 0.059USD. https://aws.amazon.com/ko/vpc/pricing/ 참고)
4-1. 쿠버네티스 클러스터 생성(private network)
우선 환경설정은 모두 끝났다고 가정하고, kops create 시 topology를 private으로 해주자.
# kops create cluster \
--master-zones ap-northeast-2a \
--zones ap-northeast-2a,ap-northeast-2c \
--state s3://gajoa-k8s-bucket \
--topology private \
--networking calico \
--master-size t3a.small \
--master-count 1 \
--node-size t3a.micro \
--node-count 1 \
--cloud aws \
$NAME
다음으로 조금 전 생성한 SSH Key Pair를 등록하자.
# kops create secret --name [클러스터명] sshpublickey admin -i ~/.ssh/k8s_rsa.pub
다음엔 kops update 명령어를 통해 클러스터를 생성한다.
# kops update cluster --name [클러스터명] #어떤 리소스가 변경될지 화면에 출력만 됨
# kops update cluster --name [클러스터명] --yes #실제 클러스터 반영(생성)
쿠버네티스 클러스터 생성 완료여부는 kops validate cluster 명령어로 체크한다.
# kops validate cluster --name [클러스터명] #클러스터 상태 확인
# watch -n 5 kops validate cluster --name [클러스터명] #클러스터 상태를 5초마다 확인
4-2. 바스티온(bastion) 인스턴스 생성
쿠버네티스 클러스터 생성이 완료되었으면 이제 바스티온 인스턴스를 만들어보도록 하자. 원래 kops create 명령어 사용 시 --bastion 옵션으로 바스티온 인스턴스를 생성할 수 있지만, gossip 기반의 클러스터를 사용할 경우는 --bastion 옵션적용이 되지 않는다. 때문에 바스티온 인스턴스를 별도로 만들어줘야 한다.
우선 바스티온 설정을 생성하는 kops create 명령어를 수행하자. --subnet 옵션값인 utility-ap-northeast-2a는 우리가 맨 처음에 kops를 통해서 쿠버네티스 클러스터를 만들었을 때 생성된 public 서브넷이다. kops는 "utility-"라는 prefix를 명시된 AZ(가용영역)에 붙이고 서브넷을 생성하게 된다(kops create할 때 topology를 private으로 하게 되면 public서브넷(utility-)과 private 서브넷이 쌍으로 만들어진다).
# kops create instancegroup bastions --role Bastion --subnet utility-ap-northeast-2a --name [클러스터명]
위와 같이 명령어를 날리면 바스티온에 대한 설정 화면이 뜨게 된다. HA설정이나 size 등 설정정보를 수정할 수 있다.
apiVersion: kops.k8s.io/v1alpha2
kind: InstanceGroup
metadata:
creationTimestamp: null
name: bastions
spec:
image: kope.io/k8s-1.16-debian-stretch-amd64-hvm-ebs-2020-01-17
machineType: t2.micro
maxSize: 1
minSize: 1
nodeLabels:
kops.k8s.io/instancegroup: bastions
role: Bastion
subnets:
- utility-ap-northeast-2a
설정정보를 저장한 후 다음과 같이 명령어를 날려 바스티온 인스턴스를 생성한다.
# kops update cluster --name [클러스터명] --yes
그러고 [AWS Management Console] -> [EC2]로 가보면 바스티온 인스턴스가 생성된 것을 확인할 수 있다.
4-3. 바스티온(bastion) 인스턴스를 통한 쿠버네티스 클러스터 접속
이제 생성한 바스티온 인스턴스를 활용하여 쿠버네티스 클러스터에 접속해보도록 하겠다. 바스티온 인스턴스에 퍼블릭IP와 퍼블릭DNS가 할당되어 있지만, 보안그룹의 인바운드 정책을 보면 ssh가 외부 접속으로부터 열려있지 않다. 인바운드정책에서 ssh 외부 접속을 허용하던가 아니면 바스티온 로드밸런서는 외부접속이 허용되어있기 때문에 로드밸런서를 통해 접속하면 된다.
4-3-1. 바스티온 로드밸런서로 바스티온 인스턴스 접속->바스티온 인스턴스에서 마스터 인스턴스 접속
우선 ssh key를 ssh agent에 등록 후 바스티온 로드밸런서를 통한 바스티온 인스턴스 접속해보자(k8s_rsa는 ssh 비밀키이다).
# eval `ssh-agent -s`
# ssh-add ~/.ssh/k8s_rsa
Enter passphrase for /home/ec2-user/.ssh/k8s_rsa:[패스워드]
# ssh admin@[바스티온 로드밸런서 DNS이름]
[AWS Management Console]에서 로드밸런서 DNS 확인이 귀찮으면 다음과 같이 한번에 접속할 수도 있다.
# eval `ssh-agent -s`
# ssh-add ~/.ssh/k8s_rsa
Enter passphrase for /home/ec2-user/.ssh/k8s_rsa:[패스워드]
# ssh admin@`aws elb --output=table describe-load-balancers|grep DNSName.\*bastion|awk '{print $4}'`
그 다음 바스티온 인스턴스 내에서 쿠버네티스 마스터 인스턴스의 프라이빗DNS 혹은 프라이빗IP로 SSH를 통해서 접속하면 된다.
# ssh admin@[마스터노드 EC2인스턴스의 프라이빗DNS or 프라이빗IP]
4-3-2. ssh proxy를 통한 마스터 인스턴스 접속
만약 위와 같이 바스티온 인스턴스에 접속 후 마스터노드 인스턴스에 접속하는게 번거롭다면 다음과 같이 한번에 접속할 수도 있다.
# eval `ssh-agent -s`
# ssh-add ~/.ssh/k8s_rsa
Enter passphrase for /home/ec2-user/.ssh/k8s_rsa:[패스워드]
# ssh admin@[마스터노드 EC2인스턴스 프라이빗DNS or 프라이빗IP] -o "proxycommand ssh -W %h:%p admin@`aws elb --output=table describe-load-balancers|grep DNSName.\*bastion|awk '{print $4}'`"
4-3-3. ssh config를 통한 마스터 인스턴스 접속
만약 매번 주소를 치는 것이 번거롭다면, config파일을 만들어놓고 접속을 하자. 우선 config파일은 아래와 같다
~/.ssh/config :
Host bastion
Hostname [바스티온 ELB DNS명]
User admin
IdentityFile ~/.ssh/k8s_rsa
Host ip-172-20-*
IdentityFile ~/.ssh/k8s_rsa
User admin
ProxyCommand ssh -W %h:%p admin@bastion
~/.ssh/k8s_rsa는 위에서 필자가 생성했던 ssh 비밀키이며 두번째 Host에 명시된 ip-172-20-*는 마스터 인스턴스의 프라이빗 DNS다(필자는 마스터 인스턴스의 프라이빗 DNS가 ip-172-20으로 시작한다).
config 파일을 생성한 후 config 파일의 권한을 변경해야한다. 권한을 변경하지 않으면 config파일로 ssh 접근이 불가능하다.
# chmod 440 ~/.ssh/config
그리고 바스티온 서버나 마스터 서버로 접속해준다.
# ssh bastion
# ssh [마스터 인스턴스 프라이빗 DNS]
5. 쿠버네티스 클러스터 테스트
자 이제 쿠버네티스 클러스터도 완성되었으니 쿠버네티스 클러스터가 잘 동작하는지 테스트를 해 보겠다. 어려운 테스트는 아니고 그냥 간단한 pod를 만들어서 쿠버네티스 클러스터에 올려보도록 하겠다. 간단한 pod 배포용 yaml파일을 만들어보자.
test.yaml :
apiVersion: v1
kind: Pod
metadata:
name: test-pod
labels:
app: testapp
spec:
containers:
- name: test-container
image: busybox
command: ['sh', '-c', 'echo test && sleep 360']
그 다음 해당 yaml파일을 쿠버네티스 클러스터에 올려보도록 하자.
# kubectl apply -f test.yaml
그리고 pod 목록 및 로그를 확인해보면 해당 yaml파일이 정상적으로 올라간 것을 확인할 수 있다. 성공!!!
# kubectl get pod --all-namespaces -o wide #pod 목록 확인
# kubectl logs [pod명] #pod 로그 확인
마지막으로 쿠버네티스 클러스터가 구축된 AWS 구성도를 그려보면 아래와 같다.
※번외로
쿠버네티스 클러스터에 간단한 스프링부트 서비스를 띄웠을 때와 띄우지 않았을 때 워커노드(t3a.micro)의 메모리를 비교하면 다음과 같다
서비스 올리기 전 :
total used free shared buff/cache available
Mem: 972 545 121 3 305 289
Swap: 0 0 0
서비스 올린 후 :
total used free shared buff/cache available
Mem: 972 713 92 3 166 121
Swap: 0 0 0
운영하다보면 메모리와 CPU 문제로 워커노드 서버가 자꾸 뻗어버린다. 서버가 뻗어버리니 쿠버네티스 클러스터의 리소스들이 Pending 상태가 되어 구동되지 않는 일이 생긴다. 확인해보니 kswapd0 라는 프로세스가 CPU를 99%나 차지하는 일이 생겼는데, 메모리 부족이 그 원인이었다(배포 시 메모리가 오버되어서 kswapd0 프로세스가 실행되는 것으로 보인다). 해당 문제는 메모리 4G 이하의 인스턴스에서는 종종 발생하는 문제라고 한다. 워커노드(worker node)에 좀 더 높은 사양의 EC2 인스턴스가 필요할 것 같다.
참고
https://medium.com/faun/how-to-setup-a-perfect-kubernetes-cluster-using-kops-in-aws-b616bdfae013
https://swalloow.github.io/aws-kops
https://blog.2dal.com/category/kubernetes/
https://github.com/kubernetes/kops
https://myopswork.com/transparent-ssh-tunnel-through-a-bastion-host-d1d864ddb9ae
'IT > AWS' 카테고리의 다른 글
AWS kops 쿠버네티스 클러스터에 CI/CD 파이프라인(Pipeline) 만들기(CodeCommit, CodeBuild 활용) (0) | 2020.03.06 |
---|---|
AWS kops 쿠버네티스 관련 에러 정리(진행 중) (0) | 2020.03.06 |
AWS RDS 생성 후 EC2 인스턴스 내 서비스와 연동 (0) | 2020.02.20 |
AWS CloudFront + S3 + React 를 활용한 정적 웹페이지 만들기 (1) | 2020.02.18 |
AWS CodePipeline과 S3를 활용한 스프링부트 서비스 배포 (0) | 2020.02.18 |
댓글