์ด ๊ธฐ์ฌ์ ๋ชฉ์ ์ ๋
์์๊ฒ Kubernetes์ ๋คํธ์ํน ๋ฐ ๋คํธ์ํฌ ์ ์ฑ
๊ด๋ฆฌ์ ๊ธฐ๋ณธ ์ฌํญ๊ณผ ํ์ค ๊ธฐ๋ฅ์ ํ์ฅํ๋ ํ์ฌ Calico ํ๋ฌ๊ทธ์ธ์ ์๊ฐํ๋ ๊ฒ์
๋๋ค. ๊ทธ ๊ณผ์ ์์ ์ฐ๋ฆฌ์ ์ด์ ๊ฒฝํ์์ ์ป์ ์ค์ ์ฌ๋ก๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ์ ์ฉ์ด์ฑ๊ณผ ์ผ๋ถ ๊ธฐ๋ฅ์ ์์ฐํ ๊ฒ์
๋๋ค.
Kubernetes ๋คํธ์ํน ์ดํ๋ผ์ด์ธ์ค์ ๋ํ ๋น ๋ฅธ ์๊ฐ
Kubernetes ํด๋ฌ์คํฐ๋ ๋คํธ์ํฌ ์์ด๋ ์์ํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฏธ ๊ธฐ๋ณธ ์ฌํญ์ ๋ํ ์๋ฃ๋ฅผ ์ถํํ์ต๋๋ค. โ
์ด ๊ธฐ์ฌ์ ๋งฅ๋ฝ์์ K8s ์์ฒด๋ ์ปจํ
์ด๋์ ๋
ธ๋ ๊ฐ์ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ ๋ด๋นํ์ง ์๋๋ค๋ ์ ์ ์ ์ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. CNI ํ๋ฌ๊ทธ์ธ (์ปจํ
์ด๋ ๋คํธ์ํน ์ธํฐํ์ด์ค). ์ด ๊ฐ๋
์ ๋ํด ๋ ์์ธํ ์์๋ณด๋ ค๋ฉด
์๋ฅผ ๋ค์ด, ์ด๋ฌํ ํ๋ฌ๊ทธ์ธ ์ค ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ฒ์
๊ทธ๋ฆฌ๊ณ Kubernetes ํด๋ฌ์คํฐ์์ ๋คํธ์ํฌ ์ ์ฑ
๊ด๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํ "์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ" ๊ธฐ๋ฅ์ด ์ ๊ณต๋ฉ๋๋ค.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 172.17.0.0/16
except:
- 172.17.1.0/24
- namespaceSelector:
matchLabels:
project: myproject
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 6379
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978
์ด๊ฒ์ ๊ฐ์ฅ ์์์ ์ธ ์๊ฐ ์๋๋ค.
ํธ๋ํฝ์๋ Pod์ ๋ค์ด๊ฐ๋(Ingress) ๊ฒ๊ณผ Pod์์ ๋๊ฐ๋(Egress)์ ๋ ๊ฐ์ง ์ ํ์ด ์๋ค๋ ๊ฒ์ด ๋ ผ๋ฆฌ์ ์ ๋๋ค.
์ค์ ๋ก ์ ์น๋ ์์ง์ด๋ ๋ฐฉํฅ์ ๋ฐ๋ผ ์ด ๋ ๊ฐ์ง๋ก ๋๋์ด์ง๋ค.
๋ค์ ํ์ ์์ฑ์ ์ ํ์์ ๋๋ค. ๊ท์น์ด ์ ์ฉ๋๋ ์ฌ๋. ์ด๋ ํฌ๋(๋๋ ํฌ๋ ๊ทธ๋ฃน) ๋๋ ํ๊ฒฝ(์: ๋ค์์คํ์ด์ค)์ผ ์ ์์ต๋๋ค. ์ค์ํ ์ธ๋ถ ์ฌํญ: ์ด๋ฌํ ๊ฐ์ฒด์ ๋ ์ ํ ๋ชจ๋ ๋ ์ด๋ธ(์ํ Kubernetes ์ฉ์ด๋ก) - ์ ์น์ธ๋ค์ด ํจ๊ป ์ด์ํ๋ ๊ฒ์ ๋๋ค.
์ผ์ข ์ ๋ ์ด๋ธ๋ก ํตํฉ๋ ํ์ ๋ ์์ ์ ํ๊ธฐ ์ธ์๋ "๋ชจ๋ ํญ๋ชฉ/๋ชจ๋ ํ์ฉ/๊ฑฐ๋ถ"์ ๊ฐ์ ๊ท์น์ ๋ค์ํ ๋ณํ์ผ๋ก ์์ฑํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ฅผ ์ํด ๋ค์ ํ์์ ๊ตฌ์ฑ์ด ์ฌ์ฉ๋ฉ๋๋ค.
podSelector: {}
ingress: []
policyTypes:
- Ingress
โ ์ด ์์์๋ ํ๊ฒฝ์ ๋ชจ๋ ํฌ๋๊ฐ ์์ ํธ๋ํฝ์์ ์ฐจ๋จ๋ฉ๋๋ค. ๋ค์ ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ฉด ๋ฐ๋ ๋์์ ์ป์ ์ ์์ต๋๋ค.
podSelector: {}
ingress:
- {}
policyTypes:
- Ingress
๋๊ฐ๋ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
podSelector: {}
policyTypes:
- Egress
- ๋๋ ค๊ณ ์. ๊ทธ๋ฆฌ๊ณ ํฌํจํ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
podSelector: {}
egress:
- {}
policyTypes:
- Egress
ํด๋ฌ์คํฐ์ฉ CNI ํ๋ฌ๊ทธ์ธ ์ ํ์ผ๋ก ๋์๊ฐ์ ๋ค์ ์ฌํญ์ ์ฃผ๋ชฉํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ๋ชจ๋ ๋คํธ์ํฌ ํ๋ฌ๊ทธ์ธ์ด NetworkPolicy๋ฅผ ์ง์ํ๋ ๊ฒ์ ์๋๋๋ค.. ์๋ฅผ ๋ค์ด, ์ด๋ฏธ ์ธ๊ธํ Flannel์ ๋คํธ์ํฌ ์ ์ฑ
์ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฆ
๋๋ค.
Calico ์์๋ณด๊ธฐ : ์ด๋ก
Calico ํ๋ฌ๊ทธ์ธ์ Flannel(ํ์ ํ๋ก์ ํธ)๊ณผ ํตํฉํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
K8s "๋ฐ์คํ" ์๋ฃจ์ ๊ณผ Calico์ API ์ธํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ค ๊ธฐํ๊ฐ ์ ๊ณต๋ฉ๋๊น?
NetworkPolicy์ ๋ด์ฅ๋ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ ์น์ธ์ ํ๊ฒฝ์ ์ํด ์ ํ๋ฉ๋๋ค.
- ์ ์ฑ ์ ๋ผ๋ฒจ์ด ํ์๋ ํฌ๋์ ์ ์ฉ๋ฉ๋๋ค.
- ๊ท์น์ ํฌ๋, ํ๊ฒฝ ๋๋ ์๋ธ๋ท์ ์ ์ฉ๋ ์ ์์ต๋๋ค.
- ๊ท์น์๋ ํ๋กํ ์ฝ, ๋ช ๋ช ๋ ๋๋ ๊ธฐํธํ๋ ํฌํธ ์ฌ์์ด ํฌํจ๋ ์ ์์ต๋๋ค.
Calico๊ฐ ์ด๋ฌํ ๊ธฐ๋ฅ์ ํ์ฅํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ ์ฑ ์ ํฌ๋, ์ปจํ ์ด๋, ๊ฐ์ ๋จธ์ ๋๋ ์ธํฐํ์ด์ค ๋ฑ ๋ชจ๋ ๊ฐ์ฒด์ ์ ์ฉ๋ ์ ์์ต๋๋ค.
- ๊ท์น์๋ ํน์ ์์ (๊ธ์ง, ํ๊ฐ, ๊ธฐ๋ก)์ด ํฌํจ๋ ์ ์์ต๋๋ค.
- ๊ท์น์ ๋์ ๋๋ ์์ค๋ ํฌํธ, ํฌํธ ๋ฒ์, ํ๋กํ ์ฝ, HTTP ๋๋ ICMP ํน์ฑ, IP ๋๋ ์๋ธ๋ท(4์ธ๋ ๋๋ 6์ธ๋), ์ ํ๊ธฐ(๋ ธ๋, ํธ์คํธ, ํ๊ฒฝ)์ผ ์ ์์ต๋๋ค.
- ๋ํ DNAT ์ค์ ๋ฐ ํธ๋ํฝ ์ ๋ฌ ์ ์ฑ ์ ์ฌ์ฉํ์ฌ ํธ๋ํฝ ํต๊ณผ๋ฅผ ๊ท์ ํ ์ ์์ต๋๋ค.
Calico ์ ์ฅ์์ GitHub์ ๋ํ ์ฒซ ๋ฒ์งธ ์ปค๋ฐ์ 2016๋
XNUMX์๋ก ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ฉฐ, XNUMX๋
ํ ํ๋ก์ ํธ๋ Kubernetes ๋คํธ์ํฌ ์ฐ๊ฒฐ ๊ตฌ์ฑ์์ ์ ๋์ ์ธ ์์น๋ฅผ ์ฐจ์งํ์ต๋๋ค. ์ด๋ ์๋ฅผ ๋ค์ด ์ค๋ฌธ ์กฐ์ฌ ๊ฒฐ๊ณผ๋ก ์
์ฆ๋ฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ K8์ ์ฌ์ฉํ๋ ๋ง์ ๋๊ท๋ชจ ๊ด๋ฆฌํ ์๋ฃจ์
์ฑ๋ฅ์ ์ฌ๊ธฐ์์ ๋ชจ๋ ๊ฒ์ด ํ๋ฅญํฉ๋๋ค. ์ ํ ํ
์คํธ์์ Calico ๊ฐ๋ฐ ํ์ ์ด๋น 50000๊ฐ์ ์ปจํ
์ด๋ ์์ฑ ์๋๋ก 500๊ฐ์ ๋ฌผ๋ฆฌ์ ๋
ธ๋์์ 20๊ฐ ์ด์์ ์ปจํ
์ด๋๋ฅผ ์คํํ์ฌ ์ฒ๋ฌธํ์ ์ธ ์ฑ๋ฅ์ ๋ณด์ฌ์ฃผ์์ต๋๋ค. ์ค์ผ์ผ๋ง์๋ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ํ์ธ๋์ง ์์์ต๋๋ค. ๊ทธ๋ฌํ ๊ฒฐ๊ณผ
์ด ํ๋ก์ ํธ๋ ๋งค์ฐ ๋น ๋ฅด๊ฒ ๊ฐ๋ฐ๋๊ณ ์์ผ๋ฉฐ K8s, OpenShift, OpenStack ๊ด๋ฆฌ๋๋ ์ธ๊ธฐ ์๋ฃจ์
์์์ ์์
์ ์ง์ํ๋ฉฐ ๋ค์์ ์ฌ์ฉํ์ฌ ํด๋ฌ์คํฐ๋ฅผ ๋ฐฐํฌํ ๋ Calico๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์นผ๋ฆฌ์ฝ๋ก ์ฐ์ตํ๊ธฐ
๋ฐ๋๋ผ ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ฌ์ฉํ๋ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ CNI๋ฅผ ์ค์นํ๋ฉด ํ์ผ์ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. calico.yaml
, kubectl apply -f
.
์ผ๋ฐ์ ์ผ๋ก ํ๋ฌ๊ทธ์ธ์ ํ์ฌ ๋ฒ์ ์ Kubernetes์ ์ต์ 2~3๊ฐ ๋ฒ์ ๊ณผ ํธํ๋ฉ๋๋ค. ์ด์ ๋ฒ์ ์์์ ์๋์ ํ ์คํธ๋์ง ์์ผ๋ฉฐ ๋ณด์ฅ๋์ง ์์ต๋๋ค. ๊ฐ๋ฐ์์ ๋ฐ๋ฅด๋ฉด Calico๋ iptables ๋๋ IPVS ์์ CentOS 3.10, Ubuntu 7 ๋๋ Debian 16์ ์คํํ๋ 8 ์ด์์ Linux ์ปค๋์์ ์คํ๋ฉ๋๋ค.
ํ๊ฒฝ ๋ด ๊ฒฉ๋ฆฌ
์ผ๋ฐ์ ์ธ ์ดํด๋ฅผ ์ํด Calico ํ๊ธฐ๋ฒ์ ๋คํธ์ํฌ ์ ์ฑ ์ด ํ์ค ํ๊ธฐ๋ฒ๊ณผ ์ด๋ป๊ฒ ๋ค๋ฅธ์ง, ๊ท์น ์์ฑ ์ ๊ทผ ๋ฐฉ์์ด ์ด๋ป๊ฒ ๊ฐ๋ ์ฑ๊ณผ ๊ตฌ์ฑ ์ ์ฐ์ฑ์ ๋จ์ํํ๋์ง ์ดํดํ๊ธฐ ์ํ ๊ฐ๋จํ ์ฌ๋ก๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ํด๋ฌ์คํฐ์๋ Node.js์ PHP๋ผ๋ 2๊ฐ์ ์น ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ฐฐํฌ๋์ด ์์ผ๋ฉฐ ๊ทธ ์ค ํ๋๋ Redis๋ฅผ ์ฌ์ฉํฉ๋๋ค. Node.js์์ ์ฐ๊ฒฐ์ ์ ์งํ๋ฉด์ PHP์์ Redis์ ๋ํ ์ก์ธ์ค๋ฅผ ์ฐจ๋จํ๋ ค๋ฉด ๋ค์ ์ ์ฑ
์ ์ ์ฉํ๋ฉด ๋ฉ๋๋ค.
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-redis-nodejs
spec:
podSelector:
matchLabels:
service: redis
ingress:
- from:
- podSelector:
matchLabels:
service: nodejs
ports:
- protocol: TCP
port: 6379
๊ธฐ๋ณธ์ ์ผ๋ก ์ฐ๋ฆฌ๋ Node.js์์ Redis ํฌํธ๋ก ๋ค์ด์ค๋ ํธ๋ํฝ์ ํ์ฉํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ ๋ถ๋ช ํ ๋ค๋ฅธ ์ด๋ค ๊ฒ๋ ๊ธ์งํ์ง ์์์ต๋๋ค. NetworkPolicy๊ฐ ๋ํ๋๋ฉด ๋ณ๋๋ก ์ง์ ํ์ง ์๋ ํ ์ฌ๊ธฐ์ ์ธ๊ธ๋ ๋ชจ๋ ์ ํ๊ธฐ๊ฐ ๊ฒฉ๋ฆฌ๋๊ธฐ ์์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ํ๊ธฐ์์ ๋ค๋ฃจ์ง ์๋ ๋ค๋ฅธ ๊ฐ์ฒด์๋ ๊ฒฉ๋ฆฌ ๊ท์น์ด ์ ์ฉ๋์ง ์์ต๋๋ค.
์์ ์์๋ apiVersion
Kubernetes๋ ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ์ง๋ง ์ฌ์ฉ์ ๋ฐฉํดํ๋ ๊ฒ์ ์์ต๋๋ค.
apiVersion: crd.projectcalico.org/v1
kind: NetworkPolicy
metadata:
name: allow-redis-nodejs
spec:
selector: service == 'redis'
ingress:
- action: Allow
protocol: TCP
source:
selector: service == 'nodejs'
destination:
ports:
- 6379
์์์ ์ธ๊ธํ ์ผ๋ฐ NetworkPolicy API๋ฅผ ํตํ ๋ชจ๋ ํธ๋ํฝ์ ํ์ฉํ๊ฑฐ๋ ๊ฑฐ๋ถํ๊ธฐ ์ํ ๊ตฌ์ฑ์๋ ์ดํดํ๊ณ ๊ธฐ์ตํ๊ธฐ ์ด๋ ค์ด ๊ดํธ๊ฐ ํฌํจ๋ ๊ตฌ์ฑ์ด ํฌํจ๋์ด ์์ต๋๋ค. Calico์ ๊ฒฝ์ฐ ๋ฐฉํ๋ฒฝ ๊ท์น์ ๋
ผ๋ฆฌ๋ฅผ ๋ฐ๋๋ก ๋ณ๊ฒฝํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํ๋ฉด ๋ฉ๋๋ค. action: Allow
์ action: Deny
.
ํ๊ฒฝ๋ณ ๊ฒฉ๋ฆฌ
์ด์ ์ ํ๋ฆฌ์ผ์ด์ ์ด Prometheus์์ ์์งํ๊ณ Grafana๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๊ฐ ๋ถ์์ ์ํ ๋น์ฆ๋์ค ์ธก์ ํญ๋ชฉ์ ์์ฑํ๋ ์ํฉ์ ์์ํด ๋ณด์ธ์. ์ ๋ก๋์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ณต๊ฐ์ ์ผ๋ก ๋ค์ ๋ณผ ์ ์๋ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค. ์ด ๋ฐ์ดํฐ๋ฅผ ์ฟ๋ณด๋ ๋์ผ๋ก๋ถํฐ ์จ๊ธฐ์:
Prometheus๋ ์ผ๋ฐ์ ์ผ๋ก ๋ณ๋์ ์๋น์ค ํ๊ฒฝ์ ๋ฐฐ์น๋ฉ๋๋ค. ์์์๋ ๋ค์๊ณผ ๊ฐ์ ๋ค์์คํ์ด์ค๊ฐ ๋ฉ๋๋ค.
apiVersion: v1
kind: Namespace
metadata:
labels:
module: prometheus
name: kube-prometheus
๋ถ์ผ metadata.labels
์ด๊ฒ์ ์ฐ์ฐ์ด ์๋ ๊ฒ์ผ๋ก ํ๋ช
๋์์ต๋๋ค. ์์ ํ ๋ฐ์ ๊ฐ์ด, namespaceSelector
(๊ฒ๋ค๊ฐ podSelector
) ๋ ์ด๋ธ๊ณผ ํจ๊ป ์๋ํฉ๋๋ค. ๋ฐ๋ผ์ ํน์ ํฌํธ์ ๋ชจ๋ Pod์์ ๋ฉํธ๋ฆญ์ ๊ฐ์ ธ์ค๋ ค๋ฉด ์ผ์ข
์ ๋ ์ด๋ธ์ ์ถ๊ฐํ๊ฑฐ๋ ๊ธฐ์กด ๋ ์ด๋ธ์์ ๊ฐ์ ธ์์ผ ํ๋ฉฐ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์ฑ์ ์ ์ฉํด์ผ ํฉ๋๋ค.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-metrics-prom
spec:
podSelector: {}
ingress:
- from:
- namespaceSelector:
matchLabels:
module: prometheus
ports:
- protocol: TCP
port: 9100
Calico ์ ์ฑ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ตฌ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
apiVersion: crd.projectcalico.org/v1
kind: NetworkPolicy
metadata:
name: allow-metrics-prom
spec:
ingress:
- action: Allow
protocol: TCP
source:
namespaceSelector: module == 'prometheus'
destination:
ports:
- 9100
์ผ๋ฐ์ ์ผ๋ก ํน์ ์๊ตฌ ์ฌํญ์ ๋ง๊ฒ ์ด๋ฌํ ์ข ๋ฅ์ ์ ์ฑ ์ ์ถ๊ฐํ๋ฉด ํด๋ฌ์คํฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์๋์ ๋ํ ์ ์์ ์ด๊ฑฐ๋ ์ฐ๋ฐ์ ์ธ ๊ฐ์ญ์ผ๋ก๋ถํฐ ๋ณดํธํ ์ ์์ต๋๋ค.
Calico์ ์ ์์์ ๋ฐ๋ฅด๋ฉด ๋ชจ๋ฒ ์ฌ๋ก๋ "๋ชจ๋ ๊ฒ์ ์ฐจ๋จํ๊ณ ํ์ํ ๊ฒ์ ๋ช
์์ ์ผ๋ก ์ฌ๋" ์ ๊ทผ ๋ฐฉ์์
๋๋ค.
์ถ๊ฐ Calico ๊ฐ์ฒด ์ฌ์ฉ
ํ์ฅ๋ Calico API ์ธํธ๋ฅผ ํตํด ํฌ๋์ ๊ตญํ๋์ง ์๊ณ ๋
ธ๋์ ๊ฐ์ฉ์ฑ์ ๊ท์ ํ ์ ์๋ค๋ ์ ์ ์๊ธฐ์์ผ ๋๋ฆฌ๊ฒ ์ต๋๋ค. ๋ค์ ์์ ์์๋ GlobalNetworkPolicy
ํด๋ฌ์คํฐ์์ ICMP ์์ฒญ์ ์ ๋ฌํ๋ ๊ธฐ๋ฅ์ด ๋ซํ๋๋ค(์: ํฌ๋์์ ๋
ธ๋๋ก, ํฌ๋ ๊ฐ ๋๋ ๋
ธ๋์์ IP ํฌ๋๋ก ping).
apiVersion: crd.projectcalico.org/v1
kind: GlobalNetworkPolicy
metadata:
name: block-icmp
spec:
order: 200
selector: all()
types:
- Ingress
- Egress
ingress:
- action: Deny
protocol: ICMP
egress:
- action: Deny
protocol: ICMP
์์ ๊ฒฝ์ฐ์๋ ํด๋ฌ์คํฐ ๋
ธ๋๊ฐ ICMP๋ฅผ ํตํด ์๋ก โ์ ๊ทผโํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐ๋ฉ๋๋ค. GlobalNetworkPolicy
, ์ํฐํฐ์ ์ ์ฉ๋จ HostEndpoint
:
apiVersion: crd.projectcalico.org/v1
kind: GlobalNetworkPolicy
metadata:
name: deny-icmp-kube-02
spec:
selector: "role == 'k8s-node'"
order: 0
ingress:
- action: Allow
protocol: ICMP
egress:
- action: Allow
protocol: ICMP
---
apiVersion: crd.projectcalico.org/v1
kind: HostEndpoint
metadata:
name: kube-02-eth0
labels:
role: k8s-node
spec:
interfaceName: eth0
node: kube-02
expectedIPs: ["192.168.2.2"]
VPN ์ฌ๋ก
๋ง์ง๋ง์ผ๋ก, ํ์ค ์ ์ฑ ์ธํธ๋ก๋ ์ถฉ๋ถํ์ง ์์ ํด๋ฌ์คํฐ ๊ทผ์ฒ ์ํธ ์์ฉ์ ๊ฒฝ์ฐ Calico ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๋งค์ฐ ์ค์ ์ ์ธ ์๋ฅผ ์ ์ํ๊ฒ ์ต๋๋ค. ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ก์ธ์คํ๊ธฐ ์ํด ํด๋ผ์ด์ธํธ๋ VPN ํฐ๋์ ์ฌ์ฉํ๋ฉฐ, ์ด ์ก์ธ์ค๋ ์๊ฒฉํ๊ฒ ์ ์ด๋๋ฉฐ ์ฌ์ฉ์ด ํ์ฉ๋ ํน์ ์๋น์ค ๋ชฉ๋ก์ผ๋ก ์ ํ๋ฉ๋๋ค.
ํด๋ผ์ด์ธํธ๋ ํ์ค UDP ํฌํธ 1194๋ฅผ ํตํด VPN์ ์ฐ๊ฒฐํ๊ณ , ์ฐ๊ฒฐ๋๋ฉด ํฌ๋ ๋ฐ ์๋น์ค์ ํด๋ฌ์คํฐ ์๋ธ๋ท์ ๋ํ ๊ฒฝ๋ก๋ฅผ ์์ ํฉ๋๋ค. ๋ค์ ์์ ๋ฐ ์ฃผ์ ๋ณ๊ฒฝ ์ค์ ์๋น์ค๊ฐ ์์ค๋์ง ์๋๋ก ์ ์ฒด ์๋ธ๋ท์ด ํธ์๋ฉ๋๋ค.
๊ตฌ์ฑ์ ํฌํธ๋ ํ์ค์ด๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๊ณ ์ด๋ฅผ Kubernetes ํด๋ฌ์คํฐ๋ก ์ ์กํ๋ ํ๋ก์ธ์ค์ ์ฝ๊ฐ์ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, UDP์ฉ AWS LoadBalancer๋ ์๋ ๋ง ๋ง ๊ทธ๋๋ก ์ ํ๋ ์ง์ญ ๋ชฉ๋ก์ ๋ํ๋ฌ์ผ๋ฉฐ NodePort๋ ๋ชจ๋ ํด๋ฌ์คํฐ ๋ ธ๋์์์ ์ ๋ฌ๋ก ์ธํด ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์๋ฒ ์ธ์คํด์ค ์๋ฅผ ํ์ฅํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๋ด๊ฒฐํจ์ฑ ๋ชฉ์ . ๋ํ ๊ธฐ๋ณธ ํฌํธ ๋ฒ์๋ฅผ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค...
๊ฐ๋ฅํ ์๋ฃจ์ ์ ๊ฒ์ํ ๊ฒฐ๊ณผ ๋ค์์ด ์ ํ๋์์ต๋๋ค.
- VPN์ด ํฌํจ๋ ํฌ๋๋ ๋
ธ๋๋ณ๋ก ์์ฝ๋ฉ๋๋ค.
hostNetwork
, ์ฆ ์ค์ IP์ ์ฐ๊ฒฐ๋ฉ๋๋ค. - ์๋น์ค๋ ๋ค์์ ํตํด ์ธ๋ถ์ ๊ฒ์๋ฉ๋๋ค.
ClusterIP
. ํฌํธ๋ ๋ ธ๋์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ค์น๋์ด ์์ผ๋ฉฐ, ์ฝ๊ฐ์ ์์ฝ(์ค์ IP ์ฃผ์์ ์กฐ๊ฑด๋ถ ์กด์ฌ)์ ํตํด ์ธ๋ถ์์ ์ก์ธ์คํ ์ ์์ต๋๋ค. - ํฌ๋๊ฐ ์์นํ ๋ ธ๋๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ์ ์ฐ๋ฆฌ ์ด์ผ๊ธฐ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฉ๋๋ค. ์์๋ ฅ์ด ์ถฉ๋ถํ๋ค๋ฉด ๋๊ตฌ๋ ์๋น์ค๋ฅผ ๋ ธ๋์ ๋จ๋จํ "๊ณ ์ "ํ๊ฑฐ๋ VPN ์๋น์ค์ ํ์ฌ IP ์ฃผ์๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ ํด๋ผ์ด์ธํธ์ ๋ฑ๋ก๋ DNS ๋ ์ฝ๋๋ฅผ ํธ์งํ๋ ์์ ์ฌ์ด๋์นด ์๋น์ค๋ฅผ ์์ฑํ ์ ์๋ค๊ณ ๋ง์๋๋ฆฌ๊ฒ ์ต๋๋ค.
๋ผ์ฐํ ๊ด์ ์์ VPN ์๋ฒ๊ฐ ๋ฐ๊ธํ IP ์ฃผ์๋ก VPN ํด๋ผ์ด์ธํธ๋ฅผ ๊ณ ์ ํ๊ฒ ์๋ณํ ์ ์์ต๋๋ค. ๋ค์์ ์์์ ์ธ๊ธํ Redis์ ์ค๋ช ๋ ์๋น์ค์ ๋ํ ํด๋ผ์ด์ธํธ์ ์ก์ธ์ค๋ฅผ ์ ํํ๋ ๊ธฐ๋ณธ ์์ ๋๋ค.
apiVersion: crd.projectcalico.org/v1
kind: HostEndpoint
metadata:
name: vpnclient-eth0
labels:
role: vpnclient
environment: production
spec:
interfaceName: "*"
node: kube-02
expectedIPs: ["172.176.176.2"]
---
apiVersion: crd.projectcalico.org/v1
kind: GlobalNetworkPolicy
metadata:
name: vpn-rules
spec:
selector: "role == 'vpnclient'"
order: 0
applyOnForward: true
preDNAT: true
ingress:
- action: Deny
protocol: TCP
destination:
ports: [6379]
- action: Allow
protocol: UDP
destination:
ports: [53, 67]
์ฌ๊ธฐ์์๋ ํฌํธ 6379์ ์ฐ๊ฒฐํ๋ ๊ฒ์ด ์๊ฒฉํ ๊ธ์ง๋์ด ์์ง๋ง ๋์์ DNS ์๋น์ค์ ์๋์ ์ ์ง๋๋ฉฐ ๊ท์น์ ์์ฑํ ๋ ๊ธฐ๋ฅ์ด ์ ํ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์์ ์ธ๊ธํ๋ฏ์ด ์ ํ๊ธฐ๊ฐ ๋ํ๋๋ฉด ๋ณ๋๋ก ์ง์ ํ์ง ์๋ ํ ๊ธฐ๋ณธ ๊ฑฐ๋ถ ์ ์ฑ ์ด ์ ์ฉ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ฒฐ๊ณผ
๋ฐ๋ผ์ Calico์ ๊ณ ๊ธ API๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋ฌ์คํฐ ๋ด๋ถ ๋ฐ ์ฃผ๋ณ์ ๋ผ์ฐํ ์ ์ ์ฐํ๊ฒ ๊ตฌ์ฑํ๊ณ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด ๋๊ตฌ์ ์ฌ์ฉ์ ๋ํฌ๋ก ์ฐธ์๋ฅผ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ผ๋ฉฐ BGP ๋ฐ IP-IP ํฐ๋์ ์ฌ์ฉํ์ฌ L3 ๋คํธ์ํฌ๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ํ๋ซ ๋คํธ์ํฌ์ ๊ฐ๋จํ Kubernetes ์ค์น์์ ๊ดด๋ฌผ์ฒ๋ผ ๋ณด์ ๋๋ค... ๊ทธ๋ฌ๋ ๊ทธ๋ ์ง ์์ผ๋ฉด ๋๊ตฌ๊ฐ ์๋นํ ์คํ ๊ฐ๋ฅํ๊ณ ์ ์ฉํด ๋ณด์ ๋๋ค. .
๋ณด์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๊ธฐ ์ํด ํด๋ฌ์คํฐ๋ฅผ ๊ฒฉ๋ฆฌํ๋ ๊ฒ์ด ํญ์ ๊ฐ๋ฅํ ๊ฒ์ ์๋๋ฉฐ Calico(๋๋ ์ ์ฌํ ์๋ฃจ์ )๊ฐ ๊ตฌ์ถ๋๋ ๊ณณ์ ๋๋ค. ์ด ๋ฌธ์์ ์ ๊ณต๋ ์์ (์ฌ์ํ ์์ ํฌํจ)๋ AWS์ ์ฌ๋ฌ ํด๋ผ์ด์ธํธ ์ค์น์ ์ฌ์ฉ๋ฉ๋๋ค.
PS
๋ธ๋ก๊ทธ์์๋ ์ฝ์ด๋ณด์ธ์.
- ยซ
๋ณด์ ์ ๋ฌธ๊ฐ๋ฅผ ์ํ Kubernetes ๋คํธ์ํฌ ์ ์ฑ ์๊ฐ "; - "Kubernetes์ ๋คํธ์ํน์ ๋ํ ๊ทธ๋ฆผ ๊ฐ์ด๋":
ํํธ 1 ๋ฐ 2(๋คํธ์ํฌ ๋ชจ๋ธ, ์ค๋ฒ๋ ์ด ๋คํธ์ํฌ) ,3๋ถ(์๋น์ค ๋ฐ ํธ๋ํฝ ์ฒ๋ฆฌ) ; - ยซ
CNI(์ปจํ ์ด๋ ๋คํธ์ํน ์ธํฐํ์ด์ค) - Linux ์ปจํ ์ด๋์ฉ ๋คํธ์ํฌ ์ธํฐํ์ด์ค ๋ฐ ํ์ค ".
์ถ์ฒ : habr.com