728x90
목표
이번 1주차 스터디에서는 KOPS 설치 및 사용법을 학습 할 예정이다.
KOPS
- Kubernetes Operations(kOps) - Production Grade k8s Installation, Upgrades and Management
- kOps 는 클라우드 플랫폼(aws, gcp, azure 등)에서 쉽게 k8s 를 설치할 수 있도록 도와주는 도구
- kOps 는 서버 인스턴스와 네트워크 리소스 등을 클라우드에서 자동으로 생성해 k8s 를 설치
- kOps 는 AWS 의 다양한 서비스와 유연하게 연동되어 사용 가능
KOPS Instance 배포
# yaml 파일 다운로드
curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/K8S/kops-new-ec2.yaml
# 배포
# aws cloudformation deploy --template-file ~/Downloads/kops-new-ec2.yaml --stack-name mykops --parameter-overrides KeyName=<My SSH Keyname> SgIngressSshCidr=<My Home Public IP Address>/32 --region <리전>
# CloudFormation 스택 배포 완료 후 EC2 공인 IP 출력
aws cloudformation describe-stacks --stack-name mykops --query 'Stacks[*].Outputs[*].OutputValue' --output text
예시) 3.35.137.31
# kOps-ec2 에 SSH 접속
예시) ssh -i <My SSH Keyfile> ec2-user@3.35.137.31
kops-new-ec2.yaml
Parameters:
KeyName:
Description: Name of an existing EC2 KeyPair to enable SSH access to the instances. Linked to AWS Parameter
Type: AWS::EC2::KeyPair::KeyName
ConstraintDescription: must be the name of an existing EC2 KeyPair.
SgIngressSshCidr:
Description: The IP address range that can be used to communicate to the EC2 instances
Type: String
MinLength: '9'
MaxLength: '18'
Default: 0.0.0.0/0
AllowedPattern: (\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})
ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
LatestAmiId:
Description: (DO NOT CHANGE)
Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'
AllowedValues:
- /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
Resources:
MyVPC:
Type: AWS::EC2::VPC
Properties:
EnableDnsSupport: true
EnableDnsHostnames: true
CidrBlock: 10.0.0.0/16
Tags:
- Key: Name
Value: My-VPC
MyIGW:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: My-IGW
MyIGWAttachment:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
InternetGatewayId: !Ref MyIGW
VpcId: !Ref MyVPC
MyPublicRT:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref MyVPC
Tags:
- Key: Name
Value: My-Public-RT
DefaultPublicRoute:
Type: AWS::EC2::Route
DependsOn: MyIGWAttachment
Properties:
RouteTableId: !Ref MyPublicRT
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref MyIGW
MyPublicSN:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref MyVPC
AvailabilityZone: !Select [ 0, !GetAZs '' ]
CidrBlock: 10.0.0.0/24
Tags:
- Key: Name
Value: My-Public-SN
MyPublicSNRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref MyPublicRT
SubnetId: !Ref MyPublicSN
KOPSEC2SG:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: kops ec2 Security Group
VpcId: !Ref MyVPC
Tags:
- Key: Name
Value: KOPS-EC2-SG
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: '22'
ToPort: '22'
CidrIp: !Ref SgIngressSshCidr
KOPSEC2:
Type: AWS::EC2::Instance
Properties:
InstanceType: t2.micro
ImageId: !Ref LatestAmiId
KeyName: !Ref KeyName
Tags:
- Key: Name
Value: kops-ec2
NetworkInterfaces:
- DeviceIndex: 0
SubnetId: !Ref MyPublicSN
GroupSet:
- !Ref KOPSEC2SG
AssociatePublicIpAddress: true
PrivateIpAddress: 10.0.0.10
UserData:
Fn::Base64:
!Sub |
#!/bin/bash
hostnamectl --static set-hostname kops-ec2
yum -y install tree tmux jq git
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
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
chmod +x kops
mv kops /usr/local/bin/kops
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
export PATH=/usr/local/bin:$PATH
source ~/.bash_profile
complete -C '/usr/local/bin/aws_completer' aws
ssh-keygen -t rsa -N "" -f /root/.ssh/id_rsa
echo 'alias vi=vim' >> /etc/profile
echo 'sudo su -' >> /home/ec2-user/.bashrc
curl -s https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
wget https://github.com/andreazorzetto/yh/releases/download/v0.4.0/yh-linux-amd64.zip
unzip yh-linux-amd64.zip
mv yh /usr/local/bin/
Outputs:
KopsEC2IP:
Value: !GetAtt KOPSEC2.PublicIp
KOPS 클러스터 배포 및 확인
# IAM User 자격 구성 : 실습 편리를 위해 administrator 권한을 가진 IAM User 의 자격 증명 입력
aws configure
AWS Access Key ID [None]: Aceess Key
AWS Secret Access Key [None]: Secret Access Key
Default region name [None]: ap-northeast-2
Default output format [None]: json
# 자격 구성 적용 확인 : 노드 IP 확인
aws ec2 describe-instances
# aws cli 페이지 출력 옵션
export AWS_PAGER=""
# 리소스를 배치할 리전이름을 변수 지정
REGION=ap-northeast-2 # 서울 리전 사용
# 배포 시 참고할 정보를 환경 변수에 저장
export KOPS_CLUSTER_NAME=<자신의 퍼블릭 호스팅 메인 주소>
export KOPS_STATE_STORE=<s3://(위에서 생성한 자신의 버킷 이름)>
export AWS_PAGER=""
export REGION=ap-northeast-2
# kops 설정 파일 생성(s3) 및 k8s 클러스터 배포 : 6분 정도 소요
## CNI는 aws vpc cni 사용, 마스터 노드 1대(t3.medium), 워커 노드 2대(t3.medium), 파드 사용 네트워크 대역 지정(172.30.0.0/16)
## --container-runtime containerd --kubernetes-version 1.24.0
kops create cluster --zones="$REGION"a,"$REGION"c --networking amazonvpc --cloud aws \
--master-size t3.medium --node-size t3.medium --node-count=2 --network-cidr 172.30.0.0/16 \
--ssh-public-key ~/.ssh/id_rsa.pub --name=$KOPS_CLUSTER_NAME --kubernetes-version "1.24.9" -y
# validate
kops validate cluster --wait 10m
KOPS 설치 확인
# kops 클러스터 정보 확인
kops get cluster
# 인스턴스그룹 정보 확인
kops get ig
# 인스턴스 정보 확인
kops get instances
# 자동 완성 및 alias 축약 설정
source <(kubectl completion bash)
echo 'source <(kubectl completion bash)' >> ~/.bashrc
echo 'alias k=kubectl' >> ~/.bashrc
echo 'complete -F __start_kubectl k' >> ~/.bashrc
관리 편리성 도구
- kubectl cli 플러그인 매니저(krew)
- kubectl 명령어를 편하고 간단하게 사용할 수 있게 해주는 플러그인
[설치]
# 설치
curl -fsSLO https://github.com/kubernetes-sigs/krew/releases/download/v0.4.3/krew-linux_amd64.tar.gz
tar zxvf krew-linux_amd64.tar.gz
./krew-linux_amd64 install krew
tree -L 3 /root/.krew/bin
# PATH 추가
export PATH="${PATH}:/root/.krew/bin"
echo 'export PATH="${PATH}:/root/.krew/bin"' >>~/.bashrc
# krew 확인
kubectl krew
kubectl krew update
kubectl krew search
kubectl krew list
kubectl krew
유용한 krew 목록
- kube-ctx : 쿠버네티스 컨텍스트 사용
- kube-ns : 네임스페이스(단일 클러스터 내에서 가상 클러스터) 사용
- kube-df-pv : Pod 볼륨 정보 확인
- kube-ktop : 리눅스 top 명령어와 비슷하게 pod의 리소스 사용량을 확인
Helm(헬름)
https://www.youtube.com/watch?v=m7iZtjeIHJw, https://www.youtube.com/watch?v=cAJ76grsERg
다양한 환경/설정에서 하나의 템플릿으로 재사용, 필요한 모듈만 배포 가능, 안정적인 헬름 차트 생태계에서 필요한 오픈소스 설치
매니페스트 범용화
쿠버네티스는 YAML 형식으로 매니페스트를 작성하고 kubectl을 사용하여 오브젝트를 제어한다.
그러나 시스템이 대규모로 바뀌면서 비슷한 매니페스트를 대량으로 만들어야 하므로 재사용이나 일괄 변경 작업이 어려워 지게 된다. 그래서 필요한 것이 매니페스트 범용화라는 개념이다.
헬름 차트(Helm Chart)
- 차트(Chart) : 쿠버네티스에서 실행할 애플리케이션을 만드는 데 필요한 정보 묶음(=압축 파일)
- 롤링 업데이트 등에도 지원하는 것들이 많아 쿠버네티스에서 최적화된 설정으로 사용할 수 있는 장점도 있다.
- 헬름이 관리하는 공식 차트는 Artifact Hub에서 제공
- 대표: Bitnami
도전과제
과제1) 각자 설치한 AWS kOps 클러스터 정보를 올려주세요.
- kops get cluster #클러스터 정보 출력
- kops get instances #각 EC2 인스턴스의 정보 출력
과제2) Helm으로 워드프레스를 배포하고 관리페이지에 접속해서 글 1개 작성해주시고 스크린샷을 올려주세요.
- 게시글에 이미지를 올리고 저장
과제3) aWS kOps 활용 - 워커 노드 증가(ASG = Auto Scaling Group 활용)
- Ig 편집 전(maxSize:1, minSize:1)
- lg 편집 후(maxSize:3, minSize:3)
- 업데이트 전 node 수
- 업데이트 및 롤링 업데이트
- 추가 Node 확인
- AWS 오토스케일링 및 인스턴스 확인
마무리
처음 쿠버네티스를 공부하면서 클러스터를 kubeadm으로 구성하여 사용했었다. 직접 구성하면서 많은 시간이 걸렸고, 매번 구성할때마다 에러로 고생을 하였다. KOPS를 접하고 쿠버네티스 클러스터를 너무 쉽게 구성할 수 있어서 놀라웠다. Helm도 많이 들어는 봤지만 처음 사용해 봤다.
Helm Chart를 사용하여 쉽고 한번에 어플리케이션을 배포할 수 있고, 구성 변경 및 적용 시 yaml을 통해 쉽게 업데이트 할 수 있었다. 기본적인 클러스터만 구성해서 사용해본 나로써는 다양한 쿠버네티스 환경을 사용해 볼 수 있어서 좋았다!!😄
728x90
'PKOS 스터디' 카테고리의 다른 글
🎄쿠버네티스 스터디 PKOS 2주차 쿠버네티스 네트워크 (0) | 2024.04.23 |
---|