๋ฉ๋ชจ. ๋ฒ์ญ: ๊ธฐ์ฌ์ ์ ์์ธ Reuven Harrison์ ์ํํธ์จ์ด ๊ฐ๋ฐ ๋ถ์ผ์์ 20๋
์ด์์ ๊ฒฝ๋ ฅ์ ๊ฐ๊ณ ์์ผ๋ฉฐ, ํ์ฌ๋ ๋ณด์ ์ ์ฑ
๊ด๋ฆฌ ์๋ฃจ์
์ ๋ง๋๋ ํ์ฌ์ธ Tufin์ CTO์ด์ ๊ณต๋ ์ฐฝ์
์์
๋๋ค. ๊ทธ๋ Kubernetes ๋คํธ์ํฌ ์ ์ฑ
์ ํด๋ฌ์คํฐ์ ๋คํธ์ํฌ ๋ถํ ์ ์ํ ์๋นํ ๊ฐ๋ ฅํ ๋๊ตฌ๋ก ๋ณด๊ณ ์์ง๋ง ์ค์ ๋ก ๊ตฌํํ๊ธฐ๊ฐ ์ฝ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด ์๋ฃ(์๋นํ ๋ฐฉ๋ํจ)๋ ์ ๋ฌธ๊ฐ์ ์ด ๋ฌธ์ ์ ๋ํ ์ธ์์ ๋์ด๊ณ ํ์ํ ๊ตฌ์ฑ์ ๋ง๋๋ ๋ฐ ๋์์ ์ฃผ๊ธฐ ์ํด ์์ฑ๋์์ต๋๋ค.
์ค๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ์ํด Kubernetes๋ฅผ ์ ํํ๋ ๊ธฐ์ ์ด ์ ์ ๋์ด๋๊ณ ์์ต๋๋ค. ์ด ์ํํธ์จ์ด์ ๋ํ ๊ด์ฌ์ด ๋๋ฌด ๋์์ ์ผ๋ถ์์๋ Kubernetes๋ฅผ "๋ฐ์ดํฐ ์ผํฐ๋ฅผ ์ํ ์๋ก์ด ์ด์ ์ฒด์ "๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ์ ์ฐจ์ ์ผ๋ก Kubernetes(๋๋ k8s)๋ ๋คํธ์ํฌ ๋ณด์์ ํฌํจํ์ฌ ์ฑ์ํ ๋น์ฆ๋์ค ํ๋ก์ธ์ค์ ๊ตฌ์ฑ์ด ํ์ํ ๋น์ฆ๋์ค์ ์ค์ํ ๋ถ๋ถ์ผ๋ก ์ธ์๋๊ธฐ ์์ํ์ต๋๋ค.
Kubernetes ์์ ์ ์ด๋ฆฌ๋ฅ์ ํดํ๋ ๋ณด์ ์ ๋ฌธ๊ฐ์๊ฒ ์ง์ง ๊นจ๋ฌ์์ ํ๋ซํผ์ ๊ธฐ๋ณธ ์ ์ฑ ์ธ ๋ชจ๋ ๊ฒ์ ํ์ฉํ๋ ๊ฒ์ผ ์ ์์ต๋๋ค.
์ด ๊ฐ์ด๋๋ ๋คํธ์ํฌ ์ ์ฑ ์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ผ๋ฐ ๋ฐฉํ๋ฒฝ ๊ท์น๊ณผ ์ด๋ป๊ฒ ๋ค๋ฅธ์ง ์ดํดํฉ๋๋ค. ๋ํ ๋ช ๊ฐ์ง ํจ์ ์ ๋ค๋ฃจ๊ณ Kubernetes์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณดํธํ๋ ๋ฐ ๋์์ด ๋๋ ๊ถ์ฅ ์ฌํญ์ ์ ๊ณตํฉ๋๋ค.
Kubernetes ๋คํธ์ํฌ ์ ์ฑ
Kubernetes ๋คํธ์ํฌ ์ ์ฑ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๋ฉด ๋คํธ์ํฌ ๊ณ์ธต(OSI ๋ชจ๋ธ์ ์ธ ๋ฒ์งธ ๊ณ์ธต)์์ ํ๋ซํผ์ ๋ฐฐํฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํธ ์์ฉ์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ๋คํธ์ํฌ ์ ์ฑ ์๋ OSI ๋ ์ด์ด 7 ์ํ ๋ฐ ์ํ ํ์ง์ ๊ฐ์ ์ต์ ๋ฐฉํ๋ฒฝ์ ์ผ๋ถ ๊ณ ๊ธ ๊ธฐ๋ฅ์ด ๋ถ์กฑํ์ง๋ง ์ข์ ์ถ๋ฐ์ ์ด ๋๋ ๊ธฐ๋ณธ ์์ค์ ๋คํธ์ํฌ ๋ณด์์ ์ ๊ณตํฉ๋๋ค.
๋คํธ์ํฌ ์ ์ฑ ์ ํฌ๋ ๊ฐ์ ํต์ ์ ์ ์ดํฉ๋๋ค.
Kubernetes์ ์ํฌ๋ก๋๋ ํจ๊ป ๋ฐฐํฌ๋ ํ๋ ์ด์์ ์ปจํ ์ด๋๋ก ๊ตฌ์ฑ๋ ํฌ๋์ ๋ถ์ฐ๋ฉ๋๋ค. Kubernetes๋ ๊ฐ Pod์ ๋ค๋ฅธ Pod์์ ์ก์ธ์คํ ์ ์๋ IP ์ฃผ์๋ฅผ ํ ๋นํฉ๋๋ค. Kubernetes ๋คํธ์ํฌ ์ ์ฑ ์ ํด๋ผ์ฐ๋์ ๋ณด์ ๊ทธ๋ฃน์ด ๊ฐ์ ๋จธ์ ์ธ์คํด์ค์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ์ดํ๋ โโ๋ฐ ์ฌ์ฉ๋๋ ๊ฒ๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ํฌ๋ ๊ทธ๋ฃน์ ๋ํ ์ก์ธ์ค ๊ถํ์ ์ค์ ํฉ๋๋ค.
๋คํธ์ํฌ ์ ์ฑ ์ ์
๋ค๋ฅธ Kubernetes ๋ฆฌ์์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋คํธ์ํฌ ์ ์ฑ
์ YAML์ ์ง์ ๋ฉ๋๋ค. ์๋ ์์์๋ ์ ํ๋ฆฌ์ผ์ด์
์ด balance
์ก์ธ์ค postgres
:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default.postgres
namespace: default
spec:
podSelector:
matchLabels:
app: postgres
ingress:
- from:
- podSelector:
matchLabels:
app: balance
policyTypes:
- Ingress
(๋ฉ๋ชจ. ๋ฒ์ญ: ์ด ์คํฌ๋ฆฐ์ท์ ์ดํ์ ๋ชจ๋ ์ ์ฌํ ์คํฌ๋ฆฐ์ท๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ธฐ๋ณธ Kubernetes ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์๋ณธ ๊ธฐ์ฌ ์์ฑ์์ ํ์ฌ์์ ๊ฐ๋ฐํ์ผ๋ฉฐ ์๋ฃ ๋์ ์ธ๊ธ๋ Tufin Orca ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋์์ต๋๋ค.)
์์ฒด ๋คํธ์ํฌ ์ ์ฑ ์ ์ ์ํ๋ ค๋ฉด YAML์ ๋ํ ๊ธฐ๋ณธ ์ง์์ด ํ์ํฉ๋๋ค. ์ด ์ธ์ด๋ ๋ค์ฌ์ฐ๊ธฐ(ํญ์ด ์๋ ๊ณต๋ฐฑ์ผ๋ก ์ง์ )๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ๋ค์ฌ์ฐ๊ธฐ๋ ์์๋ ๊ทธ ์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ค์ฌ์ฐ๊ธฐ๋ ์์์ ์ํฉ๋๋ค. ์ ๋ชฉ๋ก ์์๋ ํ์ดํ์ผ๋ก ์์ํ๊ณ ๋ค๋ฅธ ๋ชจ๋ ์์๋ ๋ค์ ํ์์ ๊ฐ์ต๋๋ค. ํต์ฌ ๊ฐ์น.
YAML์์ ์ ์ฑ
์ ์ค๋ช
ํ ํ ๋ค์์ ์ฌ์ฉํฉ๋๋ค.
kubectl create -f policy.yaml
๋คํธ์ํฌ ์ ์ฑ ์ฌ์
Kubernetes ๋คํธ์ํฌ ์ ์ฑ ์ฌ์์๋ ๋ค์ ๋ค ๊ฐ์ง ์์๊ฐ ํฌํจ๋ฉ๋๋ค.
-
podSelector
: ์ด ์ ์ฑ (๋์)์ ์ํฅ์ ๋ฐ๋ ํฌ๋๋ฅผ ์ ์ํฉ๋๋ค. - ํ์์ ๋๋ค. -
policyTypes
: ์ฌ๊ธฐ์ ํฌํจ๋ ์ ์ฑ ์ ํ์ ๋ํ๋ ๋๋ค. ์์ ๋ฐ/๋๋ ์ก์ - ์ ํ ์ฌํญ์ด์ง๋ง ๋ชจ๋ ๊ฒฝ์ฐ์ ๋ช ์์ ์ผ๋ก ์ง์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. -
ingress
: ํ์ฉ ์ ์ ๋ค์ด์ค๋ ๋์ ํฌ๋์ ๋ํ ํธ๋ํฝ - ์ ํ ์ฌํญ์ ๋๋ค. -
egress
: ํ์ฉ ์ ์ ๋๊ฐ๋ ๋์ Pod์ ํธ๋ํฝ์ ์ ํ ์ฌํญ์ ๋๋ค.
Kubernetes ์น์ฌ์ดํธ์์ ๊ฐ์ ธ์จ ์(์ ๋ role
์ app
)๋ ๋ค ๊ฐ์ง ์์๊ฐ ๋ชจ๋ ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector: # <<<
matchLabels:
app: 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
XNUMX๊ฐ์ง ์์๋ฅผ ๋ชจ๋ ํฌํจํ ํ์๋ ์์ต๋๋ค. ํ์์ผ ๋ฟ์
๋๋ค podSelector
, ์ํ๋ ๋๋ก ๋ค๋ฅธ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋ตํ๋ ๊ฒฝ์ฐ policyTypes
, ์ ์ฑ
์ ๋ค์๊ณผ ๊ฐ์ด ํด์๋ฉ๋๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ์์ ์ธก์ ์ ์ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ ์ฑ ์ ์ด๋ฅผ ๋ช ์์ ์ผ๋ก ๋ช ์ํ์ง ์์ผ๋ฉด ์์คํ ์ ๋ชจ๋ ํธ๋ํฝ์ด ๊ธ์ง๋ ๊ฒ์ผ๋ก ๊ฐ์ ํฉ๋๋ค.
- ์ก์ ์ธก์ ๋์์ ํด๋น ์ก์ ๋งค๊ฐ๋ณ์์ ์ ๋ฌด์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค.
์ค์๋ฅผ ํผํ๊ธฐ ์ํด ๋๋ ๊ถ์ฅํฉ๋๋ค ํญ์ ๋ช
์์ ์ผ๋ก ํด๋ผ policyTypes
.
์์ ๋
ผ๋ฆฌ์ ๋ฐ๋ฅด๋ฉด, ๋งค๊ฐ๋ณ์๊ฐ ingress
๋ฐ / ๋๋ egress
์๋ตํ๋ฉด ์ ์ฑ
์ด ๋ชจ๋ ํธ๋ํฝ์ ๊ฑฐ๋ถํฉ๋๋ค(์๋ "์คํธ๋ฆฌํ ๊ท์น" ์ฐธ์กฐ).
๊ธฐ๋ณธ ์ ์ฑ ์ ํ์ฉ์ ๋๋ค.
์ ์ฑ ์ด ์ ์๋์ง ์์ผ๋ฉด Kubernetes๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ํธ๋ํฝ์ ํ์ฉํฉ๋๋ค. ๋ชจ๋ ํฌ๋๋ ์๋ก ์์ ๋กญ๊ฒ ์ ๋ณด๋ฅผ ๊ตํํ ์ ์์ต๋๋ค. ์ด๋ ๋ณด์ ๊ด์ ์์ ์ง๊ด์ ๋ฐํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง Kubernetes๋ ์๋ ๊ฐ๋ฐ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ํธ ์ด์ฉ์ฑ์ ์ง์ํ๋๋ก ์ค๊ณํ๋ค๋ ์ ์ ๊ธฐ์ตํ์ธ์. ๋คํธ์ํฌ ์ ์ฑ ์ ๋์ค์ ์ถ๊ฐ๋์์ต๋๋ค.
๋ค์์คํ์ด์ค
๋ค์์คํ์ด์ค๋ Kubernetes ํ์ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ๋ ผ๋ฆฌ์ ํ๊ฒฝ์ ์๋ก ๊ฒฉ๋ฆฌํ๋๋ก ์ค๊ณ๋์์ผ๋ฉฐ, ๊ณต๊ฐ ๊ฐ ํต์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฉ๋ฉ๋๋ค.
๋๋ถ๋ถ์ Kubernetes ๊ตฌ์ฑ ์์์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋คํธ์ํฌ ์ ์ฑ
์ ํน์ ๋ค์์คํ์ด์ค์ ์์ต๋๋ค. ๋ธ๋ก์์ metadata
์ ์ฑ
์ด ์ํ๋ ๊ณต๊ฐ์ ์ง์ ํ ์ ์์ต๋๋ค.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: my-namespace # <<<
spec:
...
๋ฉํ๋ฐ์ดํฐ์ ๋ค์์คํ์ด์ค๊ฐ ๋ช
์์ ์ผ๋ก ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ ์์คํ
์ kubectl์ ์ง์ ๋ ๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค(๊ธฐ๋ณธ์ ์ผ๋ก). namespace=default
):
kubectl apply -n my-namespace -f namespace.yaml
๋๋ ์ถ์ฒํ๋ค ๋ค์์คํ์ด์ค๋ฅผ ๋ช ์์ ์ผ๋ก ์ง์ , ํ ๋ฒ์ ์ฌ๋ฌ ๋ค์์คํ์ด์ค๋ฅผ ๋์์ผ๋ก ํ๋ ์ ์ฑ ์ ์์ฑํ์ง ์๋ ํ.
์๋น ์ ๊ฑฐ ์์ podSelector
์ ์ฑ
์์๋ ์ ์ฑ
์ด ์ํ ๋ค์์คํ์ด์ค์์ ํฌ๋๋ฅผ ์ ํํฉ๋๋ค(๋ค๋ฅธ ๋ค์์คํ์ด์ค์ ํฌ๋์ ๋ํ ์ก์ธ์ค๋ ๊ฑฐ๋ถ๋จ).
๋ง์ฐฌ๊ฐ์ง๋ก, podSelector ์์ ๋ฐ ์ก์ ๋ธ๋ก์์ ๋ฌผ๋ก Pod๋ฅผ ๋ค์๊ณผ ๊ฒฐํฉํ์ง ์๋ ํ ์์ฒด ๋ค์์คํ์ด์ค์์๋ง Pod๋ฅผ ์ ํํ ์ ์์ต๋๋ค. namespaceSelector
(์ด ๋ด์ฉ์ "๋ค์์คํ์ด์ค ๋ฐ ํฌ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ํํฐ๋ง" ์น์
์์ ์ค๋ช
ํฉ๋๋ค.)
์ ์ฑ ๋ช ๋ช ๊ท์น
์ ์ฑ ์ด๋ฆ์ ๋์ผํ ๋ค์์คํ์ด์ค ๋ด์์ ๊ณ ์ ํฉ๋๋ค. ๊ฐ์ ๊ณต๊ฐ์ ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ๋ ๊ฐ์ ์ ์ฑ ์ด ์์ ์๋ ์์ง๋ง, ๋ค๋ฅธ ๊ณต๊ฐ์ ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ์ ์ฑ ์ ์์ ์ ์์ต๋๋ค. ์ด๋ ์ฌ๋ฌ ๊ณต๊ฐ์ ๊ฑธ์ณ ๋์ผํ ์ ์ฑ ์ ๋ค์ ์ ์ฉํ๋ ค๋ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค.
ํนํ ์ด๋ฆ ์ง์ ๋ฐฉ๋ฒ ์ค ํ๋๊ฐ ๋ง์์ ๋ญ๋๋ค. ๋ค์์คํ์ด์ค ์ด๋ฆ๊ณผ ๋์ Pod๋ฅผ ๊ฒฐํฉํ๋ ๊ฒ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default.postgres # <<<
namespace: default
spec:
podSelector:
matchLabels:
app: postgres
ingress:
- from:
- podSelector:
matchLabels:
app: admin
policyTypes:
- Ingress
๋ ์ด๋ธ
Pod ๋ฐ ๋ค์์คํ์ด์ค์ ๊ฐ์ Kubernetes ๊ฐ์ฒด์ ์ฌ์ฉ์ ์ง์ ๋ ์ด๋ธ์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ๋ผ๋ฒจ(๋ผ๋ฒจ - ํ๊ทธ)๋ ํด๋ผ์ฐ๋์ ํ๊ทธ์ ๋์ผํฉ๋๋ค. Kubernetes ๋คํธ์ํฌ ์ ์ฑ ์ ๋ผ๋ฒจ์ ์ฌ์ฉํ์ฌ ์ ํํฉ๋๋ค. ๊ผฌํฌ๋ฆฌ์ ์ฉ ๋์:
podSelector:
matchLabels:
role: db
โฆ ๋๋ ๋ค์์คํ์ด์ค์ ์ฉ๋ฉ๋๋ค. ์ด ์์์์๋ ํด๋น ๋ผ๋ฒจ์ด ์๋ ๋ค์์คํ์ด์ค์ ๋ชจ๋ Pod๋ฅผ ์ ํํฉ๋๋ค.
namespaceSelector:
matchLabels:
project: myproject
ํ ๊ฐ์ง ์ฃผ์ ์ฌํญ: ์ฌ์ฉ ์ namespaceSelector
์ ํํ ๋ค์์คํ์ด์ค์ ์ฌ๋ฐ๋ฅธ ๋ ์ด๋ธ์ด ํฌํจ๋์ด ์๋์ง ํ์ธํ์ธ์.. ๋ค์๊ณผ ๊ฐ์ ๋ด์ฅ ๋ค์์คํ์ด์ค๊ฐ ์๋ค๋ ์ ์ ์ ์ํ์ธ์. default
ะธ kube-system
, ๊ธฐ๋ณธ์ ์ผ๋ก ๋ผ๋ฒจ์ ํฌํจํ์ง ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์คํ์ด์ค์ ๋ผ๋ฒจ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
kubectl label namespace default namespace=default
๋์์ ์น์
์ ๋ค์์คํ์ด์ค metadata
๋ ์ด๋ธ์ด ์๋ ์ค์ ๊ณต๊ฐ ์ด๋ฆ์ ์ฐธ์กฐํด์ผ ํฉ๋๋ค.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default # <<<
spec:
...
์์ค ๋ฐ ๋์
๋ฐฉํ๋ฒฝ ์ ์ฑ
์ ์์ค์ ๋์์ด ํฌํจ๋ ๊ท์น์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. Kubernetes ๋คํธ์ํฌ ์ ์ฑ
์ ์ ์ฉ๋๋ ํฌ๋ ์ธํธ์ธ ๋์์ ๋ํด ์ ์๋ ๋ค์ ์์ ๋ฐ/๋๋ ์ก์ ํธ๋ํฝ์ ๋ํ ๊ท์น์ ์ค์ ํฉ๋๋ค. ์ด ์์์์ ์ ์ฑ
์ ๋์์ ๋ค์์คํ์ด์ค์ ๋ชจ๋ ํฌ๋๊ฐ ๋ฉ๋๋ค. default
์ด์ ๊ฐ ์๋ ๋ผ๋ฒจ ํฌํจ app
๊ทธ๋ฆฌ๊ณ ์๋ฏธ db
:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
app: 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
์ผ๋ถ ingress
์ด ์ ์ฑ
์์๋ ๋์ Pod๋ก ๋ค์ด์ค๋ ํธ๋ํฝ์ ์ฝ๋๋ค. ์ฆ, ์์ ์ ์์ค์ด๊ณ ๋์์ ํด๋น ๋์์
๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์ก์ ์ ๋์์ด๊ณ ๋์์ ์์ค์
๋๋ค.
์ด๋ Ingress โ Target์ ๋ ๊ฐ์ง ๋ฐฉํ๋ฒฝ ๊ท์น๊ณผ ๋์ผํฉ๋๋ค. ๋ชฉํ โ ์ถ๊ตฌ.
์ก์ ๋ฐ DNS(์ค์!)
๋๊ฐ๋ ํธ๋ํฝ์ ์ ํํจ์ผ๋ก์จ, DNS์ ํน๋ณํ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ธ์ - Kubernetes๋ ์ด ์๋น์ค๋ฅผ ์ฌ์ฉํ์ฌ ์๋น์ค๋ฅผ IP ์ฃผ์์ ๋งคํํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์ ์ ์ฑ
์ ์ ํ๋ฆฌ์ผ์ด์
์ ํ์ฉํ์ง ์์๊ธฐ ๋๋ฌธ์ ์๋ํ์ง ์์ต๋๋ค. balance
DNS์ ์ก์ธ์ค:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default.balance
namespace: default
spec:
podSelector:
matchLabels:
app: balance
egress:
- to:
- podSelector:
matchLabels:
app: postgres
policyTypes:
- Egress
DNS ์๋น์ค์ ๋ํ ์ก์ธ์ค๋ฅผ ์ด์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default.balance
namespace: default
spec:
podSelector:
matchLabels:
app: balance
egress:
- to:
- podSelector:
matchLabels:
app: postgres
- to: # <<<
ports: # <<<
- protocol: UDP # <<<
port: 53 # <<<
policyTypes:
- Egress
๋ง์ง๋ง ์์ to
๋น์ด ์์ผ๋ฏ๋ก ๊ฐ์ ์ ์ผ๋ก ์ ํํฉ๋๋ค. ๋ชจ๋ ๋ค์์คํ์ด์ค์ ๋ชจ๋ ํฌ๋, ํ์ฉ balance
์ ์ ํ Kubernetes ์๋น์ค(์ผ๋ฐ์ ์ผ๋ก ํด๋น ๊ณต๊ฐ์์ ์คํ๋จ)์ DNS ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋
๋๋ค. kube-system
).
์ด ์ ๊ทผ ๋ฐฉ์์ ํจ๊ณผ์ ์ด์ง๋ง ์ง๋์น๊ฒ ๊ด๋ํ๊ณ ๋ถ์ํ๋ค, DNS ์ฟผ๋ฆฌ๊ฐ ํด๋ฌ์คํฐ ์ธ๋ถ๋ก ์ ๋ฌ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ธ ๊ฐ์ง ์ฐ์ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ ๊ฐ์ ํ ์ ์์ต๋๋ค.
1. DNS ์ฟผ๋ฆฌ๋ง ํ์ฉ ์ด๋ด ์ถ๊ฐํ์ฌ ํด๋ฌ์คํฐ namespaceSelector
:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default.balance
namespace: default
spec:
podSelector:
matchLabels:
app: balance
egress:
- to:
- podSelector:
matchLabels:
app: postgres
- to:
- namespaceSelector: {} # <<<
ports:
- protocol: UDP
port: 53
policyTypes:
- Egress
2. ๋ค์์คํ์ด์ค ๋ด์์๋ง DNS ์ฟผ๋ฆฌ๋ฅผ ํ์ฉํฉ๋๋ค. kube-system
.
์ด๋ ๊ฒ ํ๋ ค๋ฉด ๋ค์์คํ์ด์ค์ ๋ ์ด๋ธ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค. kube-system
: kubectl label namespace kube-system namespace=kube-system
- ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ๋ค์์ ์ฌ์ฉํ์ฌ ์ ์ฑ
์ ๊ธฐ๋กํฉ๋๋ค. namespaceSelector
:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default.balance
namespace: default
spec:
podSelector:
matchLabels:
app: balance
egress:
- to:
- podSelector:
matchLabels:
app: postgres
- to:
- namespaceSelector: # <<<
matchLabels: # <<<
namespace: kube-system # <<<
ports:
- protocol: UDP
port: 53
policyTypes:
- Egress
3. ํธ์ง์ฆ์ ์ธ ์ฌ๋๋ค์ ๋ ๋์๊ฐ DNS ์ฟผ๋ฆฌ๋ฅผ ํน์ DNS ์๋น์ค๋ก ์ ํํ ์ ์์ต๋๋ค. kube-system
. "๋ค์์คํ์ด์ค ๋ฐ ํฌ๋๋ก ํํฐ๋ง" ์น์
์์๋ ์ด๋ฅผ ๋ฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช
ํฉ๋๋ค.
๋ ๋ค๋ฅธ ์ต์ ์ ๋ค์์คํ์ด์ค ์์ค์์ DNS๋ฅผ ํ์ธํ๋ ๊ฒ์ ๋๋ค. ์ด ๊ฒฝ์ฐ ๊ฐ ์๋น์ค๋ง๋ค ์ด ํ์๊ฐ ์์ต๋๋ค.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default.dns
namespace: default
spec:
podSelector: {} # <<<
egress:
- to:
- namespaceSelector: {}
ports:
- protocol: UDP
port: 53
policyTypes:
- Egress
๋ (null) podSelector
๋ค์์คํ์ด์ค์ ๋ชจ๋ Pod๋ฅผ ์ ํํฉ๋๋ค.
์ฒซ ๋ฒ์งธ ์ผ์น ๋ฐ ๊ท์น ์์
๊ธฐ์กด ๋ฐฉํ๋ฒฝ์์๋ ํจํท์ ๋ํ ์์ (ํ์ฉ ๋๋ ๊ฑฐ๋ถ)์ด ๋ง์กฑํ๋ ์ฒซ ๋ฒ์งธ ๊ท์น์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค. Kubernetes์์๋ ์ ์ฑ ์ ์์๊ฐ ์ค์ํ์ง ์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฑ ์ด ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ Pod ๊ฐ ํต์ ์ด ํ์ฉ๋๋ฉฐ ์์ ๋กญ๊ฒ ์ ๋ณด๋ฅผ ๊ตํํ ์ ์์ต๋๋ค. ์ ์ฑ ์๋ฆฝ์ ์์ํ๋ฉด ์ ์ฑ ์ค ํ๋ ์ด์์ ์ํฅ์ ๋ฐ๋ ๊ฐ ํฌ๋๋ ์ด๋ฅผ ์ ํํ ๋ชจ๋ ์ ์ฑ ์ ๋ถ๋ฆฌ(๋ ผ๋ฆฌ์ OR)์ ๋ฐ๋ผ ๊ฒฉ๋ฆฌ๋ฉ๋๋ค. ์ ์ฑ ์ ์ํฅ์ ๋ฐ์ง ์๋ ํฌ๋๋ ์ด๋ฆฐ ์ํ๋ก ์ ์ง๋ฉ๋๋ค.
ํ์ง ๋ฃฐ์ ์ฌ์ฉํ์ฌ ์ด ๋์์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
์คํธ๋ฆฌํ ๊ท์น(โ๊ฑฐ๋ถโ)
๋ฐฉํ๋ฒฝ ์ ์ฑ ์ ์ผ๋ฐ์ ์ผ๋ก ๋ช ์์ ์ผ๋ก ํ์ฉ๋์ง ์๋ ๋ชจ๋ ํธ๋ํฝ์ ๊ฑฐ๋ถํฉ๋๋ค.
Kubernetes์๋ ๊ฑฐ๋ถ ์์ ์ด ์์ต๋๋ค.๊ทธ๋ฌ๋ ๋น ์์ค ํฌ๋ ๊ทธ๋ฃน(์์ )์ ์ ํํ์ฌ ์ผ๋ฐ(ํ์ฉ) ์ ์ฑ ์ ์ฌ์ฉํ์ฌ ์ ์ฌํ ํจ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
namespace: default
spec:
podSelector: {}
policyTypes:
- Ingress
์ด ์ ์ฑ
์ ๋ค์์คํ์ด์ค์ ๋ชจ๋ ํฌ๋๋ฅผ ์ ํํ๊ณ ์์ ์ ์ ์๋์ง ์์ ์ํ๋ก ์ ์งํ์ฌ ๋ชจ๋ ์์ ํธ๋ํฝ์ ๊ฑฐ๋ถํฉ๋๋ค.
๋น์ทํ ๋ฐฉ์์ผ๋ก ๋ค์์คํ์ด์ค์์ ๋๊ฐ๋ ๋ชจ๋ ํธ๋ํฝ์ ์ ํํ ์ ์์ต๋๋ค.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-egress
namespace: default
spec:
podSelector: {}
policyTypes:
- Egress
์ ์ ์ฌํญ ๋ค์์คํ์ด์ค์ Pod์ ๋ํ ํธ๋ํฝ์ ํ์ฉํ๋ ์ถ๊ฐ ์ ์ฑ
์ ์ด ๊ท์น๋ณด๋ค ์ฐ์ ์ ์ฉ๋ฉ๋๋ค. (๋ฐฉํ๋ฒฝ ๊ตฌ์ฑ์์ ๊ฑฐ๋ถ ๊ท์น ์์ ํ์ฉ ๊ท์น์ ์ถ๊ฐํ๋ ๊ฒ๊ณผ ์ ์ฌ)
๋ชจ๋ ํ์ฉ(Any-Any-Any-Allow)
๋ชจ๋ ํ์ฉ ์ ์ฑ
์ ์์ฑํ๋ ค๋ฉด ์์ ๊ฑฐ๋ถ ์ ์ฑ
์ ๋น ์์๋ก ๋ณด์ํด์ผ ํฉ๋๋ค. ingress
:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all
namespace: default
spec:
podSelector: {}
ingress: # <<<
- {} # <<<
policyTypes:
- Ingress
๋ค์์์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ๋ชจ๋ ๋ค์์คํ์ด์ค(๋ฐ ๋ชจ๋ IP)์ ๋ชจ๋ ํฌ๋๋ฅผ ๋ค์์คํ์ด์ค์ ๋ชจ๋ ํฌ๋๋ก default
. ์ด ๋์์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ด ์์ผ๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ์ถ๊ฐ๋ก ์ ์ํ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ก๋ ๋ฌธ์ ๋ฅผ ์ง๋จํ๊ธฐ ์ํด ์ผ๋ถ ํน์ ๊ถํ์ ์ผ์์ ์ผ๋ก ๋นํ์ฑํํด์ผ ํ ์๋ ์์ต๋๋ค.
์ก์ธ์ค๋ง ํ์ฉํ๋๋ก ๊ท์น ๋ฒ์๋ฅผ ์ขํ ์ ์์ต๋๋ค. ํน์ ํฌ๋ ์ธํธ (app:balance
) ๋ค์์คํ์ด์ค์ default
:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all-to-balance
namespace: default
spec:
podSelector:
matchLabels:
app: balance
ingress:
- {}
policyTypes:
- Ingress
๋ค์ ์ ์ฑ
์ ํด๋ฌ์คํฐ ์ธ๋ถ์ ๋ชจ๋ IP์ ๋ํ ์ก์ธ์ค๋ฅผ ํฌํจํ์ฌ ๋ชจ๋ ์์ ๋ฐ ์ก์ ํธ๋ํฝ์ ํ์ฉํฉ๋๋ค.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all
spec:
podSelector: {}
ingress:
- {}
egress:
- {}
policyTypes:
- Ingress
- Egress
์ฌ๋ฌ ์ ์ฑ ๊ฒฐํฉ
์ ์ฑ ์ ์ธ ๊ฐ์ง ์์ค์์ ๋ ผ๋ฆฌ์ OR์ ์ฌ์ฉํ์ฌ ๊ฒฐํฉ๋ฉ๋๋ค. ๊ฐ ํฌ๋์ ๊ถํ์ ํฌ๋์ ์ํฅ์ ๋ฏธ์น๋ ๋ชจ๋ ์ ์ฑ ์ ๋ถ๋ฆฌ์ ๋ฐ๋ผ ์ค์ ๋ฉ๋๋ค.
1. ๋คํ์์ from
ะธ to
์ธ ๊ฐ์ง ์ ํ์ ์์๋ฅผ ์ ์ํ ์ ์์ต๋๋ค(๋ชจ๋ OR๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐํฉ๋จ).
-
namespaceSelector
โ ์ ์ฒด ๋ค์์คํ์ด์ค๋ฅผ ์ ํํฉ๋๋ค. -
podSelector
โ ํฌ๋๋ฅผ ์ ํํฉ๋๋ค. -
ipBlock
โ ์๋ธ๋ท์ ์ ํํฉ๋๋ค.
๋ํ ํ์ ์น์
์ ์์ ์(๋์ผํ ์์๋ผ๋) from
/to
์ ํ๋์ง ์์ต๋๋ค. ๋ชจ๋ ๋
ผ๋ฆฌ์ OR๋ก ๊ฒฐํฉ๋ฉ๋๋ค.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default.postgres
namespace: default
spec:
ingress:
- from:
- podSelector:
matchLabels:
app: indexer
- podSelector:
matchLabels:
app: admin
podSelector:
matchLabels:
app: postgres
policyTypes:
- Ingress
2. ์ ์ฑ
์น์
๋ด๋ถ ingress
๋ง์ ์์๋ฅผ ๊ฐ์ง ์ ์๋ค from
(๋
ผ๋ฆฌ์ OR๋ก ๊ฒฐํฉ) ๋ง์ฐฌ๊ฐ์ง๋ก ์น์
egress
๋ง์ ์์๋ฅผ ํฌํจํ ์ ์์ to
(๋ํ ๋ถ๋ฆฌ๋ก ๊ฒฐํฉ๋จ):
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default.postgres
namespace: default
spec:
ingress:
- from:
- podSelector:
matchLabels:
app: indexer
- from:
- podSelector:
matchLabels:
app: admin
podSelector:
matchLabels:
app: postgres
policyTypes:
- Ingress
3. ๋ค์ํ ์ ์ฑ
๋ ๋
ผ๋ฆฌ์ OR๋ก ๊ฒฐํฉ๋ฉ๋๋ค.
ํ์ง๋ง ์ด๋ค์ ๊ฒฐํฉํ ๋ ํ ๊ฐ์ง ์ ํ ์ฌํญ์ด ์์ต๋๋ค. policyTypes
(Ingress
๋๋ Egress
). ์์ (๋๋ ์ก์ )์ ์ ์ํ๋ ์ ์ฑ
์ ์๋ก ๋ฎ์ด์ฐ๊ฒ ๋ฉ๋๋ค.
๋ค์์คํ์ด์ค ๊ฐ์ ๊ด๊ณ
๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์์คํ์ด์ค ๊ฐ ์ ๋ณด ๊ณต์ ๊ฐ ํ์ฉ๋ฉ๋๋ค. ์ด๋ ๋ค์์คํ์ด์ค๋ก ๋๊ฐ๊ฑฐ๋ ๋ค์ด์ค๋ ํธ๋ํฝ์ ์ ํํ๋ ๊ฑฐ๋ถ ์ ์ฑ ์ ์ฌ์ฉํ์ฌ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค(์์ "์คํธ๋ฆฌํ ๊ท์น" ์ฐธ์กฐ).
๋ค์์คํ์ด์ค์ ๋ํ ์ก์ธ์ค๋ฅผ ์ฐจ๋จํ ํ์๋(์์ "์คํธ๋ฆฌํ ๊ท์น" ์ฐธ์กฐ) ๋ค์์ ์ฌ์ฉํ์ฌ ํน์ ๋ค์์คํ์ด์ค๋ก๋ถํฐ์ ์ฐ๊ฒฐ์ ํ์ฉํจ์ผ๋ก์จ ๊ฑฐ๋ถ ์ ์ฑ
์ ๋ํ ์์ธ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. namespaceSelector
:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: database.postgres
namespace: database
spec:
podSelector:
matchLabels:
app: postgres
ingress:
- from:
- namespaceSelector: # <<<
matchLabels:
namespace: default
policyTypes:
- Ingress
๊ฒฐ๊ณผ์ ์ผ๋ก ๋ค์์คํ์ด์ค์ ๋ชจ๋ ํฌ๋๋ default
ํฌ๋์ ์ก์ธ์คํ ์ ์์ต๋๋ค. postgres
๋ค์์คํ์ด์ค์์ database
. ํ์ง๋ง ๋ค์์ ๋ํ ์ก์ธ์ค๋ฅผ ๊ณต๊ฐํ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? postgres
๋ค์์คํ์ด์ค์ ํน์ ํฌ๋๋ง default
?
๋ค์์คํ์ด์ค ๋ฐ Pod๋ก ํํฐ๋ง
Kubernetes ๋ฒ์ 1.11 ์ด์์์๋ ์ฐ์ฐ์๋ฅผ ๊ฒฐํฉํ ์ ์์ต๋๋ค. namespaceSelector
ะธ podSelector
๋
ผ๋ฆฌ AND๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: database.postgres
namespace: database
spec:
podSelector:
matchLabels:
app: postgres
ingress:
- from:
- namespaceSelector:
matchLabels:
namespace: default
podSelector: # <<<
matchLabels:
app: admin
policyTypes:
- Ingress
์ด๊ฒ์ด ์ผ๋ฐ์ ์ธ OR ๋์ AND๋ก ํด์๋๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
์ฐธ๊ณ podSelector
ํ์ดํ์ผ๋ก ์์ํ์ง ์์ต๋๋ค. YAML์์ ์ด๋ ๋ค์์ ์๋ฏธํฉ๋๋ค. podSelector
๊ทธ๋ฆฌ๊ณ ๊ทธ ์์ ์์ namespaceSelector
๋์ผํ ๋ชฉ๋ก ์์๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ๋ฐ๋ผ์ ๋
ผ๋ฆฌ AND๋ก ๊ฒฐํฉ๋ฉ๋๋ค.
์์ ํ์ดํ ์ถ๊ฐ podSelector
๊ฒฐ๊ณผ์ ์ผ๋ก ์ด์ ๋ชฉ๋ก ์์์ ๊ฒฐํฉ๋๋ ์๋ก์ด ๋ชฉ๋ก ์์๊ฐ ๋ํ๋ฉ๋๋ค. namespaceSelector
๋
ผ๋ฆฌ์ OR์ ์ฌ์ฉํฉ๋๋ค.
ํน์ ๋ผ๋ฒจ์ด ์๋ ํฌ๋๋ฅผ ์ ํํ๋ ค๋ฉด ๋ชจ๋ ๋ค์์คํ์ด์ค์์, ๊ณต๋ฐฑ์ ์
๋ ฅํ์ธ์ namespaceSelector
:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: database.postgres
namespace: database
spec:
podSelector:
matchLabels:
app: postgres
ingress:
- from:
- namespaceSelector: {}
podSelector:
matchLabels:
app: admin
policyTypes:
- Ingress
์ฌ๋ฌ ๋ ์ด๋ธ์ด I์ ํ์ ์ด๋ฃน๋๋ค.
์ฌ๋ฌ ๊ฐ์ฒด(ํธ์คํธ, ๋คํธ์ํฌ, ๊ทธ๋ฃน)๊ฐ ์๋ ๋ฐฉํ๋ฒฝ์ ๋ํ ๊ท์น์ ๋
ผ๋ฆฌ์ OR์ ์ฌ์ฉํ์ฌ ๊ฒฐํฉ๋ฉ๋๋ค. ํจํท ์์ค๊ฐ ์ผ์นํ๋ฉด ๋ค์ ๊ท์น์ด ์๋ํฉ๋๋ค. Host_1
๋๋ Host_2
:
| Source | Destination | Service | Action |
| ----------------------------------------|
| Host_1 | Subnet_A | HTTPS | Allow |
| Host_2 | | | |
| ----------------------------------------|
๋ฐ๋๋ก Kubernetes์์๋ podSelector
๋๋ namespaceSelector
๋
ผ๋ฆฌ์ AND๋ก ๊ฒฐํฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์ ๊ท์น์ ๋ ๋ผ๋ฒจ์ด ๋ชจ๋ ์๋ ํฌ๋๋ฅผ ์ ํํฉ๋๋ค. role=db
ะ version=v2
:
podSelector:
matchLabels:
role: db
version: v2
์ ์ฑ ๋์ ์ ํ๊ธฐ, ํฌ๋ ์ ํ๊ธฐ, ๋ค์์คํ์ด์ค ์ ํ๊ธฐ ๋ฑ ๋ชจ๋ ์ ํ์ ์ฐ์ฐ์์ ๋์ผํ ๋ ผ๋ฆฌ๊ฐ ์ ์ฉ๋ฉ๋๋ค.
์๋ธ๋ท ๋ฐ IP ์ฃผ์(IPBlock)
๋ฐฉํ๋ฒฝ์ VLAN, IP ์ฃผ์ ๋ฐ ์๋ธ๋ท์ ์ฌ์ฉํ์ฌ ๋คํธ์ํฌ๋ฅผ ๋ถํ ํฉ๋๋ค.
Kubernetes์์ IP ์ฃผ์๋ ํฌ๋์ ์๋์ผ๋ก ํ ๋น๋๊ณ ์์ฃผ ๋ณ๊ฒฝ๋ ์ ์์ผ๋ฏ๋ก ๋ ์ด๋ธ์ ๋คํธ์ํฌ ์ ์ฑ ์์ ํฌ๋์ ๋ค์์คํ์ด์ค๋ฅผ ์ ํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์๋ธ๋ท(ipBlocks
)์ ์์ (ingress) ๋๋ ์ก์ (egress) ์ธ๋ถ(North-South) ์ฐ๊ฒฐ์ ๊ด๋ฆฌํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ด ์ ์ฑ
์ ๋ค์์คํ์ด์ค์ ๋ชจ๋ ํฌ๋์ ์ด๋ฆฝ๋๋ค. default
Google DNS ์๋น์ค์ ์ก์ธ์ค:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: egress-dns
namespace: default
spec:
podSelector: {}
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 8.8.8.8/32
ports:
- protocol: UDP
port: 53
์ด ์์์ ๋น ํฌ๋ ์ ํ๊ธฐ๋ "๋ค์์คํ์ด์ค์ ๋ชจ๋ ํฌ๋ ์ ํ"์ ์๋ฏธํฉ๋๋ค.
์ด ์ ์ฑ ์ 8.8.8.8์ ๋ํ ์ก์ธ์ค๋ง ํ์ฉํฉ๋๋ค. ๋ค๋ฅธ IP์ ๋ํ ์ ๊ทผ์ ๊ธ์ง๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ณธ์ง์ ์ผ๋ก ๋ด๋ถ Kubernetes DNS ์๋น์ค์ ๋ํ ์ก์ธ์ค๊ฐ ์ฐจ๋จ๋์์ต๋๋ค. ๊ทธ๋๋ ์ด๊ณ ์ถ๋ค๋ฉด ์ด๋ฅผ ๋ช ์์ ์ผ๋ก ์ง์ ํ์ธ์.
๋ณดํต ipBlocks
ะธ podSelectors
ํฌ๋์ ๋ด๋ถ IP ์ฃผ์๋ ํฌ๋์์ ์ฌ์ฉ๋์ง ์์ผ๋ฏ๋ก ์ํธ ๋ฐฐํ์ ์
๋๋ค. ipBlocks
. ํ์ํจ์ผ๋ก์จ ๋ด๋ถ IP ํฌ๋, ์ค์ ๋ก ์ด๋ฌํ ์ฃผ์๋ฅผ ์ฌ์ฉํ๋ ํฌ๋์์ ์ฐ๊ฒฐ์ ํ์ฉํ๊ฒ ๋ฉ๋๋ค. ์ค์ ๋ก๋ ์ด๋ค IP ์ฃผ์๋ฅผ ์ฌ์ฉํด์ผ ํ ์ง ์ ์ ์์ผ๋ฏ๋ก ํฌ๋๋ฅผ ์ ํํ๋ ๋ฐ ์ด๋ฅผ ์ฌ์ฉํด์๋ ์ ๋ฉ๋๋ค.
๋ฐ๋ ์๋ก ๋ค์ ์ ์ฑ ์ ๋ชจ๋ IP๋ฅผ ํฌํจํ๋ฏ๋ก ๋ค๋ฅธ ๋ชจ๋ Pod์ ๋ํ ์ก์ธ์ค๋ฅผ ํ์ฉํฉ๋๋ค.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: egress-any
namespace: default
spec:
podSelector: {}
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 0.0.0.0/0
ํฌ๋์ ๋ด๋ถ IP ์ฃผ์๋ฅผ ์ ์ธํ๊ณ ์ธ๋ถ IP์๋ง ์ก์ธ์ค๋ฅผ ์ด ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํฌ๋์ ์๋ธ๋ท์ด 10.16.0.0/14์ธ ๊ฒฝ์ฐ:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: egress-any
namespace: default
spec:
podSelector: {}
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 0.0.0.0/0
except:
- 10.16.0.0/14
ํฌํธ ๋ฐ ํ๋กํ ์ฝ
์ผ๋ฐ์ ์ผ๋ก ํฌ๋๋ ํ๋์ ํฌํธ๋ฅผ ์์ ํฉ๋๋ค. ์ด๋ ์ ์ฑ ์์ ํฌํธ ๋ฒํธ๋ฅผ ์ง์ ํ์ง ์๊ณ ๋ชจ๋ ๊ฒ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ์ฑ ์ ์ต๋ํ ์ ํ์ ์ผ๋ก ๋ง๋๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ฐ๋ผ์ ์ด๋ค ๊ฒฝ์ฐ์๋ ์ฌ์ ํ ํฌํธ๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default.postgres
namespace: default
spec:
ingress:
- from:
- podSelector:
matchLabels:
app: indexer
- podSelector:
matchLabels:
app: admin
ports: # <<<
- port: 443 # <<<
protocol: TCP # <<<
- port: 80 # <<<
protocol: TCP # <<<
podSelector:
matchLabels:
app: postgres
policyTypes:
- Ingress
์ฐธ๊ณ ๋ก ์ ํ์๋ ports
๋ธ๋ก์ ๋ชจ๋ ์์์ ์ ์ฉ๋ฉ๋๋ค. to
๋๋ from
, ํฌํจํ๋. ์๋ก ๋ค๋ฅธ ์์ ์งํฉ์ ๋ํด ์๋ก ๋ค๋ฅธ ํฌํธ๋ฅผ ์ง์ ํ๋ ค๋ฉด ๋ถํ ํ์ธ์. ingress
๋๋ egress
์ฌ๋ฌ ํ์ ์น์
์ผ๋ก to
๋๋ from
๊ฐ ํฌํธ๋ฅผ ๋ฑ๋กํ ๋:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default.postgres
namespace: default
spec:
ingress:
- from:
- podSelector:
matchLabels:
app: indexer
ports: # <<<
- port: 443 # <<<
protocol: TCP # <<<
- from:
- podSelector:
matchLabels:
app: admin
ports: # <<<
- port: 80 # <<<
protocol: TCP # <<<
podSelector:
matchLabels:
app: postgres
policyTypes:
- Ingress
๊ธฐ๋ณธ ํฌํธ ์๋:
- ํฌํธ ์ ์๋ฅผ ์์ ํ ์๋ตํ๋ ๊ฒฝ์ฐ(
ports
), ์ด๋ ๋ชจ๋ ํ๋กํ ์ฝ๊ณผ ๋ชจ๋ ํฌํธ๋ฅผ ์๋ฏธํฉ๋๋ค. - ํ๋กํ ์ฝ ์ ์(
protocol
), ์ด๋ TCP๋ฅผ ์๋ฏธํฉ๋๋ค. - ํฌํธ ์ ์๋ฅผ ์๋ตํ๋ ๊ฒฝ์ฐ(
port
), ์ด๋ ๋ชจ๋ ํฌํธ๋ฅผ ์๋ฏธํฉ๋๋ค.
๋ชจ๋ฒ ์ฌ๋ก: ๊ธฐ๋ณธ๊ฐ์ ์์กดํ์ง ๋ง๊ณ ํ์ํ ์ฌํญ์ ๋ช ์์ ์ผ๋ก ์ง์ ํ์ธ์.
์๋น์ค ํฌํธ๊ฐ ์๋ ํฌ๋ ํฌํธ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๋ ์ ์ ์ ์ํ์ธ์(์์ธํ ๋ด์ฉ์ ๋ค์ ๋จ๋ฝ์์ ์ค๋ช ).
Pod ๋๋ ์๋น์ค์ ๋ํ ์ ์ฑ ์ด ์ ์๋์ด ์๋์?
์ผ๋ฐ์ ์ผ๋ก Kubernetes์ Pod๋ ์๋น์ค(์๋น์ค๋ฅผ ๊ตฌํํ๋ Pod๋ก ํธ๋ํฝ์ ๋ฆฌ๋๋ ์ ํ๋ ๊ฐ์ ๋ก๋ ๋ฐธ๋ฐ์)๋ฅผ ํตํด ์๋ก ์ก์ธ์คํฉ๋๋ค. ๋คํธ์ํฌ ์ ์ฑ ์ด ์๋น์ค์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ์ดํ๋ค๊ณ ์๊ฐํ ์๋ ์์ง๋ง ๊ทธ๋ ์ง ์์ต๋๋ค. Kubernetes ๋คํธ์ํฌ ์ ์ฑ ์ ์๋น์ค ํฌํธ๊ฐ ์๋ ํฌ๋ ํฌํธ์์ ์๋ํฉ๋๋ค.
์๋ฅผ ๋ค์ด ์๋น์ค๊ฐ ํฌํธ 80์ ์์ ํ์ง๋ง ํด๋น Pod์ ํฌํธ 8080์ผ๋ก ํธ๋ํฝ์ ๋ฆฌ๋๋ ์ ํ๋ ๊ฒฝ์ฐ ๋คํธ์ํฌ ์ ์ฑ ์์ ์ ํํ 8080์ ์ง์ ํด์ผ ํฉ๋๋ค.
์ด๋ฌํ ๋ฉ์ปค๋์ฆ์ ์ฐจ์ ์ฑ ์ผ๋ก ๊ฐ์ฃผ๋์ด์ผ ํฉ๋๋ค. ์๋น์ค์ ๋ด๋ถ ๊ตฌ์กฐ(ํ์ด ์์ ๋๊ธฐํ๋ ํฌํธ)๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋คํธ์ํฌ ์ ์ฑ ์ ์ ๋ฐ์ดํธํด์ผ ํฉ๋๋ค.
Service Mesh๋ฅผ ์ฌ์ฉํ ์๋ก์ด ์ํคํ ์ฒ ์ ๊ทผ ๋ฐฉ์ (์๋ฅผ ๋ค์ด ์๋ Istio์ ๋ํด ์ฐธ์กฐํ์ธ์ - ๋๋ต์ ์ธ ๋ฒ์ญ) ์ด ๋ฌธ์ ์ ๋์ฒํ ์ ์์ต๋๋ค.
Ingress์ Egress๋ฅผ ๋ชจ๋ ๋ฑ๋กํด์ผ ํฉ๋๊น?
์งง์ ๋๋ต์ '์'์ ๋๋ค. Pod A๊ฐ Pod B์ ํต์ ํ๋ ค๋ฉด ๋๊ฐ๋ ์ฐ๊ฒฐ ์์ฑ์ด ํ์ฉ๋์ด์ผ ํ๋ฉฐ(์ด๋ฅผ ์ํด์๋ ์ก์ ์ ์ฑ ์ ๊ตฌ์ฑํด์ผ ํจ) Pod B๊ฐ ๋ค์ด์ค๋ ์ฐ๊ฒฐ์ ์๋ฝํ ์ ์์ด์ผ ํฉ๋๋ค( ์ด๋ฅผ ์ํด์๋ ์์ ์ ์ฑ )์ด ํ์ํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ค์ ๋ก๋ ๊ธฐ๋ณธ ์ ์ฑ ์ ์ฌ์ฉํ์ฌ ๋จ๋ฐฉํฅ ๋๋ ์๋ฐฉํฅ ์ฐ๊ฒฐ์ ํ์ฉํ ์ ์์ต๋๋ค.
์ด๋ค ํฌ๋๋ผ๋ฉด-์ถ์ฒ ํ ๋ช ์ด์์ ์ฌ๋์ด ์ ํํ๊ฒ ๋ฉ๋๋ค. ์ถ๊ตฌ-์ ์น์ธ์ ๋ํ ์ ํ์ ๊ทธ๋ค์ ๋ถ๋ฆฌ์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ Pod์ ๋ํ ์ฐ๊ฒฐ์ ๋ช ์์ ์ผ๋ก ํ์ฉํด์ผ ํฉ๋๋ค.์์ทจ์ธ์๊ฒ. ์ ์ฑ ์ ๋ฐ๋ผ Pod๊ฐ ์ ํ๋์ง ์์ ๊ฒฝ์ฐ ํด๋น Pod์ ๋๊ฐ๋(์ก์ ) ํธ๋ํฝ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฉ๋ฉ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ํฌ๋์ ์ด๋ช ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.์์ ์ธ, ํ๋ ์ด์์ ์ ํ๋จ ์ ๊ตฌ-์ ์น์ธ๋ค์ ๊ทธ๋ค์ ๋ถ๋ฆฌ์ ์ํด ๊ฒฐ์ ๋ ๊ฒ์ ๋๋ค. ์ด ๊ฒฝ์ฐ ์์ค Pod์์ ํธ๋ํฝ์ ์์ ํ๋๋ก ๋ช ์์ ์ผ๋ก ํ์ฉํด์ผ ํฉ๋๋ค. ์ ์ฑ ์ ๋ฐ๋ผ ํฌ๋๊ฐ ์ ํ๋์ง ์์ ๊ฒฝ์ฐ ํด๋น ํฌ๋์ ๋ํ ๋ชจ๋ ์์ ํธ๋ํฝ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฉ๋ฉ๋๋ค.
์๋์ Stateful ๋๋ Stateless๋ฅผ ์ฐธ์กฐํ์ธ์.
๋ก๊ทธ
Kubernetes ๋คํธ์ํฌ ์ ์ฑ ์ ํธ๋ํฝ์ ๊ธฐ๋กํ ์ ์์ต๋๋ค. ์ด๋ก ์ธํด ์ ์ฑ ์ด ์๋ํ ๋๋ก ์๋ํ๋์ง ์ฌ๋ถ๋ฅผ ํ๋จํ๊ธฐ๊ฐ ์ด๋ ต๊ณ ๋ณด์ ๋ถ์์ด ๋งค์ฐ ๋ณต์กํด์ง๋๋ค.
์ธ๋ถ ์๋น์ค์ ๋ํ ํธ๋ํฝ ์ ์ด
Kubernetes ๋คํธ์ํฌ ์ ์ฑ ์์๋ ์ก์ ์น์ ์ ์ ๊ทํ๋ ๋๋ฉ์ธ ์ด๋ฆ(DNS)์ ์ง์ ํ๋ ๊ฒ์ ํ์ฉํ์ง ์์ต๋๋ค. ์ด ์ฌ์ค์ ๊ณ ์ IP ์ฃผ์๊ฐ ์๋ ์ธ๋ถ ๋์(์: aws.com)์ผ๋ก ํธ๋ํฝ์ ์ ํํ๋ ค๊ณ ํ ๋ ์๋นํ ๋ถํธ์ ์ด๋ํฉ๋๋ค.
์ ์ฑ ํ์ธ
๋ฐฉํ๋ฒฝ์ ์๋ชป๋ ์ ์ฑ ์ ๋ํด ๊ฒฝ๊ณ ํ๊ฑฐ๋ ๊ฑฐ๋ถํ ์๋ ์์ต๋๋ค. Kubernetes๋ ๋ช ๊ฐ์ง ํ์ธ์ ์ํํฉ๋๋ค. kubectl์ ํตํด ๋คํธ์ํฌ ์ ์ฑ ์ ์ค์ ํ ๋ Kubernetes๋ ํด๋น ์ ์ฑ ์ด ์ฌ๋ฐ๋ฅด์ง ์๋ค๊ณ ์ ์ธํ๊ณ ์๋ฝ์ ๊ฑฐ๋ถํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ Kubernetes๊ฐ ์ ์ฑ ์ ๊ฐ์ ธ์ ๋๋ฝ๋ ์ธ๋ถ์ ๋ณด๋ก ์ฑ์๋๋ค. ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ๋ณผ ์ ์์ต๋๋ค.
kubernetes get networkpolicy <policy-name> -o yaml
Kubernetes ์ ํจ์ฑ ๊ฒ์ฌ ์์คํ ์ ์ค๋ฅ๊ฐ ์๋ ๊ฒ์ด ์๋๋ฉฐ ์ผ๋ถ ์ ํ์ ์ค๋ฅ๋ฅผ ๋์น ์ ์๋ค๋ ์ ์ ๋ช ์ฌํ์ธ์.
ะัะฟะพะปะฝะตะฝะธะต
Kubernetes๋ ๋คํธ์ํฌ ์ ์ฑ
์์ฒด๋ฅผ ๊ตฌํํ์ง ์์ผ๋ฉฐ CNI(์ปจํ
์ด๋ ๋คํธ์ํน ์ธํฐํ์ด์ค)๋ผ๋ ๊ธฐ๋ณธ ์์คํ
์ ์ ์ด ๋ถ๋ด์ ์์ํ๋ API ๊ฒ์ดํธ์จ์ด์ผ ๋ฟ์
๋๋ค. ์ ์ ํ CNI๋ฅผ ํ ๋นํ์ง ์๊ณ Kubernetes ํด๋ฌ์คํฐ์ ์ ์ฑ
์ ์ค์ ํ๋ ๊ฒ์ ๋ฐฉํ๋ฒฝ์ ์ ์ฑ
์ ์ค์นํ์ง ์๊ณ ๋ฐฉํ๋ฒฝ ๊ด๋ฆฌ ์๋ฒ์ ์ ์ฑ
์ ๋ง๋๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ์ ์ ํ CNI๋ฅผ ๋ณด์ ํ๊ณ ์๋์ง ๋๋ Kubernetes ํ๋ซํผ์ ๊ฒฝ์ฐ ํด๋ผ์ฐ๋์์ ํธ์คํ
๋๋์ง ํ์ธํ๋ ๊ฒ์ ๊ทํ์๊ฒ ๋ฌ๋ ค ์์ต๋๋ค. (์ ๊ณต์ ๋ชฉ๋ก์ ๋ณผ ์ ์์ต๋๋ค.
์ ์ ํ ๋์ฐ๋ฏธ CNI ์์ด ๋คํธ์ํฌ ์ ์ฑ ์ ์ค์ ํ๋ฉด Kubernetes์์ ๊ฒฝ๊ณ ๋ฅผ ํ์ํ์ง ์์ต๋๋ค.
์ํ ์ ์ฅ ๋๋ ์ํ ๋น์ ์ฅ?
๋ด๊ฐ ๋ง๋ ๋ชจ๋ Kubernetes CNI๋ ์ํ ์ ์ฅํ์ ๋๋ค(์: Calico๋ Linux conntrack์ ์ฌ์ฉํจ). ์ด๋ฅผ ํตํด ํฌ๋๋ ์ฌ์ค์ ํ ํ์ ์์ด ์์๋ TCP ์ฐ๊ฒฐ์์ ์๋ต์ ์์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ์ํ ์ ์ฅ์ ๋ณด์ฅํ๋ Kubernetes ํ์ค์ ์์ง ๋ชปํฉ๋๋ค.
๊ณ ๊ธ ๋ณด์ ์ ์ฑ ๊ด๋ฆฌ
Kubernetes์์ ๋ณด์ ์ ์ฑ ์ํ์ ๊ฐ์ ํ๋ ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Service Mesh ์ํคํ
์ฒ ํจํด์ ์ฌ์ด๋์นด ์ปจํ
์ด๋๋ฅผ ์ฌ์ฉํ์ฌ ์๋น์ค ์์ค์์ ์์ธํ ์๊ฒฉ ์ธก์ ๋ฐ ํธ๋ํฝ ์ ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ฐ๋ฆฌ๋
์ด์ค ํฐ์ค . - ์ผ๋ถ CNI ๊ณต๊ธ์ ์ฒด๋ Kubernetes ๋คํธ์ํฌ ์ ์ฑ ์ ๋ฐ์ด๋๋๋ก ๋๊ตฌ๋ฅผ ํ์ฅํ์ต๋๋ค.
-
ํฌํ ์ค๋ฅด์นด Kubernetes ๋คํธ์ํฌ ์ ์ฑ ์ ๋ํ ๊ฐ์์ฑ๊ณผ ์๋ํ๋ฅผ ์ ๊ณตํฉ๋๋ค.
Tufin Orca ํจํค์ง๋ Kubernetes ๋คํธ์ํฌ ์ ์ฑ ์ ๊ด๋ฆฌํฉ๋๋ค(์ ์คํฌ๋ฆฐ์ท์ ์์ค์ด๊ธฐ๋ ํจ).
์ถ๊ฐ ์ ๋ณด
-
GKE์ Ahmet Alp Balkan์ด ์์ฑํ ๋คํธ์ํฌ ์ ์ฑ ์ ์ ; -
๊ณต์ Kubernetes ์น์ฌ์ดํธ์ ๋ฌธ์ ; -
Kubernetes ๋คํธ์ํน ๋ชจ๋ธ ๊ฐ์ด๋ ; -
๋คํธ์ํฌ ์ ์ฑ ํ์ธ ์คํฌ๋ฆฝํธ .
๊ฒฐ๋ก
Kubernetes ๋คํธ์ํฌ ์ ์ฑ ์ ํด๋ฌ์คํฐ ๋ถํ ์ ์ํ ์ข์ ๋๊ตฌ ์ธํธ๋ฅผ ์ ๊ณตํ์ง๋ง ์ง๊ด์ ์ด์ง ์๊ณ ๋ฏธ๋ฌํ ๋ถ๋ถ์ด ๋ง์ต๋๋ค. ์ด๋ฌํ ๋ณต์ก์ฑ์ผ๋ก ์ธํด ๋ง์ ๊ธฐ์กด ํด๋ฌ์คํฐ ์ ์ฑ ์ ๋ฒ๊ทธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด ๋ฌธ์ ์ ๋ํ ๊ฐ๋ฅํ ํด๊ฒฐ์ฑ ์๋ ์ ์ฑ ์ ์ ์๋ํ ๋๋ ๊ธฐํ ๋ถํ ๋๊ตฌ ์ฌ์ฉ์ด ํฌํจ๋ฉ๋๋ค.
์ด ๊ฐ์ด๋๊ฐ ๋ช ๊ฐ์ง ์ง๋ฌธ์ ํด๊ฒฐํ๊ณ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ฒ์ญ๊ฐ์ ์ถ์
๋ธ๋ก๊ทธ์์๋ ์ฝ์ด๋ณด์ธ์.
- "Istio๋ฅผ ์ฌ์ฉํ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๋์๊ฐ๊ธฐ":
1๋ถ(์ฃผ์ ๊ธฐ๋ฅ ์๊ฐ) ,ํํธ 2(๋ผ์ฐํ , ํธ๋ํฝ ์ ์ด) ,3๋ถ(๋ณด์) ; - "Kubernetes์ ๋คํธ์ํน์ ๋ํ ๊ทธ๋ฆผ ๊ฐ์ด๋":
ํํธ 1 ๋ฐ 2(๋คํธ์ํฌ ๋ชจ๋ธ, ์ค๋ฒ๋ ์ด ๋คํธ์ํฌ) ,3๋ถ(์๋น์ค ๋ฐ ํธ๋ํฝ ์ฒ๋ฆฌ) ; - ยซ
๋ณด์์ ๋ฏผ๊ฐํ ํ๊ฒฝ์ Docker ๋ฐ Kubernetes "; - ยซ
9 Kubernetes ๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก "; - ยซ
์ฟ ๋ฒ๋คํฐ์ค ํดํน์ ํผํด์๊ฐ ๋์ง ์๋ 11๊ฐ์ง ๋ฐฉ๋ฒ ".
์ถ์ฒ : habr.com