들어가기에 앞서
포스팅 제목에도 나와있지만 이 글은 Windows의 WSL 환경에 Docker를 설치가 되어있어야 한다.
만약 WSL과 Docker가 준비되지 않았다면 아래 포스팅을 참고하여 WSL과 Docker를 설치하고 와야 한다.
WSL 환경에 Docker(무료) 설치하기 (Docker Desktop 아님)
WSL과 Docker 그리고 Kubernetes를 설치할 마음의 준비가 되었다면 아래로 넘어갈 수 있다.
※ 주의 ※
이 포스팅은 2025-01-26 기준으로 작성되었으며, 추후에는 포스팅 내용과 맞지 않는 경우가 생길 수 있으니 주의 바랍니다.
Kind 란
kind는 kubernets in docker의 약자로 docker를 활용하여 kubernetes를 쉽게 설치할 수 있는 도구이다.
docker의 container로 kubernetes를 구성하기 때문에 실제 운영 환경에는 적합하지 않다.
하지만 다양한 kubernetes의 버전을 손쉽게 구성하고 관리할 수 있으며, 실제 kubernetes와 동일하게 동작하기 때문에 개발 또는 공부를 하는 용도로는 매우 적합하다고 할 수 있다.
또한 kind를 사용하면 지원이 종료된 과거 버전 kubernetes를 설치할 수 있는데, 이는 본 포스팅의 범위를 넘어가는 것으로 판단되어 다음 포스팅에 작성할 예정이다.
현재 이 글을 쓰는 시점인 2025-01-26 기준으로는 kubernetes 공식 홈페이지에서 v1.28~ v1.32 사이를 지원하고 있고, 특정 버전 이하로는 kubernetes가 설치 repository를 변경하면서 기존 버전을 drop 했기 때문에 공식적인 설치는 불가능에 가까운 것으로 알고 있다. (낮은 버전을 설치하려면 github에서 파일들을 받아서 수동으로 퍼즐 맞추듯이 설치하면 된다고는 하는데 해본 적이 없어서 가능한지는 모르겠다..)
Kind를 사용한 Cluster 설치
1. Kind 다운로드하기
[ kind 공식 홈페이지 Install 가이드 : https://kind.sigs.k8s.io/docs/user/quick-start/ ]
[ kind github release 페이지 : https://github.com/kubernetes-sigs/kind/releases ]
이 글을 쓰는 시점(2025-01-26) 기준으로 kind의 최신 버전은 v0.26.0이며 kubernetes의 릴리즈 주기가 매우 빠른 만큼 kind의 release 주기도 상당히 빠른 편에 속한다.
아마도 몇 달안에 새로운 버전이 나올 텐데 반드시 위의 링크 또는 github kind 릴리즈를 참고하여 버전을 확인해야 한다.
# For AMD64 / x86_64
[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.26.0/kind-linux-amd64
# For ARM64
[ $(uname -m) = aarch64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.26.0/kind-linux-arm64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
2. kind version 확인
$ kind version
kind v0.26.0 go1.23.4 linux/amd64
3. kubectl 다운로드하기
아래의 명령어로 kubectl을 설치한다.
curl -LO "https://dl.k8s.io/release/{여기에 버전 입력}/bin/linux/amd64/kubectl"
$ curl -LO "https://dl.k8s.io/release/v1.32.0/bin/linux/amd64/kubectl"
$ chmod +x kubectl
$ sudo mv ./kubectl /usr/local/bin/kubectl
여기서는 생성할 cluster의 버전에 맞춰서 kubectl을 설치하는 것을 권장한다.
만약 cluster를 여러 개의 버전으로 생성하려면 설치할 cluster 중 가장 높은 버전과 동일한 kubectl을 설치하는 것을 권장한다.
왜냐하면 kubectl 보다 높은 버전의 kubernetes을 설치해서 사용할 경우 새로운 버전에 추가됐거나 변경된 object의 호환을 맞출 수 없어서 오류가 날 가능성이 있기 때문이다.
4. cluster 생성
$ kind create cluster
Creating cluster "kind" ...
✓ Ensuring node image (kindest/node:v1.32.0) 🖼
✓ Preparing nodes 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
Set kubectl context to "kind-kind"
You can now use your cluster with:
kubectl cluster-info --context kind-kind
Not sure what to do next? 😅 Check out https://kind.sigs.k8s.io/docs/user/quick-start/
5. cluster 생성 확인
$ kubectl version
Client Version: v1.32.0
Kustomize Version: v5.5.0
Server Version: v1.32.0
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
kind-control-plane Ready control-plane 14m v1.32.0
$ kind get clusters
kind
차례대로 kubectl 버전 확인과 node의 상태 확인, kind로 배포된 cluster 목록 확인을 하였다.
kind로 cluster 생성 시 아무런 이름을 지정하지 않아서 마지막의 kind get clusters 명령어를 통해 Kind라는 기본 이름의 cluster가 배포된 것을 확인할 수 있다.
여기까지가 kind를 통해 cluster를 생성하는 방법이며 아래는 kind를 통해 cluster를 관리하는 방법이다.
만약 WSL 환경에서 아래와 같은 Kind 에러를 만날 경우
# kind create cluster --name hacker
Creating cluster "hacker" ...
✓ Ensuring node image (kindest/node:v1.29.1) 🖼
✓ Preparing nodes 📦
✗ Writing configuration 📜
Deleted nodes: ["hacker-control-plane"]
ERROR: failed to create cluster: failed to copy kubeadm config to node: command "docker exec --privileged -i hacker-control-plane cp /dev/stdin /kind/kubeadm.conf" failed with error: exit status 126
Command Output: OCI runtime exec failed: exec failed: unable to start container process: read init-p: connection reset by peer: unknown
온갖 삽질을 한 끝에 이 에러를 해결 할 수 있었는데 그 방법은 아래와 같다.
(삽질의 과정이 있어서 정확하지는 않을 수 있으나 이렇게 해결하긴 했다...)
1. selinux 끄기
$ sudo apt install selinux-utils
$ sudo setenforce 0
2. docker 그룹 추가
$ sudo usermod -aG docker $USER
3. /etc/docker/daemon.json 파일 생성 후 아래 내용 입력 (docker systemd 사용)
{
"exec-opts": ["native.cgroupdriver=systemd"],
"storage-driver": "overlay2"
}
4. /etc/wsl.conf 파일에 아래 내용 입력 (systemd 활성화)
[boot]
systemd=true
5. Windows powershell에서 wsl 재시작 (주의: Windows powershell)
> wsl --shutdown
> wsl
Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 5.15.167.4-microsoft-standard-WSL2 x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/pro
This message is shown once a day. To disable it please create the
/home/hackpark/.hushlogin file.
6. Docker 데몬 실행 (재실행일 경우 start 대신 restart)
$ sudo service docker start
7. Docker 안쓰는 이미지 및 캐시 정리
$ docker image prune
이렇게 하고 다시 kind를 실행하니 정상적으로 실행되었다.
systemd 문제였던거 같은데 상당히 애를 먹고 해결하였다.
Kind를 사용한 Cluster 관리
1. kind를 통해 생성된 Cluster 리스트 확인
위에서도 잠깐 나왔지만 아래의 명령어를 통해 kind로 생성된 cluster를 확인할 수 있다.
$ kind get clusters
kind
조금 더 디테일한 정보를 확인하려면 아래의 명령어를 사용하는 것이 좋다.
$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kind-kind kind-kind kind-kind
kubectl을 통해서는 실제 cluster의 이름을 알 수 있으며 kind 명령어를 통해 얻어낸 이름은 kind로 생성한 cluster의 이름이다.
kind는 기본 이름 앞에 kind- 라는 단어를 prefix 하는 것을 확인할 수 있다.
따라서 abc라는 이름으로 생성하였어도 실제로는 kind-abc로 생성된다는 것을 알고 있어야 한다.
2. 원하는 이름의 cluster 배포
만약 원하는 이름의 cluster를 배포하려면 아래와 같은 명령어를 사용하면 된다.
$ kind create cluster --name hackerpark
Creating cluster "hackerpark" ...
✓ Ensuring node image (kindest/node:v1.32.0) 🖼
✓ Preparing nodes 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
Set kubectl context to "kind-hackerpark"
You can now use your cluster with:
kubectl cluster-info --context kind-hackerpark
Not sure what to do next? 😅 Check out https://kind.sigs.k8s.io/docs/user/quick-start/
$ kind get clusters
hackerpark
kind
$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kind-hackerpark kind-hackerpark kind-hackerpark
kind-kind kind-kind kind-kind
hackerpark과 Kind 두 개의 cluster가 정상적으로 생성된 것을 확인할 수 있다.
kubectl 명령을 보면 CURRENT에 kind-hackerpark 부분이 * 로 되어있는 것을 확인 할 수 있는데 이는 현재 kubectl의 context가 kind-hackerpark에 있다는 것을 알려주는 것이다.
이를 통해 kubectl 명령어가 여러 개의 cluster 중 어떤 cluster를 target으로 동작하는지 알 수 있게 된다.
실제로 kubectl 명령을 실행해 보면 알 수 있다.
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
hackerpark-control-plane Ready control-plane 2m50s v1.32.0
다음은 여러 cluster 중 원하는 cluster로 context를 전환하는 작업이다.
3. 원하는 cluster를 선택하여 작업할 수 있도록 kubectl의 context 전환하기
kubectl config get-contexts 명령어를 사용하여 나오는 NAME 필드를 확인한 후 아래의 명령어를 사용하며 context를 전환할 수 있다.
$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kind-hackerpark kind-hackerpark kind-hackerpark
kind-kind kind-kind kind-kind
$ kubectl config use-context kind-kind
Switched to context "kind-kind".
$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
kind-hackerpark kind-hackerpark kind-hackerpark
* kind-kind kind-kind kind-kind
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
kind-control-plane Ready control-plane 35m v1.32.0
이를 통해 kind-hackerpark 클러스터에서 kind-kind 클러스터로 손쉽게 context 전환한 것을 확인할 수 있다.
4. 생성된 cluster 삭제하기
생성된 cluster 리스트를 확인 후 kind 명령어를 사용하여 손쉽게 삭제가 가능하다.
$ kind get clusters
hackerpark
kind
$ kind delete cluster --name hackerpark
Deleting cluster "hackerpark" ...
Deleted nodes: ["hackerpark-control-plane"]
$ kind get clusters
kind
$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kind-kind kind-kind kind-kind
마무리
이렇게 kind를 사용하여 손쉽게 cluster를 생성 및 삭제할 수 있으며 여러 종류의 cluster를 생성하고 관리하는 게 가능하다.
이 포스팅에서는 kind를 통해 서로 다른 버전의 cluster를 생성하는 것을 다루지 않았는데 다음 포스팅에서 kind를 응용하여 여러 버전의 cluster를 다뤄볼 예정이며, 이미 지원 종료된 kubernetes의 버전도 설치해 볼 예정이다.
'Kubernetes > 실습' 카테고리의 다른 글
[Kubernetes] 쿠버네티스 구축 총 정리 (containerd) (2) | 2024.11.02 |
---|---|
[Kubernetes] Worker (slave) node upgrade (0) | 2024.03.22 |
[Kubernetes] Control plane (master) node upgrade (0) | 2024.03.14 |
[kubernetes] control-plane(master) node 설치 과정(cri-o) (0) | 2024.03.13 |
[Kubernetes] kubespray 를 사용한 k8s 설치 (2) | 2023.05.15 |