DevOps 잡다구리/Kubernetes Stuff

[Kubernetes] KWOK 에 대하여 ( Kubelet 이 없는 Kubernetes ) 요약 및 간단한 생각

WhiteGoblin 2023. 3. 10. 00:30
반응형

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

[3]https://kwok.sigs.k8s.io/docs/user/install/#homebrew

반응형