ํด๋น ๋ฌธ์์ ์ฟ ๋ฒ๋คํฐ์ค ๋ฒ์ : 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๋๊ณ ์ ๊ฑฐ ๋์๋ค. ๋์ (์๋์) ํ๋ก์๋ฅผ ์ฌ์ฉํ๊ธฐ๋ฅผ ๋ฐ๋๋ค.
๋ค์ํ ํ๋ก์๋ค
์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ฌ์ฉํ๋ฉด์ ๋น์ ์ด ์ ํ ์ ์๋ ๋ช ๊ฐ์ง ๋ค๋ฅธ ํ๋ก์๋ค์ด ์กด์ฌํ๋ค.
-
- ์ฌ์ฉ์์ ๋ฐ์คํฌํ์ด๋ ํ๋ ๋ด์์ ์คํํ๋ค
- localhost ์ฃผ์์์ ์ฟ ๋ฒ๋คํฐ์ค apiserver๋ก ํ๋ก์ํ๋ค
- ํ๋ก์ํ๋ ํด๋ผ์ด์ธํธ๋ HTTP๋ฅผ ์ฌ์ฉํ๋ค
- apiserver์ ํ๋ก์๋ HTTPS๋ฅผ ์ฌ์ฉํ๋ค
- apiserver๋ฅผ ์์น์ง์ ํ๋ค
- ์ธ์ฆ header๋ค์ ์ถ๊ฐํ๋ค
-
- apiserver ๋ด์ ๋นํธ์ธ bastion์ด๋ค
- ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก๋ ์ฐ๊ฒฐํ ์ ์๋ ํด๋ฌ์คํฐ ์ธ๋ถ์ ์ฌ์ฉ์๋ฅผ ํด๋ฌ์คํฐ IP๋ก ์ฐ๊ฒฐํ๋ค
- apiserver process๋ค ๋ด์์ ์คํ๋๋ค
- ํ๋ก์ํ๋ ํด๋ผ์ด์ธํธ๋ HTTPS๋ฅผ ์ฌ์ฉํ๋ค(๋๋ apiserver๊ฐ http๋ก ๊ตฌ์ฑ๋์๋ค๋ฉด http)
- ํ๊ฒ์ผ๋ก์ ํ๋ก์๋ ๊ฐ์ฉ์ ๋ณด๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์์ ์ํด์ HTTP ๋๋ HTTPS๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค
- ๋ ธ๋, ํ๋, ์๋น์ค์ ์ ๊ทผํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์๋ค
- ์๋น์ค์ ์ ๊ทผํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉด load balacingํ๋ค
-
- ๊ฐ ๋ ธ๋ ์์์ ์คํ๋๋ค
- UDP์ TCP๋ฅผ ํ๋ก์ํ๋ค
- HTTP๋ฅผ ์ธ์งํ์ง ์๋๋ค
- load balancing์ ์ ๊ณตํ๋ค
- ์๋น์ค์ ์ ๊ทผํ๋ ๋ฐ์๋ง ์ฌ์ฉ๋๋ค
-
apiserver(s) ์ ๋ฉด์ Proxy/Load-balancer:
- ์กด์ฌ๋ด์ฉ๊ณผ ๊ตฌํ์ฌํญ์ ํด๋ฌ์คํฐ ๋ณ๋ก ๋ค์ํ๋ค(์. nginx)
- ๋ชจ๋ ํด๋ผ์ด์ธํธ์ ํ๋ ์ด์์ apiserver๋ค์ ์ฌ์ด์ ์์นํ๋ค
- apiserver๊ฐ ์ฌ๋ฌ ๋ ์กด์ฌํ๋ค๋ฉด load balancer๋ก ๋์ํ๋ค
-
์ธ๋ถ ์๋น์ค์ Cloud Load Balancer๋ค:
- Cloud provider๋ค์ ์ํด์ ์ ๊ณต๋๋ค(์. AWS ELB, Google Cloud Load Balancer)
- ์ฟ ๋ฒ๋คํฐ์ค ์๋น์ค์ ํ์
์ด
LoadBalancer
๋ผ๋ฉด ์๋์ผ๋ก ์์ฑ๋๋ค - UDP/TCP ๋ง ์ฌ์ฉํ๋ค
- cloud provider๋ง๋ค ๊ตฌํ๋ ๋ด์ฉ์ด ์์ดํ๋ค
์ผ๋ฐ์ ์ผ๋ก ์ฟ ๋ฒ๋คํฐ์ค ์ฌ์ฉ์๋ค์ ์ฒ์ ๋ ํ์ ์ด ์๋ ๋ค๋ฅธ ๋ฐฉ์์ ๊ณ ๋ คํ ํ์๊ฐ ์์ง๋ง ํด๋ฌ์คํฐ ๊ด๋ฆฌ์๋ ๋๋จธ์ง ํ์ ์ ์ ์ ํ๊ฒ ๊ตฌ์ฑํด์ค์ผ ํ๋ค.