티스토리 뷰

리눅스 계정 패스워드 등 서버 설정을 하고, kops를 설치해봅니다.

sudo apt install net-tools #netstat 사용 위해 설치
sudo apt install unzip #zip 파일 unzip하기 위해 설치

sudo passwd root XXX #root 비밀번호를 XXX로 변경
sudo vi /etc/ssh/sshd_config # /PasswordAuth 엔터로 검색해서 PasswordAuthentication yes로 변경하면 키 대신 비밀번호로 인증 가능
sudo service sshd restart

kops는 도메인이 있는 상태로 연결하거나 없는 상태로 연결하는 두 가지가 있는데,

저는 장기간 사용이 아닌 단기 사이드 프로젝트이기 때문에 가비아를 통해 1년 500원하는 shop 도메인을 구매하였습니다.

도메인 적용은 바로바로 되지 않고 몇시간 ~ 24시간이 넘기도 하기 때문에 다른 설정 전에 미리 하는게 좋습니다.

현재는 .store 도메인이 500원으로 이벤트 중입니다. 

https://domain.gabia.com/regist/today_domain

freenom 같은 무료 도메인은 현재 이용 불가능하고 일부 무료 도메인 사이트(블로그, 티스토리용 도메인)는 네임서버 설정이 지원되지 않기 때문에, 무료 도메인을 구하기 매우 어렵고 무료 사이트보다 이벤트 중인 도메인을 구매하여 사용하는게 좋습니다.

 

AWS에서 kops로 도메인을 사용하여 쿠버네티스 클러스터를 구성하는 과정 코드는 맨 마지막에 다 모아놓았습니다.

kops 1.25.1, kubectl 1.26.1 버전입니다.

 

공식 kops 설치 절차

https://kops.sigs.k8s.io/getting_started/install/

 

1. 먼저 kubectl을 설치합니다

https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/

 

2. 공식 페이지 설치 절차 페이지에서 OS에 맞게 kops를 설치합니다.

 

3. AWS cli 설치 및 AWS에서 IAM 유저를 생성합니다.

https://kops.sigs.k8s.io/getting_started/aws/ - AWS에서 kops 설치 가이드

 

aws cli는 aws 콘솔에서 GUI로 하는 내용을 cli로 실행할 수 있습니다.

aws cli 설치 후 리눅스 서버에서 접속할 IAM 계정이 있어야 합니다.

AWS 웹 콘솔 화면에서 계정을 하나 만들고, 해당 계정의 액세스 키 아이디와 시크릿 키를  SSH에서 aws configure 한 후 입력하면 계정이 연동됩니다.

 

블로그 글을 보면 대부분 생성하는 User Group의 권한이 5개인데 

공식 문서에서는 7개입니다. 버전에 따라 변경사항이 있으므로 설치 과정은 항상 공식문서를 확인합니다.

공식 문서를 따라 IAM 계정 신규 생성 및 권한 설정을 한 후 aws configure를 다시 실행하여 신규 생성한 계정으로 설정합니다.

 

aws cli 계정을 설정한 후에는 

도메인에 따라 나뉘는데 저는 도메인을 타 사이트에서 구매했기 때문에 시나리오 2를 따라 AWS 가이드를 보고 진행하였습니다.

https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/domain-transfer-to-route-53.html

설명은 길지만 간단히 말하면

1. AWS 콘솔에서 Route53에 들어가서 create hosted zone을 눌러 public host zone을 생성, (호스트 존 이름은 임의 지정,저는 도메인으로 했습니다)

호스트 존을 새로 생성하면 레코드가 2개밖에 없습니다.

2. A 레코드로 EC2 인스턴스 public IPv4 주소를 등록합니다.

3. 이후 해당 호스트 존에 생성된 네임서버(NS에 있는 4개의 주소)를 도메인 사이트에서 구매한 도메인 설정(가비아 등)에 등록,

도메인 등록은 공식 문서처럼 dig ns로 확인 가능합니다. 등록됐다면 네임서버가 나옵니다.

dig ns subdomain.example.com #도메인 주소

이후 클러스터 정보를 저장할 버켓 생성 등을 진행하는데,

한국 리전에 인스턴스를 만들었다면 ap-northeast-2 를 사용합니다.

#버켓은 이름에 . 있으면 안되서 도메인에서 .을 -로 변경해서 등록 예) todaybrief-shop
aws s3api create-bucket \
    --bucket [버켓이름] \
    --region ap-northeast-2 \
    --create-bucket-configuration LocationConstraint=ap-northeast-2
#버전관리 추가
aws s3api put-bucket-versioning \
    --bucket [버켓이름] \
    --versioning-configuration Status=Enabled

aws ec2 describe-availability-zones --region ap-northeast-2

그 후 환경변수를 설정합니다.

클러스터 이름과 버켓 이름을 설정합니다.

공식문서에서 export를 이용해 환경변수를 사용하는데

ssh 접속 종료시 휘발되므로 계속 쓰려면 bashrc에 저장합니다.

#kops 환경변수 설정
#클러스터명은 cluster.도메인으로 생성함
echo "export NAME=[클러스터명]" >> ~/.bashrc
echo "export KOPS_STATE_STORE=s3://[버켓이름]" >> ~/.bashrc

kops에서 사용할 키페어를 만듭니다. (ppk로 생성, puttygen으로 pub키로 변환)

공개키는 EC2 서버에 올려두고 키가 있는 위치에 맞게 아래 parameter를 입력합니다.

 

설정을 모두 마친 후 kops create cluster를 하면 바로 클러스터가 생성되지 않고,

kops create cluster \
--name=${NAME} \
--cloud=aws \
--zones=ap-northeast-2a \
--discovery-store=${KOPS_STATE_STORE}/${NAME}/discovery  \
--topology public \
--master-size t2.medium \
--master-count 1 \
--node-size t2.medium \
--node-count 2 \
--node-volume-size=10 \
--master-volume-size=16 \
--ssh-public-key ./kops.pub

그 상태에서 edit 명령어로 수정할 수 있습니다.

클러스터 생성시 parameter는 이 블로그를 참고하였습니다. https://twofootdog.tistory.com/43

저는 공식문서의 예제에서 node size, master node size 등을 수정하였습니다. (기본은 마스터 1 노드 3이고 볼륨도 큽니다 사양도 t3입니다)

 

공식 문서에는 없지만 public key를 만들어 클러스터 내의 마스터 노드 등에 SSH 접속할 때 사용할 수 있습니다.

AWS 내에 인스턴스가 만들어지기 때문에 키가 없어도 AWS에서 인스턴스 connect해서 접속하고 패스워드 접속 허용할 수도 있지만 키로 접속하는 걸 권장합니다.

https://postlude.github.io/2021/06/22/k8s-by-kops/

 

kops update 명령어로 AWS에 인스턴스 등이 만들어지며 실제 클러스터가 생성됩니다.

클러스터 생성 후에도 변경 가능합니다.

kops update cluster --name ${NAME} --yes

#클러스터, 노드 정보 수정시 
kops edit cluster ${NAME}
kops edit ig nodes-XXXX #ig 이름

kops update cluster ${CLUSTER_NAME} --yes
#실행중인 클러스터 갱신시 rolling update 실행
#cloundonly 옵션으로 k8s api 호출하지 않고 aws api만 호출 가능
#kops rolling-update cluster ${NAME} --cloudonly --yes

클러스터 노드 정보 수정 화면

 

 

클러스터가 생성됐는지 다음 명령어로 확인 가능합니다.

kubectl get nodes

위와 같은 오류가 있으면 다음 명령어로 쿠버네티스 설정을 export 해줍니다.

kops export kubecfg --admin

https://kops.sigs.k8s.io/getting_started/kubectl/ 참고

vi ~/.kube/config

~/.kube/config 파일에서 쿠버네티스 설정을 볼 수 있습니다.(쿠버네티스 url 등)

 

 

 

클러스터를 삭제하려면 마찬가지로 kops delete에 --yes를 사용합니다. (--yes가 있어야 실제 클러스터가 삭제됩니다)

kops delete cluster --name ${NAME} --yes

 

 

 

전체 코드

sudo apt install net-tools
sudo apt install unzip
sudo passwd root #root 비밀번호 입력
sudo passwd ubuntu #기본 계정 ubuntu 비밀번호 입력

#aws cli 설치
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version

#AWS 콘솔에서 IAM 유저, 그룹 생성 후 유저, 그룹 생성 권한 허용시키고 
aws configure #해당 유저의 access key와 secret key, ap-northeast-2(리전) 입력해서 로그인

#IAM에 신규 그룹과 신규 유저 생성
aws iam create-group --group-name kops

aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonEC2FullAccess --group-name kops
aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonRoute53FullAccess --group-name kops
aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess --group-name kops
aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/IAMFullAccess --group-name kops
aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonVPCFullAccess --group-name kops
aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonSQSFullAccess --group-name kops
aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonEventBridgeFullAccess --group-name kops

aws iam create-user --user-name kops
aws iam add-user-to-group --user-name kops --group-name kops
aws iam create-access-key --user-name kops

# 새로 생성한 IAM 유저 kops의 액세스 키와 시크릿 키 입력, 리전은 ap-northeast-2
aws configure           # Use your new access and secret key here
aws iam list-users      # you should see a list of all your IAM users here

#export한 내용은 터미널 재시작하면 사라지므로 .bashrc에 환경변수 저장
echo "export AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id)" >> ~/.bashrc
echo "export AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key)" >> ~/.bashrc
source .bashrc #해야 적용됨

#kops 설치(v1.25.3)
#최신 버전
#curl -Lo 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
#v1.25.3 버전
curl -LO https://github.com/kubernetes/kops/releases/download/v1.25.3/kops-linux-amd64
chmod +x ./kops
sudo mv ./kops /usr/local/bin/

#kubectl 설치 1.26.1
#최신 버전
#curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
#1.26.1 버전
curl -LO "https://dl.k8s.io/release/v1.26.1/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
kubectl version --client

#Route53에서 도메인 등록, 도메인 사이트에 네임서버 등록


#클러스터 상태 저장할 bucket 설정
aws s3api create-bucket \
    --bucket [버켓이름] \
    --region ap-northeast-2 \
    --create-bucket-configuration LocationConstraint=ap-northeast-2
#버전관리 추가
aws s3api put-bucket-versioning \
    --bucket [버켓이름] \
    --versioning-configuration Status=Enabled
#가능한 존 확인
aws ec2 describe-availability-zones --region ap-northeast-2


#kops 환경변수 설정
#클러스터명은 cluster.도메인으로 생성함
#버켓은 이름에 . 있으면 안되서 도메인에서 .을 -로 변경해서 등록 todaybrief-shop
echo "export NAME=[클러스터명]" >> ~/.bashrc
echo "export KOPS_STATE_STORE=s3://[버켓이름]" >> ~/.bashrc

#EC2메뉴에서 KeyPair ppk 생성, public key pputygen에서 변환해서 업로드


#클러스터 설정 생성
kops create cluster \
--name=${NAME} \
--cloud=aws \
--zones=ap-northeast-2a \
--discovery-store=${KOPS_STATE_STORE}/${NAME}/discovery  \
--topology public \
--master-size t2.medium \
--master-count 1 \
--node-size t2.medium \
--node-count 2 \
--node-volume-size=10 \
--master-volume-size=16 \
--ssh-public-key ./kops.pub

#클러스터, 노드 정보 수정시 
kops edit cluster ${NAME}
kops edit ig nodes-XXXX #ig 이름

kops update cluster ${CLUSTER_NAME} --yes
#실행중인 클러스터 갱신시 rolling update 실행
#cloundonly 옵션으로 k8s api 호출하지 않고 aws api만 호출 가능
#kops rolling-update cluster ${NAME} --cloudonly --yes

kops export kubecfg --admin

kops get nodes
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함