Kubernetes ๋„คํŠธ์›Œํ‚น์„ ์œ„ํ•œ Calico: ์†Œ๊ฐœ ๋ฐ ์•ฝ๊ฐ„์˜ ๊ฒฝํ—˜

Kubernetes ๋„คํŠธ์›Œํ‚น์„ ์œ„ํ•œ Calico: ์†Œ๊ฐœ ๋ฐ ์•ฝ๊ฐ„์˜ ๊ฒฝํ—˜

์ด ๊ธฐ์‚ฌ์˜ ๋ชฉ์ ์€ ๋…์ž์—๊ฒŒ Kubernetes์˜ ๋„คํŠธ์›Œํ‚น ๋ฐ ๋„คํŠธ์›Œํฌ ์ •์ฑ… ๊ด€๋ฆฌ์˜ ๊ธฐ๋ณธ ์‚ฌํ•ญ๊ณผ ํ‘œ์ค€ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๋Š” ํƒ€์‚ฌ Calico ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์†Œ๊ฐœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ์šฐ๋ฆฌ์˜ ์šด์˜ ๊ฒฝํ—˜์—์„œ ์–ป์€ ์‹ค์ œ ์‚ฌ๋ก€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ์˜ ์šฉ์ด์„ฑ๊ณผ ์ผ๋ถ€ ๊ธฐ๋Šฅ์„ ์‹œ์—ฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Kubernetes ๋„คํŠธ์›Œํ‚น ์–ดํ”Œ๋ผ์ด์–ธ์Šค์— ๋Œ€ํ•œ ๋น ๋ฅธ ์†Œ๊ฐœ

Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋Š” ๋„คํŠธ์›Œํฌ ์—†์ด๋Š” ์ƒ์ƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๊ธฐ๋ณธ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์ž๋ฃŒ๋ฅผ ์ถœํŒํ–ˆ์Šต๋‹ˆ๋‹ค. โ€œKubernetes์˜ ๋„คํŠธ์›Œํ‚น์— ๋Œ€ํ•œ ๊ทธ๋ฆผ ๊ฐ€์ด๋“œ"๊ทธ๋ฆฌ๊ณ "๋ณด์•ˆ ์ „๋ฌธ๊ฐ€๋ฅผ ์œ„ํ•œ Kubernetes ๋„คํŠธ์›Œํฌ ์ •์ฑ… ์†Œ๊ฐœ".

์ด ๊ธฐ์‚ฌ์˜ ๋งฅ๋ฝ์—์„œ K8s ์ž์ฒด๋Š” ์ปจํ…Œ์ด๋„ˆ์™€ ๋…ธ๋“œ ๊ฐ„์˜ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์„ ๋‹ด๋‹นํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. CNI ํ”Œ๋Ÿฌ๊ทธ์ธ (์ปจํ…Œ์ด๋„ˆ ๋„คํŠธ์›Œํ‚น ์ธํ„ฐํŽ˜์ด์Šค). ์ด ๊ฐœ๋…์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด ๊ทธ๋“ค๋„ ๋‚˜ํ•œํ…Œ ๋งํ–ˆ์ง€.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋Ÿฌํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ค‘ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์€ ํ”Œ๋ž€๋„ฌ โ€” ๊ฐ ๋…ธ๋“œ์— ๋ธŒ๋ฆฌ์ง€๋ฅผ ์˜ฌ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์— ์„œ๋ธŒ๋„ท์„ ํ• ๋‹นํ•˜์—ฌ ๋ชจ๋“  ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ ๊ฐ„์— ์™„์ „ํ•œ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์™„์ „ํ•˜๊ณ  ๊ทœ์ œ๋˜์ง€ ์•Š์€ ์ ‘๊ทผ์„ฑ์ด ํ•ญ์ƒ ์œ ์ตํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ตœ์†Œํ•œ์˜ ๊ฒฉ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋ ค๋ฉด ๋ฐฉํ™”๋ฒฝ ๊ตฌ์„ฑ์— ๊ฐœ์ž…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Š” ๋™์ผํ•œ CNI์˜ ํ†ต์ œํ•˜์— ๋†“์ด๊ธฐ ๋•Œ๋ฌธ์— iptables์— ๋Œ€ํ•œ ์ œXNUMX์ž์˜ ๊ฐœ์ž…์ด ์ž˜๋ชป ํ•ด์„๋˜๊ฑฐ๋‚˜ ์™„์ „ํžˆ ๋ฌด์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋„คํŠธ์›Œํฌ ์ •์ฑ… ๊ด€๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ "์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ" ๊ธฐ๋Šฅ์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ์ •์ฑ… API. ะญั‚ะพั‚ ั€ะตััƒั€ั, ั€ะฐัะฟั€ะพัั‚ั€ะฐะฝััŽั‰ะธะนัั ะฝะฐ ะฒั‹ะฑั€ะฐะฝะฝั‹ะต ะฟั€ะพัั‚ั€ะฐะฝัั‚ะฒะฐ ะธะผั‘ะฝ, ะผะพะถะตั‚ ัะพะดะตั€ะถะฐั‚ัŒ ะฟั€ะฐะฒะธะปะฐ ะดะปั ั€ะฐะทะณั€ะฐะฝะธั‡ะตะฝะธั ะดะพัั‚ัƒะฟะฐ ะพั‚ ะพะดะฝะธั… ะฟั€ะธะปะพะถะตะฝะธะน ะบ ะดั€ัƒะณะธะผ. ะžะฝ ั‚ะฐะบะถะต ะฟะพะทะฒะพะปัะตั‚ ะฝะฐัั‚ั€ะฐะธะฒะฐั‚ัŒ ะดะพัั‚ัƒะฟะฝะพัั‚ัŒ ะผะตะถะดัƒ ะบะพะฝะบั€ะตั‚ะฝั‹ะผะธ podโ€™ะฐะผะธ, ะพะบั€ัƒะถะตะฝะธัะผะธ (ะฟั€ะพัั‚ั€ะฐะฝัั‚ะฒะฐะผะธ ะธะผั‘ะฝ) ะธะปะธ ะฑะปะพะบะฐะผะธ IP-ะฐะดั€ะตัะพะฒ:

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 ๋„คํŠธ์›Œํ‚น์„ ์œ„ํ•œ Calico: ์†Œ๊ฐœ ๋ฐ ์•ฝ๊ฐ„์˜ ๊ฒฝํ—˜

์‹ค์ œ๋กœ ์ •์น˜๋Š” ์›€์ง์ด๋Š” ๋ฐฉํ–ฅ์— ๋”ฐ๋ผ ์ด ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆ„์–ด์ง„๋‹ค.

๋‹ค์Œ ํ•„์ˆ˜ ์†์„ฑ์€ ์„ ํƒ์ž์ž…๋‹ˆ๋‹ค. ๊ทœ์น™์ด ์ ์šฉ๋˜๋Š” ์‚ฌ๋žŒ. ์ด๋Š” ํฌ๋“œ(๋˜๋Š” ํฌ๋“œ ๊ทธ๋ฃน) ๋˜๋Š” ํ™˜๊ฒฝ(์˜ˆ: ๋„ค์ž„์ŠคํŽ˜์ด์Šค)์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ: ์ด๋Ÿฌํ•œ ๊ฐœ์ฒด์˜ ๋‘ ์œ ํ˜• ๋ชจ๋‘ ๋ ˆ์ด๋ธ”(์ƒํ‘œ Kubernetes ์šฉ์–ด๋กœ) - ์ •์น˜์ธ๋“ค์ด ํ•จ๊ป˜ ์šด์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ผ์ข…์˜ ๋ ˆ์ด๋ธ”๋กœ ํ†ตํ•ฉ๋œ ํ•œ์ •๋œ ์ˆ˜์˜ ์„ ํƒ๊ธฐ ์™ธ์—๋„ "๋ชจ๋“  ํ•ญ๋ชฉ/๋ชจ๋‘ ํ—ˆ์šฉ/๊ฑฐ๋ถ€"์™€ ๊ฐ™์€ ๊ทœ์น™์„ ๋‹ค์–‘ํ•œ ๋ณ€ํ˜•์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋‹ค์Œ ํ˜•์‹์˜ ๊ตฌ์„ฑ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  podSelector: {}
  ingress: []
  policyTypes:
  - Ingress

โ€” ์ด ์˜ˆ์—์„œ๋Š” ํ™˜๊ฒฝ์˜ ๋ชจ๋“  ํฌ๋“œ๊ฐ€ ์ˆ˜์‹  ํŠธ๋ž˜ํ”ฝ์—์„œ ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ˜๋Œ€ ๋™์ž‘์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  podSelector: {}
  ingress:
  - {}
  policyTypes:
  - Ingress

๋‚˜๊ฐ€๋Š” ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

  podSelector: {}
  policyTypes:
  - Egress

- ๋„๋ ค๊ณ ์š”. ๊ทธ๋ฆฌ๊ณ  ํฌํ•จํ•  ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  podSelector: {}
  egress:
  - {}
  policyTypes:
  - Egress

ํด๋Ÿฌ์Šคํ„ฐ์šฉ CNI ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ ํƒ์œผ๋กœ ๋Œ์•„๊ฐ€์„œ ๋‹ค์Œ ์‚ฌํ•ญ์— ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋„คํŠธ์›Œํฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด NetworkPolicy๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋ฏธ ์–ธ๊ธ‰ํ•œ Flannel์€ ๋„คํŠธ์›Œํฌ ์ •์ฑ…์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ์ง์ ‘์ ์œผ๋กœ ๋งํ•œ๊ฑฐ์•ผ ๊ณต์‹ ์ €์žฅ์†Œ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์•ˆ๋„ ์–ธ๊ธ‰๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค - ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ ์˜ฅ์–‘๋ชฉ์ด๋Š” ๋„คํŠธ์›Œํฌ ์ •์ฑ… ์ธก๋ฉด์—์„œ Kubernetes API์˜ ํ‘œ์ค€ ์„ธํŠธ๋ฅผ ํฌ๊ฒŒ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.

Kubernetes ๋„คํŠธ์›Œํ‚น์„ ์œ„ํ•œ Calico: ์†Œ๊ฐœ ๋ฐ ์•ฝ๊ฐ„์˜ ๊ฒฝํ—˜

Calico ์•Œ์•„๋ณด๊ธฐ : ์ด๋ก 

Calico ํ”Œ๋Ÿฌ๊ทธ์ธ์€ Flannel(ํ•˜์œ„ ํ”„๋กœ์ ํŠธ)๊ณผ ํ†ตํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šดํ•˜) ๋˜๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ๋ฐ ๊ฐ€์šฉ์„ฑ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

K8s "๋ฐ•์Šคํ˜•" ์†”๋ฃจ์…˜๊ณผ Calico์˜ API ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ค ๊ธฐํšŒ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๊นŒ?

NetworkPolicy์— ๋‚ด์žฅ๋œ ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ •์น˜์ธ์€ ํ™˜๊ฒฝ์— ์˜ํ•ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • ์ •์ฑ…์€ ๋ผ๋ฒจ์ด ํ‘œ์‹œ๋œ ํฌ๋“œ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๊ทœ์น™์€ ํฌ๋“œ, ํ™˜๊ฒฝ ๋˜๋Š” ์„œ๋ธŒ๋„ท์— ์ ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทœ์น™์—๋Š” ํ”„๋กœํ† ์ฝœ, ๋ช…๋ช…๋œ ๋˜๋Š” ๊ธฐํ˜ธํ™”๋œ ํฌํŠธ ์‚ฌ์–‘์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Calico๊ฐ€ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ •์ฑ…์€ ํฌ๋“œ, ์ปจํ…Œ์ด๋„ˆ, ๊ฐ€์ƒ ๋จธ์‹  ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋“ฑ ๋ชจ๋“  ๊ฐœ์ฒด์— ์ ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทœ์น™์—๋Š” ํŠน์ • ์ž‘์—…(๊ธˆ์ง€, ํ—ˆ๊ฐ€, ๊ธฐ๋ก)์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทœ์น™์˜ ๋Œ€์ƒ ๋˜๋Š” ์†Œ์Šค๋Š” ํฌํŠธ, ํฌํŠธ ๋ฒ”์œ„, ํ”„๋กœํ† ์ฝœ, HTTP ๋˜๋Š” ICMP ํŠน์„ฑ, IP ๋˜๋Š” ์„œ๋ธŒ๋„ท(4์„ธ๋Œ€ ๋˜๋Š” 6์„ธ๋Œ€), ์„ ํƒ๊ธฐ(๋…ธ๋“œ, ํ˜ธ์ŠคํŠธ, ํ™˜๊ฒฝ)์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋˜ํ•œ DNAT ์„ค์ • ๋ฐ ํŠธ๋ž˜ํ”ฝ ์ „๋‹ฌ ์ •์ฑ…์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ ํ†ต๊ณผ๋ฅผ ๊ทœ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Calico ์ €์žฅ์†Œ์˜ GitHub์— ๋Œ€ํ•œ ์ฒซ ๋ฒˆ์งธ ์ปค๋ฐ‹์€ 2016๋…„ XNUMX์›”๋กœ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋ฉฐ, XNUMX๋…„ ํ›„ ํ”„๋กœ์ ํŠธ๋Š” Kubernetes ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ๊ตฌ์„ฑ์—์„œ ์„ ๋„์ ์ธ ์œ„์น˜๋ฅผ ์ฐจ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ์„ค๋ฌธ ์กฐ์‚ฌ ๊ฒฐ๊ณผ๋กœ ์ž…์ฆ๋ฉ๋‹ˆ๋‹ค. ๋‰ด ์Šคํƒ(The New Stack)์ด ์ง€ํœ˜ํ•œ:

Kubernetes ๋„คํŠธ์›Œํ‚น์„ ์œ„ํ•œ Calico: ์†Œ๊ฐœ ๋ฐ ์•ฝ๊ฐ„์˜ ๊ฒฝํ—˜

๋‹ค์Œ๊ณผ ๊ฐ™์€ K8์„ ์‚ฌ์šฉํ•˜๋Š” ๋งŽ์€ ๋Œ€๊ทœ๋ชจ ๊ด€๋ฆฌํ˜• ์†”๋ฃจ์…˜ ์•„๋งˆ์กด EKS, Azure AKS, ๊ตฌ๊ธ€ GKE ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

์„ฑ๋Šฅ์€ ์—ฌ๊ธฐ์—์„œ ๋ชจ๋“  ๊ฒƒ์ด ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. ์ œํ’ˆ ํ…Œ์ŠคํŠธ์—์„œ Calico ๊ฐœ๋ฐœ ํŒ€์€ ์ดˆ๋‹น 50000๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ์†๋„๋กœ 500๊ฐœ์˜ ๋ฌผ๋ฆฌ์  ๋…ธ๋“œ์—์„œ 20๊ฐœ ์ด์ƒ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ฒœ๋ฌธํ•™์ ์ธ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์Šค์ผ€์ผ๋ง์—๋Š” ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ํ™•์ธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๊ฒฐ๊ณผ ๋ฐœํ‘œ๋๋‹ค ์ด๋ฏธ ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „์ด ๋ฐœํ‘œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜๋ฆฌ๋Ÿ‰ ๋ฐ ๋ฆฌ์†Œ์Šค ์†Œ๋น„์— ์ดˆ์ ์„ ๋งž์ถ˜ ๋…๋ฆฝ์ ์ธ ์—ฐ๊ตฌ์—์„œ๋„ Calico์˜ ์„ฑ๋Šฅ์ด Flannel์˜ ์„ฑ๋Šฅ๊ณผ ๊ฑฐ์˜ ๋น„์Šทํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์ด ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด:

Kubernetes ๋„คํŠธ์›Œํ‚น์„ ์œ„ํ•œ Calico: ์†Œ๊ฐœ ๋ฐ ์•ฝ๊ฐ„์˜ ๊ฒฝํ—˜

์ด ํ”„๋กœ์ ํŠธ๋Š” ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœ๋˜๊ณ  ์žˆ์œผ๋ฉฐ K8s, OpenShift, OpenStack ๊ด€๋ฆฌ๋˜๋Š” ์ธ๊ธฐ ์†”๋ฃจ์…˜์—์„œ์˜ ์ž‘์—…์„ ์ง€์›ํ•˜๋ฉฐ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ฐฐํฌํ•  ๋•Œ Calico๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝฅ, Service Mesh ๋„คํŠธ์›Œํฌ ๊ตฌ์ถ•์— ๋Œ€ํ•œ ์–ธ๊ธ‰์ด ์žˆ์Šต๋‹ˆ๋‹ค(์—ฌ๊ธฐ์— ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค Istio์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋จ).

์นผ๋ฆฌ์ฝ”๋กœ ์—ฐ์Šตํ•˜๊ธฐ

๋ฐ”๋‹๋ผ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ CNI๋ฅผ ์„ค์น˜ํ•˜๋ฉด ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. calico.yaml, ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ ๋‹ค์šด๋กœ๋“œ, ์‚ฌ์šฉํ•˜์—ฌ kubectl apply -f.

์ผ๋ฐ˜์ ์œผ๋กœ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ํ˜„์žฌ ๋ฒ„์ „์€ Kubernetes์˜ ์ตœ์‹  2~3๊ฐœ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด์ „ ๋ฒ„์ „์—์„œ์˜ ์ž‘๋™์€ ํ…Œ์ŠคํŠธ๋˜์ง€ ์•Š์œผ๋ฉฐ ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž์— ๋”ฐ๋ฅด๋ฉด Calico๋Š” iptables ๋˜๋Š” IPVS ์œ„์— CentOS 3.10, Ubuntu 7 ๋˜๋Š” Debian 16์„ ์‹คํ–‰ํ•˜๋Š” 8 ์ด์ƒ์˜ Linux ์ปค๋„์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ ๋‚ด ๊ฒฉ๋ฆฌ

์ผ๋ฐ˜์ ์ธ ์ดํ•ด๋ฅผ ์œ„ํ•ด Calico ํ‘œ๊ธฐ๋ฒ•์˜ ๋„คํŠธ์›Œํฌ ์ •์ฑ…์ด ํ‘œ์ค€ ํ‘œ๊ธฐ๋ฒ•๊ณผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€, ๊ทœ์น™ ์ƒ์„ฑ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์–ด๋–ป๊ฒŒ ๊ฐ€๋…์„ฑ๊ณผ ๊ตฌ์„ฑ ์œ ์—ฐ์„ฑ์„ ๋‹จ์ˆœํ™”ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ์‚ฌ๋ก€๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Kubernetes ๋„คํŠธ์›Œํ‚น์„ ์œ„ํ•œ 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๋Š” ์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์‚ฌ์šฉ์„ ๋ฐฉํ•ดํ•˜๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. Calico ์ „๋‹ฌ๊ณผ ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋ฆฌ์†Œ์Šค. ๊ตฌ๋ฌธ์ด ๋” ์ž์„ธํ•˜๋ฏ€๋กœ ์œ„ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ๊ทœ์น™์„ ๋‹ค์Œ ํ˜•์‹์œผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๊ฐ€ ๋ถ„์„์„ ์œ„ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ์ธก์ •ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•˜๋Š” ์ƒํ™ฉ์„ ์ƒ์ƒํ•ด ๋ณด์„ธ์š”. ์—…๋กœ๋“œ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ณต๊ฐœ์ ์œผ๋กœ ๋‹ค์‹œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์—ฟ๋ณด๋Š” ๋ˆˆ์œผ๋กœ๋ถ€ํ„ฐ ์ˆจ๊ธฐ์ž:

Kubernetes ๋„คํŠธ์›Œํ‚น์„ ์œ„ํ•œ Calico: ์†Œ๊ฐœ ๋ฐ ์•ฝ๊ฐ„์˜ ๊ฒฝํ—˜

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 ํ„ฐ๋„์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ด ์•ก์„ธ์Šค๋Š” ์—„๊ฒฉํ•˜๊ฒŒ ์ œ์–ด๋˜๋ฉฐ ์‚ฌ์šฉ์ด ํ—ˆ์šฉ๋œ ํŠน์ • ์„œ๋น„์Šค ๋ชฉ๋ก์œผ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

Kubernetes ๋„คํŠธ์›Œํ‚น์„ ์œ„ํ•œ Calico: ์†Œ๊ฐœ ๋ฐ ์•ฝ๊ฐ„์˜ ๊ฒฝํ—˜

ํด๋ผ์ด์–ธํŠธ๋Š” ํ‘œ์ค€ UDP ํฌํŠธ 1194๋ฅผ ํ†ตํ•ด VPN์— ์—ฐ๊ฒฐํ•˜๊ณ , ์—ฐ๊ฒฐ๋˜๋ฉด ํฌ๋“œ ๋ฐ ์„œ๋น„์Šค์˜ ํด๋Ÿฌ์Šคํ„ฐ ์„œ๋ธŒ๋„ท์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ์ž‘ ๋ฐ ์ฃผ์†Œ ๋ณ€๊ฒฝ ์ค‘์— ์„œ๋น„์Šค๊ฐ€ ์†์‹ค๋˜์ง€ ์•Š๋„๋ก ์ „์ฒด ์„œ๋ธŒ๋„ท์ด ํ‘ธ์‹œ๋ฉ๋‹ˆ๋‹ค.

๊ตฌ์„ฑ์˜ ํฌํŠธ๋Š” ํ‘œ์ค€์ด๋ฏ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๊ณ  ์ด๋ฅผ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์ „์†กํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์— ์•ฝ๊ฐ„์˜ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, UDP์šฉ AWS LoadBalancer๋Š” ์ž‘๋…„ ๋ง ๋ง ๊ทธ๋Œ€๋กœ ์ œํ•œ๋œ ์ง€์—ญ ๋ชฉ๋ก์— ๋‚˜ํƒ€๋‚ฌ์œผ๋ฉฐ NodePort๋Š” ๋ชจ๋“  ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ์—์„œ์˜ ์ „๋‹ฌ๋กœ ์ธํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค ์ˆ˜๋ฅผ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฒฐํ•จ์„ฑ ๋ชฉ์ . ๋˜ํ•œ ๊ธฐ๋ณธ ํฌํŠธ ๋ฒ”์œ„๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค...

๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์„ ๊ฒ€์ƒ‰ํ•œ ๊ฒฐ๊ณผ ๋‹ค์Œ์ด ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  1. VPN์ด ํฌํ•จ๋œ ํฌ๋“œ๋Š” ๋…ธ๋“œ๋ณ„๋กœ ์˜ˆ์•ฝ๋ฉ๋‹ˆ๋‹ค. hostNetwork, ์ฆ‰ ์‹ค์ œ IP์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
  2. ์„œ๋น„์Šค๋Š” ๋‹ค์Œ์„ ํ†ตํ•ด ์™ธ๋ถ€์— ๊ฒŒ์‹œ๋ฉ๋‹ˆ๋‹ค. ClusterIP. ํฌํŠธ๋Š” ๋…ธ๋“œ์— ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์„ค์น˜๋˜์–ด ์žˆ์œผ๋ฉฐ, ์•ฝ๊ฐ„์˜ ์˜ˆ์•ฝ(์‹ค์ œ IP ์ฃผ์†Œ์˜ ์กฐ๊ฑด๋ถ€ ์กด์žฌ)์„ ํ†ตํ•ด ์™ธ๋ถ€์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ํฌ๋“œ๊ฐ€ ์ƒ์Šนํ•œ ๋…ธ๋“œ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ ์ด์•ผ๊ธฐ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฉ๋‹ˆ๋‹ค. ์ƒ์ƒ๋ ฅ์ด ์ถฉ๋ถ„ํ•˜๋‹ค๋ฉด ๋ˆ„๊ตฌ๋‚˜ ์„œ๋น„์Šค๋ฅผ ๋…ธ๋“œ์— ๋‹จ๋‹จํžˆ "๊ณ ์ •"ํ•˜๊ฑฐ๋‚˜ 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

๋ธ”๋กœ๊ทธ์—์„œ๋„ ์ฝ์–ด๋ณด์„ธ์š”.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€