Π¦Π΅Π»Ρ ΡΡΠ°ΡΡΠΈ β ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡΡ ΡΠΈΡΠ°ΡΠ΅Π»Ρ Ρ ΠΎΡΠ½ΠΎΠ²Π°ΠΌΠΈ ΡΠ΅ΡΠ΅Π²ΠΎΠ³ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΠ΅ΡΠ΅Π²ΡΠΌΠΈ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ°ΠΌΠΈ Π² Kubernetes, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠΎ ΡΡΠΎΡΠΎΠ½Π½ΠΈΠΌ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠΌ Calico, ΡΠ°ΡΡΠΈΡΡΡΡΠΈΠΌ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ. ΠΠΎΠΏΡΡΠ½ΠΎ Π±ΡΠ΄ΡΡ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°Π½Ρ ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΈΡΠΈ Π½Π° ΡΠ΅Π°Π»ΡΠ½ΡΡ
ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ
ΠΈΠ· ΠΎΠΏΡΡΠ° Π½Π°ΡΠ΅ΠΉ ΡΠΊΡΠΏΠ»ΡΠ°ΡΠ°ΡΠΈΠΈ.
ΠΡΡΡΡΠΎΠ΅ Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΡΠ΅ΡΠ΅Π²ΠΎΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ Kubernetes
ΠΠ»Π°ΡΡΠ΅Ρ Kubernetes Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ Π±Π΅Π· ΡΠ΅ΡΠΈ. ΠΡ ΡΠΆΠ΅ ΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»ΠΈ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Ρ ΠΏΠΎ ΠΈΡ
ΠΎΡΠ½ΠΎΠ²Π°ΠΌ: Β«
Π ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠΈ Π²Π°ΠΆΠ½ΠΎ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ Π·Π° ΡΠ΅ΡΠ΅Π²ΡΡ ΡΠ²ΡΠ·Π½ΠΎΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°ΠΌΠΈ ΠΈ ΡΠ·Π»Π°ΠΌΠΈ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π½Π΅ ΡΠ°ΠΌ K8s: Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π²ΡΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Ρ CNI (Container Networking Interface). ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΎΠ± ΡΡΠΎΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ ΠΌΡ
Π ΠΏΡΠΈΠΌΠ΅ΡΡ, Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΡΠΉ ΠΈΠ· ΡΠ°ΠΊΠΈΡ
ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² β
Π Β«ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈΒ» Π΄Π»Ρ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ΅ΡΠ΅Π²ΡΠΌΠΈ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ°ΠΌΠΈ Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅ 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
ΠΡΠΎΡ Π½Π΅ ΡΠ°ΠΌΡΠΉ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΠ·
ΠΠΎΠ³ΠΈΡΠ½ΠΎ, ΡΡΠΎ Π΅ΡΡΡ 2 ΡΠΈΠΏΠ° ΡΡΠ°ΡΠΈΠΊΠ°: Π²Ρ ΠΎΠ΄ΡΡΠΈΠΉ Π² pod (Ingress) ΠΈ ΠΈΡΡ ΠΎΠ΄ΡΡΠΈΠΉ ΠΈΠ· Π½Π΅Π³ΠΎ (Egress).
Π‘ΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, Π½Π° ΡΡΠΈ 2 ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ ΠΏΠΎ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ ΠΈ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ°.
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΉ Π°ΡΡΠΈΠ±ΡΡ β ΡΠ΅Π»Π΅ΠΊΡΠΎΡ; ΡΠΎΡ, ΠΊ ΠΊΠΎΠΌΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ pod (ΠΈΠ»ΠΈ Π³ΡΡΠΏΠΏΠ° podβΠΎΠ²) ΠΈΠ»ΠΈ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ (Ρ.Π΅. ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΈΠΌΠ΅Π½). ΠΠ°ΠΆΠ½Π°Ρ Π΄Π΅ΡΠ°Π»Ρ: ΠΎΠ±Π° Π²ΠΈΠ΄Π° ΡΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΎΠ±ΡΠ·Π°Π½Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΠΌΠ΅ΡΠΊΡ (label Π² ΡΠ΅ΡΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Kubernetes) β ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΠΌΠΈ ΠΎΠΏΠ΅ΡΠΈΡΡΡΡ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ.
ΠΠΎΠΌΠΈΠΌΠΎ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΡΠ»Π° ΡΠ΅Π»Π΅ΠΊΡΠΎΡΠΎΠ², ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΡ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΌΠ΅ΡΠΊΠΎΠΉ, ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΏΡΠ°Π²ΠΈΠ» Π²ΡΠΎΠ΄Π΅ Β«Π Π°Π·ΡΠ΅ΡΠΈΡΡ/Π·Π°ΠΏΡΠ΅ΡΠΈΡΡ Π²ΡΡ/Π²ΡΠ΅ΠΌΒ» Π² ΡΠ°Π·Π½ΡΡ Π²Π°ΡΠΈΠ°ΡΠΈΡΡ . ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π²ΠΈΠ΄Π°:
podSelector: {}
ingress: []
policyTypes:
- Ingress
β Π² ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π²ΡΠ΅ΠΌ podβΠ°ΠΌ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ Π·Π°ΠΊΡΡΠ²Π°Π΅ΡΡΡ Π²Ρ ΠΎΠ΄ΡΡΠΈΠΉ ΡΡΠ°ΡΠΈΠΊ. ΠΡΠΎΡΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡΡΡΡ ΡΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠ΅ΠΉ:
podSelector: {}
ingress:
- {}
policyTypes:
- Ingress
ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Π΄Π»Ρ ΠΈΡΡ ΠΎΠ΄ΡΡΠ΅Π³ΠΎ:
podSelector: {}
policyTypes:
- Egress
β Π΄Π»Ρ Π΅Π³ΠΎ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ. Π Π²ΠΎΡ ΡΡΠΎ Π΄Π»Ρ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ:
podSelector: {}
egress:
- {}
policyTypes:
- Egress
ΠΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΡ ΠΊ Π²ΡΠ±ΠΎΡΡ CNI-ΠΏΠ»Π°Π³ΠΈΠ½Π° Π΄Π»Ρ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°, ΡΡΠΎΠΈΡ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ Π½Π΅ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ΅ΡΠ΅Π²ΠΎΠΉ ΠΏΠ»Π°Π³ΠΈΠ½ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠ°Π±ΠΎΡΡ Ρ NetworkPolicy. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΆΠ΅ ΡΠΏΠΎΠΌΡΠ½ΡΡΡΠΉ Flannel Π½Π΅ ΡΠΌΠ΅Π΅Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅ΡΠ΅Π²ΡΠ΅ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ, ΠΎ ΡΡΠΌ
ΠΠ½Π°ΠΊΠΎΠΌΠΈΠΌΡΡ Ρ Calico: ΡΠ΅ΠΎΡΠΈΡ
ΠΠ»Π°Π³ΠΈΠ½ Calico ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π² ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Ρ Flannel (ΠΏΠΎΠ΄ΠΏΡΠΎΠ΅ΠΊΡ
ΠΠ°ΠΊΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π΄Π°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Β«ΠΊΠΎΡΠΎΠ±ΠΎΡΠ½ΠΎΠ³ΠΎΒ» ΡΠ΅ΡΠ΅Π½ΠΈΡ K8s ΠΈ Π½Π°Π±ΠΎΡΠ° API ΠΈΠ· Calico?
ΠΠΎΡ ΡΡΠΎ Π²ΡΡΡΠΎΠ΅Π½ΠΎ Π² NetworkPolicy:
- ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Ρ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ΠΌ;
- ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ ΠΊ podβΠ°ΠΌ, ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Π½ΡΠΌ Π»Π΅ΠΉΠ±Π»Π°ΠΌΠΈ;
- ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½Ρ ΠΊ podβΠ°ΠΌ, ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡΠΌ ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΡΠ΅ΡΡΠΌ;
- ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΌΠΎΠ³ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ, ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΈΠ»ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠ΅ ΡΠΊΠ°Π·Π°Π½ΠΈΡ ΠΏΠΎΡΡΠΎΠ².
Π Π²ΠΎΡ ΠΊΠ°ΠΊ Calico ΡΠ°ΡΡΠΈΡΡΠ΅Ρ ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ:
- ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ ΠΌΠΎΠ³ΡΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ ΠΊ Π»ΡΠ±ΠΎΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ: pod, ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, Π²ΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΠΌΠ°ΡΠΈΠ½Π° ΠΈΠ»ΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ;
- ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΌΠΎΠ³ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ (Π·Π°ΠΏΡΠ΅Ρ, ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅);
- Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ΅Π»ΠΈ ΠΈΠ»ΠΈ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° ΠΏΡΠ°Π²ΠΈΠ» ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΡΡ, Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΏΠΎΡΡΠΎΠ², ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ, HTTP- ΠΈΠ»ΠΈ ICMP-Π°ΡΡΠΈΠ±ΡΡΡ, IP ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΡΠ΅ΡΡ (4 ΠΈΠ»ΠΈ 6 ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΡ), Π»ΡΠ±ΡΠ΅ ΡΠ΅Π»Π΅ΠΊΡΠΎΡΡ (ΡΠ·Π»ΠΎΠ², Ρ ΠΎΡΡΠΎΠ², ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΉ);
- Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Π³ΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΡΠ°ΡΠΈΠΊΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π½Π°ΡΡΡΠΎΠ΅ΠΊ DNAT ΠΈ ΠΏΠΎΠ»ΠΈΡΠΈΠΊ ΠΏΡΠΎΠ±ΡΠΎΡΠ° ΡΡΠ°ΡΠΈΠΊΠ°.
ΠΠ΅ΡΠ²ΡΠ΅ ΠΊΠΎΠΌΠΌΠΈΡΡ Π½Π° GitHub Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ Π‘alico Π΄Π°ΡΠΈΡΡΡΡΡΡ ΠΈΡΠ»Π΅ΠΌ 2016 Π³ΠΎΠ΄Π°, Π° ΡΠΆΠ΅ ΡΠ΅ΡΠ΅Π· Π³ΠΎΠ΄ ΠΏΡΠΎΠ΅ΠΊΡ Π·Π°Π½ΡΠ» Π»ΠΈΠ΄ΠΈΡΡΡΡΠΈΠ΅ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ Π² ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΅ΡΠ΅Π²ΠΎΠΉ ΡΠ²ΡΠ·Π½ΠΎΡΡΠΈ Kubernetes β ΠΎΠ± ΡΡΠΎΠΌ Π³Π»Π°ΡΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΎΠΏΡΠΎΡΠ°,
ΠΠ½ΠΎΠ³ΠΈΠ΅ ΠΊΡΡΠΏΠ½ΡΠ΅ managed-ΡΠ΅ΡΠ΅Π½ΠΈΡ Ρ K8s, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ
Π§ΡΠΎ ΠΊΠ°ΡΠ°Π΅ΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, ΡΡΡ Π²ΡΡ Π·Π°ΠΌΠ΅ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎ. ΠΡΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΏΡΠΎΠ΄ΡΠΊΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Calico ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°Π»Π° Π°ΡΡΡΠΎΠ½ΠΎΠΌΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ, Π·Π°ΠΏΡΡΡΠΈΠ² Π±ΠΎΠ»Π΅Π΅ 50000 ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² Π½Π° 500 ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈΡ
ΡΠ·Π»Π°Ρ
ΡΠΎ ΡΠΊΠΎΡΠΎΡΡΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ 20 ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ. ΠΡΠΎΠ±Π»Π΅ΠΌ ΠΏΡΠΈ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π½Π΅ Π²ΡΡΠ²Π»Π΅Π½ΠΎ. Π’Π°ΠΊΠΈΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ
ΠΡΠΎΠ΅ΠΊΡ ΠΎΡΠ΅Π½Ρ Π±ΡΡΡΡΠΎ ΡΠ°Π·Π²ΠΈΠ²Π°Π΅ΡΡΡ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΡΠ°Π±ΠΎΡΠ° Π² ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΡ
ΡΠ΅ΡΠ΅Π½ΠΈΡΡ
managed K8s, OpenShift, OpenStack, ΠΈΠΌΠ΅Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Calico ΠΏΡΠΈ ΡΠ°Π·Π²ΠΎΡΠ°ΡΠΈΠ²Π°Π½ΠΈΠΈ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ
ΠΡΠ°ΠΊΡΠΈΠΊΠ° Ρ Calico
Π ΠΎΠ±ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π²Π°Π½ΠΈΠ»ΡΠ½ΠΎΠ³ΠΎ Kubernetes ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° CNI ΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΊ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ°ΠΉΠ»Π° calico.yaml
, kubectl apply -f
.
ΠΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, Π°ΠΊΡΡΠ°Π»ΡΠ½Π°Ρ Π²Π΅ΡΡΠΈΡ ΠΏΠ»Π°Π³ΠΈΠ½Π° ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠ° Ρ 2-3 ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΌΠΈ Π²Π΅ΡΡΠΈΡΠΌΠΈ Kubernetes: ΡΠ°Π±ΠΎΡΡ Π² Π±ΠΎΠ»Π΅Π΅ ΡΡΠ°ΡΡΡ Π²Π΅ΡΡΠΈΡΡ Π½Π΅ ΡΠ΅ΡΡΠΈΡΡΡΡ ΠΈ Π½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΡΡΡ. ΠΠΎ Π·Π°ΡΠ²Π»Π΅Π½ΠΈΡΠΌ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ², Calico ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π° ΡΠ΄ΡΠ΅ Linux Π²ΡΡΠ΅ 3.10 ΠΏΠΎΠ΄ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ CentOS 7, Ubuntu 16 ΠΈΠ»ΠΈ Debian 8, ΠΏΠΎΠ²Π΅ΡΡ iptables ΠΈΠ»ΠΈ IPVS.
ΠΠ·ΠΎΠ»ΡΡΠΈΡ Π²Π½ΡΡΡΠΈ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
ΠΠ»Ρ ΠΎΠ±ΡΠ΅Π³ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠ»ΡΡΠ°ΠΉ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ½ΡΡΡ, ΡΠ΅ΠΌ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ ΡΠ΅ΡΠ΅Π²ΡΠ΅ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ Π² Π½ΠΎΡΠ°ΡΠΈΠΈ Calico ΠΎΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΠΈ ΠΊΠ°ΠΊ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΊ ΡΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΡΠ°Π²ΠΈΠ» ΡΠΏΡΠΎΡΠ°Π΅Ρ ΠΈΡ ΡΠΈΡΠ°Π΅ΠΌΠΎΡΡΡ ΠΈ Π³ΠΈΠ±ΠΊΠΎΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ:
Π ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅ ΡΠ°Π·Π²ΡΡΠ½ΡΡΡ 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βΠ° Β«ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈΒ», Π½ΠΎ Π½ΠΈΡΡΠΎ Π½Π΅ ΠΌΠ΅ΡΠ°Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ
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. Π Π²ΡΠ³ΡΡΠ·ΠΊΠ΅ ΠΌΠΎΠ³ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡΡΡ ΡΡΠ²ΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΎΠΏΡΡΡ ΠΆΠ΅ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π΄Π»Ρ Π²ΡΠ΅ΠΎΠ±ΡΠ΅Π³ΠΎ ΠΎΠ±ΠΎΠ·ΡΠ΅Π½ΠΈΡ. ΠΠ°ΠΊΡΠΎΠ΅ΠΌ ΠΎΡ ΠΏΠΎΡΡΠΎΡΠΎΠ½Π½ΠΈΡ Π³Π»Π°Π· ΡΡΠΈ Π΄Π°Π½Π½ΡΠ΅:
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-ΡΡΠ½Π½Π΅Π»Ρ, ΠΈ ΡΡΠΎΡ Π΄ΠΎΡΡΡΠΏ ΠΆΠ΅ΡΡΠΊΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠ΅ΠΌ ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ ΡΠΏΠΈΡΠΊΠΎΠΌ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π½ΡΡ ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ²:
ΠΠ»ΠΈΠ΅Π½ΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡΡΡ ΠΊ VPN ΡΠ΅ΡΠ΅Π· ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ UDP-ΠΏΠΎΡΡ 1194 ΠΈ ΠΏΡΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΌΠ°ΡΡΡΡΡΡ ΠΊ ΠΊΠ»Π°ΡΡΠ΅ΡΠ½ΡΠΌ ΠΏΠΎΠ΄ΡΠ΅ΡΡΠΌ podβΠΎΠ² ΠΈ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ². ΠΠΎΠ΄ΡΠ΅ΡΠΈ pushβΠ°ΡΡΡ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ, ΡΡΠΎΠ±Ρ Π½Π΅ ΡΠ΅ΡΡΡΡ ΡΠ΅ΡΠ²ΠΈΡΡ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ°Ρ
ΠΈ ΡΠΌΠ΅Π½Π΅ Π°Π΄ΡΠ΅ΡΠΎΠ².
ΠΠΎΡΡ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ β ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ, ΡΡΠΎ Π½Π°ΠΊΠ»Π°Π΄ΡΠ²Π°Π΅Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠ°Π½ΡΡ Π½Π° ΠΏΡΠΎΡΠ΅ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ Π΅Π³ΠΎ ΠΏΠ΅ΡΠ΅Π½ΠΎΡ Π² Kubernetes-ΠΊΠ»Π°ΡΡΠ΅Ρ. Π ΠΏΡΠΈΠΌΠ΅ΡΡ, Π² ΡΠΎΠΌ ΠΆΠ΅ AWS LoadBalancer Π΄Π»Ρ UDP ΠΏΠΎΡΠ²ΠΈΠ»ΡΡ Π±ΡΠΊΠ²Π°Π»ΡΠ½ΠΎ Π² ΠΊΠΎΠ½ΡΠ΅ ΠΏΡΠΎΡΠ»ΠΎΠ³ΠΎ Π³ΠΎΠ΄Π° Π² ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΠΎΠΌ ΡΠΏΠΈΡΠΊΠ΅ ΡΠ΅Π³ΠΈΠΎΠ½ΠΎΠ², Π° NodePort Π½Π΅Π»ΡΠ·Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ·-Π·Π° Π΅Π³ΠΎ ΠΏΡΠΎΠ±ΡΠΎΡΠ° Π½Π° Π²ΡΠ΅Ρ ΡΠ·Π»Π°Ρ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° ΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΈΠ½ΡΡΠ°Π½ΡΠΎΠ² ΡΠ΅ΡΠ²Π΅ΡΠ° Π² ΡΠ΅Π»ΡΡ ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΠΈ. ΠΠ»ΡΡ, ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΌΠ΅Π½ΡΡΡ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΏΠΎΡΡΠΎΠ², Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌΡΠΉ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡβ¦
Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΏΠ΅ΡΠ΅Π±ΠΎΡΠ° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ Π±ΡΠ»ΠΎ Π²ΡΠ±ΡΠ°Π½ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅:
- PodβΡ Ρ VPN ΠΏΠ»Π°Π½ΠΈΡΡΡΡΡΡ Π½Π° ΡΠ·Π΅Π» Π² ΡΠ΅ΠΆΠΈΠΌΠ΅
hostNetwork
, ΡΠΎ Π΅ΡΡΡ Π½Π° ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ IP. - Π‘Π΅ΡΠ²ΠΈΡ Π²ΡΠ²Π΅ΡΠΈΠ²Π°Π΅ΡΡΡ Π½Π°ΡΡΠΆΡ ΡΠ΅ΡΠ΅Π·
ClusterIP
. ΠΠ° ΡΠ·Π»Π΅ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π΅ΡΡΡ ΠΏΠΎΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΈΠ·Π²Π½Π΅ Ρ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΠΎΠ³ΠΎΠ²ΠΎΡΠΊΠ°ΠΌΠΈ (ΡΡΠ»ΠΎΠ²Π½ΠΎΠ΅ Π½Π°Π»ΠΈΡΠΈΠ΅ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ IP-Π°Π΄ΡΠ΅ΡΠ°). - ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ·Π»Π°, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΏΠΎΠ΄Π½ΡΠ»ΡΡ 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.
Π§ΠΈΡΠ°ΠΉΡΠ΅ ΡΠ°ΠΊΠΆΠ΅ Π² Π½Π°ΡΠ΅ΠΌ Π±Π»ΠΎΠ³Π΅:
- Β«
ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΡΠ΅ΡΠ΅Π²ΡΠ΅ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ Kubernetes Π΄Π»Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡΠΎΠ² ΠΏΠΎ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Β»; - Β«ΠΠ»Π»ΡΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΏΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Ρ ΡΠ΅ΡΠΈ Π² KubernetesΒ»:
ΡΠ°ΡΡΠΈ 1 ΠΈ 2 (ΡΠ΅ΡΠ΅Π²Π°Ρ ΠΌΠΎΠ΄Π΅Π»Ρ, ΠΎΠ²Π΅ΡΠ»Π΅ΠΉΠ½ΡΠ΅ ΡΠ΅ΡΠΈ) ,ΡΠ°ΡΡΡ 3 (ΡΠ΅ΡΠ²ΠΈΡΡ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΡΠ°ΡΠΈΠΊΠ°) ; - Β«
Container Networking Interface (CNI) β ΡΠ΅ΡΠ΅Π²ΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΈ ΡΡΠ°Π½Π΄Π°ΡΡ Π΄Π»Ρ Linux-ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² Β».
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com