์ด ์น์ ์ ๋ค์ค ํ์ด์ง ์ถ๋ ฅ ํ๋ฉด์. ์ฌ๊ธฐ๋ฅผ ํด๋ฆญํ์ฌ ํ๋ฆฐํธ.
์ฟ ๋ฒ๋คํฐ์ค ํ์ฅ
1 - ํ์ฅ API ์๋ฒ ์ค์
์ ๊ทธ๋ฆฌ๊ฒ์ด์ ๋ ์ด์ด(aggregation layer)์ ์๋ํ๋๋ก ํ์ฅ API ์๋ฒ๋ฅผ ์ค์ ํ๋ฉด ์ฟ ๋ฒ๋คํฐ์ค API ์๋ฒ๋ฅผ ์ฟ ๋ฒ๋คํฐ์ค์ ํต์ฌ API์ ์ผ๋ถ๊ฐ ์๋ ์ถ๊ฐ API๋ก ํ์ฅํ ์ ์๋ค.
์์ํ๊ธฐ ์ ์
์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๊ฐ ํ์ํ๊ณ , kubectl ์ปค๋งจ๋-๋ผ์ธ ํด์ด ํด๋ฌ์คํฐ์ ํต์ ํ ์ ์๋๋ก ์ค์ ๋์ด ์์ด์ผ ํ๋ค. ์ด ํํ ๋ฆฌ์ผ์ ์ปจํธ๋กค ํ๋ ์ธ ํธ์คํธ๊ฐ ์๋ ๋ ธ๋๊ฐ ์ ์ด๋ 2๊ฐ ํฌํจ๋ ํด๋ฌ์คํฐ์์ ์คํํ๋ ๊ฒ์ ์ถ์ฒํ๋ค. ๋ง์ฝ, ์์ง ํด๋ฌ์คํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๋ค๋ฉด, minikube๋ฅผ ์ฌ์ฉํด์ ์์ฑํ๊ฑฐ๋ ๋ค์ ์ฟ ๋ฒ๋คํฐ์ค ํ๋ ์ด๊ทธ๋ผ์ด๋ ์ค ํ๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๋ฒ์ ํ์ธ์ ์ํด์, ๋ค์ ์ปค๋งจ๋๋ฅผ ์คํ kubectl version
.
- ์ ๊ทธ๋ฆฌ๊ฒ์ด์ ๋ ์ด์ด๋ฅผ ๊ตฌ์ฑํ๊ณ apiserver ํ๋๊ทธ๋ฅผ ํ์ฑํํด์ผ ํ๋ค.
์ ๊ทธ๋ฆฌ๊ฒ์ด์ ๋ ์ด์ด์ ์๋ํ๋๋ก ํ์ฅ API ์๋ฒ ์ค์ ํ๊ธฐ
๋ค์ ๋จ๊ณ๋ ํ์ฅ API ์๋ฒ๋ฅผ ๋์ ์์ค ์ผ๋ก ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๋ค. ์ด ๋จ๊ณ๋ YAML ๊ตฌ์ฑ์ ์ฌ์ฉํ๊ฑฐ๋ API๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์๊ด์์ด ์ ์ฉ๋๋ค. ๋ ์ฌ์ด์ ์ฐจ์ด์ ์ ๊ตฌ์ฒด์ ์ผ๋ก ์๋ณํ๋ ค๊ณ ์๋ํ๋ค. YAML ๊ตฌ์ฑ์ ์ฌ์ฉํ์ฌ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ตฌ์ฒด์ ์ธ ์๋ฅผ ๋ณด๋ ค๋ฉด, ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌํฌ์งํฐ๋ฆฌ์์ sample-apiserver๋ฅผ ์ฐธ๊ณ ํ ์ ์๋ค.
๋๋, apiserver-builder์ ๊ฐ์ ๊ธฐ์กด์ ํ์ฌ ์๋ฃจ์ ์ ์ฌ์ฉํ์ฌ ์ค์ผ๋ ํค(skeleton)์ ์์ฑํ๊ณ ๋ค์ ๋จ๊ณ๋ฅผ ๋ชจ๋ ์๋ํํด์ผ ํ๋ค.
- API์๋น์ค(APIService) API๊ฐ ํ์ฑํ๋์ด ์๋์ง ํ์ธํ๋ค(
--runtime-config
ํ์ธ). ํด๋ฌ์คํฐ์์ ์ผ๋ถ๋ฌ ํด์ ํ์ง ์์๋ค๋ฉด, ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ด ์์ด์ผ ํ๋ค. - API์๋น์ค ์ค๋ธ์ ํธ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ํด๋ฌ์คํฐ ๊ด๋ฆฌ์๊ฐ ์์ฑํ๋๋ก RBAC ๊ท์น์ ์์ฑํด์ผ ํ ์๋ ์๋ค. (API ํ์ฅ์ ์ ์ฒด ํด๋ฌ์คํฐ์ ์ํฅ์ ์ฃผ๊ธฐ ๋๋ฌธ์, ์ด์ ์ค์ธ ํด๋ฌ์คํฐ์์ API ํ์ฅ์ ๋ํ ํ ์คํธ/๊ฐ๋ฐ/๋๋ฒ๊น ์ ์ํํ์ง ์๋ ๊ฒ์ด ์ข๋ค.)
- ํ์ฅ API ์๋น์ค๋ฅผ ์คํํ๋ ค๋ ์ฟ ๋ฒ๋คํฐ์ค ๋ค์์คํ์ด์ค๋ฅผ ์์ฑํ๋ค.
- HTTPS๋ฅผ ์ํด ํ์ฅ API ์๋ฒ๊ฐ ์ฌ์ฉํ๋ ์๋ฒ ์ธ์ฆ์์ ์๋ช ํ๋ ๋ฐ ์ฌ์ฉํ CA ์ธ์ฆ์๋ฅผ ์์ฑํ๊ฑฐ๋ ๊ฐ์ ธ์จ๋ค.
- HTTPS๋ฅผ ์ํด API ์๋ฒ๊ฐ ์ฌ์ฉํ ์๋ฒ ์ธ์ฆ์/ํค๋ฅผ ์์ฑํ๋ค. ์ด ์ธ์ฆ์๋ ์์ CA ์ธ์ฆ์์ ์ํด ์๋ช
ํด์ผ ํ๋ค. ๋ํ Kube DNS ์ด๋ฆ์ CN์ด ์์ด์ผ ํ๋ค. ์ด๊ฒ์ ์ฟ ๋ฒ๋คํฐ์ค ์๋น์ค์์ ํ์๋์์ผ๋ฉฐ
<service name>.<service name namespace>.svc
ํ์์ด๋ค. - ๋ค์์คํ์ด์ค์ ์๋ฒ ์ธ์ฆ์/ํค๋ฅผ ์ฌ์ฉํ์ฌ ์ฟ ๋ฒ๋คํฐ์ค ์ํฌ๋ฆฟ์ ์์ฑํ๋ค.
- ํ์ฅ API ์๋ฒ์ ๋ํ ์ฟ ๋ฒ๋คํฐ์ค ๋ํ๋ก์ด๋จผํธ๋ฅผ ์์ฑํ๊ณ ์ํฌ๋ฆฟ์ ๋ณผ๋ฅจ์ผ๋ก ๋ก๋ํ๋์ง ํ์ธํ๋ค. ํ์ฅ API ์๋ฒ์ ์๋ํ๋(working) ์ด๋ฏธ์ง์ ๋ํ ์ฐธ์กฐ๋ฅผ ํฌํจํด์ผ ํ๋ค. ๋ํ๋ก์ด๋จผํธ๋ ๋ค์์คํ์ด์ค์๋ ์์ด์ผ ํ๋ค.
- ํ์ฅ API ์๋ฒ๊ฐ ํด๋น ๋ณผ๋ฅจ์์ ํด๋น ์ธ์ฆ์๋ฅผ ๋ก๋ํ๊ณ HTTPS ํธ๋์ ฐ์ดํฌ์ ์ฌ์ฉ๋๋์ง ํ์ธํ๋ค.
- ๋ค์์คํ์ด์ค์์ ์ฟ ๋ฒ๋คํฐ์ค ์๋น์ค ์ด์นด์ดํธ๋ฅผ ์์ฑํ๋ค.
- ๋ฆฌ์์ค์ ํ์ฉํ๋ ค๋ ์์ ์ ๋ํ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ๋กค(role)์ ์์ฑํ๋ค.
- ๋ค์์คํ์ด์ค์ ์๋น์ค ์ด์นด์ดํธ์์ ๋ฐฉ๊ธ ๋ง๋ ํด๋ฌ์คํฐ ๋กค๋ก ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ๋กค ๋ฐ์ธ๋ฉ์ ์์ฑํ๋ค.
- ๋ค์์คํ์ด์ค์ ์๋น์ค ์ด์นด์ดํธ์์
system:auth-delegator
ํด๋ฌ์คํฐ ๋กค๋ก ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ๋กค ๋ฐ์ธ๋ฉ์ ๋ง๋ค์ด ์ธ์ฆ ๊ฒฐ์ ์ ์ฟ ๋ฒ๋คํฐ์ค ํต์ฌ API ์๋ฒ์ ์์ํ๋ค. - ๋ค์์คํ์ด์ค์ ์๋น์ค ์ด์นด์ดํธ์์
extension-apiserver-authentication-reader
๋กค๋ก ์ฟ ๋ฒ๋คํฐ์ค ๋กค ๋ฐ์ธ๋ฉ์ ์์ฑํ๋ค. ์ด๋ฅผ ํตํด ํ์ฅ API ์๋ฒ๊ฐextension-apiserver-authentication
์ปจํผ๊ทธ๋งต(configmap)์ ์ ๊ทผํ ์ ์๋ค. - ์ฟ ๋ฒ๋คํฐ์ค API ์๋น์ค๋ฅผ ์์ฑํ๋ค. ์์ CA ์ธ์ฆ์๋ base64๋ก ์ธ์ฝ๋ฉ๋์ด, ์๋ก์ด ๋ผ์ธ์ด ์ ๊ฑฐ๋๊ณ API ์๋น์ค์์ spec.caBundle๋ก ์ฌ์ฉ๋์ด์ผ ํ๋ค. ์ด๊ฒ์ namespaced๊ฐ ์๋์ด์ผ ํ๋ค. kube-aggregator API๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, base64 ์ธ์ฝ๋ฉ์ด ์ํ๋๋ฏ๋ก PEM ์ธ์ฝ๋ฉ๋ CA ๋ฒ๋ค๋ง ํต๊ณผํ๋ค.
- kubectl์ ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค๋ฅผ ์ป๋๋ค. kubectl์ ์คํํ๋ฉด, "No resources found."๊ฐ ๋ฐํ๋๋ค. ์ด ๋ฉ์์ง๋ ๋ชจ๋ ๊ฒ์ด ์๋๋์ง๋ง ํ์ฌ ํด๋น ๋ฆฌ์์ค ์ ํ์ ์ค๋ธ์ ํธ๊ฐ ์์ฑ๋์ง ์์์์ ๋ํ๋ธ๋ค.
๋ค์ ๋ด์ฉ
- API ์ ๊ทธ๋ฆฌ๊ฒ์ด์ ๋ ์ด์ด๋ฅผ ๊ตฌ์ฑํ๊ณ apiserver ํ๋๊ทธ๋ฅผ ํ์ฑํํ๋ ๋จ๊ณ๋ฅผ ์ํํ๋ค.
- ๋์ ์์ค์ ๊ฐ์์ ๋ํด์๋, ์ ๊ทธ๋ฆฌ๊ฒ์ด์ ๋ ์ด์ด๋ก ์ฟ ๋ฒ๋คํฐ์ค API ํ์ฅํ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ๋ค.
- ์ปค์คํ ๋ฆฌ์์ค ๋ฐํผ๋์ ์ ์ฌ์ฉํ์ฌ ์ฟ ๋ฒ๋คํฐ์ค API ํ์ฅํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณธ๋ค.
2 - ๋ค์ค ์ค์ผ์ค๋ฌ ์ค์
์ฟ ๋ฒ๋คํฐ์ค๋ ์ฌ๊ธฐ์์ ์ค๋ช ํ ์ค์ผ์ค๋ฌ๋ฅผ ๊ธฐ๋ณธ ์ค์ผ์ค๋ฌ๋ก ์ฌ์ฉํ๋ค. ๋ง์ผ ๊ธฐ๋ณธ ์ค์ผ์ค๋ฌ๊ฐ ์ฌ์ฉ์์ ํ์๋ฅผ ๋ง์กฑ์ํค์ง ๋ชปํ๋ค๋ฉด ์ง์ ์ค์ผ์ค๋ฌ๋ฅผ ๊ตฌํํ์ฌ ์ฌ์ฉํ ์ ์๋ค. ์ด์ ๋ํด, ๊ธฐ๋ณธ ์ค์ผ์ค๋ฌ์ ํจ๊ป ์ฌ๋ฌ ์ค์ผ์ค๋ฌ๋ฅผ ๋์์ ์ฌ์ฉํ์ฌ ์ฟ ๋ฒ๋คํฐ์ค๊ฐ ๊ฐ ํ๋์ ๋ํด ์ด๋ค ์ค์ผ์ค๋ฌ๋ฅผ ์ ์ฉํ ์ง์ ๋ํ ์ค์ ๋ ํ ์ ์๋ค. ์์ ์ ํจ๊ป ์ฟ ๋ฒ๋คํฐ์ค์์ ๋ค์ค ์ค์ผ์ค๋ฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ฐฐ์๋ณด๋๋ก ํ์.
์ค์ผ์ค๋ฌ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ์ค๋ช ์ ํด๋น ๋ฌธ์์์ ๋ค๋ฃจ์ง ์๋๋ค. kube-scheduler ๊ตฌํ์ ๋ค๋ฃจ๋ ๊ณต์ ์์๋ ์ฟ ๋ฒ๋คํฐ์ค ์์ค ๋๋ ํ ๋ฆฌ์ ์๋ pkg/scheduler ๋ฅผ ์ฐธ๊ณ ํ๋ค.
์์ํ๊ธฐ ์ ์
์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๊ฐ ํ์ํ๊ณ , kubectl ์ปค๋งจ๋-๋ผ์ธ ํด์ด ํด๋ฌ์คํฐ์ ํต์ ํ ์ ์๋๋ก ์ค์ ๋์ด ์์ด์ผ ํ๋ค. ์ด ํํ ๋ฆฌ์ผ์ ์ปจํธ๋กค ํ๋ ์ธ ํธ์คํธ๊ฐ ์๋ ๋ ธ๋๊ฐ ์ ์ด๋ 2๊ฐ ํฌํจ๋ ํด๋ฌ์คํฐ์์ ์คํํ๋ ๊ฒ์ ์ถ์ฒํ๋ค. ๋ง์ฝ, ์์ง ํด๋ฌ์คํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๋ค๋ฉด, minikube๋ฅผ ์ฌ์ฉํด์ ์์ฑํ๊ฑฐ๋ ๋ค์ ์ฟ ๋ฒ๋คํฐ์ค ํ๋ ์ด๊ทธ๋ผ์ด๋ ์ค ํ๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๋ฒ์ ํ์ธ์ ์ํด์, ๋ค์ ์ปค๋งจ๋๋ฅผ ์คํ kubectl version
.
์ค์ผ์ค๋ฌ ํจํค์ง
์ค์ผ์ค๋ฌ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ก ํจํค์งํ๋ค. ํด๋น ์์ ๋ฅผ ํตํด ๊ธฐ๋ณธ ์ค์ผ์ค๋ฌ (kube-scheduler)๋ฅผ ๋ ๋ฒ์งธ ์ค์ผ์ค๋ฌ๋ก ์ฌ์ฉํ ์ ์๋ค. GitHub ์ฟ ๋ฒ๋คํฐ์ค ์์ค์ฝ๋๋ฅผ ํด๋ก ํ๊ณ ์์ค๋ฅผ ๋น๋ํ์.
git clone https://github.com/kubernetes/kubernetes.git
cd kubernetes
make
kube-scheduler ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ด์ ์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ์.
์ด๋ฏธ์ง๋ฅผ ๋น๋ ํ๊ธฐ ์ํ Dockerfile
์ ๋ค์๊ณผ ๊ฐ๋ค.
FROM busybox
ADD ./_output/local/bin/linux/amd64/kube-scheduler /usr/local/bin/kube-scheduler
ํ์ผ์ Dockerfile
๋ก ์ ์ฅํ๊ณ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ ํ ๋ ์ง์คํธ๋ฆฌ๋ก ํธ์ํ์. ํด๋น ์์ ์์๋ ์ด๋ฏธ์ง๋ฅผ
Google Container Registry (GCR)๋ก
ํธ์ํ๊ณ ์๋ค.
์ด์ ๋ํ ์์ธํ ๋ด์ฉ์ GCR
๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์.
docker build -t gcr.io/my-gcp-project/my-kube-scheduler:1.0 .
gcloud docker -- push gcr.io/my-gcp-project/my-kube-scheduler:1.0
์ค์ผ์ค๋ฌ์์ ์ฌ์ฉํ ์ฟ ๋ฒ๋คํฐ์ค ๋ํ๋ก์ด๋จผํธ ์ ์ํ๊ธฐ
์ด์ ์ค์ผ์ค๋ฌ ์ปจํ
์ด๋ ์ด๋ฏธ์ง๊ฐ ์์ผ๋, ํด๋น ์ด๋ฏธ์ง๋ฅผ ํฌํจํ๋ ํ๋ ๊ตฌ์ฑ์ ์์ฑํ๊ณ
์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ๋ด์์ ์คํํด๋ณด์. ํด๋น ์์ ์์๋, ํด๋ฌ์คํฐ ๋ด์ ์ง์ ํ๋๋ฅผ ์์ฑํ๋ ๋์ ์
๋ํ๋ก์ด๋จผํธ๋ฅผ ์ฌ์ฉํด๋ ๋๋ค.
๋ํ๋ก์ด๋จผํธ๋
๋ ํ๋ฆฌ์นด ์
์ ๊ด๋ฆฌํ๋ฉฐ,
์ด๋ ๋ ํ๋๋ฅผ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์ค์ผ์ค๋ฌ์ ๋ํ ํ๋ณต ํ๋ ฅ์ฑ์ ์ ๊ณตํ๋ค.
๋ค์์ ๋ํ๋ก์ด๋จผํธ์ ๋ํ ๊ตฌ์ฑ ํ์ผ์ด๋ค. ์ด ํ์ผ์ my-scheduler.yaml
์ผ๋ก ์ ์ฅํ๋ค.
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-scheduler
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: my-scheduler-as-kube-scheduler
subjects:
- kind: ServiceAccount
name: my-scheduler
namespace: kube-system
roleRef:
kind: ClusterRole
name: system:kube-scheduler
apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: my-scheduler-as-volume-scheduler
subjects:
- kind: ServiceAccount
name: my-scheduler
namespace: kube-system
roleRef:
kind: ClusterRole
name: system:volume-scheduler
apiGroup: rbac.authorization.k8s.io
---
apiVersion: v1
kind: ConfigMap
metadata:
name: my-scheduler-config
namespace: kube-system
data:
my-scheduler-config.yaml: |
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: my-scheduler
leaderElection:
leaderElect: false
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
component: scheduler
tier: control-plane
name: my-scheduler
namespace: kube-system
spec:
selector:
matchLabels:
component: scheduler
tier: control-plane
replicas: 1
template:
metadata:
labels:
component: scheduler
tier: control-plane
version: second
spec:
serviceAccountName: my-scheduler
containers:
- command:
- /usr/local/bin/kube-scheduler
- --config=/etc/kubernetes/my-scheduler/my-scheduler-config.yaml
image: gcr.io/my-gcp-project/my-kube-scheduler:1.0
livenessProbe:
httpGet:
path: /healthz
port: 10259
scheme: HTTPS
initialDelaySeconds: 15
name: kube-second-scheduler
readinessProbe:
httpGet:
path: /healthz
port: 10259
scheme: HTTPS
resources:
requests:
cpu: '0.1'
securityContext:
privileged: false
volumeMounts:
- name: config-volume
mountPath: /etc/kubernetes/my-scheduler
hostNetwork: false
hostPID: false
volumes:
- name: config-volume
configMap:
name: my-scheduler-config
ํด๋น ๋งค๋ํ์คํธ์์๋ KubeSchedulerConfiguration์
์ฌ์ฉํ์ฌ ๊ตฌํํ ์ค์ผ์ค๋ฌ์ ํน์ฑ์ ์ ์ํ๋ค. ์ด๋ฌํ ์ค์ ์ ์ด๊ธฐํ ๊ณผ์ ์์ --config
์ต์
์ ํตํด kube-scheduler
์๊ฒ ์ ๋ฌ๋๋ค.
ํด๋น ๊ตฌ์ฑ ํ์ผ์ my-scheduler-config
์ปจํผ๊ทธ๋งต์ ์ ์ฅ๋๋ค. my-scheduler
๋ํ๋ก์ด๋จผํธ์ ํ๋์์๋ my-scheduler-config
์ปจํผ๊ทธ๋งต์ ๋ณผ๋ฅจ์ผ๋ก ๋ง์ดํธ ์ํจ๋ค.
์์ ์ธ๊ธํ ์ค์ผ์ค๋ฌ ๊ตฌ์ฑ์์๋, ๊ตฌํํ ์ค์ผ์ค๋ฌ๊ฐ KubeSchedulerProfile์ ํ์์ผ๋ก ๋ํ๋๊ฒ ๋๋ค.
์ฐธ๊ณ :
์ค์ผ์ค๋ฌ๊ฐ ํน์ ํ๋์ ๋ํ ์ค์ผ์ค๋ง์ ์ํํ๋์ง ํ๋จํ๊ธฐ ์ํด์๋, PodTemplate ๋๋ ํ๋ ๋งค๋ํ์คํธ์spec.schedulerName
ํ๋๊ฐ KubeSchedulerProfile
์ schedulerName
ํ๋์ ์ผ์นํ๋์ง ํ์ธํด์ผ ํ๋ค.
ํด๋ฌ์คํฐ ๋ด ์คํ๋๊ณ ์๋ ๋ชจ๋ ์ค์ผ์ค๋ฌ๋ ๊ณ ์ ํ ์ด๋ฆ์ ๊ฐ์ ธ์ผ ํ๋ค.๋ํ, kube-scheduler
์ ๊ฐ์ ๊ถํ์ ๋ถ์ฌ๋ฐ๊ธฐ ์ํด์๋ ์ ์ฉ ์๋น์ค ์ด์นด์ดํธ my-scheduler
๋ฅผ ์์ฑํ๊ณ
ํด๋น ์๋น์ค ์ด์นด์ดํธ๋ฅผ ํด๋ฌ์คํฐ๋กค system:kube-scheduler
์ ๋ฐ์ธ๋ฉํด์ผ ํ๋ค.
์ด์ธ์ ์ปค๋งจ๋ ๋ผ์ธ ์ธ์์ ๋ํ ์์ธํ ์ค๋ช
์
kube-scheduler ๋ฌธ์์์ ์ฐธ๊ณ ํ๊ณ
์ด์ธ์ ์ฌ์ฉ์ ์ ์ kube-scheduler
๊ตฌ์ฑ์ ๋ํ ์์ธํ ์ค๋ช
์
์ค์ผ์ค๋ฌ ๊ตฌ์ฑ ๋ ํผ๋ฐ์ค
์์ ์ฐธ๊ณ ํ๋ค.
๋ ๋ฒ์งธ ์ค์ผ์ค๋ฌ๋ฅผ ํด๋ฌ์คํฐ์์ ์คํํ๊ธฐ
์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์์ ์ค์ผ์ค๋ฌ๋ฅผ ์คํํ๊ธฐ ์ํด์, ์์ ๊ตฌ์ฑ ํ์ผ์์ ๋ช ์ํ ๋ํ๋ก์ด๋จผํธ๋ฅผ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ๋ด์ ์์ฑํ๋ค.
kubectl create -f my-scheduler.yaml
์ค์ผ์ค๋ฌ ํ๋๊ฐ ์คํ๋๊ณ ์๋์ง ํ์ธํ๋ค.
kubectl get pods --namespace=kube-system
NAME READY STATUS RESTARTS AGE
....
my-scheduler-lnf4s-4744f 1/1 Running 0 2m
...
๊ธฐ๋ณธ kube-scheduler ํ๋์ ๋๋ถ์ด, my-scheduler ํ๋๊ฐ ์คํ("Running")๋๊ณ ์๋ค๋ ๊ฒ์ ๋ชฉ๋ก์์ ๋ณผ ์ ์์ ๊ฒ์ด๋ค.
๋ฆฌ๋ ์ ์ถ ํ์ฑํ
๋ฆฌ๋ ์ ์ถ์ด ํ์ฑํ๋ ์ํ๋ก ๋ค์ค ์ค์ผ์ค๋ฌ๋ฅผ ์คํํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํด์ผ ํ๋ค.
my-scheduler-config
์ปจํผ๊ทธ๋งต์ YAML ํ์ผ์์ KubeSchedulerConfiguration์ ๋ค์๊ณผ ๊ฐ์ ํ๋๋ค์ ๊ฐฑ์ ํ๋ค.
leaderElection.leaderElect
๋ฅผtrue
๋กleaderElection.resourceNamespace
๋ฅผ<lock-object-namespace>
๋กleaderElection.resourceName
์<lock-object-name>
์ผ๋ก
์ฐธ๊ณ :
์ปจํธ๋กค ํ๋ ์ธ์ด ์ ๊ธ ์ค๋ธ์ ํธ๋ฅผ ์์ฑํด ์ฃผ์ง๋ง, ํด๋น ๋ค์์คํ์ด์ค๊ฐ ์กด์ฌํ๋ ์ํ์ด์ด์ผ ํ๋ค.kube-system
๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ฉํด๋ ๋๋ค.ํด๋ฌ์คํฐ ๋ด์ RBAC๊ฐ ํ์ฑํ๋์ด ์๋ ์ํ๋ผ๋ฉด, system:kube-scheduler
ํด๋ฌ์คํฐ๋กค์ ์
๋ฐ์ดํธ ํด์ผ ํ๋ค.
๋ค์ ์์์ ๊ฐ์ด, ๊ตฌํํ ์ค์ผ์ค๋ฌ์ ์ด๋ฆ์ endpoints
์ leases
๋ฆฌ์์ค์ ์ ์ฉ๋๋ ๋ฃฐ์ resourceNames์ ์ถ๊ฐํ์.
kubectl edit clusterrole system:kube-scheduler
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
labels:
kubernetes.io/bootstrapping: rbac-defaults
name: system:kube-scheduler
rules:
- apiGroups:
- coordination.k8s.io
resources:
- leases
verbs:
- create
- apiGroups:
- coordination.k8s.io
resourceNames:
- kube-scheduler
- my-scheduler
resources:
- leases
verbs:
- get
- update
- apiGroups:
- ""
resourceNames:
- kube-scheduler
- my-scheduler
resources:
- endpoints
verbs:
- delete
- get
- patch
- update
ํ๋์ ์ค์ผ์ค๋ฌ๋ฅผ ์ง์ ํ๊ธฐ
์ด์ ๋ ๋ฒ์งธ ์ค์ผ์ค๋ฌ๊ฐ ์คํ๋๊ณ ์์ผ๋, ํ๋๋ฅผ ๋ช ๊ฐ ์์ฑํ์ฌ ๊ธฐ๋ณธ ์ค์ผ์ค๋ฌ ๋๋ ์๋ก ๋ฐฐ์นํ ์ค์ผ์ค๋ฌ์ ์ํด ์ค์ผ์ค๋ง์ด ๋๋๋ก ์ค์ ํด ๋ณด์. ํน์ ์ค์ผ์ค๋ฌ๋ฅผ ์ด์ฉํ์ฌ ํ๋๋ฅผ ์ค์ผ์ค๋งํ๊ธฐ ์ํด์๋ ํด๋น ํ๋์ ๋ช ์ธ์ ํด๋น ์ค์ผ์ค๋ฌ์ ์ด๋ฆ์ ๋ช ์ํด์ผ ํ๋ค. ์ธ ๊ฐ์ง ์์๋ฅผ ์ฐธ๊ณ ํด ๋ณด์.
์ค์ผ์ค๋ฌ ์ด๋ฆ์ ๋ช ์ํ์ง ์์ ํ๋ ๋ช ์ธ
apiVersion: v1 kind: Pod metadata: name: no-annotation labels: name: multischeduler-example spec: containers: - name: pod-with-no-annotation-container image: registry.k8s.io/pause:2.0
์ค์ผ์ค๋ฌ ์ด๋ฆ์ ์ ๊ณต๋ฐ์ง ๋ชปํ๋ค๋ฉด, ํ๋๋ ์๋์ผ๋ก ๊ธฐ๋ณธ ์ค์ผ์ค๋ฌ์ ์ํด ์ค์ผ์ค๋ง์ด ์ํ๋๋ค.
ํด๋น ํ์ผ์
pod1.yaml
๋ก ์ ์ฅํ๊ณ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ์ ์ถํด ๋ณด์.kubectl create -f pod1.yaml
default-scheduler
๋ฅผ ๋ช ์ํ ํ๋ ๋ช ์ธapiVersion: v1 kind: Pod metadata: name: annotation-default-scheduler labels: name: multischeduler-example spec: schedulerName: default-scheduler containers: - name: pod-with-default-annotation-container image: registry.k8s.io/pause:2.0
spec.schedulerName
์ ๊ฐ์ผ๋ก ์ค์ผ์ค๋ฌ ์ด๋ฆ์ ์ ๊ณตํจ์ผ๋ก์จ ์ค์ผ์ค๋ฌ๊ฐ ์ ํด์ง๋ค. ์ด์ ๊ฐ์ ๊ฒฝ์ฐ์์๋, ๊ธฐ๋ณธ ์ค์ผ์ค๋ฌ์ ์ด๋ฆ์ธdefault-scheduler
๋ฅผ ๋ช ์ํ๊ณ ์๋ค.ํด๋น ํ์ผ์
pod2.yaml
๋ก ์ ์ฅํ๊ณ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ์ ์ถํด ๋ณด์.kubectl create -f pod2.yaml
my-scheduler
๋ฅผ ๋ช ์ํ ํ๋ ๋ช ์ธapiVersion: v1 kind: Pod metadata: name: annotation-second-scheduler labels: name: multischeduler-example spec: schedulerName: my-scheduler containers: - name: pod-with-second-annotation-container image: registry.k8s.io/pause:2.0
์ด์ ๊ฐ์ ๊ฒฝ์ฐ์์๋, ์ง์ ๋ฐฐ์นํ ์ค์ผ์ค๋ฌ -
my-scheduler
๋ฅผ ํตํด ํด๋น ํ๋์ ์ค์ผ์ค๋ง์ด ์ํ๋์ด์ผ ํ๋ค๋ ๊ฒ์ ๋ช ์ํ๊ณ ์๋ค.spec.schedulerName
์ ๊ฐ์KubeSchedulerProfile
๋งคํ์schedulerName
ํ๋์ ์ผ์นํด์ผ ํ๋ค.ํด๋น ํ์ผ์
pod3.yaml
๋ก ์ ์ฅํ๊ณ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ์ ์ถํด ๋ณด์.kubectl create -f pod3.yaml
์ธ ๊ฐ์ ํ๋๊ฐ ๋ชจ๋ ์คํ๋๊ณ ์๋์ง ํ์ธํด ๋ณด์.
kubectl get pods
ํ๋๊ฐ ์ํ๋ ์ค์ผ์ค๋ฌ์ ์ํด ์ค์ผ์ค๋ง ๋์๋์ง ํ์ธํด๋ณด๊ธฐ
์ด๋ฒ ์์ ๋ค์ ์์ํ๊ฒ ์งํํ๊ธฐ ์ํด,
ํ๋๊ฐ ์ค์ ๋ก ์ํ๋ ์ค์ผ์ค๋ฌ์ ์ํด ์ค์ผ์ค๋ง๋๊ณ ์๋์ง ํ์ธํด ๋ณด์ง ์์๋ค.
ํด๋น ์ฌํญ์ ํ๋์ ๋ํ๋ก์ด๋จผํธ ๊ตฌ์ฑ ํ์ผ์ ์ ์ถ ์์๋ฅผ ๋ฐ๊ฟ๋ณด๋ฉด ํ์ธํด ๋ณผ ์ ์๋ค.
๋ง์ผ ์ค์ผ์ค๋ฌ ๋ํ๋ก์ด๋จผํธ ๊ตฌ์ฑ ํ์ผ์ ์ ์ถํ๊ธฐ ์ ์ ๋ชจ๋ ํ๋์ ๊ตฌ์ฑ ํ์ผ์ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ์ ์ถํ๋ค๋ฉด,
๋ค๋ฅธ ๋ ๊ฐ์ ํ๋๋ ์ค์ผ์ค๋ง ๋๋ ์์ค์ annotation-second-scheduler
ํ๋๋
๋ฌด๊ธฐํ "Pending" ์ํ์ ๋จธ๋ฌด๋ฅด๋ ๊ฒ์ ๊ด์ฐฐํ ์ ์๋ค.
์ค์ผ์ค๋ฌ ๋ํ๋ก์ด๋จผํธ ๊ตฌ์ฑ ํ์ผ์ ์ ์ถํ์ฌ ์๋ก์ด ์ค์ผ์ค๋ฌ๊ฐ ์คํ๋๊ธฐ ์์ํ๋ฉด,
annotation-second-scheduler
ํ๋๋ ์ค์ผ์ค๋ง ๋๋ค.
๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋, ์ด๋ฒคํธ ๋ก๊ทธ์์ "Scheduled" ํญ๋ชฉ์ ์ฐพ์ ํ๋๊ฐ ์ํ๋ ์ค์ผ์ค๋ฌ์ ์ํด ์ค์ผ์ค๋ง ๋์๋์ง ํ์ธํด ๋ณผ ์ ์๋ค.
kubectl get events
๋ํ, ๊ด๋ จ๋ ์ปจํธ๋กค ํ๋ ์ธ ๋ ธ๋๋ค์ ์คํํฑ ํ๋ ๋งค๋ํ์คํธ๋ฅผ ์์ ํ๋ฉด ํด๋ฌ์คํฐ์ ๋ฉ์ธ ์ค์ผ์ค๋ฌ๋ก ์ฌ์ฉ์ ์ ์ ์ค์ผ์ค๋ฌ ๊ตฌ์ฑ ๋๋ ์ฌ์ฉ์ ์ ์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค.
3 - HTTP ํ๋ก์๋ฅผ ์ฌ์ฉํ์ฌ ์ฟ ๋ฒ๋คํฐ์ค API์ ์ ๊ทผ
์ด ํ์ด์ง๋ ์ฟ ๋ฒ๋คํฐ์ค API์ ์ ๊ทผํ๊ธฐ ์ํด HTTP ํ๋ก์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๋ค.
์์ํ๊ธฐ ์ ์
์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๊ฐ ํ์ํ๊ณ , kubectl ์ปค๋งจ๋-๋ผ์ธ ํด์ด ํด๋ฌ์คํฐ์ ํต์ ํ ์ ์๋๋ก ์ค์ ๋์ด ์์ด์ผ ํ๋ค. ์ด ํํ ๋ฆฌ์ผ์ ์ปจํธ๋กค ํ๋ ์ธ ํธ์คํธ๊ฐ ์๋ ๋ ธ๋๊ฐ ์ ์ด๋ 2๊ฐ ํฌํจ๋ ํด๋ฌ์คํฐ์์ ์คํํ๋ ๊ฒ์ ์ถ์ฒํ๋ค. ๋ง์ฝ, ์์ง ํด๋ฌ์คํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๋ค๋ฉด, minikube๋ฅผ ์ฌ์ฉํด์ ์์ฑํ๊ฑฐ๋ ๋ค์ ์ฟ ๋ฒ๋คํฐ์ค ํ๋ ์ด๊ทธ๋ผ์ด๋ ์ค ํ๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๋ฒ์ ํ์ธ์ ์ํด์, ๋ค์ ์ปค๋งจ๋๋ฅผ ์คํ kubectl version
.
ํด๋ฌ์คํฐ์์ ์คํ ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ค๋ฉด, ์๋ ๋ช ๋ น์ ์ ๋ ฅํ์ฌ Hello world ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํ๋ค.
kubectl create deployment node-hello --image=gcr.io/google-samples/node-hello:1.0 --port=8080
kubectl์ ์ฌ์ฉํ์ฌ ํ๋ก์ ์๋ฒ ์์
์๋ ์ปค๋งจ๋๋ ์ฟ ๋ฒ๋คํฐ์ค API ์๋ฒ์ ํ๋ก์๋ฅผ ์์ํ๋ค.
kubectl proxy --port=8080
Kubernetes API ํ์
ํ๋ก์ ์๋ฒ๊ฐ ์คํ ์ค์ผ ๋ curl
, wget
๋๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฌ์ฉํ์ฌ API๋ฅผ ํ์ํ ์ ์๋ค.
API ๋ฒ์ ๊ฐ์ ธ์ค๊ธฐ.
curl http://localhost:8080/api/
์ถ๋ ฅ์ ๋ค์๊ณผ ์ ์ฌํ๋ค.
{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "10.0.2.15:8443"
}
]
}
ํ๋ ๋ชฉ๋ก ๊ฐ์ ธ์ค๊ธฐ.
curl http://localhost:8080/api/v1/namespaces/default/pods
์ถ๋ ฅ์ ๋ค์๊ณผ ์ ์ฌํ๋ค.
{
"kind": "PodList",
"apiVersion": "v1",
"metadata": {
"resourceVersion": "33074"
},
"items": [
{
"metadata": {
"name": "kubernetes-bootcamp-2321272333-ix8pt",
"generateName": "kubernetes-bootcamp-2321272333-",
"namespace": "default",
"uid": "ba21457c-6b1d-11e6-85f7-1ef9f1dab92b",
"resourceVersion": "33003",
"creationTimestamp": "2016-08-25T23:43:30Z",
"labels": {
"pod-template-hash": "2321272333",
"run": "kubernetes-bootcamp"
},
...
}
๋ค์ ๋ด์ฉ
kubectl ํ๋ก์์ ๋ํด ๋ ๋ฐฐ์ฐ๊ธฐ.
4 - SOCKS5 ํ๋ก์๋ฅผ ์ฌ์ฉํ์ฌ ์ฟ ๋ฒ๋คํฐ์ค API์ ์ ๊ทผ
Kubernetes v1.24 [stable]
์ด ๋ฌธ์๋ SOCKS5 ํ๋ก์๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฒฉ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ API์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๋ค. ์ด ๊ธฐ๋ฅ์ ์ ๊ทผํ๋ ค๋ ํด๋ฌ์คํฐ์ API๋ฅผ ๊ณต์ฉ ์ธํฐ๋ท์ ์ง์ ๋ ธ์ถํ์ง ์์ผ๋ ค๊ณ ํ ๋ ์ ์ฉํ๋ค.
์์ํ๊ธฐ ์ ์
์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๊ฐ ํ์ํ๊ณ , kubectl ์ปค๋งจ๋-๋ผ์ธ ํด์ด ํด๋ฌ์คํฐ์ ํต์ ํ ์ ์๋๋ก ์ค์ ๋์ด ์์ด์ผ ํ๋ค. ์ด ํํ ๋ฆฌ์ผ์ ์ปจํธ๋กค ํ๋ ์ธ ํธ์คํธ๊ฐ ์๋ ๋ ธ๋๊ฐ ์ ์ด๋ 2๊ฐ ํฌํจ๋ ํด๋ฌ์คํฐ์์ ์คํํ๋ ๊ฒ์ ์ถ์ฒํ๋ค. ๋ง์ฝ, ์์ง ํด๋ฌ์คํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๋ค๋ฉด, minikube๋ฅผ ์ฌ์ฉํด์ ์์ฑํ๊ฑฐ๋ ๋ค์ ์ฟ ๋ฒ๋คํฐ์ค ํ๋ ์ด๊ทธ๋ผ์ด๋ ์ค ํ๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ฟ ๋ฒ๋คํฐ์ค ์๋ฒ์ ๋ฒ์ ์ ๋ค์๊ณผ ๊ฐ๊ฑฐ๋ ๋ ๋์์ผ ํจ. ๋ฒ์ : v1.24.๋ฒ์ ํ์ธ์ ์ํด์, ๋ค์ ์ปค๋งจ๋๋ฅผ ์คํ kubectl version
.
SSH ํด๋ผ์ด์ธํธ ์ํํธ์จ์ด(ssh
๋๊ตฌ)์ ์๊ฒฉ ์๋ฒ์์ ์คํ๋๋ SSH ์๋น์ค๊ฐ ํ์ํ๋ค.
์๊ฒฉ ์๋ฒ์ SSH ์๋น์ค์ ๋ก๊ทธ์ธํ ์ ์์ด์ผ ํ๋ค.
์์ ๋ด์ฉ
์ฐธ๊ณ :
์๋ ์์๋ SSH ํด๋ผ์ด์ธํธ ๋ฐ ์๋ฒ๊ฐ SOCKS ํ๋ก์ ์ญํ ์ ํ๋ SSH๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋ํฝ์ ํฐ๋๋ง(tunnel)ํ๋ค. ๋ค๋ฅธ ์ข ๋ฅ์ SOCKS5 ํ๋ก์๋ฅผ ๋์ ์ฌ์ฉํ ์ ์๋ค.๊ทธ๋ฆผ 1์ ์ด ์์ ์์ ๋ฌ์ฑํ๊ณ ์ ํ๋ ๋ชฉํ๋ฅผ ๋ํ๋ธ๋ค.
- ์ฐ์ ์ฟ ๋ฒ๋คํฐ์ค API์ ํต์ ์ ์์ํ๋ ๋ก์ปฌ ํด๋ผ์ด์ธํธ ์ปดํจํฐ๊ฐ ์๋ค.
- ์ฟ ๋ฒ๋คํฐ์ค ์๋ฒ/API๋ ์๊ฒฉ ์๋ฒ์์ ํธ์คํ ๋๋ค.
- SSH ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ํํธ์จ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ก์ปฌ ์๋ฒ์ ์๊ฒฉ ์๋ฒ ๊ฐ์ ๋ณด์ SOCKS5 ํฐ๋์ ์์ฑํ๋ค. ํด๋ผ์ด์ธํธ์ ์ฟ ๋ฒ๋คํฐ์ค API ๊ฐ์ HTTPS ํธ๋ํฝ์ SOCKS5 ํฐ๋์ ํตํด ์ ์ก๋๋ฉฐ, ํฐ๋์ SSH๋ฅผ ํตํด ํฐ๋๋ง๋๋ค.
ํธ๋ํฝ .-> local_ssh[๋ก์ปฌ SSH
SOCKS5 ํ๋ก์]; end local_ssh[SSH
SOCKS5
ํ๋ก์]-- SSH ํฐ๋ -->sshd subgraph remote[์๊ฒฉ ์๋ฒ] sshd[SSH
์๋ฒ]-- ๋ก์ปฌ ํธ๋ํฝ -->service1; end client([ํด๋ผ์ด์ธํธ])-. ํ๋ก์๋ HTTPs ํธ๋ํฝ
ํ๋ก์๋ฅผ ํต๊ณผ .->service1[์ฟ ๋ฒ๋คํฐ์ค API]; classDef plain fill:#ddd,stroke:#fff,stroke-width:4px,color:#000; classDef k8s fill:#326ce5,stroke:#fff,stroke-width:4px,color:#fff; classDef cluster fill:#fff,stroke:#bbb,stroke-width:2px,color:#326ce5; class ingress,service1,service2,pod1,pod2,pod3,pod4 k8s; class client plain; class cluster cluster;
ssh๋ฅผ ์ฌ์ฉํ์ฌ SOCKS5 ํ๋ก์ ์์ฑํ๊ธฐ
์๋ ์ปค๋งจ๋(command)๋ ํด๋ผ์ด์ธํธ ์ปดํจํฐ์ ์๊ฒฉ ์๋ฒ ๊ฐ์ SOCKS5 ํ๋ก์๋ฅผ ์์ํ๋ค. SOCKS5 ํ๋ก์๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ฌ์คํฐ์ API ์๋ฒ์ ์ฐ๊ฒฐํ ์ ์๋ค.
# ์๋ ์ปค๋งจ๋๋ฅผ ์คํํ ํ SSH ํฐ๋์ ํฌ๊ทธ๋ผ์ด๋(foreground)์์ ์คํ๋๋ค.
ssh -D 1080 -q -N username@kubernetes-remote-server.example
-D 1080
: SOCKS ํ๋ก์๋ฅผ ๋ก์ปฌ ํฌํธ 1080์ผ๋ก ์ฐ๋ค.-q
: quiet ๋ชจ๋. ๊ฒฝ๊ณ ๋ฐ ์ง๋จ ๋ฉ์์ง ๋๋ถ๋ถ์ ํ์ํ์ง ์๋๋ค.-N
: ์๊ฒฉ ์ปค๋งจ๋๋ฅผ ์คํํ์ง ์๋๋ค. ํฌํธ ํฌ์๋ฉ์ ์ ์ฉ.username@kubernetes-remote-server.example
: ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๊ฐ ์คํ ์ค์ธ ์๊ฒฉ SSH ์๋ฒ.
ํด๋ผ์ด์ธํธ ํ๊ฒฝ ์ค์
์ฟ ๋ฒ๋คํฐ์ค API๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋จผ์ , ํด๋ผ์ด์ธํธ์๊ฒ ์์์ ๋ง๋ SOCKS5 ํ๋ก์๋ฅผ ํตํด ์ฟผ๋ฆฌ๋ฅผ ์ ์กํ๋๋ก ์ง์ํด์ผ ํ๋ค.
https_proxy
ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ๊ณ ์คํํ๋ ์ปค๋งจ๋๋ฅผ ์ปค๋งจ๋๋ผ์ธ ํด์ ์ ๋ฌํ๋ค.
export https_proxy=socks5h://localhost:1080
https_proxy
๋ณ์๋ฅผ ์ค์ ํ๋ฉด curl
๊ณผ ๊ฐ์ ํด์ ๊ตฌ์ฑํ ํ๋ก์๋ฅผ ํตํด HTTPS ํธ๋ํฝ์ ๋ผ์ฐํ
ํ๋ค.
ํด์ด SOCKS5 ํ๋ก์๋ฅผ ์ง์ํด์ผ ์ด ๊ธฐ๋ฅ์ด ๋์ํ๋ค.
์ฐธ๊ณ :
URL https://localhost:6443/api์์localhost
๋ ๋ก์ปฌ ํด๋ผ์ด์ธํธ ์ปดํจํฐ๋ฅผ ์ฐธ์กฐํ์ง ์๋๋ค.
๋์ localhost
๋ผ๊ณ ์๋ ค์ง ์๊ฒฉ ์๋ฒ์ ์๋ํฌ์ธํธ(endpoint)๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
curl
ํด์ ํธ์คํธ ์ด๋ฆ์ HTTPS URL์์ SOCKS๋ฅผ ํตํด ์ ์กํ๊ณ ,
์๊ฒฉ ์๋ฒ๋ ์ด๊ฒ์ ๋ก์ปฌ(๋ฃจํ๋ฐฑ ์ธํฐํ์ด์ค์ ์ํ๋ ์ฃผ์)๋ก ์ฒ๋ฆฌํ๋ค.curl -k -v https://localhost:6443/api
ํ๋ก์์ ํจ๊ป ๊ณต์ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ผ์ด์ธํธ kubectl
์ ์ฌ์ฉํ๋ ค๋ฉด, ~/.kube/config
ํ์ผ์์ ๊ด๋ จ cluster
ํญ๋ชฉ์ ๋ํ proxy-url
์์๋ฅผ ์ค์ ํ๋ค.
์์:
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LRMEMMW2 # ๊ฐ๋
์ฑ์ ์ํด์ ์ถ์ฝํจ
server: https://<API_SERVER_IP_ADRESS>:6443 # "์ฟ ๋ฒ๋คํฐ์ค API" ์๋ฒ, ์ฟ ๋ฒ๋คํฐ์ค-์๊ฒฉ-์๋ฒ์ IP ์ฃผ์
proxy-url: socks5://localhost:1080 # ์ ๋ค์ด์ด๊ทธ๋จ์ "SSH SOCKS5 ํ๋ก์" (SOCKS๋ฅผ ํตํ DNS ํ์ธ ๊ธฐ๋ฅ ๋นํธ-์ธ)
name: default
contexts:
- context:
cluster: default
user: default
name: default
current-context: default
kind: Config
preferences: {}
users:
- name: default
user:
client-certificate-data: LS0tLS1CR== # ๊ฐ๋
์ฑ์ ์ํด์ ์ถ์ฝํจ
client-key-data: LS0tLS1CRUdJT= # ๊ฐ๋
์ฑ์ ์ํด์ ์ถ์ฝํจ
ํฐ๋์ด ๋์ ์ค์ด๊ณ ์ด ํด๋ฌ์คํฐ๋ฅผ ์ฌ์ฉํ๋ ์ปจํ
์คํธ์์ kubectl
์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํ๋ก์๋ฅผ ํตํด ํด๋ฌ์คํฐ์ ์ํธ ์์ฉํ ์ ์๋ค. ์์:
kubectl get pods
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-85cb69466-klwq8 1/1 Running 0 5m46s
์ ๋ฆฌํ๊ธฐ
SSH ํฌํธ ํฌ์๋ฉ ํ๋ก์ธ์ค๊ฐ ์คํ ์ค์ธ ํฐ๋ฏธ๋์์ CTRL+C
๋ฅผ ๋๋ฌ ํ๋ก์ธ์ค๋ฅผ ์ค์งํ๋ค.
ํฐ๋ฏธ๋์ unset https_proxy
๋ฅผ ์
๋ ฅํ์ฌ ํ๋ก์๋ฅผ ํตํ http ํธ๋ํฝ ์ ์ก์ ์ค์งํ๋ค.
๋ ์ฝ์ด๋ณด๊ธฐ
5 - Konnectivity ์๋น์ค ์ค์
Konnectivity ์๋น์ค๋ ์ปจํธ๋กค ํ๋ ์ธ์ ํด๋ฌ์คํฐ ํต์ ์ ์ํ TCP ์์ค ํ๋ก์๋ฅผ ์ ๊ณตํ๋ค.
์์ํ๊ธฐ ์ ์
์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๊ฐ ์์ด์ผ ํ๋ฉฐ, kubectl ๋ช ๋ น์ค ๋๊ตฌ๊ฐ ํด๋ฌ์คํฐ์ ํต์ ํ๋๋ก ์ค์ ๋์ด ์์ด์ผ ํ๋ค. ์ปจํธ๋กค ํ๋ ์ธ ํธ์คํธ๊ฐ ์๋ ๋ ๊ฐ ์ด์์ ๋ ธ๋๋ก ๊ตฌ์ฑ๋ ํด๋ฌ์คํฐ์์ ์ด ํํ ๋ฆฌ์ผ์ ์ํํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค. ํด๋ฌ์คํฐ๊ฐ ์๋ค๋ฉด, minikube๋ฅผ ์ด์ฉํ์ฌ ์์ฑํ ์ ์๋ค.
Konnectivity ์๋น์ค ์ค์
๋ค์ ๋จ๊ณ์๋ ์ก์ (egress) ์ค์ ์ด ํ์ํ๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
apiVersion: apiserver.k8s.io/v1beta1
kind: EgressSelectorConfiguration
egressSelections:
# ํด๋ฌ์คํฐ์ ๋ํ ์ก์ (egress) ํธ๋ํฝ์ ์ ์ดํ๊ธฐ ์ํด
# "cluster"๋ฅผ name์ผ๋ก ์ฌ์ฉํ๋ค. ๊ธฐํ ์ง์๋๋ ๊ฐ์ "etcd" ๋ฐ "controlplane"์ด๋ค.
- name: cluster
connection:
# API ์๋ฒ์ Konnectivity ์๋ฒ ๊ฐ์ ํ๋กํ ์ฝ์
# ์ ์ดํ๋ค. ์ง์๋๋ ๊ฐ์ "GRPC" ๋ฐ "HTTPConnect"์ด๋ค. ๋ ๋ชจ๋ ๊ฐ์
# ์ต์ข
์ฌ์ฉ์๊ฐ ๋ณผ ์ ์๋ ์ฐจ์ด์ ์ ์๋ค. ๋์ผํ ๋ชจ๋์์ ์๋ํ๋๋ก
# Konnectivity ์๋ฒ๋ฅผ ์ค์ ํด์ผ ํ๋ค.
proxyProtocol: GRPC
transport:
# API ์๋ฒ๊ฐ Konnectivity ์๋ฒ์ ํต์ ํ๋ ๋ฐ ์ฌ์ฉํ๋
# transport๋ฅผ ์ ์ดํ๋ค. Konnectivity ์๋ฒ๊ฐ API ์๋ฒ์ ๋์ผํ ์์คํ
์
# ์๋ ๊ฒฝ์ฐ UDS๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. ๋์ผํ UDS ์์ผ์์
# ์์ ๋๊ธฐํ๋๋ก Konnectivity ์๋ฒ๋ฅผ ๊ตฌ์ฑํด์ผ ํ๋ค.
# ์ง์๋๋ ๋ค๋ฅธ ์ ์ก์ "tcp"์ด๋ค. TCP ์ ์ก์ ๋ณดํธํ๋ ค๋ฉด TLS ๊ตฌ์ฑ์ ์ค์ ํด์ผ ํ๋ค.
uds:
udsName: /etc/kubernetes/konnectivity-server/konnectivity-server.socket
Konnectivity ์๋น์ค๋ฅผ ์ฌ์ฉํ๊ณ ๋คํธ์ํฌ ํธ๋ํฝ์ ํด๋ฌ์คํฐ ๋ ธ๋๋ก ๋ณด๋ด๋๋ก API ์๋ฒ๋ฅผ ๊ตฌ์ฑํด์ผ ํ๋ค.
- Service Account Token Volume Projection ๊ธฐ๋ฅ์ด ํ์ฑํ๋์ด ์๋์ง ํ์ธํ๋ค. ์ฟ ๋ฒ๋คํฐ์ค v1.20๋ถํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ด ์๋ค.
admin/konnectivity/egress-selector-configuration.yaml
๊ณผ ๊ฐ์ ์ก์ ๊ตฌ์ฑ ํ์ผ์ ์์ฑํ๋ค.- API ์๋ฒ์
--egress-selector-config-file
ํ๋๊ทธ๋ฅผ API ์๋ฒ ์ก์ ๊ตฌ์ฑ ํ์ผ์ ๊ฒฝ๋ก๋ก ์ค์ ํ๋ค. - UDS ์ฐ๊ฒฐ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ kube-apiserver์ ๋ณผ๋ฅจ ๊ตฌ์ฑ์ ์ถ๊ฐํ๋ค.
spec: containers: volumeMounts: - name: konnectivity-uds mountPath: /etc/kubernetes/konnectivity-server readOnly: false volumes: - name: konnectivity-uds hostPath: path: /etc/kubernetes/konnectivity-server type: DirectoryOrCreate
konnectivity-server์ ๋ํ ์ธ์ฆ์ ๋ฐ kubeconfig๋ฅผ ์์ฑํ๊ฑฐ๋ ์ป๋๋ค.
์๋ฅผ ๋ค์ด OpenSSL ์ปค๋งจ๋๋ผ์ธ ํด์ ์ฌ์ฉํ์ฌ ์ปจํธ๋กค ํ๋ ์ธ ํธ์คํธ์์
ํด๋ฌ์คํฐ CA ์ธ์ฆ์ /etc/kubernetes/pki/ca.crt
๋ฅผ ์ฌ์ฉํ์ฌ X.509 ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํ ์ ์๋ค.
openssl req -subj "/CN=system:konnectivity-server" -new -newkey rsa:2048 -nodes -out konnectivity.csr -keyout konnectivity.key
openssl x509 -req -in konnectivity.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out konnectivity.crt -days 375 -sha256
SERVER=$(kubectl config view -o jsonpath='{.clusters..server}')
kubectl --kubeconfig /etc/kubernetes/konnectivity-server.conf config set-credentials system:konnectivity-server --client-certificate konnectivity.crt --client-key konnectivity.key --embed-certs=true
kubectl --kubeconfig /etc/kubernetes/konnectivity-server.conf config set-cluster kubernetes --server "$SERVER" --certificate-authority /etc/kubernetes/pki/ca.crt --embed-certs=true
kubectl --kubeconfig /etc/kubernetes/konnectivity-server.conf config set-context system:konnectivity-server@kubernetes --cluster kubernetes --user system:konnectivity-server
kubectl --kubeconfig /etc/kubernetes/konnectivity-server.conf config use-context system:konnectivity-server@kubernetes
rm -f konnectivity.crt konnectivity.key konnectivity.csr
๋ค์์ผ๋ก Konnectivity ์๋ฒ์ ์์ด์ ํธ๋ฅผ ๋ฐฐํฌํด์ผ ํ๋ค. kubernetes-sigs/apiserver-network-proxy์์ ๊ตฌํ์ ์ฐธ์กฐํ ์ ์๋ค.
์ปจํธ๋กค ํ๋ ์ธ ๋
ธ๋์ Konnectivity ์๋ฒ๋ฅผ ๋ฐฐํฌํ๋ค. ์ ๊ณต๋
konnectivity-server.yaml
๋งค๋ํ์คํธ๋
์ฟ ๋ฒ๋คํฐ์ค ๊ตฌ์ฑ ์์๊ฐ ํด๋ฌ์คํฐ์ ์คํํฑ ํ๋(static Pod)๋ก ๋ฐฐํฌ๋์๋ค๊ณ ๊ฐ์ ํ๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์๋ Konnectivity
์๋ฒ๋ฅผ ๋ฐ๋ชฌ์
(DaemonSet)์ผ๋ก ๋ฐฐํฌํ ์ ์๋ค.
apiVersion: v1
kind: Pod
metadata:
name: konnectivity-server
namespace: kube-system
spec:
priorityClassName: system-cluster-critical
hostNetwork: true
containers:
- name: konnectivity-server-container
image: registry.k8s.io/kas-network-proxy/proxy-server:v0.0.32
command: ["/proxy-server"]
args: [
"--logtostderr=true",
# ์ด๊ฒ์ egressSelectorConfiguration์ ์ค์ ๋ ๊ฐ๊ณผ ์ผ์นํด์ผ ํ๋ค.
"--uds-name=/etc/kubernetes/konnectivity-server/konnectivity-server.socket",
# ๋ค์ ๋ ์ค์ Konnectivity ์๋ฒ๊ฐ apiserver์
# ๋์ผํ ์์คํ
์ ๋ฐฐํฌ๋๊ณ API ์๋ฒ์ ์ธ์ฆ์์
# ํค๊ฐ ์ง์ ๋ ์์น์ ์๋ค๊ณ ๊ฐ์ ํ๋ค.
"--cluster-cert=/etc/kubernetes/pki/apiserver.crt",
"--cluster-key=/etc/kubernetes/pki/apiserver.key",
# ์ด๊ฒ์ egressSelectorConfiguration์ ์ค์ ๋ ๊ฐ๊ณผ ์ผ์นํด์ผ ํ๋ค.
"--mode=grpc",
"--server-port=0",
"--agent-port=8132",
"--admin-port=8133",
"--health-port=8134",
"--agent-namespace=kube-system",
"--agent-service-account=konnectivity-agent",
"--kubeconfig=/etc/kubernetes/konnectivity-server.conf",
"--authentication-audience=system:konnectivity-server"
]
livenessProbe:
httpGet:
scheme: HTTP
host: 127.0.0.1
port: 8134
path: /healthz
initialDelaySeconds: 30
timeoutSeconds: 60
ports:
- name: agentport
containerPort: 8132
hostPort: 8132
- name: adminport
containerPort: 8133
hostPort: 8133
- name: healthport
containerPort: 8134
hostPort: 8134
volumeMounts:
- name: k8s-certs
mountPath: /etc/kubernetes/pki
readOnly: true
- name: kubeconfig
mountPath: /etc/kubernetes/konnectivity-server.conf
readOnly: true
- name: konnectivity-uds
mountPath: /etc/kubernetes/konnectivity-server
readOnly: false
volumes:
- name: k8s-certs
hostPath:
path: /etc/kubernetes/pki
- name: kubeconfig
hostPath:
path: /etc/kubernetes/konnectivity-server.conf
type: FileOrCreate
- name: konnectivity-uds
hostPath:
path: /etc/kubernetes/konnectivity-server
type: DirectoryOrCreate
๊ทธ๋ฐ ๋ค์ ํด๋ฌ์คํฐ์ Konnectivity ์์ด์ ํธ๋ฅผ ๋ฐฐํฌํ๋ค.
apiVersion: apps/v1
# ์์ด์ ํธ๋ฅผ Deployment(๋ํ๋ก์ด๋จผํธ)๋ก ๋ฐฐํฌํ ์๋ ์๋ค. ๊ฐ ๋
ธ๋์ ์์ด์ ํธ๊ฐ
# ์์ ํ์๋ ์๋ค.
kind: DaemonSet
metadata:
labels:
addonmanager.kubernetes.io/mode: Reconcile
k8s-app: konnectivity-agent
namespace: kube-system
name: konnectivity-agent
spec:
selector:
matchLabels:
k8s-app: konnectivity-agent
template:
metadata:
labels:
k8s-app: konnectivity-agent
spec:
priorityClassName: system-cluster-critical
tolerations:
- key: "CriticalAddonsOnly"
operator: "Exists"
containers:
- image: us.gcr.io/k8s-artifacts-prod/kas-network-proxy/proxy-agent:v0.0.16
name: konnectivity-agent
command: ["/proxy-agent"]
args: [
"--logtostderr=true",
"--ca-cert=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt",
# konnectivity ์๋ฒ๋ hostNetwork=true๋ก ์คํ๋๊ธฐ ๋๋ฌธ์,
# ์ด๊ฒ์ ๋ง์คํฐ ๋จธ์ ์ IP ์ฃผ์์ด๋ค.
"--proxy-server-host=35.225.206.7",
"--proxy-server-port=8132",
"--admin-server-port=8133",
"--health-server-port=8134",
"--service-account-token-path=/var/run/secrets/tokens/konnectivity-agent-token"
]
volumeMounts:
- mountPath: /var/run/secrets/tokens
name: konnectivity-agent-token
livenessProbe:
httpGet:
port: 8134
path: /healthz
initialDelaySeconds: 15
timeoutSeconds: 15
serviceAccountName: konnectivity-agent
volumes:
- name: konnectivity-agent-token
projected:
sources:
- serviceAccountToken:
path: konnectivity-agent-token
audience: system:konnectivity-server
๋ง์ง๋ง์ผ๋ก ํด๋ฌ์คํฐ์์ RBAC๊ฐ ํ์ฑํ๋ ๊ฒฝ์ฐ ๊ด๋ จ RBAC ๊ท์น์ ์์ฑํ๋ค.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: system:konnectivity-server
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:auth-delegator
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: system:konnectivity-server
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: konnectivity-agent
namespace: kube-system
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile