[์ฟ ๋ฒ„๋„คํ‹ฐ์Šค] kind ํด๋Ÿฌ์Šคํ„ฐ์— operator sdk ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋กœ์ปฌ ๋ฐฐํฌ (2)

https://appletreeworkplace.tistory.com/41

 

[์ฟ ๋ฒ„๋„คํ‹ฐ์Šค] Kind + Cilium CNI ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์ถ• (1)

kind ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋กœ์ปฌ์—์„œ ๋„์ปค๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ด๋ณธ๋‹ค.๊ทผ๋ฐ ์ด์ œ ๋„คํŠธ์›Œํฌ cni๋Š” cilium์„ ๊ณ๋“ค์ธ ๋ฒ„์ „์ด๋‹ค.์‚ฌ์ „ ํ™˜๊ฒฝ ์…‹ํŒ…brew install orbstack ๋งฅ

appletreeworkplace.tistory.com

 

์ „ํŽธ์—์„œ ์ƒ์„ฑํ•œ kind ํด๋Ÿฌ์Šคํ„ฐ ์œ„์— operator sdk๋กœ ๋งŒ๋“  ์ด๋ฏธ์ง€๋ฅผ ๋กœ์ปฌ๋กœ ๋ฐฐํฌํ•ด์„œ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋ณธ๋‹ค.

 

์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋นŒ๋“œ

make docker-build IMG=localhost:5000/controller:1.0.0

docker images
REPOSITORY                  TAG       IMAGE ID       CREATED          SIZE
localhost:5000/controller   1.0.0     f817d23c4901   18 minutes ago   70.1MB

 

๋กœ์ปฌ ํ™˜๊ฒฝ์— ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.

 

Kind ํด๋Ÿฌ์Šคํ„ฐ์— ์ด๋ฏธ์ง€ ๋กœ๋“œ

kind load docker-image --name $MY_CLUSTER localhost:5000/controller:1.0.0

 

๋กœ์ปฌ Docker์—์„œ ๋นŒ๋“œํ•œ ์ด๋ฏธ์ง€๋ฅผ Kind ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€๋กœ ๋กœ๋“œํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.
์ด ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•ด์ฃผ๋Š” ์ด์œ ๋Š” Kind๋Š” ์ž์ฒด์ ์ธ Docker ๋„คํŠธ์›Œํฌ์—์„œ ์‹คํ–‰๋˜์–ด docker push ์—†์ด kind load docker-image๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋“ฑ๋กํ•ด์•ผ ๋ง์•„๋†“์€ ์ด๋ฏธ์ง€๊ฐ€ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

Normal   BackOff    23s               kubelet            Back-off pulling image "localhost:5000/controller:1.0.0"
Warning  Failed     23s               kubelet            Error: ImagePullBackOff
Normal   Pulling    9s (x2 over 24s)  kubelet            Pulling image "localhost:5000/controller:1.0.0"
Warning  Failed     9s (x2 over 24s)  kubelet            Failed to pull image "localhost:5000/controller:1.0.0": failed to pull and unpack image "localhost:5000/controller:1.0.0": failed to resolve reference "localhost:5000/controller:1.0.0": failed to do request: Head "http://localhost:5000/v2/controller/manifests/1.0.0": dial tcp [::1]:5000: connect: connection refused
Warning  Failed     9s (x2 over 24s)  kubelet            Error: ErrImagePull

 

๋กœ๋“œ๋ฅผ ๋”ฐ๋กœ ์•ˆํ–ˆ๋”๋‹ˆ ๊ณ„์† ์ด๋ฏธ์ง€๊ฐ€ ์—๋Ÿฌ๊ฐ€ ๋– ์„œ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ๐Ÿฅฒ

 

Operator ๋ฐฐํฌ

make deploy IMG=localhost:5000/controller:1.0.0

 

๋™์ž‘ ํ™•์ธ

k get po -A
omyo-meow-system     omyo-meow-controller-manager-6fd85d76df-jzrrl   1/1     Running   0          2m21s

 

ํŒŒ๋“œ๊ฐ€ ๋Ÿฌ๋‹ ์ƒํƒœ๋กœ ๋–ด๋‹ค.

๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ปจํŠธ๋กค๋Ÿฌ ๋ฆฌ์ปจ์‚ฌ์ผ ๋ถ€๋ถ„์ด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด์•˜๋‹ค.

 

๋ฆฌ์†Œ์Šค ๋ฐฐํฌ

kubectl apply -f - <<EOF
apiVersion: omyo.test.io/v1alpha1
kind: OmyoTracker
metadata:
  name: test-tracker
spec:
  vmName: "vm-test"
  hostNode: "node-1"
  vmState: "Running"
EOF

 

์˜คํผ๋ ˆ์ดํ„ฐ ๋กœ๊ทธ

kubectl logs -n omyo-meow-system deployment/omyo-meow-controller-manager -f

 

Operator๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๋‹ค๊ฐ€ ์ข…๋ฃŒ๋œ ๊ณผ์ •์„ ์‚ดํŽด๋ณด๋„๋ก ํ•œ๋‹ค.

2025-03-08T13:20:11Z INFO     setup   starting manager
2025-03-08T13:20:11Z   INFO     controller-runtime.metrics      Starting metrics server
2025-03-08T13:20:11Z   INFO     setup   disabling http/2
2025-03-08T13:20:11Z   INFO     starting server {"name": "health probe", "addr": "[::]:8081"}

 

์˜คํผ๋ ˆ์ดํ„ฐ ์ปจํŠธ๋กค๋Ÿฌ ๋งค๋‹ˆ์ €๊ฐ€ ์‹œ์ž‘๋˜๊ณ , ๋งคํŠธ๋ฆญ ์ˆ˜์ง‘์„ ์œ„ํ•œ ๋งคํŠธ๋ฆญ ์„œ๋ฒ„๊ฐ€ ์‹œ์ž‘๋œ๋‹ค.

ํ—ฌ์Šค ์ฒดํฌ ์„œ๋ฒ„(Health Probe) ์‹œ์ž‘๋˜๋ฉด์„œ Operator์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋Š” API๊ฐ€ Kubernetes๊ฐ€ Operator๊ฐ€ ์ •์ƒ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ฐ์ง€ํ•œ๋‹ค.

I0308 13:20:11.747981       1 leaderelection.go:254] attempting to acquire leader lease omyo-meow-system/a9bae644.test.io...
I0308 13:20:11.757835       1 leaderelection.go:268] successfully acquired lease omyo-meow-system/a9bae644.test.io
2025-03-08T13:20:11Z   DEBUG  events  omyo-meow-controller-manager-6fd85d76df-jzrrl_be888f8f-6e74-47af-ac2f-601937cd2dfb became leader        {"type": "Normal", "object": {"kind":"Lease","namespace":"omyo-meow-system","name":"a9bae644.test.io","uid":"c53e7713-554d-4bce-b7b6-0ca5c67d50c1","apiVersion":"coordination.k8s.io/v1","resourceVersion":"351222"}, "reason": "LeaderElection"}

 

Operator๊ฐ€ ๋ฆฌ๋” ์„ ์ถœ์„ ํ•˜๋Š”๋ฐ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์—ฌ๋Ÿฌ Operator ์ธ์Šคํ„ด์Šค๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๊ฐœ์˜ ํŒŒ๋“œ๋งŒ ๋ฆฌ๋” ์—ญํ• ์„ ๋งก๋„๋ก ์„ ์ถœํ•˜๊ฒŒ ๋œ๋‹ค.

๋ฆฌ๋” ์„ ์ถœ์ด ์™„๋ฃŒ๋œ ํ›„ Reconcile ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ์ค€๋น„๋ฅผ ํ•˜๊ฒŒ ๋œ๋‹ค.

2025-03-08T13:20:11Z   INFO     Starting EventSource    {"controller": "omyotracker", "controllerGroup": "omyo.test.io", "controllerKind": "OmyoTracker", "source": "kind source: *v1alpha1.OmyoTracker"}
2025-03-08T13:20:11Z   INFO     Starting Controller     {"controller": "omyotracker", "controllerGroup": "omyo.test.io", "controllerKind": "OmyoTracker"}
2025-03-08T13:20:11Z   INFO     Starting workers        {"controller": "omyotracker", "controllerGroup": "omyo.test.io", "controllerKind": "OmyoTracker", "worker count": 1}
2025-03-08T13:20:12Z   INFO     controller-runtime.metrics      Serving metrics server  {"bindAddress": ":8443", "secure": true}

 

OmyoTracker ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ์ด๋ฒคํŠธ ์†Œ์Šค๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉด์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ์ง€ํ•˜๊ฒŒ ๋˜๋ฉด Reconcile ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

Reconcile ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์›Œ์ปค ํ”„๋กœ์„ธ์Šค๊ฐ€ 1๊ฐœ ํ™œ์„ฑํ™”๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

2025-03-08T13:27:11Z   INFO     Host Node:      {"controller": "omyotracker", "controllerGroup": "omyo.test.io", "controllerKind": "OmyoTracker", "OmyoTracker": {"name":"test-tracker"}, "namespace": "", "name": "test-tracker", "reconcileID": "1f0e593e-f32e-47c9-beb2-a5c341457d6a", "host": "node-1"}

 

Reconcile ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ๋ฆฌ์†Œ์Šค ๋ฐฐํฌ ์‹œ ๋กœ๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜๋„๋ก ์ž‘์„ฑํ•˜์˜€๋‹ค.

2025-03-08T13:28:49Z   INFO     Stopping and waiting for non leader election runnables
2025-03-08T13:28:49Z   INFO     Stopping and waiting for leader election runnables
2025-03-08T13:28:49Z   INFO     Shutdown signal received, waiting for all workers to finish     {"controller": "omyotracker", "controllerGroup": "omyo.test.io", "controllerKind": "OmyoTracker"}
2025-03-08T13:28:49Z   INFO     All workers finished    {"controller": "omyotracker", "controllerGroup": "omyo.test.io", "controllerKind": "OmyoTracker"}
2025-03-08T13:28:49Z   INFO     Stopping and waiting for caches
2025-03-08T13:28:49Z   INFO     Stopping and waiting for webhooks
2025-03-08T13:28:49Z   INFO     Stopping and waiting for HTTP servers
2025-03-08T13:28:49Z   INFO     shutting down server    {"name": "health probe", "addr": "[::]:8081"}
2025-03-08T13:28:49Z   INFO     controller-runtime.metrics      Shutting down metrics server with timeout of 1 minute
2025-03-08T13:28:49Z   INFO     Wait completed, proceeding to shutdown the manager

 

make undeploy๋กœ ์˜ฌ๋ ค๋‘” ์˜คํผ๋ ˆ์ดํ„ฐ ํŒŒ๋“œ๋ฅผ ๋‚ด๋ ค์ฃผ์—ˆ์„ ๋•Œ ์ข…๋ฃŒ ๋™์ž‘์ด๋‹ค.