[Kubernetes] KWOK 에 대하여 ( Kubelet 이 없는 Kubernetes ) 요약 및 간단한 생각
https://kubernetes.io/blog/2023/03/01/introducing-kwok/ [1]
Introducing KWOK: Kubernetes WithOut Kubelet
Author: Shiming Zhang (DaoCloud), Wei Huang (Apple), Yibo Zhuang (Apple) Have you ever wondered how to set up a cluster of thousands of nodes just in seconds, how to simulate real nodes with a low resource footprint, and how to test your Kubernetes control
kubernetes.io
위 글을 읽고 유용하다가 여겨서 이렇게 글을 작성하게 되었습니다.
쿠버네티스는 기본적으로 마스터 노드에 api server 가 있고 이러한 api server 를 통해서 kubelet 이 보고 하는 것을 통해 노드의 pod 상태를 확인 및 상태를 유지 하고자 합니다.
하지만 위 글은 우선 이러한 기본적으로 존재해야 하는 kubelet 없는 kubernetes 에 대해서 이야기를 하니 흥미가 안 갈 수 없는 주제 인거 같습니다.
1. kwok 이란?
해당 글에서 정의 하기를
kwok is the cornerstone of this project, responsible for simulating the lifecycle of fake nodes, pods, and other Kubernetes API resources.
이라고 한다, 즉 kwok 은 가짜 포드, 노드 및 기타 Kubernetes API 리소스의 수명 주기 시뮬레이션을 책임지는 프로젝트의 시작점 입니다.
그리고 이러한 kwok 의 CLI 툴인 kwokctl 이 있습니다.
2. kwok 사용해보기 [2]
[3] https://kwok.sigs.k8s.io/docs/user/install/#homebrew
Install | KWOK
Install # This document walks through the installation of kwokctl and kwok binaries. Homebrew # On Linux/MacOS systems you can install kwok/kwokctl via brew: brew install kwok Binary Releases # Variables preparation # # KWOK repository KWOK_REPO=kubernetes
kwok.sigs.k8s.io
kwok & kwokctl 설치 하기
kwokctl --version
kwokctl version v0.1.0
kwok --version
kwok version v0.1.0
이런식으로 버전 체크 까지 하면 완료입니다.
3. kwok 를 통해 cluster 생성하기
// 본 글에서는 docker 를 사용 및 설치되어 있다는 것을 전제로 시작합니다.
kwokctl --name demo create cluster
Creating cluster cluster=demo
Pull image cluster=demo image="registry.k8s.io/etcd:3.5.6-0"
3.5.6-0: Pulling from etcd
76c00402984b: Pull complete
ab8f7ca28a3b: Pull complete
efcaddbb2748: Pull complete
63b3d4853045: Pull complete
d41cc84301d4: Pull complete
Digest: sha256:dd75ec974b0a2a6f6bb47001ba09207976e625db898d1b16735528c009cb171c
Status: Downloaded newer image for registry.k8s.io/etcd:3.5.6-0
registry.k8s.io/etcd:3.5.6-0
Pull image cluster=demo image="registry.k8s.io/kube-apiserver:v1.26.0"
v1.26.0: Pulling from kube-apiserver
76c00402984b: Already exists
f832b2590026: Pull complete
5d30da516795: Pull complete
Digest: sha256:d230a0b88a3daf14e4cce03b906b992c8153f37da878677f434b1af8c4e8cc75
Status: Downloaded newer image for registry.k8s.io/kube-apiserver:v1.26.0
registry.k8s.io/kube-apiserver:v1.26.0
Pull image cluster=demo image="registry.k8s.io/kwok/kwok:v0.1.0"
v0.1.0: Pulling from kwok/kwok
a9eaa45ef418: Already exists
dcd5679ade7e: Pull complete
Digest: sha256:03308ed8f9cca3eb9fbf538d7f2f13402b61dbc0302cc2b17b718388b69e52c0
Status: Downloaded newer image for registry.k8s.io/kwok/kwok:v0.1.0
registry.k8s.io/kwok/kwok:v0.1.0
Pull image cluster=demo image="registry.k8s.io/kube-controller-manager:v1.26.0"
v1.26.0: Pulling from kube-controller-manager
76c00402984b: Already exists
f832b2590026: Already exists
c75418d40b12: Pull complete
Digest: sha256:26e260b50ec46bd1da7352565cb8b34b6dd2cb006cebbd2f35170d50935fb9ec
Status: Downloaded newer image for registry.k8s.io/kube-controller-manager:v1.26.0
registry.k8s.io/kube-controller-manager:v1.26.0
Pull image cluster=demo image="registry.k8s.io/kube-scheduler:v1.26.0"
v1.26.0: Pulling from kube-scheduler
76c00402984b: Already exists
f832b2590026: Already exists
7de044f271d4: Pull complete
Digest: sha256:34a142549f94312b41d4a6cd98e7fddabff484767a199333acb7503bf46d7410
Status: Downloaded newer image for registry.k8s.io/kube-scheduler:v1.26.0
registry.k8s.io/kube-scheduler:v1.26.0
Starting cluster cluster=demo
[+] Running 6/6
⠿ Network kwok-demo Created 0.0s
⠿ Container kwok-demo-etcd Starte... 0.4s
⠿ Container kwok-demo-kube-apiserver Started 0.6s
⠿ Container kwok-demo-kube-controller-manager Started 1.1s
⠿ Container kwok-demo-kube-scheduler Started 0.9s
⠿ Container kwok-demo-kwok-controller Started 1.2s
Cluster is created cluster=demo elapsed=1s
You can now use your cluster with:
kubectl config use-context kwok-demo
Thanks for using kwok!
kwokctl get clusters
demo
빠르게 끝나는것을 확인할 수 있습니다.
이제는 node 를 추가합니다.
https://github.com/kubernetes-sigs/kwok/tree/main/test/kwok
위 링크 안에 보면 fake-node.yaml , fake-deployment.yaml 이라는 두 파일 이 보입니다.
해당 파일들을 이용하여서 예제를 진행하게 될 것입니다.
fake-node.yaml 을 확인 해보면
apiVersion: v1
kind: Node
metadata:
annotations:
kwok.x-k8s.io/node: fake
node.alpha.kubernetes.io/ttl: "0"
labels:
beta.kubernetes.io/arch: amd64
beta.kubernetes.io/os: linux
kubernetes.io/arch: amd64
kubernetes.io/hostname: fake-node
kubernetes.io/os: linux
kubernetes.io/role: agent
node-role.kubernetes.io/agent: ""
type: kwok-controller
name: fake-node
spec:
taints:
- effect: NoSchedule
key: kwok-controller/provider
value: fake
fake-deployments.yaml 파일을 보면
apiVersion: apps/v1
kind: Deployment
metadata:
name: fake-pod
namespace: default
spec:
replicas: 5
selector:
matchLabels:
app: fake-pod
template:
metadata:
labels:
app: fake-pod
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: In
values:
- kwok-controller
tolerations:
- key: "kwok-controller/provider"
operator: "Exists"
effect: "NoSchedule"
containers:
- name: fake-container
image: fake
nodeName: fake-node
위 두 파일을 kubectl 을 통해서 적용하게 되면
kubectl apply -f fake-deployment.yaml
kubectl apply -f fake-node.yaml
kubectl get nodes
NAME STATUS ROLES AGE VERSION
fake-node Ready agent 68m fake
kubectl get pods
NAME READY STATUS RESTARTS AGE
fake-pod-644977fd68-4s4mt 1/1 Running 0 62m
fake-pod-644977fd68-8nr7l 1/1 Running 0 62m
fake-pod-644977fd68-czsqz 1/1 Running 0 62m
fake-pod-644977fd68-kqgvv 1/1 Running 0 62m
fake-pod-644977fd68-zvv7q 1/1 Running 0 62m
위 처럼 나오게 됩니다
우선 이렇게 빠르게 되는것이 신기 하기는 한데 정말 그렇게 되는건지 궁금해서 docker 를 확인 해보니
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f3af9cdf70e8 registry.k8s.io/kwok/kwok:v0.1.0 "kwok --manage-all-n…" About an hour ago Up About an hour kwok-demo-kwok-controller
8db972e107f2 registry.k8s.io/kube-scheduler:v1.26.0 "kube-scheduler --ku…" About an hour ago Up About an hour kwok-demo-kube-scheduler
52d2c8e885a4 registry.k8s.io/kube-controller-manager:v1.26.0 "kube-controller-man…" About an hour ago Up About an hour kwok-demo-kube-controller-manager
c095f8f1f358 registry.k8s.io/kube-apiserver:v1.26.0 "kube-apiserver --ad…" About an hour ago Up About an hour 0.0.0.0:32766->6443/tcp kwok-demo-kube-apiserver
0812fde542d7 registry.k8s.io/etcd:3.5.6-0 "etcd --name=node0 -…" About an hour ago Up About an hour 2379-2380/tcp, 4001/tcp, 7001/tcp kwok-demo-etcd
위와 같이 schduler , controller , api server 그리고 etcd 가 추가 되어 있는것을 확인 할 수 있습니다.
minikube 의 경우
ddf73f7a8f56 gcr.io/k8s-minikube/kicbase:v0.0.36 "/usr/local/bin/entr…" 38 seconds ago Up 37 seconds 0.0.0.0:53847->22/tcp, 0.0.0.0:53848->2376/tcp, 0.0.0.0:53850->5000/tcp, 0.0.0.0:53846->8443/tcp, 0.0.0.0:53849->32443/tcp minikube
위와 같이 하나의 컨테이너 였는데 kwok 의 경우 그렇지 않고 다 다른 container 를 통해서 kubernetes 의 master node 의 요소들을 구성해 내가는거 같습니다.
현재 23.03.09 까지 나와 있는 요소들은 저 정도인것 같습니다.
현재 kwok 블로그 글에서는 learning, dev, testing 용으로 용이하다고 하는데 그 부분에 대해서는 찬성합니다.
추가적으로 개발이 되거나 추가 되는 특성들이 있다면 해당 부분들을 업로드 하겠습니다.
[참고문헌]
[1] https://kubernetes.io/blog/2023/03/01/introducing-kwok/
[2] https://github.com/kubernetes-sigs/kwok/
GitHub - kubernetes-sigs/kwok: Kubernetes WithOut Kubelet - Simulates thousands of Nodes and Clusters.
Kubernetes WithOut Kubelet - Simulates thousands of Nodes and Clusters. - GitHub - kubernetes-sigs/kwok: Kubernetes WithOut Kubelet - Simulates thousands of Nodes and Clusters.
github.com