Calico maka ịkparịta ụka n'Ịntanet na Kubernetes: mmeghe na obere ahụmahụ

Calico maka ịkparịta ụka n'Ịntanet na Kubernetes: mmeghe na obere ahụmahụ

Ebumnuche nke isiokwu a bụ ịme ka onye na-agụ ya nweta ihe ndabere nke ịkparịta ụka n'Ịntanet na ijikwa atumatu netwọkụ na Kubernetes, yana ngwa mgbakwunye Calico nke atọ nke na-agbatị ike ọkọlọtọ. N'akụkụ ụzọ, a ga-egosipụta ịdị mfe nhazi na ụfọdụ atụmatụ site na iji ezigbo ihe atụ sitere na ahụmịhe ọrụ anyị.

Ntinye ngwa ngwa maka ngwa netwọk Kubernetes

Enweghị ike iche n'echiche ụyọkọ Kubernetes na-enweghị netwọk. Anyị ebipụtalarị ihe gbasara ntọala ha: “Ntuziaka atụpụtara maka ịkparịta ụka n'Ịntanet na Kubernetes"Na"Okwu mmalite nke amụma netwọkụ Kubernetes maka ndị ọkachamara nchekwa".

N'ihe gbasara isiokwu a, ọ dị mkpa iburu n'obi na K8s n'onwe ya abụghị maka njikọ netwọk n'etiti arịa na ọnụ: maka nke a, dị iche iche. CNI plugins (Container Networking Interface). More banyere echiche a anyị ha gwakwara m.

Dịka ọmụmaatụ, ihe kachasị n'ime plugins ndị a bụ Flannel - na-enye njikọta netwọkụ zuru oke n'etiti ọnụ ụyọkọ niile site n'ịkwalite àkwà mmiri na ọnụ nke ọ bụla, na-ekenye subnet na ya. Agbanyeghị, nnweta zuru oke na enweghị iwu anaghị aba uru mgbe niile. Iji hụ na ụfọdụ ụdị dịpụrụ adịpụ na ụyọkọ ahụ, ọ dị mkpa itinye aka na nhazi nke firewall. N'okwu n'ozuzu, a na-etinye ya n'okpuru nchịkwa nke otu CNI, nke mere na ihe ọ bụla nke ndị ọzọ na-eme na iptables nwere ike ịkọwa n'ụzọ na-ezighị ezi ma ọ bụ na-eleghara ya anya kpamkpam.

Na “site na igbe” maka ịhazi njikwa iwu netwọkụ na ụyọkọ Kubernetes ka ewepụtara Amụma netwọk API. Akụrụngwa a, nke ekesara n'ofe aha ahọpụtara, nwere ike ịnwe iwu dị iche iche ịnweta site na otu ngwa gaa na nke ọzọ. Ọ na-enye gị ohere ịhazi ohere n'etiti pọd, gburugburu (oghere aha) ma ọ bụ ngọngọ nke adreesị 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

Nke a abụghị ihe atụ kacha ochie nke akwụkwọ ikike nwere ike ịkụda mmụọ n'otu oge n'ịghọta ezi uche nke otu atumatu netwọkụ si arụ ọrụ. Otú ọ dị, anyị ka ga-agbalị ịghọta ụkpụrụ bụ isi na ụzọ nke nhazi okporo ụzọ na-eji atumatu netwọk ...

Ọ bụ ihe ezi uche dị na ya na e nwere ụdị okporo ụzọ abụọ: ịbanye na pod (Ingress) na ịpụ na ya (Egress).

Calico maka ịkparịta ụka n'Ịntanet na Kubernetes: mmeghe na obere ahụmahụ

N'ezie, ndọrọ ndọrọ ọchịchị na-ekewa n'ime ụdị abụọ a dabere na ntụzịaka mmegharị ahụ.

Àgwà ọma ọzọ a chọrọ bụ onye nhọpụta; onye iwu na-emetụta. Nke a nwere ike ịbụ pọd (ma ọ bụ otu pọd) ma ọ bụ gburugburu (ya bụ ebe aha aha). Nkọwa dị mkpa: ụdị ihe abụọ a ga-enwerịrị akara (labeelu na Kubernetes terminology) - ndị a bụ ndị ndọrọ ndọrọ ọchịchị na-arụ ọrụ.

Na mgbakwunye na ọnụ ọgụgụ ndị na-ahọrọ oke ọnụ nke ụdị akara ụfọdụ, ọ ga-ekwe omume ịde iwu dịka "Kwe ka / jụ ihe ọ bụla / onye ọ bụla" na ọdịiche dị iche iche. Maka ebumnuche a, a na-eji ihe owuwu nke ụdị a:

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

- na ihe atụ a, a na-egbochi pods niile dị na gburugburu okporo ụzọ na-abata. Enwere ike nweta omume dị iche site na ihe owuwu ndị a:

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

N'otu aka ahụ maka ọpụpụ:

  podSelector: {}
  policyTypes:
  - Egress

- ịgbanyụ ya. Na nke a bụ ihe ị ga-agụnye:

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

Ịlaghachi na nhọrọ nke ngwa mgbakwunye CNI maka ụyọkọ, ọ bara uru ịmara nke ahụ Ọ bụghị ngwa mgbakwunye netwọkụ ọ bụla na-akwado NetworkPolicy. Dịka ọmụmaatụ, Flannel akpọtụrụla amaghị ka esi ahazi atumatu netwọkụ, nke a na-ekwu ya ozugbo n'ime ebe nchekwa gọọmentị. Akwukwara ihe ọzọ ebe ahụ - ọrụ Open Source calico, nke na-agbasawanye ụkpụrụ nke Kubernetes API n'ụzọ dị ukwuu n'usoro iwu netwọkụ.

Calico maka ịkparịta ụka n'Ịntanet na Kubernetes: mmeghe na obere ahụmahụ

Ịmata Calico: tiori

Enwere ike iji ngwa mgbakwunye Calico na njikọta na Flannel (isiokwu Canal) ma ọ bụ n'onwe ya, na-ekpuchi ma njikọ netwọk na ike njikwa nnweta.

Ohere dị aṅaa ka iji ngwọta “boxed” K8 na API setịpụrụ Calico na-enye?

Nke a bụ ihe arụnyere na NetworkPolicy:

  • ndị ndọrọ ndọrọ ọchịchị na-ejedebe na gburugburu ebe obibi;
  • a na-etinye usoro iwu na pọd ndị nwere akara;
  • enwere ike itinye iwu na pods, gburugburu ma ọ bụ subnets;
  • iwu nwere ike ịnwe protocol, aha ma ọ bụ nkọwa ọdụ ụgbọ mmiri ihe atụ.

Nke a bụ ka Calico si gbasaa ọrụ ndị a:

  • enwere ike itinye atumatu na ihe ọ bụla: pọd, akpa, igwe mebere ma ọ bụ interface;
  • iwu nwere ike ịnwe otu omume (mmachibido iwu, ikike, osisi);
  • ebumnuche ma ọ bụ isi iyi nke iwu nwere ike ịbụ ọdụ ụgbọ mmiri, ọdụ ụgbọ mmiri dị iche iche, usoro iwu, HTTP ma ọ bụ ICMP àgwà, IP ma ọ bụ subnet (ọgbọ nke anọ ma ọ bụ 4), ndị na-ahọrọ ọ bụla (ọnụ, ndị ọbịa, gburugburu);
  • Na mgbakwunye, ị nwere ike ịhazi ụzọ nke okporo ụzọ site na iji ntọala DNAT na amụma mbugharị okporo ụzọ.

Nke mbụ na-eme na GitHub na Calico repository ụbọchị laa azụ na July 2016, na otu afọ mgbe nke ahụ gasịrị, oru ngo ahụ weere ọnọdụ na-eduga n'ịhazi netwọk Kubernetes - nke a gosipụtara, dịka ọmụmaatụ, site na nchọpụta nyocha. The New Stack duziri:

Calico maka ịkparịta ụka n'Ịntanet na Kubernetes: mmeghe na obere ahụmahụ

Ọtụtụ nnukwu ngwọta jisiri ike na K8, dịka Amazon EKS, Azure AKS, Google GKE na ndị ọzọ malitere ịkwado ya maka ojiji.

Maka arụmọrụ, ihe niile dị mma ebe a. N'ịnwale ngwaahịa ha, ndị otu mmepe Calico gosipụtara arụmọrụ nke mbara igwe, na-agba ọsọ karịa 50000 na ọnụ ụzọ anụ ahụ 500 nwere ọnụego okike nke 20 containers kwa nkeji. Ọnweghị nsogbu achọpụtara na ncha. Nsonaazụ dị otú ahụ e mara ọkwa ugbua na ọkwa nke mbụ version. Ọmụmụ ihe ndị nọọrọ onwe ha na-elekwasị anya na ntinye na oriri akụrụngwa na-egosikwa na arụmọrụ Calico fọrọ nke nta ka ọ dị mma ka Flannel. Dịka ọmụmaatụ:

Calico maka ịkparịta ụka n'Ịntanet na Kubernetes: mmeghe na obere ahụmahụ

Ọrụ a na-etolite ngwa ngwa, ọ na-akwado ọrụ na ngwọta ndị a ma ama na-achịkwa K8s, OpenShift, OpenStack, ọ ga-ekwe omume iji Calico mgbe ị na-ebuga ụyọkọ site na iji. kops, enwere ntụaka maka owuwu nke netwọk Mesh Service (lee otu ihe atụ eji ya na Istio).

Mụta ihe na Calico

N'ihe gbasara iji vanilla Kubernetes, ịwụnye CNI na-agbadata iji faịlụ ahụ calico.yaml, ebudatara na webụsaịtị gọọmentị, site na iji kubectl apply -f.

Dị ka a na-achị, ụdị ngwa mgbakwunye dị ugbu a dakọtara na ụdị 2-3 kachasị ọhụrụ nke Kubernetes: arụ ọrụ na nsụgharị ochie adịghị anwale ma ọ dịghị ekwe nkwa. Dị ka ndị mmepe si kwuo, Calico na-agba ọsọ na Linux kernels n'elu 3.10 na-agba ọsọ CentOS 7, Ubuntu 16 ma ọ bụ Debian 8, n'elu iptables ma ọ bụ IPVS.

Kewapụ n'ime gburugburu ebe obibi

Maka nghọta n'ozuzu, ka anyị leba anya n'okwu dị mfe iji ghọta otú atumatu netwọkụ na akara Calico si dị iche na nke ọkọlọtọ yana otu ụzọ isi mepụta iwu si eme ka ọgụgụ ha dị mfe na nhazi mgbanwe:

Calico maka ịkparịta ụka n'Ịntanet na Kubernetes: mmeghe na obere ahụmahụ

Enwere ngwa webụ 2 etinyere na ụyọkọ: na Node.js na PHP, otu n'ime ha na-eji Redis. Iji gbochie ịbanye na Redis site na PHP, ka ị na-eji Node.js na-ejikọta ya, tinye naanị iwu ndị a:

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

N'ezie, anyị kwere ka okporo ụzọ na-abata n'ọdụ ụgbọ mmiri Redis si Node.js. Na n'ụzọ doro anya na ha egbochighị ihe ọ bụla ọzọ. Ozugbo NetworkPolicy pụtara, ndị niile na-ahọpụta ndị a kpọtụrụ aha na ya na-amalite ịnọpụ iche, ọ gwụla ma akọwapụtara ya ọzọ. Agbanyeghị, iwu ikewapụ anaghị emetụta ihe ndị ọzọ onye nhọpụta kpuchirighị ya.

Ihe atụ na-eji apiVersion Kubernetes si na igbe ahụ, mana ọ nweghị ihe na-egbochi gị iji ya akụ nke otu aha sitere na nnyefe Calico. Okwu syntax dị ebe ahụ nwere nkọwa zuru oke, yabụ ị ga-achọ idegharị iwu maka ikpe dị n'elu n'ụdị a:

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

Ihe arụrụ n'elu maka ikwe ma ọ bụ ịgọnarị okporo ụzọ niile site na NetworkPolicy API mgbe niile nwere ihe arụrụ arụ nwere akara aka ndị siri ike nghọta na icheta. N'ihe banyere Calico, ịgbanwe echiche nke iwu firewall na nke ọzọ, naanị gbanwee action: Allow on action: Deny.

Kewapụrụ site na gburugburu ebe obibi

Ugbu a were were ọnọdụ ebe ngwa na-ewepụta metrik azụmahịa maka mkpokọta na Prometheus yana nyocha ọzọ site na iji Grafana. Nbulite ahụ nwere ike ịnwe data nwere mmetụta, nke enwere ike ịhụ ọzọ na ndabara. Ka anyị zochie data a n'anya anya na-agbapụta:

Calico maka ịkparịta ụka n'Ịntanet na Kubernetes: mmeghe na obere ahụmahụ

A na-etinye Prometheus, dịka iwu, na ebe ọrụ dị iche - na ihe atụ ọ ga-abụ aha aha dị ka nke a:

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

ubi metadata.labels nke a mechara bụrụ ihe mberede. Dị ka e kwuru n'elu, namespaceSelector (yana podSelector) na-arụ ọrụ na akara. Ya mere, iji kwe ka ewepụtara metrics na pọd niile na ọdụ ụgbọ mmiri akọwapụtara, ị ga-agbakwunye ụdị akara (ma ọ bụ were site na ndị dị adị), wee tinye nhazi dịka:

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

Ma ọ bụrụ na ị na-eji Calico atumatu, syntax ga-adị ka nke a:

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

N'ozuzu, site n'ịgbakwụnye ụdị atumatu ndị a maka mkpa ụfọdụ, ị nwere ike ichebe pụọ na ndabichi obi ọjọọ ma ọ bụ mberede n'ime ọrụ ngwa n'ime ụyọkọ ahụ.

Omume kachasị mma, dị ka ndị okike nke Calico si kwuo, bụ "Kpochie ihe niile ma meghee ihe ị chọrọ n'ụzọ doro anya", nke edepụtara na ya. akwụkwọ ikike (ndị ọzọ na-agbaso usoro yiri nke ahụ - karịsịa, na ekwularị isiokwu).

Iji ihe Calico agbakwunyere

Ka m chetara gị na site na ogologo ogologo nke Calico APIs ị nwere ike ịhazi nnweta ọnụ, ọ bụghị naanị na pọd. Na-esonụ atụ iji GlobalNetworkPolicy A na-emechi ikike ịfefe arịrịọ ICMP na ụyọkọ (dịka ọmụmaatụ, pings site na pọd gaa na ọnụ, n'etiti pods, ma ọ bụ site na ọnụ gaa na pod 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

N'okwu a dị n'elu, ọ ka ga-ekwe omume maka ọnụ ọnụ ụyọkọ 'ịbịarute' ibe ha site na ICMP. A na-edozikwa okwu a site n'ụzọ GlobalNetworkPolicy, etinyere n'ọrụ 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"]

Okwu VPN

N'ikpeazụ, m ga-enye ezigbo ihe atụ nke iji ọrụ Calico maka ihe gbasara mmekọrịta dị nso-ụyọkọ, mgbe ụkpụrụ ọkọlọtọ ezughị. Iji nweta ngwa weebụ, ndị ahịa na-eji ọwara VPN, a na-achịkwa ohere a nke ọma ma kpachie ya na ndepụta ọrụ akọwapụtara maka ojiji:

Calico maka ịkparịta ụka n'Ịntanet na Kubernetes: mmeghe na obere ahụmahụ

Ndị ahịa na-ejikọta na VPN site na ọkọlọtọ UDP ọdụ ụgbọ mmiri 1194 ma, mgbe ejikọtara ya, na-enweta ụzọ gaa na ụyọkọ nke pọd na ọrụ. A na-akwali subnets niile ka ha ghara ida ọrụ mgbe ịmalitegharị na ịgbanwe adreesị.

Ọdụ ụgbọ mmiri dị na nhazi ahụ bụ ọkọlọtọ, nke na-etinye ụfọdụ nuances na usoro nhazi ngwa na ịnyefe ya na ụyọkọ Kubernetes. Dịka ọmụmaatụ, n'otu AWS LoadBalancer maka UDP pụtara n'ụzọ nkịtị na njedebe nke afọ gara aga na ndepụta mpaghara nwere oke, na NodePort enweghị ike iji ya n'ihi na-ebugharị ya na ụyọkọ ụyọkọ niile na ọ gaghị ekwe omume ịkọ ọnụ ọgụgụ nke ihe nkesa maka. ebumnuche nnabata mmejọ. Na mgbakwunye, ị ga-agbanwe ụdị ọdụ ụgbọ mmiri ndabara...

N'ihi nchọta site na azịza enwere ike, a họọrọ ihe ndị a:

  1. A na-ahazi pọd nwere VPN n'otu ọnụ n'ime hostNetwork, ya bụ, na IP n'ezie.
  2. A na-ezigara ọrụ ahụ n'èzí ClusterIP. A na-etinye ọdụ ụgbọ mmiri n'ụzọ anụ ahụ na ọnụ, nke a na-enweta site na mpụga na obere ndoputa (ọnụnọ ọnọdụ nke ezigbo adreesị IP).
  3. Ịchọpụta ọnụ nke pod rose karịrị akarị nke akụkọ anyị. M ga-ekwu na ị nwere ike "ntu" ọrụ ahụ na ọnụ ọnụ ma ọ bụ dee obere ọrụ ụgbọ ala nke ga-enyocha adreesị IP nke ọrụ VPN ma dezie ndekọ DNS nke ndị ahịa debanyere aha - onye ọ bụla nwere echiche zuru ezu.

Site n'usoro ụzọ, anyị nwere ike ịmata onye ahịa VPN pụrụ iche site na adreesị IP nke sava VPN nyere. N'okpuru bụ ihe atụ mbụ nke igbochi ụdị onye ahịa ahụ ịnweta ọrụ, nke egosiri na Redis akpọpụtara n'elu:

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]

N'ebe a, a machibidoro ijikọ na ọdụ ụgbọ mmiri 6379, ma n'otu oge ahụ, a na-echekwa ọrụ DNS, nke na-arụ ọrụ nke na-enwekarị nhụjuanya mgbe ị na-emepụta iwu. N'ihi na, dị ka ekwuru na mbụ, mgbe onye nhọpụta pụtara, a na-etinye iwu agọnarị ndabara na ya belụsọ ma akọwapụtaghị ya.

Nsonaazụ

Yabụ, n'iji Calico's elu API, ị nwere ike hazie n'ụzọ na-agbanwe agbanwe wee gbanwee ụzọ n'ime na gburugburu ụyọkọ ahụ. N'ozuzu, ojiji ya nwere ike ịdị ka agbapụ nza na egbe egbe, na imejuputa netwọk L3 na BGP na IP-IP tunnels anya dị egwu na ntinye Kubernetes dị mfe na netwọk dị larịị ... Otú ọ dị, ma ọ bụghị ya, ngwá ọrụ ahụ dị nnọọ irè ma baa uru. .

Ikewapụta ụyọkọ iji gboo ihe nchekwa chọrọ nwere ike ọ gaghị adị mfe mgbe niile, ebe a bụ ebe Calico (ma ọ bụ ihe ngwọta yiri ya) na-abịa napụta. A na-eji ihe atụ ndị enyere n'isiokwu a (nwere obere mgbanwe) n'ọtụtụ nrụnye nke ndị ahịa anyị na AWS.

PS

Gụọkwa na blọọgụ anyị:

isi: www.habr.com

Tinye a comment