ํ•ด๋‹น ๋ฌธ์„œ์˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฒ„์ „: v1.30

Kubernetes v1.30 ๋ฌธ์„œ๋Š” ๋” ์ด์ƒ ์ ๊ทน์ ์œผ๋กœ ๊ด€๋ฆฌ๋˜์ง€ ์•Š์Œ. ํ˜„์žฌ ๋ณด๊ณ ์žˆ๋Š” ๋ฌธ์„œ๋Š” ์ •์  ์Šค๋ƒ…์ƒท์ž„. ์ตœ์‹  ๋ฌธ์„œ๋ฅผ ์œ„ํ•ด์„œ๋Š”, ๋‹ค์Œ์„ ์ฐธ๊ณ . ์ตœ์‹  ๋ฒ„์ „.

ํด๋Ÿฌ์Šคํ„ฐ ์ ‘๊ทผ

์—ฌ๊ธฐ์—์„œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ†ต์‹ ์„ ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฃฐ ๊ฒƒ์ด๋‹ค.

์ฒ˜์Œ์ด๋ผ๋ฉด kubectl์„ ์‚ฌ์šฉํ•˜์—ฌ ์ ‘๊ทผ

์ตœ์ดˆ๋กœ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API์— ์ ‘๊ทผํ•  ๋•Œ ์šฐ๋ฆฌ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค CLI์ธ kubectl์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์˜ ์œ„์น˜์ •๋ณด๋ฅผ ์•Œ์•„์•ผ ํ•˜๊ณ  ํด๋Ÿฌ์Šคํ„ฐ์— ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•œ ์ธ์ฆ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Š” ๋‹น์‹ ์ด Getting started guide๋ฅผ ๋‹ค ์ง„ํ–‰ํ–ˆ์„ ๋•Œ ์ž๋™์œผ๋กœ ๊ตฌ์„ฑ๋˜๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ๋‹น์‹ ์—๊ฒŒ ์ธ์ฆ์ •๋ณด์™€ ์œ„์น˜์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

kubectl์ด ์ธ์ง€ํ•˜๋Š” ์œ„์น˜์ •๋ณด์™€ ์ธ์ฆ์ •๋ณด๋Š” ๋‹ค์Œ ์ปค๋งจ๋“œ๋กœ ํ™•์ธํ•œ๋‹ค.

kubectl config view

์—ฌ๊ธฐ์—์„œ kubectl ์‚ฌ์šฉ ์˜ˆ์‹œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์™„์ „ํ•œ ๋ฌธ์„œ๋Š” kubectl ๋ ˆํผ๋Ÿฐ์Šค์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

REST API์— ์ง์ ‘ ์ ‘๊ทผ

kubectl์€ apiserver์˜ ์œ„์น˜ ํŒŒ์•…๊ณผ ์ธ์ฆ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋งŒ์•ฝ ๋‹น์‹ ์ด curl, wget ๋˜๋Š” ์›น๋ธŒ๋ผ์šฐ์ €์™€ ๊ฐ™์€ http ํด๋ผ์ด์–ธํŠธ๋กœ REST API์— ์ง์ ‘ ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด ์œ„์น˜ ํŒŒ์•…๊ณผ ์ธ์ฆ์„ ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค.

  • kubectl์„ proxy ๋ชจ๋“œ๋กœ ์‹คํ–‰.
    • ๊ถŒ์žฅํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹.
    • ์ €์žฅ๋œ apiserver ์œ„์น˜๋ฅผ ์‚ฌ์šฉ.
    • self-signed ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ apiserver์˜ identity๋ฅผ ๊ฒ€์ฆ. MITM์€ ๋ถˆ๊ฐ€๋Šฅ.
    • apiserver ์ธ์ฆ.
    • ์•ž์œผ๋กœ๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก์˜ ์ง€๋Šฅํ˜• load balancing๊ณผ failover๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.
  • ์ง์ ‘์ ์œผ๋กœ http ํด๋ผ์ด์–ธํŠธ์— ์œ„์น˜์ •๋ณด์™€ ์ธ์ฆ์ •๋ณด๋ฅผ ์ œ๊ณต.
    • ๋Œ€์•ˆ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹.
    • proxy ์‚ฌ์šฉ๊ณผ ํ˜ผ๋™๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ํƒ€์ž…์˜ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์™€ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.
    • MITM๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธ๋ฅผ ์œ„ํ•ด root ์ธ์ฆ์„œ๋ฅผ ๋‹น์‹ ์˜ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ž„ํฌํŠธํ•ด์•ผ ํ•œ๋‹ค.

kubectl proxy ์‚ฌ์šฉ

๋‹ค์Œ ์ปค๋งจ๋“œ๋Š” kubectl์„ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ(reverse proxy)์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š” ๋ชจ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ด๋Š” apiserver์˜ ์œ„์น˜์ง€์ •๊ณผ ์ธ์ฆ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•œ๋‹ค.

kubectl proxy --port=8080

์ƒ์„ธ ๋‚ด์šฉ์€ kubectl proxy๋ฅผ ์ฐธ์กฐํ•œ๋‹ค

์ดํ›„์— ๋‹น์‹ ์€ curl, wget, ์›น๋ธŒ๋ผ์šฐ์ €๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด API๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค. localhost๋Š” IPv6 ์ฃผ์†Œ [::1]๋กœ๋„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค.

curl http://localhost:8080/api/

๊ฒฐ๊ด๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.

{
  "kind": "APIVersions",
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "10.0.1.149:443"
    }
  ]
}

kubectl proxy๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ

kubectl apply ๋ฐ kubectl describe secret... ๋ช…๋ น๊ณผ grep/cut์„ ํ™œ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ์˜ ํ† ํฐ์„ ์ƒ์„ฑํ•œ๋‹ค.

๋จผ์ €, ๊ธฐ๋ณธ ์„œ๋น„์Šค์–ด์นด์šดํŠธ๋ฅผ ์œ„ํ•œ ํ† ํฐ์„ ์š”์ฒญํ•˜๋Š” ์‹œํฌ๋ฆฟ์„ ์ƒ์„ฑํ•œ๋‹ค.

kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: default-token
  annotations:
    kubernetes.io/service-account.name: default
type: kubernetes.io/service-account-token
EOF

๋‹ค์Œ์œผ๋กœ, ํ† ํฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ•ด๋‹น ์‹œํฌ๋ฆฟ์— ํ† ํฐ์„ ์ฑ„์šฐ๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

while ! kubectl describe secret default-token | grep -E '^token' >/dev/null; do
  echo "waiting for token..." >&2
  sleep 1
done

๊ฒฐ๊ณผ๋ฅผ ์บก์ฒ˜ํ•˜์—ฌ ์ƒ์„ฑ๋œ ํ† ํฐ์„ ์‚ฌ์šฉํ•œ๋‹ค.

APISERVER=$(kubectl config view --minify | grep server | cut -f 2- -d ":" | tr -d " ")
TOKEN=$(kubectl describe secret default-token | grep -E '^token' | cut -f2 -d':' | tr -d " ")

curl $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure

๊ฒฐ๊ณผ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.

{
  "kind": "APIVersions",
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "10.0.1.149:443"
    }
  ]
}

jsonpath๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

APISERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')
TOKEN=$(kubectl get secret default-token -o jsonpath='{.data.token}' | base64 --decode)

curl $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure

๊ฒฐ๊ณผ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.

{
  "kind": "APIVersions",
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "10.0.1.149:443"
    }
  ]
}

์œ„ ์˜ˆ์ œ์—์„œ๋Š” --insecure flag๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ์ด๋Š” MITM ๊ณต๊ฒฉ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋กœ ๋‘๋Š” ๊ฒƒ์ด๋‹ค. kubectl๋กœ ํด๋Ÿฌ์Šคํ„ฐ์— ์ ‘์†ํ•  ๋•Œ ์ €์žฅ๋œ root ์ธ์ฆ์„œ์™€ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ๋“ค์„ ์„œ๋ฒ„ ์ ‘์†์— ์‚ฌ์šฉํ•œ๋‹ค. (์ด๋“ค์€ ~/.kube ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์„ค์น˜๋œ๋‹ค.) ์ผ๋ฐ˜์ ์œผ๋กœ self-signed ์ธ์ฆ์„œ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ์ธ์ฆ์„œ๋กœ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ๋‹น์‹ ์˜ http ํด๋ผ์ด์–ธํŠธ๊ฐ€ root ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํŠน์ˆ˜ํ•œ ์„ค์ •์„ ํ•„์š”๋กœ ํ•  ๊ฒƒ์ด๋‹ค.

localhost์—์„œ ์ œ๊ณต๋˜๊ฑฐ๋‚˜ ๋ฐฉํ™”๋ฒฝ์œผ๋กœ ๋ณดํ˜ธ๋˜๋Š” ๋ช‡๋ช‡ ํด๋Ÿฌ์Šคํ„ฐ๋“ค์—์„œ๋Š” apiserver๊ฐ€ ์ธ์ฆ์„ ์š”๊ตฌํ•˜์ง€ ์•Š์ง€๋งŒ ์ด๋Š” ํ‘œ์ค€์ด ์•„๋‹ˆ๋‹ค. API์— ๋Œ€ํ•œ ์ ‘๊ทผ ์ œ์–ด์€ ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๊ฐ€ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์„ค๋ช…ํ•œ๋‹ค.

API์— ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ๊ณต์‹์ ์œผ๋กœ Go์™€ Python ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง€์›ํ•œ๋‹ค.

Go ํด๋ผ์ด์–ธํŠธ

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ทจ๋“ํ•˜๋ ค๋ฉด go get k8s.io/client-go@kubernetes-<kubernetes-version-number> ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. INSTALL.md์—์„œ ์ƒ์„ธํ•œ ์„ค์น˜ ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. https://github.com/kubernetes/client-go์—์„œ ์–ด๋–ค ๋ฒ„์ ผ์ด ์ง€์›๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • client-go ํด๋ผ์ด์–ธํŠธ ์œ„์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•˜์ž. client-go๋Š” ์ž์ฒด์ ์œผ๋กœ API ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ •์˜ํ•˜๋ฏ€๋กœ ํ•„์š”ํ•˜๋‹ค๋ฉด main ๋ ˆํฌ์ง€ํ„ฐ๋ฆฌ๋ณด๋‹ค๋Š” client-go์—์„œ API ์ •์˜๋“ค์„ importํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž€๋‹ค. ์ •ํ™•ํ•˜๊ฒŒ import "k8s.io/client-go/kubernetes"๋กœ importํ•˜๋Š” ๊ฒƒ์„ ์˜ˆ๋กœ ๋“ค ์ˆ˜ ์žˆ๋‹ค.

Go ํด๋ผ์ด์–ธํŠธ๋Š” apiserver์˜ ์œ„์น˜์ง€์ •๊ณผ ์ธ์ฆ์— kubectl CLI์™€ ๋™์ผํ•˜๊ฒŒ kubeconfig file์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ์ œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

๋งŒ์•ฝ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์— ํŒŒ๋“œ๋กœ ๋ฐฐํฌ๋˜์—ˆ๋‹ค๋ฉด ๋‹ค์Œ ์žฅ์„ ์ฐธ์กฐํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž€๋‹ค.

Python ํด๋ผ์ด์–ธํŠธ

Python ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด pip install kubernetes ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์„ค์น˜ ์˜ต์…˜์— ๋Œ€ํ•œ ์ƒ์„ธ ์‚ฌํ•ญ์€ Python Client Library page๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

Python ํด๋ผ์ด์–ธํŠธ๋Š” apiserver์˜ ์œ„์น˜์ง€์ •๊ณผ ์ธ์ฆ์— kubectl CLI์™€ ๋™์ผํ•˜๊ฒŒ kubeconfig file์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ์ œ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

๋‹ค๋ฅธ ์–ธ์–ด

๋‹ค๋ฅธ ์–ธ์–ด์—์„œ API๋ฅผ ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•œ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค๋„ ์กด์žฌํ•œ๋‹ค. ์ด๋“ค์ด ์–ด๋–ป๊ฒŒ ์ธ์ฆํ•˜๋Š”์ง€๋Š” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์˜ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

ํŒŒ๋“œ์—์„œ API ์ ‘๊ทผ

ํŒŒ๋“œ์—์„œ API์— ์ ‘๊ทผํ•˜๋Š” ๊ฒฝ์šฐ, API ์„œ๋ฒ„๋ฅผ ์ฐพ๊ณ  ์ธ์ฆํ•˜๋Š” ๋ฐฉ์‹์ด ์•ฝ๊ฐ„ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํŒŒ๋“œ ๋‚ด์—์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API์— ์ ‘๊ทผ์„ ์ฐธ์กฐํ•œ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰๋˜๋Š” ์„œ๋น„์Šค๋กœ ์ ‘๊ทผ

์ด์ „ ์„น์…˜์—์„œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•˜์˜€๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰๋˜๋Š” ๋‹ค๋ฅธ ์„œ๋น„์Šค์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํด๋Ÿฌ์Šคํ„ฐ ์„œ๋น„์Šค์— ์ ‘๊ทผ ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

redirect ์š”์ฒญํ•˜๊ธฐ

redirect ๊ธฐ๋Šฅ์€ deprecated๋˜๊ณ  ์ œ๊ฑฐ ๋˜์—ˆ๋‹ค. ๋Œ€์‹  (์•„๋ž˜์˜) ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž€๋‹ค.

๋‹ค์–‘ํ•œ ํ”„๋ก์‹œ๋“ค

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋‹น์‹ ์ด ์ ‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ํ”„๋ก์‹œ๋“ค์ด ์กด์žฌํ•œ๋‹ค.

  1. kubectl proxy:

    • ์‚ฌ์šฉ์ž์˜ ๋ฐ์Šคํฌํƒ‘์ด๋‚˜ ํŒŒ๋“œ ๋‚ด์—์„œ ์‹คํ–‰ํ•œ๋‹ค
    • localhost ์ฃผ์†Œ์—์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค apiserver๋กœ ํ”„๋ก์‹œํ•œ๋‹ค
    • ํ”„๋ก์‹œํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๋Š” HTTP๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค
    • apiserver์˜ ํ”„๋ก์‹œ๋Š” HTTPS๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค
    • apiserver๋ฅผ ์œ„์น˜์ง€์ •ํ•œ๋‹ค
    • ์ธ์ฆ header๋“ค์„ ์ถ”๊ฐ€ํ•œ๋‹ค
  2. apiserver proxy:

    • apiserver ๋‚ด์˜ ๋นŒํŠธ์ธ bastion์ด๋‹ค
    • ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ๋Š” ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์˜ ์‚ฌ์šฉ์ž๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ IP๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค
    • apiserver process๋“ค ๋‚ด์—์„œ ์‹คํ–‰๋œ๋‹ค
    • ํ”„๋ก์‹œํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๋Š” HTTPS๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค(๋˜๋Š” apiserver๊ฐ€ http๋กœ ๊ตฌ์„ฑ๋˜์—ˆ๋‹ค๋ฉด http)
    • ํƒ€๊ฒŸ์œผ๋กœ์˜ ํ”„๋ก์‹œ๋Š” ๊ฐ€์šฉ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋ก์‹œ์— ์˜ํ•ด์„œ HTTP ๋˜๋Š” HTTPS๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค
    • ๋…ธ๋“œ, ํŒŒ๋“œ, ์„œ๋น„์Šค์— ์ ‘๊ทผํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค
    • ์„œ๋น„์Šค์— ์ ‘๊ทผํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉด load balacingํ•œ๋‹ค
  3. kube proxy:

    • ๊ฐ ๋…ธ๋“œ ์ƒ์—์„œ ์‹คํ–‰๋œ๋‹ค
    • UDP์™€ TCP๋ฅผ ํ”„๋ก์‹œํ•œ๋‹ค
    • HTTP๋ฅผ ์ธ์ง€ํ•˜์ง€ ์•Š๋Š”๋‹ค
    • load balancing์„ ์ œ๊ณตํ•œ๋‹ค
    • ์„œ๋น„์Šค์— ์ ‘๊ทผํ•˜๋Š” ๋ฐ์—๋งŒ ์‚ฌ์šฉ๋œ๋‹ค
  4. apiserver(s) ์ „๋ฉด์˜ Proxy/Load-balancer:

    • ์กด์žฌ๋‚ด์šฉ๊ณผ ๊ตฌํ˜„์‚ฌํ•ญ์€ ํด๋Ÿฌ์Šคํ„ฐ ๋ณ„๋กœ ๋‹ค์–‘ํ•˜๋‹ค(์˜ˆ. nginx)
    • ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์™€ ํ•˜๋‚˜ ์ด์ƒ์˜ apiserver๋“ค์˜ ์‚ฌ์ด์— ์œ„์น˜ํ•œ๋‹ค
    • apiserver๊ฐ€ ์—ฌ๋Ÿฌ ๋Œ€ ์กด์žฌํ•œ๋‹ค๋ฉด load balancer๋กœ ๋™์ž‘ํ•œ๋‹ค
  5. ์™ธ๋ถ€ ์„œ๋น„์Šค์˜ Cloud Load Balancer๋“ค:

    • Cloud provider๋“ค์— ์˜ํ•ด์„œ ์ œ๊ณต๋œ๋‹ค(์˜ˆ. AWS ELB, Google Cloud Load Balancer)
    • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ๋น„์Šค์˜ ํƒ€์ž…์ด LoadBalancer๋ผ๋ฉด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค
    • UDP/TCP ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค
    • cloud provider๋งˆ๋‹ค ๊ตฌํ˜„๋œ ๋‚ด์šฉ์ด ์ƒ์ดํ•˜๋‹ค

์ผ๋ฐ˜์ ์œผ๋กœ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‚ฌ์šฉ์ž๋“ค์€ ์ฒ˜์Œ ๋‘ ํƒ€์ž…์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๋ฐฉ์‹์€ ๊ณ ๋ คํ•  ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๋Š” ๋‚˜๋จธ์ง€ ํƒ€์ž…์„ ์ ์ ˆํ•˜๊ฒŒ ๊ตฌ์„ฑํ•ด์ค˜์•ผ ํ•œ๋‹ค.