Calico ืœื ื˜ื•ื•ืจืงื™ื ื’ ื‘-Kubernetes: ื”ื™ื›ืจื•ืช ื•ืงืฆืช ื ื™ืกื™ื•ืŸ

Calico ืœื ื˜ื•ื•ืจืงื™ื ื’ ื‘-Kubernetes: ื”ื™ื›ืจื•ืช ื•ืงืฆืช ื ื™ืกื™ื•ืŸ

ืžื˜ืจืช ื”ืžืืžืจ ื”ื™ื ืœื”ืฆื™ื’ ืœืงื•ืจื ืืช ื”ื™ืกื•ื“ื•ืช ืฉืœ ืจืฉืชื•ืช ื•ื ื™ื”ื•ืœ ืžื“ื™ื ื™ื•ืช ืจืฉืช ื‘-Kubernetes, ื›ืžื• ื’ื ืืช ื”ืชื•ืกืฃ Calico ืฉืœ ืฆื“ ืฉืœื™ืฉื™ ื”ืžืจื—ื™ื‘ ืืช ื”ื™ื›ื•ืœื•ืช ื”ืกื˜ื ื“ืจื˜ื™ื•ืช. ืœืื•ืจืš ื”ื“ืจืš, ืงืœื•ืช ื”ืชืฆื•ืจื” ื•ื›ืžื” ืชื›ื•ื ื•ืช ื™ื•ื“ื’ืžื• ื‘ืืžืฆืขื•ืช ื“ื•ื’ืžืื•ืช ืืžื™ืชื™ื•ืช ืžื ื™ืกื™ื•ืŸ ื”ืชืคืขื•ืœ ืฉืœื ื•.

ืžื‘ื•ื ืžื”ื™ืจ ืœืžื›ืฉื™ืจ ื”ืจืฉืช ืฉืœ Kubernetes

ืœื ื ื™ืชืŸ ืœื“ืžื™ื™ืŸ ืืฉื›ื•ืœ Kubernetes ืœืœื ืจืฉืช. ื›ื‘ืจ ืคืจืกืžื ื• ื—ื•ืžืจื™ื ืขืœ ื”ื™ืกื•ื“ื•ืช ืฉืœื”ื: "ืžื“ืจื™ืš ืžืื•ื™ืจ ืœืจืฉืช ื‘-Kubernetes"ื•"ืžื‘ื•ื ืœืžื“ื™ื ื™ื•ืช ื”ืจืฉืช ืฉืœ Kubernetes ืœืื ืฉื™ ืื‘ื˜ื—ื”".

ื‘ื”ืงืฉืจ ืฉืœ ืžืืžืจ ื–ื”, ื—ืฉื•ื‘ ืœืฆื™ื™ืŸ ื›ื™ K8s ืขืฆืžื” ืื™ื ื” ืื—ืจืื™ืช ืœืงื™ืฉื•ืจื™ื•ืช ื”ืจืฉืช ื‘ื™ืŸ ืงื•ื ื˜ื™ื™ื ืจื™ื ื•ืฆืžืชื™ื: ืœืฉื ื›ืš, ืชื•ืกืคื™ื ืฉืœ CNI (ืžืžืฉืง ืจืฉืช ืžื™ื›ืœ). ืขื•ื“ ืขืœ ื”ืจืขื™ื•ืŸ ื”ื–ื” ืื ื—ื ื• ื”ื ื’ื ืืžืจื• ืœื™.

ืœื“ื•ื’ืžื”, ื”ื ืคื•ืฅ ื‘ื™ื•ืชืจ ืžื‘ื™ืŸ ื”ืชื•ืกืคื™ื ื”ืœืœื• ื”ื•ื ืคืœึธื ึถืœ - ืžืกืคืง ืงื™ืฉื•ืจื™ื•ืช ืจืฉืช ืžืœืื” ื‘ื™ืŸ ื›ืœ ืฆืžืชื™ ื”ืืฉื›ื•ืœ ืขืœ ื™ื“ื™ ื”ืจืžืช ื’ืฉืจื™ื ืขืœ ื›ืœ ืฆื•ืžืช, ื”ืงืฆืืช ืจืฉืช ืžืฉื ื” ืœื•. ืขื ื–ืืช, ื ื’ื™ืฉื•ืช ืžืœืื” ื•ื‘ืœืชื™ ืžื•ืกื“ืจืช ืœื ืชืžื™ื“ ืžื•ืขื™ืœื”. ื›ื“ื™ ืœืกืคืง ืื™ื–ืฉื”ื• ื‘ื™ื“ื•ื“ ืžื™ื ื™ืžืœื™ ื‘ืืฉื›ื•ืœ, ื™ืฉ ืฆื•ืจืš ืœื”ืชืขืจื‘ ื‘ืชืฆื•ืจืช ื—ื•ืžืช ื”ืืฉ. ื‘ืžืงืจื” ื”ื›ืœืœื™, ื”ื•ื ื ืชื•ืŸ ืœืฉืœื™ื˜ืชื• ืฉืœ ืื•ืชื• CNI, ื•ื–ื• ื”ืกื™ื‘ื” ืฉื›ืœ ื”ืชืขืจื‘ื•ืช ืฉืœ ืฆื“ ืฉืœื™ืฉื™ ื‘-iptables ื™ื›ื•ืœื” ืœื”ืชืคืจืฉ ื‘ืื•ืคืŸ ืฉื’ื•ื™ ืื• ืœื”ืชืขืœื ืœื—ืœื•ื˜ื™ืŸ.

ืžืกื•ืคืง "ืžื—ื•ืฅ ืœืงื•ืคืกื”" ืœืืจื’ื•ืŸ ื ื™ื”ื•ืœ ืžื“ื™ื ื™ื•ืช ืจืฉืช ื‘ืืฉื›ื•ืœ Kubernetes NetworkPolicy API. ืžืฉืื‘ ื–ื”, ื”ืžื•ืคืฅ ืขืœ ืคื ื™ ืžืจื—ื‘ื™ ืฉืžื•ืช ื ื‘ื—ืจื™ื, ืขืฉื•ื™ ืœื”ื›ื™ืœ ื›ืœืœื™ื ืœื”ื‘ื“ื™ืœ ื‘ื™ืŸ ื’ื™ืฉื” ืžืืคืœื™ืงืฆื™ื” ืื—ืช ืœืื—ืจืช. ื–ื” ื’ื ืžืืคืฉืจ ืœืš ืœื”ื’ื“ื™ืจ ื ื’ื™ืฉื•ืช ื‘ื™ืŸ ืชืจืžื™ืœื™ื ืกืคืฆื™ืคื™ื™ื, ืกื‘ื™ื‘ื•ืช (ืžืจื—ื‘ื™ ืฉืžื•ืช) ืื• ื‘ืœื•ืงื™ื ืฉืœ ื›ืชื•ื‘ื•ืช 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 ืกื•ื’ื™ ืชืขื‘ื•ืจื”: ื›ื ื™ืกื” ืœืคื•ื“ (Ingress) ื•ื™ืฆื™ืื” ืžืžื ื• (Egress).

Calico ืœื ื˜ื•ื•ืจืงื™ื ื’ ื‘-Kubernetes: ื”ื™ื›ืจื•ืช ื•ืงืฆืช ื ื™ืกื™ื•ืŸ

ืœืžืขืฉื”, ื”ืคื•ืœื™ื˜ื™ืงื” ืžื—ื•ืœืงืช ืœ-2 ื”ืงื˜ื’ื•ืจื™ื•ืช ื”ืœืœื• ืขืœ ืกืžืš ื›ื™ื•ื•ืŸ ื”ืชื ื•ืขื”.

ื”ืชื›ื•ื ื” ื”ื ื“ืจืฉืช ื”ื‘ืื” ื”ื™ื ื‘ื•ืจืจ; ื–ื” ืฉื”ื›ืœืœ ื—ืœ ืขืœื™ื•. ื–ื” ื™ื›ื•ืœ ืœื”ื™ื•ืช ืคื•ื“ (ืื• ืงื‘ื•ืฆืช ืคื•ื“ื™ื) ืื• ืกื‘ื™ื‘ื” (ื›ืœื•ืžืจ ืžืจื—ื‘ ืฉืžื•ืช). ืคืจื˜ ื—ืฉื•ื‘: ืฉื ื™ ืกื•ื’ื™ ื”ืื•ื‘ื™ื™ืงื˜ื™ื ื”ืœืœื• ื—ื™ื™ื‘ื™ื ืœื”ื›ื™ืœ ืชื•ื•ื™ืช (ืชื•ื•ื™ืช ื‘ื˜ืจืžื™ื ื•ืœื•ื’ื™ื” ืฉืœ Kubernetes) - ืืœื” ื”ื ืืœื” ืฉืคื•ืœื™ื˜ื™ืงืื™ื ืคื•ืขืœื™ื ืื™ืชื.

ื‘ื ื•ืกืฃ ืœืžืกืคืจ ืกื•ืคื™ ืฉืœ ื‘ื•ืจืจื™ื ื”ืžืื•ื—ื“ื™ื ืขืœ ื™ื“ื™ ืชื•ื•ื™ืช ื›ืœืฉื”ื™, ืืคืฉืจ ืœื›ืชื•ื‘ ื›ืœืœื™ื ื›ืžื• "ืืคืฉืจ/ื”ื›ื—ื™ืฉ ื”ื›ืœ/ื›ื•ืœื" ื‘ื•ื•ืจื™ืืฆื™ื•ืช ืฉื•ื ื•ืช. ืœืžื˜ืจื” ื–ื• ืžืฉืชืžืฉื™ื ื‘ืžื‘ื ื™ื ืฉืœ ื”ื˜ื•ืคืก:

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

- ื‘ื“ื•ื’ืžื” ื–ื•, ื›ืœ ื”ืคื•ื“ื™ื ื‘ืกื‘ื™ื‘ื” ื—ืกื•ืžื™ื ืžืชื ื•ืขื” ื ื›ื ืกืช. ื ื™ืชืŸ ืœื”ืฉื™ื’ ื”ืชื ื”ื’ื•ืช ื”ืคื•ื›ื” ืขื ื”ื‘ื ื™ื™ื” ื”ื‘ืื”:

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

ื‘ืื•ืคืŸ ื“ื•ืžื” ืขื‘ื•ืจ ื™ื•ืฆืื™ื:

  podSelector: {}
  policyTypes:
  - Egress

- ื›ื“ื™ ืœื›ื‘ื•ืช ืื•ืชื•. ื•ื”ื ื” ืžื” ืฉืฆืจื™ืš ืœื›ืœื•ืœ:

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

ืื ื ื—ื–ื•ืจ ืœื‘ื—ื™ืจืช ืชื•ืกืฃ CNI ืœืืฉื›ื•ืœ, ืจืื•ื™ ืœืฆื™ื™ืŸ ื–ืืช ืœื ื›ืœ ืชื•ืกืฃ ืจืฉืช ืชื•ืžืš ื‘-NetworkPolicy. ืœื“ื•ื’ืžื”, ื”ืคืœื ืœ ืฉื”ื•ื–ื›ืจ ื›ื‘ืจ ืœื ื™ื•ื“ืข ืื™ืš ืœื”ื’ื“ื™ืจ ืžื“ื™ื ื™ื•ืช ืจืฉืช, ืืฉืจ ื–ื” ื ืืžืจ ื™ืฉื™ืจื•ืช ื‘ืžืื’ืจ ื”ืจืฉืžื™. ืžื•ื–ื›ืจืช ืฉื ื’ื ืืœื˜ืจื ื˜ื™ื‘ื” - ืคืจื•ื™ืงื˜ ืงื•ื“ ืคืชื•ื— ืงืืœื™ืงื•, ืžื” ืฉืžืจื—ื™ื‘ ื‘ืื•ืคืŸ ืžืฉืžืขื•ืชื™ ืืช ื”ืกื˜ ื”ืกื˜ื ื“ืจื˜ื™ ืฉืœ ืžืžืฉืงื™ API ืฉืœ Kubernetes ืžื‘ื—ื™ื ืช ืžื“ื™ื ื™ื•ืช ืจืฉืช.

Calico ืœื ื˜ื•ื•ืจืงื™ื ื’ ื‘-Kubernetes: ื”ื™ื›ืจื•ืช ื•ืงืฆืช ื ื™ืกื™ื•ืŸ

ื”ื™ื›ืจื•ืช ืขื Calico: ืชื™ืื•ืจื™ื”

ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ืชื•ืกืฃ Calico ื‘ืฉื™ืœื•ื‘ ืขื ืคืœื ืœ (ืชืช-ืคืจื•ื™ืงื˜ ืชืขืœื”) ืื• ื‘ืื•ืคืŸ ืขืฆืžืื™, ื”ืžื›ืกื” ื”ืŸ ืงื™ืฉื•ืจื™ื•ืช ืจืฉืช ื•ื”ืŸ ื™ื›ื•ืœื•ืช ื ื™ื”ื•ืœ ื–ืžื™ื ื•ืช.

ืื™ืœื• ื”ื–ื“ืžื ื•ื™ื•ืช ืžืกืคืง ื”ืฉื™ืžื•ืฉ ื‘ืคืชืจื•ืŸ ื”"ืงื•ืคืกื" ืฉืœ K8s ื•ื‘ืขืจื›ืช ื”-API ืฉืœ Calico?

ื”ื ื” ืžื” ืฉืžื•ื‘ื ื” ื‘-NetworkPolicy:

  • ืคื•ืœื™ื˜ื™ืงืื™ื ืžื•ื’ื‘ืœื™ื ืขืœ ื™ื“ื™ ื”ืกื‘ื™ื‘ื”;
  • ืžื“ื™ื ื™ื•ืช ื—ืœื” ืขืœ ืชืจืžื™ืœื™ื ื”ืžืกื•ืžื ื™ื ื‘ืชื•ื•ื™ื•ืช;
  • ื ื™ืชืŸ ืœื”ื—ื™ืœ ื›ืœืœื™ื ืขืœ ืชืจืžื™ืœื™ื, ืกื‘ื™ื‘ื•ืช ืื• ืจืฉืชื•ืช ืžืฉื ื”;
  • ื›ืœืœื™ื ื™ื›ื•ืœื™ื ืœื”ื›ื™ืœ ืคืจื•ื˜ื•ืงื•ืœื™ื, ืžืคืจื˜ื™ ื™ืฆื™ืื•ืช ื‘ืฉืžื•ืช ืื• ืกืžืœื™ื™ื.

ื›ืš ืžืจื—ื™ื‘ื” Calico ืืช ื”ืคื•ื ืงืฆื™ื•ืช ื”ืœืœื•:

  • ื ื™ืชืŸ ืœื”ื—ื™ืœ ืžื“ื™ื ื™ื•ืช ืขืœ ื›ืœ ืื•ื‘ื™ื™ืงื˜: ืคื•ื“, ืžื™ื›ืœ, ืžื›ื•ื ื” ื•ื™ืจื˜ื•ืืœื™ืช ืื• ืžืžืฉืง;
  • ื›ืœืœื™ื ื™ื›ื•ืœื™ื ืœื”ื›ื™ืœ ืคืขื•ืœื” ืกืคืฆื™ืคื™ืช (ืื™ืกื•ืจ, ื”ืจืฉืื”, ืจื™ืฉื•ื);
  • ื”ื™ืขื“ ืื• ืžืงื•ืจ ื”ื›ืœืœื™ื ื™ื›ื•ืœื™ื ืœื”ื™ื•ืช ื™ืฆื™ืื”, ืžื’ื•ื•ืŸ ื™ืฆื™ืื•ืช, ืคืจื•ื˜ื•ืงื•ืœื™ื, ืชื›ื•ื ื•ืช HTTP ืื• ICMP, IP ืื• ืจืฉืช ืžืฉื ื” (ื“ื•ืจ 4 ืื• 6), ื›ืœ ื‘ื•ืจืจ (ืฆืžืชื™ื, ืžืืจื—ื™ื, ืกื‘ื™ื‘ื•ืช);
  • ื‘ื ื•ืกืฃ, ืืชื” ื™ื›ื•ืœ ืœื•ื•ืกืช ืืช ืžืขื‘ืจ ื”ืชืขื‘ื•ืจื” ื‘ืืžืฆืขื•ืช ื”ื’ื“ืจื•ืช DNAT ื•ืžื“ื™ื ื™ื•ืช ื”ืขื‘ืจืช ืชืขื‘ื•ืจื”.

ื”ื”ืชื—ื™ื™ื‘ื•ื™ื•ืช ื”ืจืืฉื•ื ื•ืช ื‘-GitHub ื‘ืžืื’ืจ Calico ืžืชื•ืืจื›ื•ืช ืœื™ื•ืœื™ 2016, ื•ืฉื ื” ืœืื—ืจ ืžื›ืŸ ืชืคืก ื”ืคืจื•ื™ืงื˜ ืขืžื“ื” ืžื•ื‘ื™ืœื” ื‘ืืจื’ื•ืŸ ืงื™ืฉื•ืจื™ื•ืช ืจืฉืช Kubernetes - ืขืœ ื›ืš ืžืขื™ื“ื™ื, ืœืžืฉืœ, ืชื•ืฆืื•ืช ื”ืกืงืจ, ื‘ื ื™ืฆื•ื—ื• ืฉืœ The New Stack:

Calico ืœื ื˜ื•ื•ืจืงื™ื ื’ ื‘-Kubernetes: ื”ื™ื›ืจื•ืช ื•ืงืฆืช ื ื™ืกื™ื•ืŸ

ื”ืจื‘ื” ืคืชืจื•ื ื•ืช ืžื ื•ื”ืœื™ื ื’ื“ื•ืœื™ื ืขื K8s, ื›ื’ื•ืŸ ืืžื–ื•ืŸ EKS, ืชื›ืœืช AKS, ื’ื•ื’ืœ GKE ื•ืื—ืจื™ื ื”ื—ืœื• ืœื”ืžืœื™ืฅ โ€‹โ€‹ืขืœื™ื• ืœืฉื™ืžื•ืฉ.

ืœื’ื‘ื™ ื‘ื™ืฆื•ืขื™ื, ื”ื›ืœ ืžืฆื•ื™ืŸ ื›ืืŸ. ื‘ื‘ื“ื™ืงืช ื”ืžื•ืฆืจ ืฉืœื”ื, ืฆื•ื•ืช ื”ืคื™ืชื•ื— ืฉืœ Calico ื”ืคื’ื™ืŸ ื‘ื™ืฆื•ืขื™ื ืืกื˜ืจื•ื ื•ืžื™ื™ื, ื›ืฉื”ื•ื ืžืจื™ืฅ ื™ื•ืชืจ ืž-50000 ืžื›ื•ืœื•ืช ืขืœ 500 ืฆืžืชื™ื ืคื™ื–ื™ื™ื ืขื ืงืฆื‘ ื™ืฆื™ืจื” ืฉืœ 20 ืžื›ื•ืœื•ืช ื‘ืฉื ื™ื™ื”. ืœื ื–ื•ื”ื• ื‘ืขื™ื•ืช ื‘ืงื ื” ืžื™ื“ื”. ืชื•ืฆืื•ืช ื›ืืœื” ื”ื•ื›ืจื–ื• ื›ื‘ืจ ื‘ื”ื›ืจื–ื” ืขืœ ื”ื’ืจืกื” ื”ืจืืฉื•ื ื”. ืžื—ืงืจื™ื ืขืฆืžืื™ื™ื ื”ืžืชืžืงื“ื™ื ื‘ืชืคื•ืงื” ื•ืฆืจื™ื›ืช ืžืฉืื‘ื™ื ื’ื ืžืืฉืจื™ื ืฉื”ื‘ื™ืฆื•ืขื™ื ืฉืœ Calico ื˜ื•ื‘ื™ื ื›ืžืขื˜ ื›ืžื• ืฉืœ ืคืœื ืœ. ืœืžืฉืœ:

Calico ืœื ื˜ื•ื•ืจืงื™ื ื’ ื‘-Kubernetes: ื”ื™ื›ืจื•ืช ื•ืงืฆืช ื ื™ืกื™ื•ืŸ

ื”ืคืจื•ื™ืงื˜ ืžืชืคืชื— ืžื”ืจ ืžืื•ื“, ื”ื•ื ืชื•ืžืš ื‘ืขื‘ื•ื“ื” ื‘ืคืชืจื•ื ื•ืช ืคื•ืคื•ืœืจื™ื™ื ืžื ื•ื”ืœื™ื K8s, OpenShift, OpenStack, ืืคืฉืจ ืœื”ืฉืชืžืฉ ื‘-Calico ื‘ืขืช ืคืจื™ืกืช ืืฉื›ื•ืœ ื‘ืืžืฆืขื•ืช ื‘ึผึฐืขึดื™ื˜ึธื”, ื™ืฉื ืŸ ื”ืชื™ื™ื—ืกื•ื™ื•ืช ืœื‘ื ื™ื™ืช ืจืฉืชื•ืช Service Mesh (ื”ื ื” ื“ื•ื’ืžื” ื‘ืฉื™ืžื•ืฉ ื‘ืฉื™ืœื•ื‘ ืขื Istio).

ืชืชืืžืŸ ืขื Calico

ื‘ืžืงืจื” ื”ื›ืœืœื™ ืฉืœ ืฉื™ืžื•ืฉ ื‘- Vanilla Kubernetes, ื”ืชืงื ืช CNI ืžืกืชื›ืžืช ื‘ืฉื™ืžื•ืฉ ื‘ืงื•ื‘ืฅ calico.yaml, ื”ื•ืจื“ื” ืžื”ืืชืจ ื”ืจืฉืžื™, ืขืœ ื™ื“ื™ ืฉื™ืžื•ืฉ ื‘ kubectl apply -f.

ื›ื›ืœืœ, ื”ื’ืจืกื” ื”ื ื•ื›ื—ื™ืช ืฉืœ ื”ืชื•ืกืฃ ืชื•ืืžืช ืœ-2-3 ื”ื’ืจืกืื•ืช ื”ืื—ืจื•ื ื•ืช ืฉืœ Kubernetes: ื”ืคืขื•ืœื” ื‘ื’ืจืกืื•ืช ื™ืฉื ื•ืช ื™ื•ืชืจ ืื™ื ื” ื ื‘ื“ืงืช ื•ืื™ื ื” ืžื•ื‘ื˜ื—ืช. ืœื“ื‘ืจื™ ื”ืžืคืชื—ื™ื, Calico ืคื•ืขืœ ืขืœ ื’ืจืขื™ื ื™ ืœื™ื ื•ืงืก ืžืขืœ 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

ื”ืžื‘ื ื™ื ืฉื”ื•ื–ื›ืจื• ืœืขื™ืœ ืœืืคืฉืจ ืื• ื“ื—ื™ื™ืช ื›ืœ ืชืขื‘ื•ืจื” ื“ืจืš ื”-API ื”ืจื’ื™ืœ ืฉืœ NetworkPolicy ืžื›ื™ืœื™ื ืžื‘ื ื™ื ืขื ืกื•ื’ืจื™ื™ื ืฉืงืฉื” ืœื”ื‘ื™ืŸ ื•ืœื–ื›ื•ืจ. ื‘ืžืงืจื” ืฉืœ Calico, ื›ื“ื™ ืœืฉื ื•ืช ืืช ื”ื”ื™ื’ื™ื•ืŸ ืฉืœ ื›ืœืœ ื—ื•ืžืช ืืฉ ืœื”ื™ืคืš, ืคืฉื•ื˜ ืฉื ื” action: Allow ืขืœ action: Deny.

ื‘ื™ื“ื•ื“ ืขืœ ื™ื“ื™ ืกื‘ื™ื‘ื”

ื›ืขืช ื“ืžื™ื™ื ื• ืžืฆื‘ ืฉื‘ื• ืืคืœื™ืงืฆื™ื” ืžื™ื™ืฆืจืช ืžื“ื“ื™ื ืขืกืงื™ื™ื ืœืื™ืกื•ืฃ ื‘-Prometheus ื•ื ื™ืชื•ื— ื ื•ืกืฃ ื‘ืืžืฆืขื•ืช Grafana. ื”ื”ืขืœืื” ืขืฉื•ื™ื” ืœื”ื›ื™ืœ ื ืชื•ื ื™ื ืจื’ื™ืฉื™ื, ืฉืฉื•ื‘ ื ื™ืชื ื™ื ืœืฆืคื™ื™ื” ืฆื™ื‘ื•ืจื™ืช ื›ื‘ืจื™ืจืช ืžื—ื“ืœ. ื‘ื•ืื• ื ืกืชื™ืจ ืืช ื”ื ืชื•ื ื™ื ื”ืืœื” ืžืขื™ื ื™ื™ื ืกืงืจื ื™ื•ืช:

Calico ืœื ื˜ื•ื•ืจืงื™ื ื’ ื‘-Kubernetes: ื”ื™ื›ืจื•ืช ื•ืงืฆืช ื ื™ืกื™ื•ืŸ

ืคืจื•ืžืชืื•ืก, ื›ื›ืœืœ, ืžืžื•ืงื ื‘ืกื‘ื™ื‘ืช ืฉื™ืจื•ืช ื ืคืจื“ืช - ื‘ื“ื•ื’ืžื” ื–ื” ื™ื”ื™ื” ืžืจื—ื‘ ืฉืžื•ืช ื›ืžื• ื–ื”:

apiVersion: v1
kind: Namespace
metadata:
  labels:
    module: prometheus
  name: kube-prometheus

ืฉื“ื” metadata.labels ื”ืชื‘ืจืจ ืฉื–ื” ืœื ืžืงืจื™. ื›ืžื•ื–ื›ืจ ืœืขื™ืœ, namespaceSelector (ื‘ื ื•ืกืฃ ืœ podSelector) ืคื•ืขืœ ืขื ืชื•ื•ื™ื•ืช. ืœื›ืŸ, ื›ื“ื™ ืœืืคืฉืจ ืœืงื—ืช ืžื“ื“ื™ื ืžื›ืœ ื”ืคื•ื“ื™ื ื‘ื™ืฆื™ืื” ืกืคืฆื™ืคื™ืช, ืชืฆื˜ืจืš ืœื”ื•ืกื™ืฃ ืื™ื–ื•ืฉื”ื™ ืชื•ื•ื™ืช (ืื• ืœืงื—ืช ืžื”ืงื™ื™ืžื™ื), ื•ืœืื—ืจ ืžื›ืŸ ืœื”ื—ื™ืœ ืชืฆื•ืจื” ื›ืžื•:

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 ืชื•ื›ืœื• ืœื•ื•ืกืช ืืช ื”ื–ืžื™ื ื•ืช ืฉืœ ืฆืžืชื™ื, ืœื ืžื•ื’ื‘ืœ ืœืชืจืžื™ืœื™ื. ื‘ื“ื•ื’ืžื” ื”ื‘ืื” ื‘ืืžืฆืขื•ืช GlobalNetworkPolicy ื”ื™ื›ื•ืœืช ืœื”ืขื‘ื™ืจ ื‘ืงืฉื•ืช ICMP ื‘ืืฉื›ื•ืœ ืกื’ื•ืจื” (ืœื“ื•ื’ืžื”, ืคื™ื ื’ื™ื ืžืคื•ื“ ืœืฆื•ืžืช, ื‘ื™ืŸ ืชืจืžื™ืœื™ื ืื• ืžืฆื•ืžืช ืœืชืจืžื™ืœ IP):

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, ื•ื›ืืฉืจ ื”ื ืžื—ื•ื‘ืจื™ื, ืžืงื‘ืœื™ื ืžืกืœื•ืœื™ื ืœืจืฉืชื•ืช ื”ืžืฉื ื” ืฉืœ ืืฉื›ื•ืœื•ืช ื•ืฉื™ืจื•ืชื™ื. ืจืฉืชื•ืช ืžืฉื ื” ืฉืœืžื•ืช ื ื“ื—ืคื•ืช ื›ื“ื™ ืœื ืœืื‘ื“ ืฉื™ืจื•ืชื™ื ื‘ืžื”ืœืš ื”ืคืขืœื” ืžื—ื“ืฉ ื•ืฉื™ื ื•ื™ื™ ื›ืชื•ื‘ืช.

ื”ื™ืฆื™ืื” ื‘ืชืฆื•ืจื” ื”ื™ื ืกื˜ื ื“ืจื˜ื™ืช, ืžื” ืฉืžื˜ื™ืœ ื›ืžื” ื ื™ื•ืื ืกื™ื ื‘ืชื”ืœื™ืš ืงื‘ื™ืขืช ื”ืชืฆื•ืจื” ืฉืœ ื”ืืคืœื™ืงืฆื™ื” ื•ื”ืขื‘ืจืชื” ืœืืฉื›ื•ืœ Kubernetes. ืœื“ื•ื’ืžื”, ื‘ืื•ืชื• AWS LoadBalancer ืขื‘ื•ืจ UDP ื”ื•ืคื™ืข ืžืžืฉ ื‘ืกื•ืฃ ื”ืฉื ื” ืฉืขื‘ืจื” ื‘ืจืฉื™ืžื” ืžื•ื’ื‘ืœืช ืฉืœ ืื–ื•ืจื™ื, ื•ืœื ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘-NodePort ื‘ื’ืœืœ ื”ื”ืขื‘ืจื” ืฉืœื• ืขืœ ื›ืœ ืฆืžืชื™ ื”ืืฉื›ื•ืœ ื•ืื™ ืืคืฉืจ ืœืฉื ื•ืช ืืช ืงื ื” ื”ืžื™ื“ื” ืฉืœ ืžืกืคืจ ืžื•ืคืขื™ ื”ืฉืจืช ืขื‘ื•ืจ ืžื˜ืจื•ืช ืกื•ื‘ืœื ื•ืช ืชืงืœื•ืช. ื‘ื ื•ืกืฃ, ืชืฆื˜ืจืš ืœืฉื ื•ืช ืืช ื˜ื•ื•ื— ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ืฉืœ ื™ืฆื™ืื•ืช...

ื›ืชื•ืฆืื” ืžื—ื™ืคื•ืฉ ืื—ืจ ืคืชืจื•ื ื•ืช ืืคืฉืจื™ื™ื, ื ื‘ื—ืจื•:

  1. ืคื•ื“ื™ื ืขื VPN ืžืชื•ื›ื ื ื™ื ืœื›ืœ ืฆื•ืžืช ืคื ื™ืžื” hostNetwork, ื›ืœื•ืžืจ, ืœ-IP ื‘ืคื•ืขืœ.
  2. ื”ืฉื™ืจื•ืช ืžื•ืฆื‘ ื‘ื—ื•ืฅ ื“ืจืš ClusterIP. ืคื•ืจื˜ ืžื•ืชืงืŸ ืคื™ื–ื™ืช ืขืœ ื”ืฆื•ืžืช, ื”ื ื’ื™ืฉ ืžื‘ื—ื•ืฅ ืขื ื”ืกืชื™ื™ื’ื•ื™ื•ืช ืงืœื•ืช (ื ื•ื›ื—ื•ืช ืžื•ืชื ื™ืช ืฉืœ ื›ืชื•ื‘ืช IP ืืžื™ืชื™ืช).
  3. ืงื‘ื™ืขืช ื”ืฆื•ืžืช ืฉืขืœื™ื• ืขืœื” ื”ืชืจืžื™ืœ ื”ื™ื ืžืขื‘ืจ ืœืชื—ื•ื ื”ืกื™ืคื•ืจ ืฉืœื ื•. ืื ื™ ืจืง ืื’ื™ื“ ืฉืืชื” ื™ื›ื•ืœ "ืœืžืกืžืจ" ื”ื™ื˜ื‘ ืืช ื”ืฉื™ืจื•ืช ืœืฆื•ืžืช ืื• ืœื›ืชื•ื‘ ืฉื™ืจื•ืช ืฆื“ื“ื™ ืงื˜ืŸ ืฉื™ื ื˜ืจ ืืช ื›ืชื•ื‘ืช ื”-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.

ื .ื‘.

ืงืจื ื’ื ื‘ื‘ืœื•ื’ ืฉืœื ื•:

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”