Calico для сСти Π² Kubernetes: знакомство ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ· ΠΎΠΏΡ‹Ρ‚Π°

Calico для сСти Π² Kubernetes: знакомство ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ· ΠΎΠΏΡ‹Ρ‚Π°

ЦСль ΡΡ‚Π°Ρ‚ΡŒΠΈ β€” ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒ читатСля с основами сСтСвого взаимодСйствия ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ сСтСвыми ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°ΠΌΠΈ Π² Kubernetes, Π° Ρ‚Π°ΠΊΠΆΠ΅ со сторонним ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠΌ Calico, Ρ€Π°ΡΡˆΠΈΡ€ΡΡŽΡ‰ΠΈΠΌ стандартныС возмоТности. ΠŸΠΎΠΏΡƒΡ‚Π½ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ продСмонстрированы удобство ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ„ΠΈΡ‡ΠΈ Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΈΠ· ΠΎΠΏΡ‹Ρ‚Π° нашСй эксплуатации.

БыстроС Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² сСтСвоС устройство Kubernetes

ΠšΠ»Π°ΡΡ‚Π΅Ρ€ Kubernetes Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π±Π΅Π· сСти. ΠœΡ‹ ΡƒΠΆΠ΅ ΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»ΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ ΠΏΠΎ ΠΈΡ… основам: Β«Π˜Π»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ руководство ΠΏΠΎ устройству сСти Π² KubernetesΒ» ΠΈ Β«Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² сСтСвыС ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Kubernetes для спСциалистов ΠΏΠΎ бСзопасности».

Π’ контСкстС этой ΡΡ‚Π°Ρ‚ΡŒΠΈ Π²Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π·Π° ΡΠ΅Ρ‚Π΅Π²ΡƒΡŽ ΡΠ²ΡΠ·Π½ΠΎΡΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌΠΈ ΠΈ ΡƒΠ·Π»Π°ΠΌΠΈ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π½Π΅ сам K8s: для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ всСвозмоТныС ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ CNI (Container Networking Interface). ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ± этой ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ ΠΌΡ‹ Ρ‚ΠΎΠΆΠ΅ рассказывали.

К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнный ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² β€” Flannel β€” обСспСчиваСт ΠΏΠΎΠ»Π½ΡƒΡŽ ΡΠ΅Ρ‚Π΅Π²ΡƒΡŽ ΡΠ²ΡΠ·Π½ΠΎΡΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ всСми ΡƒΠ·Π»Π°ΠΌΠΈ кластСра с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ поднятия мостов Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡƒΠ·Π»Π΅, закрСпляя Π·Π° Π½ΠΈΠΌ ΠΏΠΎΠ΄ΡΠ΅Ρ‚ΡŒ. Однако полная ΠΈ нСрСгулируСмая Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ Π½Π΅ всСгда ΠΏΠΎΠ»Π΅Π·Π½Π°. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ·ΠΎΠ»ΡΡ†ΠΈΡŽ Π² кластСрС, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΌΠ΅ΡˆΠ°Ρ‚ΡŒΡΡ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ firewall’а. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС ΠΎΠ½ΠΎ ΠΎΡ‚Π΄Π°Π½ΠΎ Π² ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ самого CNI, ΠΈΠ·-Π·Π° Ρ‡Π΅Π³ΠΎ Π»ΡŽΠ±Ρ‹Π΅ сторонниС Π²ΠΌΠ΅ΡˆΠ°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π° Π² iptables ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΈΠ»ΠΈ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ вовсС.

А Β«ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈΒ» для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ управлСния сСтСвыми ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°ΠΌΠΈ Π² кластСрС Kubernetes прСдоставляСтся NetworkPolicy 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

Π­Ρ‚ΠΎΡ‚ Π½Π΅ самый ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π· ΠΈ навсСгда ΠΎΡ‚Π±ΠΈΡ‚ΡŒ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ Π² Π»ΠΎΠ³ΠΈΠΊΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ сСтСвых ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ. Однако ΠΌΡ‹ всё ΠΆΠ΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΏΠΎΠ½ΡΡ‚ΡŒ основныС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сСтСвых политик…

Π›ΠΎΠ³ΠΈΡ‡Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ 2 Ρ‚ΠΈΠΏΠ° Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°: входящий Π² pod (Ingress) ΠΈ исходящий ΠΈΠ· Π½Π΅Π³ΠΎ (Egress).

Calico для сСти Π² Kubernetes: знакомство ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ· ΠΎΠΏΡ‹Ρ‚Π°

БобствСнно, Π½Π° эти 2 ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ ΠΏΠΎ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ двиТСния ΠΈ раздСляСтся ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ β€” сСлСктор; Ρ‚ΠΎΡ‚, ΠΊ ΠΊΠΎΠΌΡƒ примСняСтся ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ pod (ΠΈΠ»ΠΈ Π³Ρ€ΡƒΠΏΠΏΠ° pod’ов) ΠΈΠ»ΠΈ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ (Ρ‚.Π΅. пространство ΠΈΠΌΠ΅Π½). ВаТная Π΄Π΅Ρ‚Π°Π»ΡŒ: ΠΎΠ±Π° Π²ΠΈΠ΄Π° этих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² обязаны ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΊΡƒ (label Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Kubernetes) β€” ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΠΌΠΈ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ.

Помимо ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ числа сСлСкторов, ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Π½Ρ‹Ρ… ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ, сущСствуСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ написания ΠΏΡ€Π°Π²ΠΈΠ» Π²Ρ€ΠΎΠ΄Π΅ Β«Π Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ/Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ всё/всСм» Π² Ρ€Π°Π·Π½Ρ‹Ρ… вариациях. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ конструкции Π²ΠΈΠ΄Π°:

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

β€” Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ всСм pod’ам окруТСния закрываСтся входящий Ρ‚Ρ€Π°Ρ„ΠΈΠΊ. ΠŸΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠ³ΠΎ повСдСния ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Ρ‚Π°ΠΊΠΎΠΉ конструкциСй:

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

Аналогично для исходящСго:

  podSelector: {}
  policyTypes:
  - Egress

β€” для Π΅Π³ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. И Π²ΠΎΡ‚ Ρ‡Ρ‚ΠΎ для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ:

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

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ Π²Ρ‹Π±ΠΎΡ€Ρƒ CNI-ΠΏΠ»Π°Π³ΠΈΠ½Π° для кластСра, стоит ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ сСтСвой ΠΏΠ»Π°Π³ΠΈΠ½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с NetworkPolicy. НапримСр, ΡƒΠΆΠ΅ упомянутый Flannel Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сСтСвыС ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ, ΠΎ Ρ‡Ρ‘ΠΌ прямо сказано Π² ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ. Π’Π°ΠΌ ΠΆΠ΅ упомянута Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° β€” Open Source-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Calico, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ стандартный Π½Π°Π±ΠΎΡ€ API Kubernetes Π² ΠΏΠ»Π°Π½Π΅ сСтСвых ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ.

Calico для сСти Π² Kubernetes: знакомство ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ· ΠΎΠΏΡ‹Ρ‚Π°

Знакомимся с Calico: тСория

Плагин Calico ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ с Flannel (ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Canal) ΠΈΠ»ΠΈ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, покрывая ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ΠΈΡŽ сСтСвой связности, Ρ‚Π°ΠΊ ΠΈ возмоТности управлСния Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒΡŽ.

КакиС возмоТности Π΄Π°Ρ‘Ρ‚ использованиС Β«ΠΊΠΎΡ€ΠΎΠ±ΠΎΡ‡Π½ΠΎΠ³ΠΎΒ» Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ K8s ΠΈ Π½Π°Π±ΠΎΡ€Π° API ΠΈΠ· Calico?

Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ встроСно Π² NetworkPolicy:

  • ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ΠΌ;
  • ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΊ pod’ам, ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹ΠΌ Π»Π΅ΠΉΠ±Π»Π°ΠΌΠΈ;
  • ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Ρ‹ ΠΊ pod’ам, окруТСниям ΠΈΠ»ΠΈ подсСтям;
  • ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹, ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΈΠ»ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ указания ΠΏΠΎΡ€Ρ‚ΠΎΠ².

А Π²ΠΎΡ‚ ΠΊΠ°ΠΊ Calico Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

  • ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ: pod, ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина ΠΈΠ»ΠΈ интСрфСйс;
  • ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ дСйствиС (Π·Π°ΠΏΡ€Π΅Ρ‚, Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅);
  • Π² качСствС Ρ†Π΅Π»ΠΈ ΠΈΠ»ΠΈ источника ΠΏΡ€Π°Π²ΠΈΠ» ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΡ€Ρ‚, Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΏΠΎΡ€Ρ‚ΠΎΠ², ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹, HTTP- ΠΈΠ»ΠΈ ICMP-Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, IP ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΡΠ΅Ρ‚ΡŒ (4 ΠΈΠ»ΠΈ 6 поколСния), Π»ΡŽΠ±Ρ‹Π΅ сСлСкторы (ΡƒΠ·Π»ΠΎΠ², хостов, ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ);
  • Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ настроСк DNAT ΠΈ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ проброса Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°.

ΠŸΠ΅Ρ€Π²Ρ‹Π΅ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ Π½Π° GitHub Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Π‘alico Π΄Π°Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ июлСм 2016 Π³ΠΎΠ΄Π°, Π° ΡƒΠΆΠ΅ Ρ‡Π΅Ρ€Π΅Π· Π³ΠΎΠ΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ занял Π»ΠΈΠ΄ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π² ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ сСтСвой связности Kubernetes β€” ΠΎΠ± этом гласят, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ опроса, ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ The New Stack:

Calico для сСти Π² Kubernetes: знакомство ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ· ΠΎΠΏΡ‹Ρ‚Π°

МногиС ΠΊΡ€ΡƒΠΏΠ½Ρ‹Π΅ managed-Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ с K8s, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Amazon EKS, Azure AKS, Google GKE ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅, стали Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΊ использованию.

Π§Ρ‚ΠΎ касаСтся ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Ρ‚ΡƒΡ‚ всё Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. ΠŸΡ€ΠΈ тСстировании своСго ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Calico продСмонстрировала астрономичСскиС ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, запустив Π±ΠΎΠ»Π΅Π΅ 50000 ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² Π½Π° 500 физичСских ΡƒΠ·Π»Π°Ρ… со ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ создания 20 ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² Π² сСкунду. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΡ€ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π΅ выявлСно. Π’Π°ΠΊΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π±Ρ‹Π»ΠΈ ΠΎΠ·Π²ΡƒΡ‡Π΅Π½Ρ‹ ΡƒΠΆΠ΅ ΠΏΡ€ΠΈ анонсС ΠΏΠ΅Ρ€Π²ΠΎΠΉ вСрсии. НСзависимыС исслСдования, Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ Π½Π° ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ½ΡƒΡŽ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΌΡ‹ потрСблСния рСсурсов, Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π°ΡŽΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Calico, практичСски Π½Π΅ ΡƒΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΡƒΡŽ Flannel. НапримСр:

Calico для сСти Π² Kubernetes: знакомство ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ· ΠΎΠΏΡ‹Ρ‚Π°

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ ΠΎΡ‡Π΅Π½ΡŒ быстро развиваСтся, поддСрТиваСтся Ρ€Π°Π±ΠΎΡ‚Π° Π² популярных Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΡ… managed K8s, OpenShift, OpenStack, имССтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Calico ΠΏΡ€ΠΈ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π½ΠΈΠΈ кластСра с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ kops, Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ упоминания построСния Service Mesh-сСтСй (Π²ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования совмСстно с Istio).

ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° с Calico

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС использования ванильного Kubernetes установка CNI сводится ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡŽ Ρ„Π°ΠΉΠ»Π° calico.yaml, скачанного с ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ сайта, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ kubectl apply -f.

Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ вСрсия ΠΏΠ»Π°Π³ΠΈΠ½Π° совмСстима с 2-3 послСдними вСрсиями Kubernetes: Ρ€Π°Π±ΠΎΡ‚Ρƒ Π² Π±ΠΎΠ»Π΅Π΅ старых вСрсиях Π½Π΅ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΡƒΡŽΡ‚ ΠΈ Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‚. По заявлСниям Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², Calico Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° ядрС Linux Π²Ρ‹ΡˆΠ΅ 3.10 ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ CentOS 7, Ubuntu 16 ΠΈΠ»ΠΈ Debian 8, ΠΏΠΎΠ²Π΅Ρ€Ρ… iptables ΠΈΠ»ΠΈ IPVS.

Π˜Π·ΠΎΠ»ΡΡ†ΠΈΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ окруТСния

Для ΠΎΠ±Ρ‰Π΅Π³ΠΎ понимания рассмотрим простой случай, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Π΅ΠΌ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ сСтСвыС ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Π² Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Calico ΠΎΡ‚ стандартных ΠΈ ΠΊΠ°ΠΊ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ ΡΠΎΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡŽ ΠΏΡ€Π°Π²ΠΈΠ» ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΈΡ… Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΈ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ конфигурирования:

Calico для сСти Π² Kubernetes: знакомство ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ· ΠΎΠΏΡ‹Ρ‚Π°

Π’ кластСрС Ρ€Π°Π·Π²Ρ‘Ρ€Π½ΡƒΡ‚Ρ‹ 2 Π²Π΅Π±-прилоТСния: Π½Π° Node.js ΠΈ PHP, β€” ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Redis. Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ доступ ΠΊ Redis ΠΈΠ· PHP, оставив ΠΏΡ€ΠΈ этом ΡΠ²ΡΠ·Π½ΠΎΡΡ‚ΡŒ с Node.js, достаточно ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ:

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

По сути ΠΌΡ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠ»ΠΈ входящий Ρ‚Ρ€Π°Ρ„ΠΈΠΊ Π½Π° ΠΏΠΎΡ€Ρ‚ Redis ΠΈΠ· Node.js. И явно Π½Π΅ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π»ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ появляСтся 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, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€Π°Π²ΠΈΠ»Π° firewall’а Π½Π° ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΡƒΡŽ, достаточно ΡΠΌΠ΅Π½ΠΈΡ‚ΡŒ action: Allow Π½Π° action: Deny.

Π˜Π·ΠΎΠ»ΡΡ†ΠΈΡ ΠΏΠΎ окруТСниям

Π’Π΅ΠΏΠ΅Ρ€ΡŒ прСдставим ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ бизнСс-ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ для ΠΈΡ… сбора Π² Prometheus ΠΈ дальнСйшСго Π°Π½Π°Π»ΠΈΠ·Π° посрСдством Grafana. Π’ Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅ доступны для всСобщСго обозрСния. Π—Π°ΠΊΡ€ΠΎΠ΅ΠΌ ΠΎΡ‚ посторонних Π³Π»Π°Π· эти Π΄Π°Π½Π½Ρ‹Π΅:

Calico для сСти Π² Kubernetes: знакомство ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ· ΠΎΠΏΡ‹Ρ‚Π°

Prometheus, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, вынСсСн Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ слуТСбноС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ β€” Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ это Π±ΡƒΠ΄Π΅Ρ‚ namespace ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π²ΠΈΠ΄Π°:

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

Напомню, Ρ‡Ρ‚ΠΎ посрСдством Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π° API Calico ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ ΡƒΠ·Π»ΠΎΠ², Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡΡΡŒ pod’ами. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GlobalNetworkPolicy закрываСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ прохоТдСния ICMP-запросов Π² кластСрС (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΈΠ½Π³ΠΈ ΠΈΠ· pod’а Π½Π° ΡƒΠ·Π΅Π», ΠΌΠ΅ΠΆΠ΄Ρƒ pod’ми ΠΈΠ»ΠΈ с ΡƒΠ·Π»Π° Π½Π° IP pod’а):

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-Ρ‚ΡƒΠ½Π½Π΅Π»ΡŒ, ΠΈ этот доступ ТСстко ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌ ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ списком Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹Ρ… ΠΊ использованию сСрвисов:

Calico для сСти Π² Kubernetes: знакомство ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ· ΠΎΠΏΡ‹Ρ‚Π°

ΠšΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ ΠΊ VPN Ρ‡Π΅Ρ€Π΅Π· стандартный UDP-ΠΏΠΎΡ€Ρ‚ 1194 ΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ ΠΊ кластСрным подсСтям pod’ов ΠΈ сСрвисов. ΠŸΠΎΠ΄ΡΠ΅Ρ‚ΠΈ push’атся Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Ρ‚Π΅Ρ€ΡΡ‚ΡŒ сСрвисы ΠΏΡ€ΠΈ пСрСзапусках ΠΈ смСнС адрСсов.

ΠŸΠΎΡ€Ρ‚ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ β€” стандартный, Ρ‡Ρ‚ΠΎ Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡŽΠ°Π½ΡΡ‹ Π½Π° процСсс конфигурирования прилоТСния ΠΈ Π΅Π³ΠΎ пСрСнос Π² Kubernetes-кластСр. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ AWS LoadBalancer для UDP появился Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ³ΠΎ Π³ΠΎΠ΄Π° Π² ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΌ спискС Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ², Π° NodePort нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ·-Π·Π° Π΅Π³ΠΎ проброса Π½Π° всСх ΡƒΠ·Π»Π°Ρ… кластСра ΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ количСство инстансов сСрвСра Π² цСлях отказоустойчивости. Плюс, придСтся ΠΌΠ΅Π½ΡΡ‚ΡŒ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΏΠΎΡ€Ρ‚ΠΎΠ², Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌΡ‹ΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽβ€¦

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π±Ρ‹Π»ΠΎ Π²Ρ‹Π±Ρ€Π°Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

  1. Pod’ы с VPN ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½Π° ΡƒΠ·Π΅Π» Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ hostNetwork, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π½Π° фактичСский IP.
  2. БСрвис Π²Ρ‹Π²Π΅ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ Π½Π°Ρ€ΡƒΠΆΡƒ Ρ‡Π΅Ρ€Π΅Π· ClusterIP. На ΡƒΠ·Π»Π΅ физичСски поднимаСтся ΠΏΠΎΡ€Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ доступСн ΠΈΠ·Π²Π½Π΅ с нСбольшими ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΊΠ°ΠΌΠΈ (условноС Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ IP-адрСса).
  3. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡƒΠ·Π»Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ поднялся pod, Π»Π΅ΠΆΠΈΡ‚ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ нашСго повСствования. Π‘ΠΊΠ°ΠΆΡƒ лишь, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ТСстко Β«ΠΏΡ€ΠΈΠ±ΠΈΡ‚ΡŒΒ» сСрвис ΠΊ ΡƒΠ·Π»Ρƒ ΠΈΠ»ΠΈ ΠΆΠ΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ нСбольшой sidecar-сСрвис, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ IP-адрСсом VPN-сСрвиса ΠΈ ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ 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, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ довольно часто страдаСт ΠΏΡ€ΠΈ составлСнии ΠΏΡ€Π°Π²ΠΈΠ». ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ, ΠΊΠ°ΠΊ Ρ€Π°Π½Π΅Π΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ, ΠΏΡ€ΠΈ появлСнии сСлСктора ΠΊ Π½Π΅ΠΌΡƒ примСняСтся Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ссли Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ ΠΈΠ½ΠΎΠ΅.

Π˜Ρ‚ΠΎΠ³ΠΈ

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ³ΠΎ API Calico ΠΌΠΎΠΆΠ½ΠΎ Π³ΠΈΠ±ΠΊΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ динамичСски ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡŽ Π² кластСрС ΠΈ Π²ΠΎΠΊΡ€ΡƒΠ³ Π½Π΅Π³ΠΎ. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС Π΅Π³ΠΎ использованиС ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ ΡΡ‚Ρ€Π΅Π»ΡŒΠ±Π° ΠΈΠ· ΠΏΡƒΡˆΠΊΠΈ ΠΏΠΎ Π²ΠΎΡ€ΠΎΠ±ΡŒΡΠΌ, Π° Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ L3-сСти с BGP- ΠΈ IP-IP-туннСлями выглядит монструозно Π² простой инсталляции Kubernetes Π² плоской сСти… Однако Π² ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΌ инструмСнт выглядит Π²ΠΏΠΎΠ»Π½Π΅ ТизнСспособным ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ.

Π˜Π·ΠΎΠ»ΡΡ†ΠΈΡ кластСра для обСспСчСния Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ бСзопасности Π½Π΅ всСгда ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌΠ°, ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² Ρ‚Π°ΠΊΠΈΡ… случаях Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Calico (ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅). ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ (с нСбольшой Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… инсталляциях Π½Π°ΡˆΠΈΡ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² Π² AWS.

P.S.

Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π² нашСм Π±Π»ΠΎΠ³Π΅:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com