Calico alang sa networking sa Kubernetes: pasiuna ug gamay nga kasinatian

Calico alang sa networking sa Kubernetes: pasiuna ug gamay nga kasinatian

Ang katuyoan sa artikulo mao ang pagpaila sa magbabasa sa mga sukaranan sa networking ug pagdumala sa mga palisiya sa network sa Kubernetes, ingon man ang ikatulo nga partido nga Calico plugin nga nagpalapad sa sukaranan nga mga kapabilidad. Sa kadugayan, ang kasayon ​​sa pag-configure ug pipila ka mga bahin ipakita gamit ang tinuod nga mga pananglitan gikan sa among kasinatian sa pag-operate.

Usa ka dali nga pagpaila sa Kubernetes networking appliance

Ang Kubernetes cluster dili mahanduraw nga walay network. Gipublikar na namo ang mga materyales sa ilang mga sukaranan: "Usa ka gihulagway nga giya sa networking sa Kubernetes"Ug"Usa ka Pasiuna sa Mga Patakaran sa Kubernetes Network para sa mga Propesyonal sa Seguridad".

Sa konteksto niini nga artikulo, importante nga matikdan nga ang K8s mismo dili responsable sa koneksyon sa network tali sa mga sudlanan ug mga node: alang niini, nagkalain-laing Mga plugin sa CNI (Container Networking Interface). Dugang pa mahitungod niini nga konsepto kita ila pud ko giingnan.

Pananglitan, ang labing kasagaran niini nga mga plugins mao ang Flannel β€” Naghatag ug bug-os nga koneksyon sa network tali sa tanan nga mga cluster node pinaagi sa pagpataas sa mga tulay sa matag node, nga naghatag usa ka subnet niini. Bisan pa, ang kompleto ug dili kontrolado nga pag-access dili kanunay nga mapuslanon. Aron makahatag usa ka gamay nga pagkalainlain sa cluster, kinahanglan nga mangilabot sa pag-configure sa firewall. Sa kinatibuk-an nga kaso, kini gibutang ubos sa kontrol sa sama nga CNI, mao nga ang bisan unsa nga ikatulo nga-partido nga interbensyon sa iptables mahimong mahubad sa sayop o dili pagtagad sa tanan.

Ug gihatag ang "gawas sa kahon" alang sa pag-organisar sa pagdumala sa palisiya sa network sa usa ka cluster sa Kubernetes NetworkPolicy API. Kini nga kapanguhaan, nga gipang-apod-apod sa mga pinili nga namespaces, mahimong adunay mga lagda sa paglainlain sa pag-access gikan sa usa ka aplikasyon ngadto sa lain. Gitugotan ka usab niini nga i-configure ang pagka-access tali sa piho nga mga pod, palibot (mga namespace) o mga bloke sa mga adres sa 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

Dili kini ang labing karaan nga pananglitan sa opisyal nga dokumentasyon mahimo nga sa makausa ug alang sa tanan makapaluya sa tinguha nga masabtan ang lohika kung giunsa ang mga palisiya sa network molihok. Bisan pa, sulayan gihapon namon nga masabtan ang sukaranan nga mga prinsipyo ug pamaagi sa pagproseso sa mga dagan sa trapiko gamit ang mga palisiya sa network...

Makataronganon nga adunay 2 ka matang sa trapiko: pagsulod sa pod (Ingress) ug paggawas gikan niini (Egress).

Calico alang sa networking sa Kubernetes: pasiuna ug gamay nga kasinatian

Sa tinuud, ang politika gibahin sa kini nga 2 nga mga kategorya base sa direksyon sa paglihok.

Ang sunod nga gikinahanglan nga hiyas mao ang usa ka tigpili; ang usa nga gipadapat sa lagda. Kini mahimo nga usa ka pod (o usa ka grupo sa mga pod) o usa ka palibot (ie namespace). Usa ka importante nga detalye: ang duha ka matang niini nga mga butang kinahanglang adunay label (label sa terminolohiya sa Kubernetes) - kini ang mga politiko nga naglihok uban.

Dugang sa usa ka limitado nga gidaghanon sa mga pinili nga gihiusa sa usa ka matang sa label, posible nga magsulat sa mga lagda sama sa "Allow/deny everything/everyone" sa lain-laing mga variation. Alang niini nga katuyoan, ang mga pagtukod sa porma gigamit:

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

β€” sa kini nga pananglitan, ang tanan nga mga pod sa palibot gibabagan gikan sa umaabot nga trapiko. Ang kaatbang nga kinaiya mahimong makab-ot sa mosunod nga pagtukod:

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

Susama alang sa paggawas:

  podSelector: {}
  policyTypes:
  - Egress

- sa pagpalong niini. Ug ania ang ilakip:

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

Pagbalik sa pagpili sa usa ka CNI plugin alang sa usa ka cluster, angay nga hinumdoman kana dili tanang network plugin nagsuporta sa NetworkPolicy. Pananglitan, ang nahisgutan na nga Flannel wala mahibal-an kung giunsa ang pag-configure sa mga palisiya sa network, nga direkta nga giingon sa opisyal nga tipiganan. Usa ka alternatibo ang gihisgutan usab didto - usa ka proyekto sa Open Source Calico, nga makahuluganon nga nagpalapad sa standard set sa mga Kubernetes API sa termino sa mga polisiya sa network.

Calico alang sa networking sa Kubernetes: pasiuna ug gamay nga kasinatian

Pag-ila sa Calico: teorya

Ang Calico plugin mahimong gamiton sa integrasyon sa Flannel (subproject kanal) o independente, nga naglangkob sa duha ka koneksyon sa network ug mga kapabilidad sa pagdumala sa pagkaanaa.

Unsang mga oportunidad ang gihatag sa paggamit sa K8s "boxed" nga solusyon ug ang API set gikan sa Calico?

Ania kung unsa ang gitukod sa NetworkPolicy:

  • ang mga politiko limitado sa palibot;
  • ang mga palisiya gipadapat sa mga pod nga gimarkahan og mga label;
  • Ang mga lagda mahimong magamit sa mga pod, palibot o mga subnet;
  • Ang mga lagda mahimong adunay mga protocol, ginganlan o simbolo nga mga detalye sa pantalan.

Ania kung giunsa pagpalapad ni Calico kini nga mga gimbuhaton:

  • ang mga palisiya mahimong magamit sa bisan unsang butang: pod, sudlanan, virtual machine o interface;
  • Ang mga lagda mahimong adunay usa ka piho nga aksyon (pagdili, pagtugot, pag-log);
  • ang target o tinubdan sa mga lagda mahimong usa ka pantalan, usa ka han-ay sa mga pantalan, protocol, HTTP o ICMP nga mga hiyas, IP o subnet (ika-4 o ika-6 nga henerasyon), bisan unsang mga tigpili (mga node, host, environment);
  • Dugang pa, mahimo nimong i-regulate ang pagpasa sa trapiko gamit ang mga setting sa DNAT ug mga palisiya sa pagpasa sa trapiko.

Ang unang commit sa GitHub sa Calico repository petsa balik sa Hulyo 2016, ug sa usa ka tuig sa ulahi ang proyekto mikuha sa usa ka nag-unang posisyon sa pag-organisar Kubernetes network connectivity - kini mao ang ebidensya, alang sa panig-ingnan, sa mga resulta sa survey, gipahigayon sa The New Stack:

Calico alang sa networking sa Kubernetes: pasiuna ug gamay nga kasinatian

Daghang dagkong gidumala nga mga solusyon sa K8s, sama sa Amazon EKS, Azure AKS, Google GKE ug ang uban nagsugod sa pagrekomendar niini alang sa paggamit.

Mahitungod sa pasundayag, ang tanan maayo dinhi. Sa pagsulay sa ilang produkto, ang Calico development team nagpakita sa astronomical performance, nga nagpadagan sa labaw sa 50000 ka mga sudlanan sa 500 ka pisikal nga mga node nga adunay 20 ka mga sudlanan matag segundo. Wala’y nakita nga mga problema sa pag-scale. Ang ingon nga mga resulta gipahibalo na sa pahibalo sa unang bersyon. Ang mga independenteng pagtuon nga nagpunting sa throughput ug pagkonsumo sa kapanguhaan nagpamatuod usab nga ang pasundayag sa Calico hapit sama ka maayo sa Flannel. Pananglitan:

Calico alang sa networking sa Kubernetes: pasiuna ug gamay nga kasinatian

Ang proyekto dali nga nag-uswag, nagsuporta kini sa trabaho sa mga sikat nga solusyon nga gidumala K8s, OpenShift, OpenStack, posible nga gamiton ang Calico kung mag-deploy sa usa ka cluster gamit ang kops, adunay mga pakisayran sa pagtukod sa mga network sa Service Mesh (Ania ang usa ka panig-ingnan gigamit kauban sa Istio).

Pagpraktis sa Calico

Sa kinatibuk-ang kaso sa paggamit sa vanilla Kubernetes, ang pag-install sa CNI moabut sa paggamit sa file calico.yaml, gi-download gikan sa opisyal nga website, pinaagi sa paggamit kubectl apply -f.

Ingon sa usa ka lagda, ang kasamtangan nga bersyon sa plugin nahiuyon sa pinakabag-o nga 2-3 nga bersyon sa Kubernetes: ang operasyon sa mas daan nga mga bersyon wala gisulayan ug dili garantiya. Sumala sa mga developers, ang Calico nagdagan sa Linux kernels labaw sa 3.10 nga nagpadagan sa CentOS 7, Ubuntu 16 o Debian 8, sa ibabaw sa iptables o IPVS.

Pag-inusara sulod sa palibot

Alang sa kinatibuk-ang pagsabot, atong tan-awon ang usa ka yano nga kaso aron masabtan kon sa unsang paagi ang mga polisiya sa network sa Calico notation lahi sa mga standard ug sa unsang paagi ang pamaagi sa paghimo og mga lagda nagpasimple sa ilang pagkabasa ug pagka-flexible sa configuration:

Calico alang sa networking sa Kubernetes: pasiuna ug gamay nga kasinatian

Adunay 2 ka aplikasyon sa web nga gipakatap sa cluster: sa Node.js ug PHP, usa niini naggamit sa Redis. Aron babagan ang pag-access sa Redis gikan sa PHP, samtang gipadayon ang koneksyon sa Node.js, gamita lang ang mosunod nga palisiya:

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

Sa tinuud gitugotan namon ang umaabot nga trapiko sa pantalan sa Redis gikan sa Node.js. Ug klaro nga wala nila gidili ang bisan unsang butang. Sa diha nga makita ang NetworkPolicy, ang tanan nga mga pinili nga gihisgutan niini magsugod nga mahimulag, gawas kung gipiho. Bisan pa, ang mga lagda sa pag-inusara wala magamit sa ubang mga butang nga wala nasakup sa nagpili.

Ang pananglitan naggamit apiVersion Kubernetes sa gawas sa kahon, apan walay makapugong kanimo sa paggamit niini kapanguhaan sa parehas nga ngalan gikan sa paghatud sa Calico. Ang syntax didto mas detalyado, mao nga kinahanglan nimo nga isulat pag-usab ang lagda alang sa kaso sa ibabaw sa mosunod nga porma:

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

Ang gihisgutan sa ibabaw nga mga konstruksyon para sa pagtugot o pagdumili sa tanan nga trapiko pinaagi sa regular nga NetworkPolicy API adunay mga konstruksyon nga adunay mga parentesis nga lisud sabton ug mahinumduman. Sa kaso sa Calico, aron mabag-o ang lohika sa usa ka lagda sa firewall sa kaatbang, usba lang action: Allow sa action: Deny.

Pag-inusara sa palibot

Karon hunahunaa ang usa ka sitwasyon diin ang usa ka aplikasyon nagpatunghag mga sukatan sa negosyo alang sa pagkolekta sa Prometheus ug dugang nga pagtuki gamit ang Grafana. Ang pag-upload mahimong adunay sensitibo nga datos, nga makita na usab sa publiko pinaagi sa default. Atong itago kini nga data gikan sa prying mata:

Calico alang sa networking sa Kubernetes: pasiuna ug gamay nga kasinatian

Ang Prometheus, ingon nga usa ka lagda, gibutang sa usa ka lahi nga palibot sa serbisyo - sa pananglitan kini usa ka namespace nga sama niini:

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

uma metadata.labels kini nahimo nga dili aksidente. Sama sa gihisgutan sa ibabaw, namespaceSelector (ingon man podSelector) naglihok nga adunay mga label. Busa, aron tugutan ang mga sukatan nga makuha gikan sa tanan nga mga pod sa usa ka piho nga pantalan, kinahanglan nimo nga idugang ang usa ka matang sa label (o pagkuha gikan sa mga naa na), ug dayon i-apply ang usa ka configuration sama sa:

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

Ug kung mogamit ka sa mga palisiya sa Calico, ang syntax mahimong sama niini:

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

Sa kinatibuk-an, pinaagi sa pagdugang niini nga mga matang sa mga palisiya alang sa piho nga mga panginahanglan, mahimo nimong mapanalipdan batok sa malisyoso o aksidente nga pagpanghilabot sa operasyon sa mga aplikasyon sa cluster.

Ang labing kaayo nga praktis, sumala sa mga tiglalang sa Calico, mao ang "I-block ang tanan ug hayag nga ablihan ang imong kinahanglan" nga pamaagi, nga gidokumento sa opisyal nga dokumentasyon (ang uban nagsunod sa parehas nga pamaagi - labi na, sa nahisgotan na nga artikulo).

Paggamit sa Dugang nga mga Butang sa Calico

Pahinumdumi ko nimo nga pinaagi sa gipalawig nga set sa mga Calico API mahimo nimong i-regulate ang pagkaanaa sa mga node, dili limitado sa mga pod. Sa mosunod nga pananglitan gamit ang GlobalNetworkPolicy ang abilidad sa pagpasa sa mga hangyo sa ICMP sa cluster sirado (pananglitan, mga ping gikan sa usa ka pod ngadto sa usa ka node, tali sa mga pod, o gikan sa usa ka node ngadto sa usa ka 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

Sa kaso sa ibabaw, posible gihapon alang sa mga cluster node nga "makaabot" sa usag usa pinaagi sa ICMP. Ug kini nga isyu masulbad pinaagi sa paagi GlobalNetworkPolicy, gipadapat sa usa ka entidad 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"]

Ang Kaso sa VPN

Sa katapusan, maghatag ako usa ka tinuud nga panig-ingnan sa paggamit sa mga function sa Calico alang sa kaso sa hapit nga pundok nga pakig-uban, kung ang usa ka sukaranan nga hugpong sa mga palisiya dili igo. Aron ma-access ang web application, ang mga kliyente mogamit ug VPN tunnel, ug kini nga pag-access hugot nga kontrolado ug limitado sa usa ka piho nga listahan sa mga serbisyo nga gitugotan nga gamiton:

Calico alang sa networking sa Kubernetes: pasiuna ug gamay nga kasinatian

Ang mga kliyente nagkonektar sa VPN pinaagi sa standard nga UDP port 1194 ug, kung konektado, makadawat og mga ruta sa cluster subnets sa mga pod ug mga serbisyo. Ang tibuuk nga mga subnet giduso aron dili mawad-an sa mga serbisyo sa panahon sa pag-restart ug mga pagbag-o sa pagsulbad.

Ang pantalan sa pag-configure mao ang sumbanan, nga nagpahamtang sa pipila ka mga nuances sa proseso sa pag-configure sa aplikasyon ug pagbalhin niini sa Kubernetes cluster. Pananglitan, sa parehas nga AWS LoadBalancer para sa UDP nagpakita nga literal sa katapusan sa miaging tuig sa usa ka limitado nga lista sa mga rehiyon, ug ang NodePort dili magamit tungod sa pagpasa niini sa tanan nga mga cluster node ug imposible nga i-scale ang gidaghanon sa mga instances sa server alang sa. mga katuyoan sa pagtugot sa sayup. Dugang pa, kinahanglan nimo nga usbon ang default range sa mga pantalan ...

Ingon usa ka sangputanan sa pagpangita pinaagi sa posible nga mga solusyon, gipili ang mga musunud:

  1. Ang mga pod nga adunay VPN gieskedyul matag node in hostNetwork, kana mao, sa aktuwal nga IP.
  2. Ang serbisyo gi-post sa gawas pinaagi sa ClusterIP. Ang usa ka pantalan pisikal nga na-install sa node, nga ma-access gikan sa gawas nga adunay mga menor de edad nga reserbasyon (kondisyon nga presensya sa usa ka tinuud nga IP address).
  3. Ang pagdeterminar sa node diin ang pod nga rosas labaw pa sa kasangkaran sa atong istorya. Moingon lang ko nga mahimo nimong "ilansang" ang serbisyo sa usa ka node o magsulat usa ka gamay nga serbisyo sa sidecar nga mag-monitor sa karon nga IP address sa serbisyo sa VPN ug i-edit ang mga rekord sa DNS nga narehistro sa mga kliyente - bisan kinsa nga adunay igo nga imahinasyon.

Gikan sa usa ka routing perspective, kita talagsaon nga makaila sa usa ka VPN client pinaagi sa iyang IP address nga gi-isyu sa VPN server. Sa ubos usa ka primitive nga pananglitan sa pagpugong sa ingon nga kliyente sa pag-access sa mga serbisyo, nga gihulagway sa nahisgutan sa ibabaw nga 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]

Dinhi, ang pagkonektar sa port 6379 hugot nga gidili, apan sa samang higayon gipreserbar ang operasyon sa serbisyo sa DNS, nga ang pag-obra niini kanunay nga nag-antos sa paghimo sa mga lagda. Tungod kay, sama sa nahisgotan na, kung ang usa ka tigpili makita, ang default nga palisiya sa pagdumili magamit niini gawas kung gipiho.

Mga resulta

Busa, gamit ang abante nga API sa Calico, mahimo nimo nga mabag-o ang pag-configure ug dinamikong pagbag-o sa ruta sa sulod ug palibot sa cluster. Sa kinatibuk-an, ang paggamit niini mahimong tan-awon sama sa pagpamusil sa mga maya nga adunay usa ka kanyon, ug ang pagpatuman sa usa ka L3 network nga adunay BGP ug IP-IP tunnels tan-awon nga makalilisang sa usa ka yano nga pag-instalar sa Kubernetes sa usa ka patag nga network ... Apan, kung dili ang himan tan-awon nga praktikal ug mapuslanon. .

Ang paglain sa usa ka cluster aron matubag ang mga kinahanglanon sa seguridad mahimong dili kanunay mahimo, ug kini diin ang Calico (o parehas nga solusyon) moabut aron maluwas. Ang mga pananglitan nga gihatag niini nga artikulo (nga adunay ginagmay nga mga pagbag-o) gigamit sa daghang mga instalasyon sa among mga kliyente sa AWS.

PS

Basaha usab sa among blog:

Source: www.habr.com

Idugang sa usa ka comment