์ด๋ฒ์ ์ ๋ฌด๊ณผ์ ์์ ์ผ๋ ํด๋ค์ ์ ๋ฆฌํด๋ณด๋ฉด์ k8s ์น ๋ฐฐํฌ๋ฅผ ์๋ ์ ํ๋ ๊ธฐ์ต์ ๋์ด๋ ค ๋ค์ ๊ณต๋ถํด๋ณด๋ฉด์ ํฌ์คํ ํ๊ธฐ๋ก ํ๋ค. ์ง๋ ํฌ์คํ ์์๋ DB ์ค์ ์ ํ์ํ ํ์ผ๋ค์ ๋ง๋ค์ด๋ณด๋ฉด์ PV, PVC, configmap ๋ฑ ๋ด๊ฐ ํท๊ฐ๋ ธ๋ ๊ฒ๋ค์ ์ ๋ฆฌํด๋ณด๋ ์๊ฐ์ ๊ฐ์ก๋ค. ์ด๋ฒ ํฌ์คํ ์์๋ kubernetes์ ๋คํธ์ํน์ ๋ํด์ ๊ฐ๋จํ ์์๋ณด๊ณ , ingress์ gateway์ ๋ํด ์ ๋ฆฌํ๊ณ , ๋์ ์ฝ์ง(...)์ ๊ธฐ๋กํ๋๋ก ํ๊ฒ ๋ค.
๋ชฉํ
- GKE(Google Kubernetes Engine)์ GCE(Google Compute Engine) ๋ฑ์ ํ์ฉํ ํ์คํ ์น ์๋น์ค ๋ฐฐํฌํ๊ธฐ
- docker file ๊ตฌ์ฑํ๊ธฐ
- kubectl ํ์ฉํ๊ธฐ
- ์ฟ ๋ฒ๋คํฐ์ค ๊ตฌ์ฑ์ ๊ดํ ์ดํด ๋ฐ ์ ์ฉ
- Deployment
- StatefulSet
- Persistent Volume
- Service
- Gateway
1. Kubernetes ๋คํธ์ํฌ
์ฟ ๋ฒ๋คํฐ์ค(Kubernetes) ๋คํธ์ํฌ ์ ๋ฆฌ
Kubernetes Network
medium.com
- ์ ๊ธ์ ์ฐธ๊ณ ํด ๊ณต๋ถํ์ต๋๋ค. ์ข์ ๊ธ ๊ฐ์ฌํฉ๋๋ค.
- ์์๋ก ๋ฐ์ง๋ฉด gateway๋ฅผ ์ ์ฉํ๋ ค๊ณ ํ๋ค๊ฐ ๋๋ฌด ์๋ผ์ ๋คํธ์ํฌ๊ฐ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ก๋์ง ๋ค์ ๋์๊ฐ์ ํ์ธํ๋ค๊ณ ๋ณด๋ ๊ฒ์ด ์ณ์๋ฐ, ๋ด๊ฐ ์ค์ ์ ์ผ๋ก ๋ณธ ๊ฒ์ ๋ค์ฏ ๊ฐ์ง์ด๋ค.
A. Docker container ๊ฐ์ ๋คํธ์ํน
- ๋์ปค์ ๊ฒฝ์ฐ ๊ฐ๊ฐ์ container๊ฐ ๊ฐ์ ๋คํธ์ํฌ ์ธํฐํ์ด์ค๋ฅผ ๊ณ ์ ํ๊ฒ ๊ฐ์ ธ๊ฐ ip ์ฃผ์๊ฐ ๋ค๋ฅด๋ค.
- ๊ทธ๋ฌ๋ ํ๋์ ๊ฐ์ ๋คํธ์ํฌ ์ธํฐํ์ด์ค ์์ ๋ฌถ์ฌ์๊ธฐ ๋๋ฌธ์ ์ด๊ฑธ ํตํด์ ํต์ ์ด ๊ฐ๋ฅํ๋ค.
- ex) eth0 = 10.100.0.2 ์ผ ๋, docker network interface = 172.17.0.1 ์ด๋ผ๊ณ ํ๋ค.
- ์ด๋ container 1 = 172.17.0.2 / container 2 = 172.17.0.3
- ์ด๋ ๊ฒ docker network interface์ ๋ฌถ์ธ ์ฑ๋ก ์๋ก ๋ค๋ฅธ ip ์ฃผ์๋ฅผ ๊ฐ์ง๋ค.
B. K8S pod ๋ด๋ถ์ ๋คํธ์ํน
- kubernetes์ pod๋ฅผ ๋ณด๋ฉด ํ๋์ ๊ฐ์ ๋คํธ์ํฌ ์ธํฐํ์ด์ค์ ๋ ๊ฐ์ container๊ฐ ๋์์ ํ ๋น๋์ด ์๋ค(ip ์ฃผ์๊ฐ์).
- ๋ฐ๋ผ์ pod ๋ด๋ถ์์๋ port ๋ฒํธ๋ก ์๋ก๋ฅผ ๊ตฌ๋ถํ๋ค.
- pod์ ๋คํธ์ํฌ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํด์ฃผ๋ ํน์ ์ปจํ ์ด๋๋ฅผ pause ๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ์ด ์ปจํ ์ด๋๋ pod๋ง๋ค ์กด์ฌํ๋ค.
C. Pod ๊ฐ์ ๋คํธ์ํน
- kubernetes์์ kubenet์ด๋ผ๋ ๋คํธ์ํฌ ํ๋ฌ๊ทธ์ธ์ ์ ๊ณตํ๊ธด ํ์ง๋ง CNI ์คํ์ ์ค์ํ๋ ๋ค๋ฅธ ํ๋ฌ๊ทธ์ธ ์ฌ์ฉ์ ๊ถ์ฅํ๋ค.
- ๊ฐ๊ฐ์ pod๋ ๊ณ ์ ํ ip ์ฃผ์๋ฅผ ๊ฐ์ง๋ค.
- ๋ฐ๋ผ์ kubenet ํน์ ๋ค๋ฅธ ๋คํธ์ํฌ ์ธํฐํ์ด์ค(ํ๋ฌ๊ทธ์ธ)์ ์ฌ์ฉํด์ ip๋ก ํต์ ์ด ๊ฐ๋ฅํ๋ค.
- ์์ Node๊ฐ ๋ค๋ฅธ pod์ ๊ฒฝ์ฐ์๋ ๋ผ์ฐํฐ๋ฅผ ๊ฑฐ์ณ์ผํ๋ค.
D. Pod to Service ๋คํธ์ํน
- ์ง๋ ๋ฒ์๋ ์ด์ผ๊ธฐํ๋ฏ์ด pod๋ ๊ณ์ ๋ณํ๊ณ ๋์ฒด๋๊ธฐ ์ฌ์ฐ๋ฏ๋ก pod to pod ์ฐ๊ฒฐ์๋ ์๋ฏธ๊ฐ ์๋ค. ์๋ก ์์ฑ๋์ ๋ ์ด์ ๊ณผ ip๊ฐ ๊ฐ์ ๊ฒ์ด๋ ๋ณด์ฅ๋ ์๊ณ (statefulset์ด ์๋๋ผ๋ฉด)
- ๋๋ฌธ์ ์๋น์ค๋ก reverse proxy ํน์ loadbalancer๋ฅผ ์ฌ๋ ค์ ํด๊ฒฐํ๋ค.
- ํด๋ผ์ด์ธํธ์์ proxy๋ก ์ฐ๊ฒฐํ๋ฉด ์๋ฒ ๋ชฉ๋ก์ ๊ด๋ฆฌํ๋ฉด์ ์ด์์๋ pod๋ก ํธ๋ํฝ์ ์ฐ๊ฒฐํ๋ค.
- pod์ ๋์ผํ๊ฒ service๋ ๊ฐ์ ip์ธ๋ฐ, pod ๋คํธ์ํฌ๋ ๊ฐ์ฌ์ ์ด๋๋ท ๋คํธ์ํฌ ์ธํฐํ์ด์ค๊ฐ ์์ด์ ifconfig๊ฐ ๋์ํ์ง๋ง service์์๋ ๋ถ๊ฐ๋ฅํ๋ค.(๋น์ฐํจ)
- ์์์ ๊ฐ์ด ๋ณด์.
์์!
- (๊ฐ์ ํด๋ฌ์คํฐ ๋ด) ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ ์์ปค ๋ ธ๋๊ฐ ์๊ณ , ํ๋์ ๊ฒ์ดํธ์จ์ด/๋ผ์ฐํฐ๋ก ์ฐ๊ฒฐ๋์ด ์๋ค. ์๋น์ค๋ ์๋์ ๊ฐ๋ค.
apiVersion: v1
kind: Service
metadata:
name: service-test
spec:
selector:
app: server-pod1
ports:
- protocol: TCP
port: 80
targetPort: 8080
- ํ ์ชฝ์ ์์ปค ๋ ธ๋์์ ๋ค๋ฅธ ์ชฝ์ผ๋ก ์์ฒญ์ ๋ณด๋ด๋ฉด์ ip๋ฅผ ์ฐพ๋ ๊ณผ์ ์ ํ ๋ฒ ํ์ธํด๋ณด์.
- client pod๊ฐ http request๋ฅผ service-test๋ผ๋ dns ์ด๋ฆ์ผ๋ก ์์ฒญํ๋ค.
- ํด๋ฌ์คํฐ dns ์๋ฒ๊ฐ ํด๋น ์ด๋ฆ์ service ip๋ก ๋งคํํด์ค๋ค.
- http client๊ฐ dns ์๋ฒ๋ก๋ถํฐ ip๋ฅผ ๋ฐ์ ip ์ฃผ์๋ก ์ต์ข ์์ฒญ์ ๋ณด๋ธ๋ค.
- ์ฌ๊ธฐ๊น์ง๊ฐ ip ์ฃผ์๋ฅผ ์ป๋ ๋ฐฉ๋ฒ์ด๋ค. ์ด์ ip ์ฃผ์๋ก ๋ชฉ์ ์ง๋ฅผ ์ฐพ๋ ๊ณผ์ ์ ๋ณด์.

- ip ๋คํธ์ํฌ๋ ์์ ์ host์์ ๋ชฉ์ ์ง๋ฅผ ์ฐพ์ง ๋ชปํ๋ฉด ์์ ๊ฒ์ดํธ์จ์ด๋ก ํจํท์ ์ ๋ฌํ๋ค.
- client pod์์ ์์ํ๋ค๊ณ ํ ๋, ๋ชฉ์ ์ง ์ฃผ์๊ฐ 10.3.241.152๋ผ๋ฉด veth1์ ๋ง์ง ์์ผ๋ cbr0์ผ๋ก, cbr0์์ eth0์ผ๋ก, eth0์์ router๋ก ๊ฐ๋ค.
- ๊ทธ๋ฌ๋ฉด ๊ฒฐ๊ตญ์๋ ๋ชป ์ฐพ๋ ๊ฑฐ ์๋๊ฐ? ์ถ์๋ฐ, ์ค์ ๋ก๋ ํจํท ๋ชฉ์ ์ง ์ฃผ์๊ฐ ๋ณ๊ฒฝ๋์ด server pod 1์ ์ฐพ์๊ฐ๋ค.
- ์์ผ๊น???
Kube-proxy

- ์๊ฐ ๊ทธ ์ด์ ๋ค.
- kubernetes๋ netfilter์ iptables๋ก ํจํท ํ๋ฆ์ ์ ์ดํ๋ค.
- netfilter : ๋ฃฐ ๋ฒ ์ด์ค ํจํท ์ฒ๋ฆฌ ์์ง. ์ค๊ณ ๊ฐ๋ ํจํท์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ํ์ธํ๊ณ ๊ท์น์ ๋ง๋ ํจํท์ด ์์ผ๋ฉด ์ ํด์ง action์ ์ํํ๋ค.
- ์ด action ์ค์ Destination NAT๋ผ๋ ๋ชฉ์ ์ง ์ฃผ์ ๋ณ๊ฒฝ action์ด ์๋ค.
- iptables : netfilter๋ฅผ ์ฌ์ฉํด์ chain rule์ด๋ผ๋ ๊ท์น์ ์ง์ ํ๊ณ , ํจํท์ ํฌ์๋ฉํ๋๋ก ๋คํธ์ํฌ๋ฅผ ์ค์ ํ๋ค.
- netfilter : ๋ฃฐ ๋ฒ ์ด์ค ํจํท ์ฒ๋ฆฌ ์์ง. ์ค๊ณ ๊ฐ๋ ํจํท์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ํ์ธํ๊ณ ๊ท์น์ ๋ง๋ ํจํท์ด ์์ผ๋ฉด ์ ํด์ง action์ ์ํํ๋ค.
- kubernetes๋ ์ด netfilter๋ฅผ proxy ํํ๋ก ์ฌ์ฉํ๋ค.
- kube-proxy๊ฐ localhost์์ ์๋น์ค ์์ฒญ์ ๋ฐ๊ธฐ ์ํด ํฌํธ๋ฅผ ์ฐ๋ค.
- kube-proxy๊ฐ netfilter๋ก service IP๋ก ๋ค์ด์ค๋ ํจํท์ kube-proxy ์์ ์๊ฒ ์ค๊ฒ ์ค์ ํ๋ค.
- kube-proxy๋ก ์จ ์์ฒญ์ ์ค์ server pod์ ip:port๋ก ์ ๋ฌํ๋ค.
- ๋ค๋ง ์ด๋ ๊ฒ user space์์ proxyingํ๋ ๊ฒ์ ํจํท์ ๋ค์ user์์ ์ปค๋๋ก ๋ณํํ๋ ๋น์ฉ์ด ๋ฐ์ํ๋ค.
>> iptable์ ๋์ ์ฌ์ฉํ๊ธฐ!
- kube-proxy๊ฐ proxy ์ญํ ์ ํ์ง ์๊ณ netfilter์๊ฒ ์ ์ฒด๋ฅผ ๋ค ๋งก๊ธฐ๊ณ , ๊ท์น ์์ ๋ง ํ๋ค.
- kube-proxy๋ ๋ง์คํฐ ๋
ธ๋ api server์์ ์ ๋ณด๋ฅผ ๋ฐ๊ธฐ ๋๋ฌธ์ ํด๋ฌ์คํฐ ๋ณํ๋ฅผ ๊ฐ์งํด์ ์ด์์๋ ์๋ฒ pod๋ฅผ ์ ์ ์๋ค. ์๊ฒ๋๋ฉด iptables๋ฅผ ์
๋ฐ์ดํธ ํด์ ๊ท์น์ ๊ฐฑ์ ํ๋ค.
- ๋ง์คํฐ ๋ ธ๋ api์์ health check๋ฅผ ํ๋ ๋ฒ = kubelet
E. ์ธ๋ถ์ Service ๊ฐ์ ๋คํธ์ํน
- ์ฌํ๊น์ง๋ cluster ๋ด๋ถํต์ ์ด์๋ค.
- ์ธ๋ถ ํต์ ์ด ๊ฐ๋ฅํ service ํ์ ์ ๋ ๊ฐ๋ค.
1. NodePort
- ๋ ธ๋ ๋คํธ์ํฌ ip๋ก๋ ์ ๊ทผ ๊ฐ๋ฅํ๊ณ , cluster ip๋ก๋ ์ด ์๋น์ค์ ์ ๊ทผํ ์ ์๋ค.
- nodeport๊ฐ ์์ฑ๋ ๋ kube proxy๊ฐ ๋คํธ์ํฌ ์ธํฐํ์ด์ค์ 30000~32767 ์ฌ์ด ํฌํธ๋ฅผ ํ ๋นํ๋ค.
- ์ด ํฌํธ๋ก ์ธ๋ถ์์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ๋งคํ๋์ด ์๋ cluster ip๋ก ์ ๋ฌํ๋ค.
2. Load Balancer
- ์ธ๋ถ ํด๋ผ์ฐ๋ ์๋น์ค๋ฅผ ์ฌ์ฉํด์ ํ๋ก๋น์ ๋ํ ์ ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
- ์ธ๋ถ ๋ก๋๋ฐธ๋ฐ์ ํธ๋ํฝ์ด ํด๋ฌ์คํฐ ๋ด์ pod๋ก ์ ๋ฌ๋๋ ๋ฐฉ์์ด๊ณ , ํด๋ผ์ฐ๋ ์ ๊ณต ์ ์ฒด ์ชฝ์์ ๋์์ ๊ฒฐ์ ํ๋ค.
2. Ingress์ Gateway API
A. Ingress
- ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ์ธ๋ถ์ HTTP/HTTPS ํธ๋ํฝ์ ํด๋ฌ์คํฐ ๋ด ์๋น์ค๋ก ๋ผ์ฐํ ํ๋ค.
- ๋จ์ผ IP ์ฃผ์๋ก ์ธ๋ถ์์ ์ ๊ทผํด์ ํด๋ฌ์คํฐ ๋ด๋ถ ์ฌ๋ฌ ์๋น์ค๋ก ํธ๋ํฝ์ ๋ถ์ฐ์ํจ๋ค.
- url ๊ฒฝ๋ก ์ค์ / SSL, TLS๋ก ๋ณด์ ์ค์ / ๋ก๋๋ฐธ๋ฐ์ฑ ๋ฑ์ ์ญํ ๋ ์ํํ๋ค.
- ingress api
- ์ฟ ๋ฒ๋คํฐ์ค์์ ingress ๋ฆฌ์์ค ์ ์๋ฅผ ์ํด ์ฌ์ฉํ๋ api๋ก, ์ฐ๋ฆฌ๊ฐ ์์ฑํ๋ yaml ๊ตฌ์ฑ ํ์ผ๋ก ์ค์ ํ๋ค.
- ingress controller
- ingress api์ ๋ฆฌ์์ค์์ ์ ์ํ ๊ท์น์ ๊ตฌํํ๊ณ ์คํํ๋ ์ํํธ์จ์ด์ด๋ค.
- ์ฌ๊ธฐ์ ์ค์ ๋ก ํธ๋ํฝ์ ์ฒ๋ฆฌํ๋ค.
- nginx controller๊ฐ ๋ํ์ ์ด๋ค.
- ingress controller - ingress๊ฐ ํ๋์ ์ง์ด๋ค.
B. Gateway

- ์๋น์ค ๋คํธ์ํน์ ์ํ ์คํ์์ค ํ์ค.
- ingress์ ํ๊ณ ๊ทน๋ณต์ ์ํ Multi Tenant network routing solution์ด๋ค.
- ingress๋ crds(custom resource definition)์ ์ง์ ๋ค ์ ์ด์ฃผ์ด์ผํ๋ค๋ ํ๊ณ๊ฐ ์๋ค.
- ์ฌ๋ฌ ์ ํ์ Layer 7 ๋ฆฌ์์ค๋ฅผ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ค๋ค.
- ๋ฉํฐ ํ ๋ํธ ์ง์ = ํด๋ฌ์คํฐ ํ ๊ฐ์์ ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ๋คํธ์ํฌ ํธ๋ํฝ ๊ด๋ฆฌ ๊ฐ๋ฅ
- TCP, UDP ๊น์ง ํ์ฅ ์ง์
- ์ธ๋ถํ๋ ํธ๋ํฝ ์ ์ฑ ์ค์ ๊ฐ๋ฅ
- gateway class์๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋๋ฐ, ์๋ฅผ ๋ค์ด๋ณด๋ฉด
- gke-l7-regional-external-managed(๋ฆฌ์ ์ธ๋ถ ์ ํ๋ฆฌ์ผ์ด์ ๋ถํ ๋ถ์ฐ๊ธฐ)
- gke-l7-regional-external-managed-mc(๋ฆฌ์ ์ธ๋ถ ๋ฉํฐํด๋ฌ์คํฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ถํ ๋ถ์ฐ๊ธฐ)

- Ingress์ ๋น๊ตํด๋ณด์์ ๋, Ingress๋ url routing๊น์ง ์ฒ๋ฆฌํด์ service์ ๋ฐ๋ก ์ฐ๊ฒฐํ๋ค.
- gateway์ ๊ฒฝ์ฐ gateway api์ routeing ๋ถ๋ถ์ด ๋ถ๋ฆฌ๋์ด ์์ผ๋ฏ๋ก ์ ์ง๋ณด์๊ฐ ์ข ๋ ์ฝ๋ค๋ ๊ฒ์ด ์ฅ์ ์ด๋ค.
C. GatewayAPI ์ HTTPRoute ์ค์
Gateway API
kind: Gateway
apiVersion: gateway.networking.k8s.io/v1
metadata:
name: http-gateway
namespace: web
spec:
gatewayClassName: gke-l7-regional-external-managed
listeners:
- name: http
protocol: HTTP
port: 80
allowedRoutes:
namespaces:
from: Same
- gateway api ์ค์ ํ์ผ์ ๋ถ์ํด๋ณด์.
- ๋จผ์ apiVersion์ด gateway.networking.k8s.io/v1 ์ด๋ค. ์ด์ ๊ณผ๋ ๋ค๋ฅด๋ ๋๋์ด ํํ ์ค๊ฒ ์ง๋ง, ์ด ๋ง์ gateway api๋ ์ถ๊ฐ ์ค์น๊ฐ ํ์ํ๋ค๋ผ๋ ๊ฒ์ด๋ค.
- ๋ง์ผ ํด๋ฌ์คํฐ ์์ฑ ์์ ๊ณ ๊ธ ๋คํธ์ํน ํญ์์ gateway api๋ฅผ ์ค์ ํ๋ค๋ฉด ์๋์ผ๋ก ์ค์น๋ฅผ ํด์ฃผ๋ฏ๋ก ์ถ๊ฐ ์ค์น๋ฅผ ํ ํ์๋ ์๋ค.
- ์ค์น ๋ช ๋ น์ด๋ ์๋์ ๊ฐ๋ค.
gcloud container clusters update <YOUR_CLUSTER_NAME> --region=<YOUR_REGION> --gateway-api=standard

- ์ค์น ํ ์๋ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด ์ค์น๋ gateway class๋ค์ ํ์ธํ ์ ์๋ค.
kubectl get gatewayclass

- spec.gatewayClassName์ ์ด class ์ค ํ๋๋ฅผ ์ ๋๋ฐ, ๋๋ ๋ฆฌ์ ์ธ๋ถ ์ ํ๋ฆฌ์ผ์ด์ ๋ถํ ๋ถ์ฐ gateway api๋ฅผ ์ํ๋ฏ๋ก gke-l7-regional-external-managed ๋ฅผ ์ ํํ๋ค. ๋ฉํฐํด๋ฌ์คํฐ๋ผ๋ฉด mc ๊ฐ ๋ถ์ ํด๋์ค๋ฅผ ์ ํํ๋ฉด ๋๋ค.
- spec.listeners๋ ํธ๋ํฝ ์ฒ๋ฆฌ ์ธํ๋ผ ์ธ์คํด์ค๊ฐ ์ด๋ ํธ๋ํฝ์ ์ด๋ ํฌํธ์์ ์์ ํ ๊ฒ์ธ์ง๋ฅผ ์ ๋๋ค. ์ง๊ธ ์์ ์์๋ HTTP ํ๋กํ ์ฝ์ ํฌํธ 80๋ฒ์์ ์์ ํ๋๋ก ํ๋ค.
- allowRoutes๋ ์ด๋๋ก ๊ฐ๋ ๋ผ์ฐํ ์ ํ์ฉํ ๊ฒ์ธ์ง ์ ์ฝ์ ์ค๋ค. ์ง๊ธ์ ๊ฒฝ์ฐ ๊ฐ์ namespace ์์ ์๋ ์๋น์ค๋ก ๋ผ์ฐํ ์ด ๊ฐ๋ฅํ๋๋ก ์ ํํด๋์๋ค.
- ์ด๋ ๋ค์ ๋ผ์ฐํ ๊ท์น์ ์ง์ ํ๋ HTTPRoute์์ ์ง์ ํ๋ ํฌํธ๋ service ์ ๋ณด๊ฐ ๋ค๋ฅธ ์์์ ์ค๋ณต๋๋๋ผ๋ ๊ฐ์ namespace ์์ ์๋ service์ ๋ผ์ฐํ ํ๋๋ก ํ๋ค.
HTTPRoute
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: web-route
namespace: web
spec:
hostnames:
- bunny-bun.me
parentRefs:
- name: http-gateway
group: gateway.networking.k8s.io
kind: Gateway
sectionName: http
rules:
- matches:
- path:
type: pathPrefix
value: /
backendRefs:
- port: 80
name: server-svc
- HTTPRoute๋ ๊ฐ์ apiVersion์ ์ฌ์ฉํ๋ค.
- spec.hostnames์๋ dns ์ฃผ์๊ฐ ๋ค์ด๊ฐ๋ค. ๋๋ ๋ด๊ฐ ๊ฐ์ง๊ณ ์๋ ์ฃผ์ bunny-bun.me ๋ฅผ ๋ฃ์๋ค.
- parentRefs์๋ ๋ฑ๋กํ gateway api๋ฅผ ์ง์ ํด์ ์ด gateway์ ๋ผ์ฐํ
๊ท์น์์ ๋ฑ ์ ํด์ค๋ค.
- ๋ง๋ ์ด๋ฆ, group(api version), kind๋ฅผ ์์ฑํด์ฃผ๊ณ sectionName์ ํ๋กํ ์ฝ์ ์ ๋๋ค.
- rules๋ gateway๋ก ๋ค์ด์จ ์ด๋ค ์กฐ๊ฑด์ ๋ง๋ ํธ๋ํฝ์ด ์ด๋ ์๋น์ค์ ํฌํธ๋ก ๊ฐ ๊ฒ์ธ์ง ๊ท์น์ ์ ํด์ค๋ค.
- rules.matches.path๋ hostname ๋ค ๊ฒฝ๋ก๊ฐ value์ type์ผ๋ก ์ค์ ํ ๊ฒ์ ๋ง๋ ๊ฒฝ๋ก๋ฅผ ํต๊ณผ์ํจ๋ค. ์ด ๊ท์น์ ๋ง์์ผ ์๋ ์๋น์ค๋ก ๋ผ์ฐํ ๋๋ค.
- rules.matches.backendRefs๋ ํฌํธ ๋ฒํธ์ ์๋น์ค๋ฅผ ์ฐ๊ฒฐํ๋ค. ์ด gateway ๋ก ๋ค์ด์จ ํธ๋ํฝ์ด ์ด๋ ์๋น์ค์ ์ด๋ค ํฌํธ๋ก ๊ฐ๋์ง๋ฅผ ์ ํด์ค๋ค. ์ฌ๋ฌ ๊ฐ์ ์๋น์ค๋ฅผ ์ฐ๊ฒฐํด์ ํธ๋ํฝ์ ํผ์ผํธ ๋จ์๋ก ๋ถ์ฐํ ์๋ ์๋ค. ์ด ๊ฒฝ์ฐ์๋ weight ์ต์ ์ ์ฌ์ฉํ๋ค.
- rules์์ ์ฌ๋ฌ backendRefs์ matches๋ฅผ ์ค์ ํ ์ ์๋ ๊ฒ์ด Ingress๋ณด๋ค Gateway๊ฐ ๋ ์ ์ฐํ๊ณ ๊ฐ๋ ฅํ ํธ๋ํฝ ๋ผ์ฐํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ ์ด์ ์ด๋ค.
- matches๋ ๋น๋จ ๊ฒฝ๋ก ๋ฟ ์๋๋ผ ๋ค๋ฅธ ๊ฒ๋ค๋ ์ค์ ํ ์ ์๋ค.
rules:
- matches:
- method: POST
- headers:
- name: user-type
value: admin
backendRefs:
- name: admin-api-svc
port: 80
- ์ ์์์์ ๋ณด๋ฉด, ์์ฒญ์ด POST ์ด๊ณ header์ user-type=admin ์ผ ๋, ์ด rule์ ์ ์ฉํ์ฌ admin-api-svc์ 80๋ฒ ํฌํธ๋ก ์ ๋ฌํ๋ผ๊ณ ๋์ด ์๋ค. ์ด๋ฐ ์์ผ๋ก ์ธ๋ฐํ ํธ๋ํฝ ํ๋ฆ์ ์ ์ธ์ ์ผ๋ก ์ ์ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
3. ์ ์ฉ ์ค์ ๋ง์ฃผํ ์ค๋ฅ๋ค๊ณผ ํด๊ฒฐ ๋ฐฉ์
์์ ์ K8S๋ฅผ ์ฌ์ฉํ์ ๋๋ nginx ingress controller๋ฅผ ์ฌ์ฉํด์ ingress๋ก ๋ฐฐํฌ๋ฅผ ํ์๊ธฐ ๋๋ฌธ์ GatewayAPI๋ก๋ ์ฒ์ ๋ผ์ฐํ ํด๋ณด๊ฒ ๋์๋ค. ๋ฐ๋ผ์ ๊ต์ฅํ ๋ง์ ์ค๋ฅ๋ค์ ๋ง์ฃผํ๊ฒ ๋์์ผ๋ฏ๋ก ๊ทธ ์ฝ์ง ๊ธฐ๋ก์ ํ ๋ฒ ๊ณต์ ํด๋ณด๋ ค๊ณ ํ๋ค.
a. Fault filter abort
์ฐ์ ์ฒ์ Gateway API์ HTTPRoute๋ฅผ ์ฌ๋ ธ์ ๋ ๋ง์ฃผํ ์๋ฌ์ด๋ค. hostname์ผ๋ก ์ฐ๊ฒฐํ์ง ์๊ณ gateway์ ํ ๋น๋ ์ธ๋ถ ip ์ฃผ์๋ก ์ ์ํ๋๋ฐ ์น ํ์ด์ง์ ๋ฑ ์ด๊ฒ๋ง ๋จ๊ณ ์๋ฌด ์ ๋ณด๊ฐ์ด ์์๋ค. ์ฐพ์๋ณด๋๊น gateway ์ชฝ์์ ์ฐ๊ฒฐ๋ ๋ฐฑ์๋ ์๋น์ค์ health check์ ์คํจํ๋ฉด ์ด๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๊ณ ํ๋ค.
์๋ํ ๋ฐฉ๋ฒ 1
๋๋ฌธ์ fastapi pod๊ฐ ์ฃฝ์๋์ง ํ์ธํ๊ธฐ ์ํด์ health check๋ฅผ ๋ฐฐํฌํ๋ค.
apiVersion: networking.gke.io/v1
kind: HealthCheckPolicy
metadata:
name: fastapi-health-policy
namespace: web
spec:
targetRef:
group: ""
kind: Service
name: server-svc
default:
config:
type: HTTP
httpHealthCheck:
port: 8080
requestPath: /
- targetRef์ health check๋ฅผ ํ ์๋น์ค๋ฅผ ์ง์ ํ๊ณ , default์ config ํ์์ health check ๋ฐฉ๋ฒ์ ์ค์ ํ๋ค.
- ์ด ๊ฒฝ์ฐ์๋ HTTP ํธ๋ํฝ์ผ๋ก 8080 port, ๊ฒฝ๋ก / ๋ก health check๋ฅผ ์ํํ๋ค.
์ด ๊ตฌ์ฑํ์ผ์ ์ ์ฉ์ํจ ๋ค์ health check๋ฅผ ์งํํ๋ค.
kubectl describe healthcheckpolicy fastapi-health-policy -n web
๊ฐ์ฅ ์๋ events ์ conditions ํญ๋ชฉ์ ํ์ธํด๋ณด๋ฉด,

Gateway๋ ์ ์ ๋ด๋ ธ์ผ๋ ์๋ ๊ฒ์ด ๋ง๊ณ , event๋ normal ์ธ ๊ฒ์ ๋ณด๋ฉด pod ์์ฒด์๋ ๋ฌธ์ ๊ฐ ์์ด ์ด์์๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
์๋ํ ๋ฐฉ๋ฒ 2
Gemini์ ํ ๋ก ํด๋ดค์ ๋ ๋ฐฉํ๋ฒฝ ๋ฌธ์ ์ผ ๊ฐ๋ฅ์ฑ์ด ์๋ค๊ณ ํด์ pod๋ก ์ฐ๊ฒฐ๋๋ 8080 port TCP๋ฅผ ์ด์ด์ฃผ์์ง๋ง ํด๊ฒฐ๋์ง ์์๋ค. ๊ตณ์ด ๋ฐฉ๋ฒ์ ๊ณต์ ํ์ง ์๋๋ค...
ํด๊ฒฐ ๋ฐฉ์ 1
๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด service type์ด loadbalancer์ด๋ฉด ์๋๋ค. ๋ฐ๋์ Cluster IP๋ก ์ค์ ๋์ด์ผ ํ๋ค. ์ด์ ๋ ์๋์ ๊ฐ๋ค.
- server service๋ฅผ loadbalancer ํ์ ์ผ๋ก ์ค์ ํ๋ฉด GCP L4 network loadbalancer๊ฐ ์์ฑ๋๋ค.
- ์ฌ๊ธฐ์ gateway๊ฐ GCP L7 HTTP(S) loadbalancer๋ฅผ ์ฌ์ฉํ๋ฉด L4-L7 ์ด์คํ๊ฐ ๋ฐ์ํ๋ค
- ์๋ L4-L7 ์ฐ๊ฒฐ์ด ์๋๋ ๊ฑด ์๋๋ค.(HAํ๋ก์ ๋ฑ) ๊ทธ๋ฐ๋ฐ gcp ๊ด๋ฆฌํ ์๋น์ค+k8s ์ปจํธ๋กค๋ฌ ์ค๊ณ๊ฐ ๊ฒน์น๋ฉด์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก L7 ๊ฒ์ดํธ์จ์ด ๋ก๋๋ฐธ๋ฐ์๋ pod์ ์ง์ health check๋ฅผ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค.
- ๊ทธ๋ฌ๋ L4 Loadbalancer ๋ก ์ค์ ๋ ์๋น์ค๊ฐ ์๊ธฐ ๋๋ฌธ์ pod์ ์ง์ ๋ฟ๋ ๊ฒ์ด ์๋๋ผ L4 Loadbalancer ip๋ฅผ ๋ฐฑ์๋๋ก ์ฐธ์กฐํ๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ฉด health check ์์ฒญ์ ๋ฐ์์ ๋ pod๋ก ์ ๋ฌํ๊ธฐ ์ํด ์ถ๊ฐ ๋ ์ด์ด๊ฐ ์์ฑ๋๋ค.
- L4์ L7์ health check port ํน์ ๊ฒฝ๋ก๊ฐ ๋ค๋ฅด๊ฑฐ๋, L7์ด ์ฐธ์กฐ๋ฅผ ์๋ชปํด์ ์ค์ pod์ ๋ฆฌ์ค๋ ํฌํธ์ ๋ฟ์ง ๋ชปํ๋ฉด unhealthy ์ํ๊ฐ ๋ฆฌํด๋๋ค.
- ๊ทธ๋ฌ๋ฉด fault filter abort๋ฅผ ๋ฑ๋๋ค!!
- +) gke gateway api๋ gcp์ gateway controller์์ ์์ cluster ip์์ pod ip๋ฅผ ๋ฝ์์ ์ง์ L7์ ๋ถ์ด์ง ์์ผ๋ฉด ์ ํจํ์ง ์๋ค๊ณ ํ๋จํ๋ค.
b. An active proxy-only subnetwork is required in the same region and VPC as the forwarding rule.
์ด์ฏค์์ ์์ฌ๋๋ ๊ฑธ ๋ค ํ๋์ฉ ๋ฐ๊ฟ๋ณด๊ณ ์์๋๋ฐ, ์ด๋ gateway class๋ฅผ global์์ regional์ผ๋ก ๋ณ๊ฒฝํด๋ณด์๋ค(cluster๊ฐ regional์ด๋ ์ด์จ๋ ํน์๋ ํด์)
๊ทธ๋ฌ๋๋ ์๋ก์ด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค!

Gateway: Invalid : error cause: gceSync: generic::invalid_argument: Insert: Invalid value for field 'resource.target': 'regions/us-central1/targetHttpProxies/gkegw1-jst4-web-http-gateway-bqvswgdmrblp'. An active proxy-only subnetwork is required in the same region and VPC as the forwarding rule.
์๋ฌ๋ฉ์ธ์ง๋ ์๋ ๊ฒ ์๋ ๊ฒ๋ณด๋ค ๋ฐฑ ๋ฐฐ ๋ซ๋ค.
์ฝ์ด๋ณด๋ ๊ฐ์ region์ ํ๋ก์ ์ ์ฉ ์๋ธ๋ท์ด ์์ด์ผํ๋ค๊ณ ํ๋ค. ๊ทธ๋ฐ๋ฐ ๊ฐ์ Loadbalancer์ธ๋ฐ ์ L4 loadbalncer์์๋ ์์ด๋ ๋์๊น?
- L4๋ ํค๋ ๊ฒ์ฌ๋ฅผ ํ์ง ์๋๋ค. ๋ฐ๋ผ์ ํ๋ก์ ์๋ธ๋ท์ด ๋ฐ๋ก ํ์๊ฐ ์๋ค. ๋ฐ๋ก ๋ ธ๋ ip๋ก ์ง์ ์ ๋ฌ๋๊ธฐ ๋๋ฌธ์ด๋ค.
- ๋ฐ๋ฉด L7 gateway loadbalancer์ ๊ฒฝ์ฐ์๋ ํธ๋ํฝ์ ์ฒ๋ฆฌํ ํ๋ก์ ๋ฐฐ์น๊ณต๊ฐ์ด ๋ฐ๋์ ํ์ํ๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
์๋ธ๋ท ํ๋ก์๋ฅผ ๋ฑ๋กํ๋ค. ํ๋ก์ ๋ฑ๋ก ์ ์ ํ์ธํด์ผํ ๊ฒ์, ํ์ฌ cluster๊ฐ ์ํ vpc ๋คํธ์ํฌ ๋์ญ๊ณผ ๋ค๋ฅธ ๋์ญ์ ์ ํํด์ผํ๋ค๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ํ์ฌ network ๋์ญ์ ํ์ธํด๋ด์ผํ๋ค. ๋จผ์ vpc ๋คํธ์ํฌ ์ด๋ฆ์ ํ์ธํด๋ณด์.
gcloud container clusters describe <cluster-name> --region <region> --format="value(network)"
์ด๋ ๊ฒ ํ๋ฉด ๋คํธ์ํฌ ์ด๋ฆ๋ง ๋ฐ๋ผ ์ ์๋ค. ์ด์ ๋์ญ์ ํ์ธํด๋ณด์.
gcloud compute networks subnets list -- network <network-name>
์คํํ๋ฉด ํ์ฌ ํด๋ฌ์คํฐ vpc ๋คํธ์ํฌ ๋์ญ์ ์ ์ ์๋ค. ๋์ ๊ฒฝ์ฐ 10. ๋์๊ธฐ ๋๋ฌธ์, subnet ๋์ญ์ 192.168 ํน์ 172.16 ๋์ญ์ ์ ํํ๋ฉด ๋๋ค.
gcloud compute networks subnets create gke-proxy-subnet-<REGION>
\ --region=<REGION>
\ --network=<NETWORK_NAME>
\ --range=192.168.0.0/20
\ --purpose=REGIONAL_MANAGED_PROXY
\ --role=ACTIVE

์๋ธ๋ท ์์ฑ ํ์ ๋ค์ gateway์ httproute๋ฅผ ์ฌ๋ ค๋ณด์.

c. ๋ค์ Fault filter abort
์์ ๋ชจ๋ ๊ฒ์ ํ๋๋ฐ๋!!!!!!!!!!!! ๋ fault filter abort ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ๋ฐฉํ๋ฒฝ๋ถํฐ health check policy ์ฌํ์ธ, pod ํ์ธ ๋ฑ ์ค๋ง ๊ฒ์ ํด๋ณธ ๊ฒฐ๊ณผ, ์ด์ ์ ํด๊ฒฐ ๋ฐฉ์์ ์๋์ ๊ฐ์๋ค...
ํด๊ฒฐ ๋ฐฉ์
hostname์ ์ค์ ํ ๊ฒฝ์ฐ dns ์ ๊ณต ์ ์ฒด์์ ip address๋ฅผ ์ง์ ํด์ฃผ์ด์ผํ๋๋ฐ, ip address๊ฐ ํ๋ฆฐ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค. ์ด๊ฒ์ gateway loadbalancer์ ip๋ก ์ ์ํด๋ ๊ฐ์ ํ์์ด ๋ฐ์ํ๋ค. ์ด์ ๋ ์๋์ ๊ฐ๋ค.
- L7 ์๋น์ค๋ ๋ผ์ดํ ์ ์ํด HTTP/1.1 ํ๋กํ ์ฝ์ Host ํค๋์ ์์กดํ๋ค. ์ด๋ ์๋ฒ๊ฐ ํ๋์ IP ์ฃผ์๋ก ์ฌ๋ฌ ๋๋ฉ์ธ์ ํธ์คํ ํ ๋ ์ด๋ค ๋๋ฉ์ธ์ ์์ฒญํ๋์ง ๊ตฌ๋ถํ๋๋ก ํ๋ค.
- ๋ธ๋ผ์ฐ์ ๊ฐ IP๋ก ์ง์ ์ ์ํ๋ฉด host ํค๋์ ๋๋ฉ์ธ ๋์ ip ์ฃผ์๊ฐ ๋ค์ด๊ฐ๊ณ , gateway api์ hostname ๊ท์น์ด ์๋ค๋ฉด host ํค๋๊ฐ ip์ธ ๊ฒฝ์ฐ ๊ท์น์ ๋งค์นญ๋์ง ์์ ์ฒ๋ฆฌ ์คํจํ ์ ์๋ค.
- hostname์ ์ ๊ฑฐํ๋ฉด ์์ผ๋์นด๋(*) ์ฒ๋ฆฌ๋์ด ๊ท์น์ด ์ ์ฉ๋๋ค.
๋๋ฌธ์ hostname์ httpRoute์์ ์ ๊ฑฐํ ๋ค์๋ ์ ์์ ์ผ๋ก ํด๊ฒฐ๋๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค. ๋ง์ธ ์ฆ์จ, dns ์ ๊ณต์ ์ฒด ์ชฝ์์ ๋ฐ์ํ host์ ip ์ฃผ์๊ฐ ์ค์ ๋ก ๋ฐ์๋ ๋๊น์ง๋ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค๋ ๊ฒ์ด๋ค.
3. ๋ง๋ฌด๋ฆฌํ๋ฉฐ
3๊ฐ์ ํฌ์คํธ๋ฅผ ์์ฑํ๋ฉฐ ์น ์๋น์ค๋ฅผ gcloud gke๋ก ์ฌ๋ ค๋ณด๋ ์์ ์ ์งํํ๋ค. ์ฌ์ค ๋ณด์์ ์ธ ์ธก๋ฉด์ด๋ ๋คํธ์ํฌ์ ๊ดํ ์ง์์ด ์กฐ๊ธ ๋ถ์กฑํ ํธ์ด๋ผ ํด๋ผ์ฐ๋ ์๋น์ค ์์ ์ฌ๋ ค๋ณด๊ณ autopilot๊ณผ standard cluster๋ฅผ ์ฌ์ฉํด ๊ฐ๋จํ ์ด์ํด๋ณด๋ ์ ๋๋ก ํ์ผ๋, ์ด ๊ณผ์ ์์ kubernetes์ deployment, statefulset, persistant volume, service(load balancer, cluster ip), health check policy, configmap, secret, gateway api์ httproute, VPC ๋คํธ์ํฌ๊น์ง ์์คํ ์ ๋ฐ์์ ํ์๋กํ๋ ์์๋ฅผ ์ง์ ์ฌ์ฉํด๋ณด๊ณ ์ค๋ฅ๋ฅผ ๋ถ์ํด๋ณด๋ฉฐ ๊น์ด ์ดํดํ๊ณ ๋๋ฒ๊น ํด๋ณผ ์ ์๋ ์ข์ ๊ธฐํ๊ฐ ๋์๋ค.
์ถํ ๊ฐ์ธ ์น ํ์ด์ง ํ๋ก์ ํธ๋ฅผ ํ๋ค๋ฉด ํ ๋ฒ ๋ ์ฌ๋ ค๋ณผ ์๊ฐ์ด ์์ง๋ง... ์ด์๋น์ฉ์ด ์๋นํ ๋น์ธ์ ๊น์ํด๋ด์ผํ ๊ฒ ๊ฐ๋ค๐ฅฒ