회사에서 EKS 를 유지보수해야 할 일이 생겨, 미뤄두었던 쿠버네티스를 공부하기로 마음먹었다..
5장부터 시작하려고 한다.
05장. 쿠버네티스 설치
그리스어로 조타수라는 뜻의 쿠버네티스는 오늘날 사실상 표준 (de facto standard) 으로 사용되고 있는 컨테이너 오케스트레이션 도구입니다. 구글에서 2014년에 오픈소스로 공개한 이후로, 오픈시프트(Openshift), 렌처(Rancher) 와 같은 클라우드 플랫폼을 비롯한 많은 회사들이 쿠버네티스를 실제 서비스 운영에 도입해 사용하고 있습니다.
쿠버네티스는 다른 오픈소스 오케스트레이션 툴과 비교해 매우 많은 장점이 있습니다.
- 서버 지원 클러스터링, 마이크로서비스 구조의 컨테이너 배포, 서비스 장애 복구 등 컨테이너 기반의 서비스 운영에 필요한 대부분의 오케스트레이션 기능을 폭넓게 지원합니다.
- 구글, 레드햇을 비롯한 많은 오픈소스 진영에서 쿠버네티스의 소스코드에 기여하고 있기 때문에 성능과 안정성 면에서 신뢰받고 있습니다.
- 영속적 볼륨 (Persistent Volume), 스케줄링, 장애 복구, 오토 스케일링, 서비스 디스커버리 및 인그레스 (Ingress) 등 컨테이너 기반의 클라우드를 운영할 때 필요한 대부분의 기능과 컴포넌트를 사용자가 직접 커스터마이징할 수 있습니다.
- CNCF (Cloud Native Computing Foundation) 및 다른 클라우드 운영 도구들과 쉽게 연동되므로 확장성이 높습니다.
CNCF 는 리눅스 재단 (Linux Foundation) 산하의 단체입니다. 쿠버네티스는 CNCF에 소속된 오픈소스이며, 도커 컨테이너의 핵심 중 하나인 containerd, 컨테이너의 데이터를 수집하기 위한 프로메테우스 (Prometheus) 등이 함께 CNCF 에 소속돼 있습니다.
5.1 쿠버네티스 설치 환경의 종류
개발 용도의 쿠버네티스 설치
- Minikube
- Docker Desktop for Mac/Windows 에 내장된 쿠버네티스
서비스 테스트 또는 운영 용도의 쿠버네티스 설치
- kops
- kubespray
- kubeadm
- EKS, GKE 등의 매니지드(Managed) 서비스
Docker Desktop for Mac 이나 for Windows 를 설치했다면 쿠버네티스를 함께 사용할 수 있으므로 별도의 설치 과정이 필요하지 않습니다. 또는 Minikube 를 사용하면 버추얼 박스 등의 가상화 환경에서 쿠버네티스를 손쉽게 설치할 수 있습니다. 그러나 이러한 개발 용도의 쿠버네티스는 로컬 노드를 스탠드얼론 (standalone) 모드로 사용하기 때문에 쿠버네티스의 기능들을 완벽하게 사용해보기에는 적합하지 않다는 단점이 있습니다.
간편하게 설치해 사용할 수 있는 대신, 기본 기능의 테스트 및 로컬 개발 용도로 제한된다는 한계점이 있습니다.
개발 용도가 아닌, 실제 서비스 테스트 또는 운영 용도로 쿠버네티스를 사용하려면 어떠한 환경에서 쿠버네티스를 설치할 것인지를 먼저 결정해야 합니다. 첫 번째는 AWS, GKE 등의 클라우드 플랫폼 환경이고, 두 번째는 자체적으로 보유한 온프레미스(on-premise) 서버 환경입니다.
- 자체 서버 환경에서 쿠버네티스 설치
- 자체 서버 환경에서는 kubespray, kubeadm 등의 도구를 이용해 쿠버네티스를 설치할 수 있습니다.
- 클라우드 플랫폼에서 쿠버네티스 설치
- 서버 인스턴스만을 사용해 쿠버네티스를 설치할지, 쿠버네티스 자체를 서비스로서 제공하는 매니지드 서비스를 사용할지 선택해야 합니다.
- AWS 의 EC2 인스턴스를 생성한 다음, 그 위에 직접 쿠버네티스를 설치하는 방법이 될 수 있습니다.
- 이때 사용할 수 있는 쿠버네티스 설치 도구는 kubespray, kubeadm, kops 등이 있습니다.
- 쿠버네티스 자체를 클라우드 서비스로서 사용
- 처음 시작하는 단계에 있다면 곧바로 매니지드 서비스를 이용하기보다는 직접 쿠버네티스를 설치해 전체적인 개념을 파악하는 것이 좋습니다.
쿠버네티스는 클라우드 플랫폼에서만 사용할 수 있는 기능이 일부 포함돼 있습니다. 따라서 로컬 개발 환경이나 온프레미스 서버에서 쿠버네티스를 설치해 사용할 경우 로드 밸런서(LoadBalancer) 또는 퍼시스턴트 볼륨(Persistent Volume) 등의 기능을 사용하지 못할 수도 있습니다.
5.2 쿠버네티스 버전 선택
운영 단계의 쿠버네티스를 고려하고 있다면 쿠버네티스 버전을 신중히 선택하는 것이 좋습니다.
2020년 9월 기준으로 사용할 수 있는 최신 쿠버네티스 버전은 1.18 버전입니다.
5.3 개발 용도의 쿠버네티스 설치
5.3.1 Docker Desktop for Mac / Windows 에서 쿠버네티스 사용


버전확인
kubectl version

5.3.2 Minikube 로 쿠버네티스 설치
Minikube 는 로컬에서 가상 머신이나 도커 엔진을 통해 쿠버네티스를 사용할 수 있는 환경을 제공합니다.
Minikube 는 가상 머신 또는 도커를 통해 쿠버네티스를 설치하기 때문에 버추얼 박스 또는 도커 엔진이 미리 설치돼 있어야 합니다. 이번 절에서는 기본 설정을 이용해 버추얼 박스로 Minikube 를 설치하는 방법을 먼저 살펴보고, 리눅스 서버에서 가상 머신 없이 도커만으로 Minikube 를 설치하는 방법을 살펴보겠습니다.
기본 설정을 이용해 버추얼 박스로 minikube 설치
1. 버추얼박스 설치
맥 OS X 에서는 아래 링크에서 dmg 확장자의 설치 파일을 내려받아 설치합니다.
https://download.virtualbox.org/virtualbox
책에서 5.0 버전을 받는 것 같으니 5.0 을 받아주자.
2. minikube, kubectl 내려받기
2020년 8월 기준으로 minikube 는 1.18.0 버전을, kubectl 은 1.18.0 버전을 사용할 수 있습니다.
minikube 설치
curl -LO https://storage.googleapis.com/minikube/releases/v1.12.0/minikube-darwin-amd64
chmod +x minikube-darwin-amd64
sudo mv minikube-darwin-amd64 /usr/local/bin/minikube
kubectl 설치
curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/v1.18.0/bin/darwin/amd64/kubectl
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
3. minikube 가상 머신 설치
버추얼박스를 설치했다면 다음 명령어로 minikube 가상 머신을 생성할 수 있습니다. minikube 는 자동으로 minikube 의 ISO 파일을 내려받아 설치합니다.
특정 버전의 쿠버네티스를 설치하려면 다음과 같이 --kubernetes-version 옵션을 추가합니다.
minikube start --kubernetes-version v1.13.5
리눅스 서버에서 가상 머신 없이 도커 엔진만으로 minikube 설치
도커 엔진을 미리 설치해 둔 리눅스에서는 가상 머신을 생성하지 않고도 Minikube 를 이용해 쿠버네티스를 설치할 수 있습니다. 앞의 "기본 설정을 이용해 버추얼 박스로 minikube 설치" 에서 "2. minikube, kubectl 내려받기" 를 참고해 minikube 와 kubectl 을 내려받은 뒤, 다음 명령어를 실행합니다.
minikube start --vm-driver=none
설치가 완료된 뒤에는 다음 명령어로 쿠버네티스가 정상적으로 설치됐는지 확인합니다.
kubectl version --short
Minikube 를 삭제하려면 minikube delete 명령어를 사용합니다.
minikube delete
5.4 여러 서버로 구성된 쿠버네티스 클러스터 설치
이번 절에서는 여러 개의 서버를 이용해 쿠버네티스 클러스터를 설치하는 방법인 kubeadm, kops, GKS 에 대해서 알아봅니다. 사용할 서버의 개수는 각자의 환경에 맞게 준비하면 되지만, 쿠버네티스의 각종 기능을 제대로 사용하려면 최소한 3대 이상의 서버를 준비하는 것이 좋습니다. 따라서 이번 절에서는 1개의 마스터와 3개의 워커 노드로 구성된 테스트용 쿠버네티스 클러스터를 설치하는 방법을 설명합니다.
각 서버에서 아래의 항목들이 준비됐는지 확인한 후에 설치를 진행해야 합니다.
- 모든 서버의 시간이 ntp 를 통해 동기화돼 있는지 확인합니다.
- 모든 서버의 맥(MAC) 주소가 다른지 확인합니다. 가상 머신을 복사해 사용할 경우, 같은 맥 주소를 가지는 서버가 존재할 수 있습니다.
- 모든 서버가 2GB 메모리, 2 CPU 이상의 충분한 자원을 가지고 있는지 확인합니다.
- 다음 명령어를 사용해 모든 서버에서 메모리 스왑 (Swap) 을 비활성화합니다. 메모리 스왑이 활성화돼 있으면 컨테이너의 성능이 일관되지 않을 수 있기 때문에 대부분의 쿠버네티스 설치 도구는 메모리 스왑을 허용하지 않습니다.
swapoff -a
kubeadm, kops, GKE 는 모두 서비스 운영 환경에서 사용할 수 있는 좋은 방법이지만, 이번 장에서 설명하는 설치 및 클러스터 구성은 쿠버네티스의 기능을 테스트하기 위한 간소화된 방법이라는 점에 유의해야 합니다.
5.4.1 kubeadm 으로 쿠버네티스 설치
쿠버네티스 설치 도구입니다.
kubeadm 은 온프레미스 환경, 클라우드 인프라 환경에 상관없이 일반적인 리눅스 서버라면 모두 사용할 수 있습니다. 이번 예제에서는 별도의 설정 없이 AWS 에서 우분투 18.04 의 EC2 서버를 4개 생성한 다음에 진행한다고 가정합니다. 그러나 가상 머신, 베어 메탈 서버 환경 등에서 동일하게 따라 해도 상관없습니다.
Ubuntu 18.04 LTS 를 검색하여 우분투 18로 세팅한다.
EC2 4개를 생성하자
필자는 아래 환경으로 쿠버네티스를 세팅합니다.
kube-worker
- OS: usm-saas-sensor-aws-7.71.1035-7.0.956-master-Ubuntu_18.04.6_LTS

$ swapoff -a
$ free -h # swap 0 확인
$ sudo su - # root 권한
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
$ cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
$ wget -qO- get.docker.com | sh
---
- OS: Ubuntu 22.04 LTS (HVM), SSD Volume Type
- 인스턴스 유형: t3.small
- Docker version: 19.03 (Kubernetes 1.18 당시 최신버전)
- Kubernetes version: 1.18.6

$ swapoff -a
$ free -h # swap 0 확인
apt update 정상화
rm -f /etc/apt/sources.list.d/sensor.list
rm -f /usr/share/keyrings/attcs-archive-keyring.gpg
apt clean
rm -rf /var/lib/apt/lists/*
apt update
docker 19.03 버전 설치
sudo apt install -y ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
apt install -y software-properties-common
echo \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable" \
> /etc/apt/sources.list.d/docker.list
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
sudo apt update
apt install -y \
docker-ce=5:19.03.15~3-0~ubuntu-bionic \
docker-ce-cli=5:19.03.15~3-0~ubuntu-bionic \
containerd.io
docker --version

1. kubectl 설치
curl -LO https://dl.k8s.io/v1.18.6/bin/linux/amd64/kubectl
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
2. kubeadm 설치
curl -LO https://dl.k8s.io/v1.18.6/bin/linux/amd64/kubeadm
chmod +x kubeadm
sudo mv kubeadm /usr/local/bin/
3. kubelet 설치
curl -LO https://dl.k8s.io/v1.18.6/bin/linux/amd64/kubelet
chmod +x kubelet
sudo mv kubelet /usr/local/bin/
4. kubelet systemd 서비스 등록
curl -LO https://raw.githubusercontent.com/kubernetes/release/v0.4.0/cmd/kubepkg/templates/latest/deb/kubelet/lib/systemd/system/kubelet.service
sudo mv kubelet.service /etc/systemd/system/
curl -LO https://raw.githubusercontent.com/kubernetes/release/v0.4.0/cmd/kubepkg/templates/latest/deb/kubeadm/10-kubeadm.conf
sudo mkdir -p /etc/systemd/system/kubelet.service.d
sudo mv 10-kubeadm.conf /etc/systemd/system/kubelet.service.d/
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable kubelet
sudo apt update
sudo apt install -y conntrack
마스터 노드로 사용할 호스트에서 다음 명령어로 클러스터를 초기화합니다.
kubeadm init --apiserver-advertise-address 172.31.32.106 \
--pod-network-cidr=192.168.0.0/16 --kubernetes-version 1.18.6
초기화가 완료되면 다음과 같은 출력 결과를 확인할 수 있습니다.
5.4. new
(SupportedImages) - Ubuntu 18.04 LTS x86_64 LATEST - 20251124-6f3aa60e-6d45-416e-b6b8-54900c63ddba
Ubuntu Linux 18, ubuntu/images/hvm-ssd/ubuntu-bionic-18.04-amd64-server, Ubuntu Minimal, Minimal Ubuntu 18, Ubuntu Debian, Ubuntu Latest, 18.04 Ubuntu LTS, ubuntu 18.04 ami, ubuntu ami, ubuntu 18 ami, ubuntu pro 18.04
5.4.2 kops 로 AWS 에서 쿠버네티스 설치
버전
- kops 1.27.0
- kubernetes: 1.21.0
- 참고: https://github.com/kubernetes/kops/blob/master/permalinks/upgrade_k8s.md#supported-kubernetes-versions
1. kops 및 kubectl 실행 바이너리 내려받기
$ brew install wget
$ wget -O kops https://github.com/kubernetes/kops/releases/download/v1.18.0/kops-darwin-amd64
$ chmod +x ./kops
$ sudo mv ./kops /usr/local/bin/
$ wget -O kubectl \
http://storage.googleapis.com/kubernetes-release/release/v1.18.0/bin/darwin/amd64/kubectl
$ chmod +x kubectl
$ sudo mv kubectl /usr/local/bin
kops version 으로 버전을 확인할 수 있다.

# 1.27 버전 다운로드
wget -O kops https://github.com/kubernetes/kops/releases/download/v1.27.0/kops-darwin-amd64
# 실행 권한 부여
chmod +x kops
# 전역 PATH로 이동
sudo mv kops /usr/local/bin/
3트
wget -O kops https://github.com/kubernetes/kops/releases/download/v1.32.2/kops-darwin-amd64
chmod +x kops
sudo mv kops /usr/local/bin/
kops version # 버전확인
curl -LO "https://dl.k8s.io/release/v1.32.0/bin/darwin/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
kubectl version --client # 버전확인
4트
1. kops 및 kubectl 실행 바이너리 내려받기
brew install kops
2. AWS 사용자 생성, 정책 연결 및 AWS CLI 설정
https://blog.naver.com/alice_k106/221342005691 참고
kops 에 필요한 자격 증명
AmazonEC2FullAccess
AmazonRoute53FullAccess
AmazonS3FullAccess
IAMFullAccess
AmazonVPCFullAccess
AmazonSQSFullAccess
AmazonEventBridgeFullAccess
aws iam create-group --group-name kops # IAM User group 생성
# Permissions policies 추가
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 # User 생성
aws iam add-user-to-group --user-name kops --group-name kops # User 를 User group 에 추가
aws iam create-access-key --user-name kops # Access key 생성
# configure the aws client to use your new IAM user
aws configure # Use your new access and secret key here
# Because "aws configure" doesn't export these vars for kops to use, we export them now
export AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id)
export AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key)
3. S3 버킷에 쿠버네티스 클러스터의 설정 정보 저장
kops 는 쿠버네티스의 설정 정보를 S3 버킷에 저장하기 때문에 kops 가 사용할 S3 버킷을 미리 생성해 둬야 합니다.
aws s3api create-bucket --bucket connor-k8s-bucket --create-bucket-configuration LocationConstraint=ap-northeast-2

참고: S3는 us-east-1 이외의 지역에 대해 --create-bucket-configuration LocationConstraint=<region>이 필요합니다. 참고: 이전 상태 저장소를 되돌리거나 복구해야 하는 경우를 대비하여 S3 버킷을 버전화하는 것이 좋습니다.
버켓이름은 전세계에서 유일해야 합니다. 중복이 안되니, --bucket 을 적절하게 수정하세요.
S3 버켓 버저닝
aws s3api put-bucket-versioning --bucket connor-k8s-bucket --versioning-configuration Status=Enabled

For a gossip-based cluster, make sure the name ends with k8s.local. For example:
우리는 DNS 없이 구축할 것이므로, NAME 이 k8s.local 로 끝나야 한다.
셸 환경변수 설정
export NAME=mycluster.k8s.local
export KOPS_STATE_STORE=s3://connor-k8s-bucket
availability-zones 확인
aws ec2 describe-availability-zones --region ap-northeast-2

EC2 인스턴스에 배포될 SSH 키 생성
ssh-keygen -t rsa -N "" -f ~/.ssh/kops_id_rsa
클러스터 설정 생성
- name
- cloud
- zones: AZ
- discovery-store: OIDC Store
AWS 프리티어라면, 마스터 워커 노드의 갯수와 인스턴스 타입이 높을 경우 EC2 가 생성되지 않는다..
나처럼 불쌍한 무료이용자도 구축하게 해달라..
AWS 프리티어가 아니라면,
kops create cluster \
--zones ap-northeast-2a \
--networking calico \
--ssh-public-key ./id_rsa.pub \
$NAME
AWS 프리티어라면,
kops create cluster \
--zones ap-northeast-2a \
--networking calico \
--ssh-public-key ~/.ssh/kops_id_rsa.pub \
--node-size=t3.micro \
--control-plane-size=t3.micro \
--node-count=1 \
$NAME

Must specify --yes to apply changes
Cluster configuration has been created.
Suggestions:
* list clusters with: kops get cluster
* edit this cluster with: kops edit cluster mycluster.k8s.local
* edit your node instance group: kops edit ig --name=mycluster.k8s.local nodes-ap-northeast-2a
* edit your control-plane instance group: kops edit ig --name=mycluster.k8s.local control-plane-ap-northeast-2a
Finally configure your cluster with: kops update cluster --name mycluster.k8s.local --yes --admin
변경사항을 적용하려면 --yes 명시
- 리스트 클러스터: kops get cluster
- 클러스터 편집: kops edit cluster mycluster.kk8s.local
- 노드 인스턴스 그룹 편집: kops edit ig --name=mycluster.k8s.local nodes-ap-northeast-2a
- control-plane 인스턴스 그룹 편집: kops edit ig --name=mycluster.k8s.local control-plane-ap-northeast-2a
마지막으로 클러스터 구성하려면: kops update cluster --name myclluster.k8s.local --yes --admin
생성된 클러스터 확인
kops get cluster

4. 쿠버네티스 클러스터 옵션 변경
마스터와 워커 노드의 인스턴스 타입이나 워커 노드의 개수 등을 조절할 수 있습니다. 다음 명령어를 입력해서 워커 노드의 옵션을 수정해 보겠습니다.
먼저 인스턴스 그룹 이름을 확인한다.
kops get ig --name $NAME

kops edit ig {INSTANCE_GROUP_NAME} --name $NAME
필자는 아래와 같이 입력했다.
kops edit ig nodes-ap-northeast-2a --name $NAME

노드의 개수는 maxSize 와 minSize 를 수정해 변경할 수 있고, 워커의 CPU 와 메모리 크기는 인스턴스 타입을 수정해 변경할 수 있습니다. 이번 예시에서는 3개의 워커 노드를 생성하도록 설정해 보겠습니다. 다음과 같이 maxSize 와 minSize 를 3으로 변경합니다.
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: kops.k8s.io/v1alpha2
kind: InstanceGroup
metadata:
creationTimestamp: "2025-12-18T14:29:00Z"
labels:
kops.k8s.io/cluster: mycluster.k8s.local
name: nodes-ap-northeast-2a
spec:
image: 099720109477/ubuntu/images/hvm-ssd-gp3/ubuntu-noble-24.04-amd64-server-20251126
machineType: t3.micro
maxSize: 1
minSize: 1
role: Node
subnets:
- ap-northeast-2a
kops 가 자동으로 생성하는 AWS 의 오토 스케일링 그룹에서 사용되는 숫자입니다.
다음은 마스터 노드의 설정을 변경해 보겠습니다. 마스터 노드는 1개의 노드만을 사용하되, 인스턴스 타입을 워커와 동일한 종류인 t2.medium 으로 변경하겠습니다.
kops edit ig control-plane-ap-northeast-2a --name $NAME

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: kops.k8s.io/v1alpha2
kind: InstanceGroup
metadata:
creationTimestamp: "2025-12-18T13:07:11Z"
labels:
kops.k8s.io/cluster: mycluster.k8s.local
name: control-plane-ap-northeast-2a
spec:
image: 099720109477/ubuntu/images/hvm-ssd-gp3/ubuntu-noble-24.04-amd64-server-20251126
machineType: t2.medium
maxSize: 1
minSize: 1
role: Master
subnets:
- ap-northeast-2a
5. 쿠버네티스 클러스터 생성
다음 명령어를 입력하면 kops 가 자동으로 서버 인스턴스, 네트워크 리소스 등을 생성해 쿠버네티스를 설치합니다.
kops update cluster --name $NAME --yes --admin
쿠버네티스 클러스터의 준비에는 약 5~10분 정도가 소요됩니다. 쿠버네티스 설치 진행 상황은 kops validate cluster 명령어를 사용해 확인할 수 있습니다.

kOps has set your kubectl context to mycluster.k8s.local
W1218 22:25:14.263041 87927 update_cluster.go:439] Exported kubeconfig with no user authentication; use --admin, --user or --auth-plugin flags with `kops export kubeconfig`
Cluster is starting. It should be ready in a few minutes.
Suggestions:
* validate cluster: kops validate cluster --wait 10m
* list nodes: kubectl get nodes --show-labels
* ssh to a control-plane node: ssh -i ~/.ssh/id_rsa ubuntu@
* the ubuntu user is specific to Ubuntu. If not using Ubuntu please use the appropriate user based on your OS.
* read about installing addons at: https://kops.sigs.k8s.io/addons.
kOps 가 kubectl 컨텍스트를 mycluster.k8s.local 로 설정함
사용자 인증 없이 하려면 --admin, --user or --auth-plugin 플래그를 'kops export kubeconfig' 와 함께 쓰면 된다.
- 클러스터 검증: kops validate cluster --wait 10m
- 노드 목록: kubectl get nodes --show-labels
- SSH to control-plane node: ssh -i ~/.ssh/id_rsa ubuntu@
- 우분투 유저는 우분투 OS 전용이다. 다른 OS 면 적절한 유저 사용하세요.
- 애드온 설치에 대해 읽어보세요. https://kops.sigs.k8s.io/addons
kOps .. 설명이 친절한 편..

인증서 내보내기
kops export kubecfg --name mycluster.k8s.local --admin
open ~/.kube/config

kops validate cluster
잠시 후, 다음 명령어로 노드의 목록과 쿠버네티스 버전을 출력해 설치가 정상적으로 완료됐는지 확인합니다.
kops get all [CLUSTER]
kops get [CLUSTER] 는 deprecated 라고 한다.

kubectl version --short

kops 는 쿠버네티스 클러스터를 AWS 의 DNS 서비스인 Route53 에 등록된 도메인, 서브 도메인과 연동함으로써 핵심 컴포넌트 간에 DNS 로 접근할 수 있는 기능을 제공합니다. 기존에 구입한 도메인이 Route53 의 AWS 네임 서버에 등록돼 있다면 클러스터 이름 환경변수를 다음과 같이 설정한 뒤 설치를 진행함으로써 쿠버네티스 클러스터를 도메인에 등록할 수 있습니다.
export NAME=alicek106.com
kops 로 생성한 쿠버네티스 클러스터를 삭제하려면 다음 명령어를 입력합니다. 단, S3 에 저장된 쿠버네티스 클러스터의 설정 파일은 삭제되지 않습니다.
kops delete cluster $NAME --yes
Trouble shooting
# 1. ELB scheme 확인 (이미 OK)
aws elbv2 describe-load-balancers
Validate 자꾸 실패해서 보니, Master 인스턴스 타입이 t3.micro 라 api server 조차 정상실행되지 않는다.
명령어로 다시 인스턴스 타입 높여서 띄우는 중..
kops edit ig control-plane-ap-northeast-2a --name $NAME # 인스턴스 타입 변경
kops update cluster --yes # 설정 적용
# 인스턴스 강제 재시작
kops rolling-update cluster \
--name mycluster.k8s.local \
--yes \
--cloudonly


이번엔.. 워커 노드가 아픈 것 같다.. 워커 노드도 그냥 올려주자..

06장. 쿠버네티스 시작하기
6.1 쿠버네티스를 시작하기 전에
모든 리소스는 오브젝트 형태로 관리됩니다.
쿠버네티스에서 사용할 수 있는 오브젝트에는 어떤 것이 있는지 kubectl api-resources 명령어를 사용해 확인해 보겠습니다. 꽤 많은 종류의 오브젝트를 사용할 수 있음을 알 수 있습니다.
kubectl api-resources
쿠버네티스 공식 문서에서 대부분의 리소스 오브젝트의 사용 방법을 친절하게 설명하고 있기 때문에 처음 보는 오브젝트라도 당황하지 말고 필요에 따라 배우고 익히면 됩니다.
특정 오브젝트의 간단한 설명을 보고 싶다면 kubectl explain 명령어를 사용합니다.
kubectl explain pod
쿠버네티스는 명령어로도 사용할 수 있지만, YAML 파일을 더 많이 사용합니다.
쿠버네티스에서 YAML 파일의 용도는 컨테이너뿐만 아니라 거의 모든 리소스 오브젝트들에 사용될 수 있다는 것이 가장 큰 특징입니다. 예를 들어 컨테이너 자체는 물론이고, 컨테이너의 설정값 (ConfigMap), 비밀값 (Secrets) 등도 모두 YAML 파일로 정의해 사용합니다. 그리고 쿠버네티스에서 실제로 서비스를 배포할 때에도 kubectl 명령어가 아닌 여러 개의 YAML 파일을 정의해 쿠버네티스에 적용시키는 방식으로 동작할 것입니다.
쿠버네티스는 여러 개의 컴포넌트로 구성돼 있습니다.
쿠버네티스 노드의 역할은 크게 마스터와 워커로 나뉘어 있습니다. 마스터 노드는 쿠버네티스가 제대로 동작핧 수 있게 클러스터를 관리하는 역할을 담당하며, 워커 노드에는 애플리케이션 컨테이너가 생성됩니다.
쿠버네티스는 도커를 포함한 매우 많은 컴포넌트들이 실행됩니다. 예를 들어, 마스터 노드에서는 API 서버 (kube-apiserver), 컨트롤러 매니저 (kube-controller-manager), 스케줄러 (kube-scheduler), DNS 서버 (coreDNS) 등이 실행되며, 모든 노드에서는 오버레이 네트워크 구성을 위해 프록시 (kube-proxy) 와 네트워크 플러그인 (calico, flannel 등) 이 실행됩니다.
이러한 컴포넌트들은 기본적으로 도커 컨테이너로서 실행되고 있습니다. 마스터 노드에 SSH 로 접속해 docker ps 명령어를 실행해 보면 매우 많은 컨테이너가 실행되고 있을 것입니다.
Docker desktop 에서 show system containers 항목을 체크하면 쿠버네티스의 컴포넌트 컨테이너를 확인할 수 있습니다.
그리고 쿠버네티스 클러스터 구성을 위해 kubelet 이라는 에이전트가 모든 노드에서 실행됩니다. kubelet 은 컨테이너의 생성, 삭제뿐만 아니라 마스터와 워커 노드 간의 통신 역할을 함께 담당하는 매우 중요한 에이전트입니다. 따라서 kubelet 이 정상적으로 실행되지 않으면 해당 노드는 쿠버네티스와 제대로 연결되지 않을 수도 있습니다.
쿠버네티스의 입장에서 보면 도커 데몬 또한 하나의 컴포넌트입니다. 따라서 쿠버네티스에서 반드시 도커를 사용해야 하는 것은 아니며, OCI (Open Container Initiative) 라는 컨테이너의 런타임 표준을 구현한 CRI (Container Runtime Interface) 를 갖추고 있다면 어떠한 컨테이너를 써도 문제는 없습니다.
CRI 는 kubelet 과 통신하기 위한 인터페이스를 의미
도커 컨테이너의 경우 runC 컨테이너 런타임을 제어하는 containerd (컨테이너-디) 는 자체적으로 CRI 플러그인을 내장하고 있으므로 도커 엔진만 설치해도 쿠버네티스와 문제없이 연결해 사용할 수 있습니다.
CRI 를 구현하는 다른 오픈소스에는 cri-i 등이 있습니다.
6.2 포드(Pod) : 컨테이너를 다루는 기본 단위
알아야 할 몇가지 오브젝트
- Pod
- Replica Set
- Service
- Deployment
6.2.1 포드 사용하기
컨테이너 애플리케이션의 기본 단위를 포드 (Pod) 라고 부르며, 포드는 1개 이상의 컨테이너로 구성된 컨테이너의 집합입니다.
포드의 개념을 좀 더 정확히 이해하기 위해서 Nginx 컨테이너로 구성된 포드를 직접 생성해보겠습니다.
nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-nginx-pod
spec:
containers:
- name: my-nginx-container
image: nginx:latest
ports:
- containerPort: 80
protocol: TCP
쿠버네티스의 YAML 파일은 일반적으로 apiVersion, kind, metadata, spec 네 가지 항목으로 구성됩니다.
- apiVersion: YAML 파일에서 정의한 오브젝트의 API 버전을 나타냅니다. 오브젝트의 종류 및 개발 성숙도에 따라 apiVersion 설정값이 달라질 수 있다는 것만 알고 넘어가겠습니다.
- kind: 이 리소스의 종류를 나타냅니다. 위의 YAML 파일에서 생성하려고 하는 것이 포드이기 때문에 Pod 를 입력했습니다. kind 항목에서 사용할 수 있는 리소스 오브젝트 종류는 kubectl api-resources 명령어의 KIND 항목에서 확인할 수 있습니다.
- metadata: 라벨, 주석 (Annotation), 이름 등과 같은 리소스의 부가 정보들을 입력합니다. 위 예시에서는 name 항목에서 포드의 고유한 이름을 my-nginx-pod 로 설정했습니다.
- spec: 리소스를 생성하기 위한 자세한 정보를 입력합니다. 위 예시에서는 포드에서 실행될 컨테이너 정보를 정의하는 containers 항목을 작성한 뒤, 하위 항목인 image 에서 사용할 도커 이미지를 지정했습니다. name 항목에서는 컨테이너의 이름을, ports 항목에서는 Nginx 컨테이너가 사용할 포트인 80을 입력했습니다.
작성한 YAML 파일은 kubectl apply -f 명령어로 쿠버네티스에 생성할 수 있습니다. 다음 명령어를 사용해 새로운 포드를 생성합니다.
6.2.
6.2.
6.2.
6.3 레플리카셋(Replica Set) : 일정 개수의 포드를 유지하는 컨트롤러
6.4 디플로이먼트(Deployment) : 레플리카셋, 포드의 배포를 관리
6.5 서비스(Service) : 포드를 연결하고 외부에 노출
07장. 쿠버네티스 리소스의 관리와 설정
08장. 인그레스 (Ingress)
09장. 퍼시스턴트 볼륨 (PV) 과 퍼시스턴트 볼륨 클레임 (PVC)
10장. 보안을 위한 인증과 인가 : ServiceAccount 와 RBAC
11장. 애플리케이션 배포를 위한 고급 설정
12장. 커스텀 리소스와 컨트롤러
13장. 포드를 사용하는 다른 오브젝트들
14장. 쿠버네티스 모니터링
'DevOps > 스터디' 카테고리의 다른 글
| RabbitMQ IN DEPTH (2) | 2025.02.16 |
|---|---|
| 따라하며 배우는 도커와 CI 환경 (1) | 2023.03.26 |
| 시작하세요! 도커 / 쿠버네티스 (0) | 2023.02.05 |
| 시작하세요! 도커 / 쿠버네티스 legacy (0) | 2022.06.17 |
| 따라하며 배우는 도커와 CI환경 (0) | 2022.03.11 |