Calico ho an'ny tambajotra ao Kubernetes: fampidirana sy traikefa kely

Calico ho an'ny tambajotra ao Kubernetes: fampidirana sy traikefa kely

Ny tanjon'ny lahatsoratra dia ny fampahafantarana ny mpamaky ny fototry ny tambajotra sy ny fitantanana ny politikan'ny tambajotra ao Kubernetes, ary koa ny plugin Calico an'ny antoko fahatelo izay manitatra ny fahaiza-manao mahazatra. Teny an-dalana, ny fanamorana ny fandrindrana sy ny endri-javatra sasany dia haseho amin'ny fampiasana ohatra tena izy avy amin'ny traikefantsika miasa.

Fampidirana haingana ny fitaovana tambajotra Kubernetes

Tsy azo eritreretina ny cluster Kubernetes raha tsy misy tambajotra. Efa namoaka fitaovana momba ny fototr'izy ireo izahay: “Torolalana misy sary momba ny tambajotra ao Kubernetes"Ary"Fampidirana ny politikan'ny tambajotra Kubernetes ho an'ny matihanina amin'ny fiarovana".

Ao anatin'ny tontolon'ity lahatsoratra ity dia zava-dehibe ny manamarika fa ny K8s mihitsy no tsy tompon'andraikitra amin'ny fifandraisana amin'ny tambajotra eo amin'ny kaontenera sy ny nodes: noho izany, isan-karazany CNI plugins (Interface Networking Container). More momba ity hevitra ity izahay hoy koa izy ireo tamiko.

Ohatra, ny mahazatra indrindra amin'ireo plugins ireo dia Flannel - manome fifandraisana feno amin'ny tambajotra eo amin'ny node cluster rehetra amin'ny alàlan'ny fampiakarana tetezana amin'ny node tsirairay, manendry subnet ho azy. Na izany aza, ny fidirana feno sy tsy voafehy dia tsy mahasoa foana. Mba hanomezana karazana fitokanana kely indrindra ao amin'ny cluster, dia ilaina ny miditra an-tsehatra amin'ny fanamafisana ny firewall. Amin’ny ankapobeny dia apetraka eo ambany fifehezan’ny CNI iray ihany izy io, ka izay mety ho fitsabahan’ny antoko fahatelo amin’ny iptables dia azo adika diso na atao tsinontsinona mihitsy.

Ary nomena ny "out of the box" ho an'ny fandaminana ny fitantanana ny politikan'ny tambajotra ao anaty cluster Kubernetes NetworkPolicy API. Ity loharano ity, izay zaraina amin'ny toeran'ny anarana voafantina, dia mety misy fitsipika hanavahana ny fidirana amin'ny fampiharana iray mankany amin'ny iray hafa. Izy io koa dia ahafahanao manitsy ny fidirana eo anelanelan'ny pods manokana, ny tontolo iainana (namespaces) na ny sakana amin'ny adiresy 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

Tsy io no ohatra voalohany indrindra amin'ny antontan-taratasy ofisialy dia mety hanakivy ny faniriana hahatakatra ny lojikan'ny fomba fiasan'ny politikan'ny tambajotra. Na izany aza, mbola hiezaka ny hahatakatra ny fitsipika fototra sy ny fomba fanodinana ny fifamoivoizana amin'ny alàlan'ny politikan'ny tambajotra...

Lojika fa misy karazany 2 ny fifamoivoizana: miditra ao amin'ny pod (Ingress) ary mivoaka avy ao (Egress).

Calico ho an'ny tambajotra ao Kubernetes: fampidirana sy traikefa kely

Raha ny marina dia mizara ho sokajy 2 ireo ny politika mifototra amin'ny fitarihana ny hetsika.

Ny toetra ilaina manaraka dia mpifidy; izay mihatra amin'ny fitsipika. Ity dia mety ho pod (na vondron'ny pods) na tontolo iainana (izany hoe sehatra anarana). Tsipiriany manan-danja: tsy maintsy misy marika ireo karazana ireo zavatra roa ireo (marika amin'ny teny Kubernetes) - ireo no iasan'ny mpanao politika.

Ho fanampin'ny isa voafetra voafantina mitambatra amin'ny karazana marika sasany, azo atao ny manoratra fitsipika toy ny "Avelao / mandà ny zava-drehetra / rehetra" amin'ny fiovaovana samihafa. Ho an'ity tanjona ity, ny fananganana endrika dia ampiasaina:

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

- Amin'ity ohatra ity, ny pods rehetra ao amin'ny tontolo iainana dia voasakana amin'ny fifamoivoizana miditra. Ny fihetsika mifanohitra amin'izany dia azo atao amin'ny fananganana manaraka:

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

Toy izany koa ho an'ny fivoahana:

  podSelector: {}
  policyTypes:
  - Egress

- hamono azy. Ary izao no tokony hampidirina:

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

Raha iverenana amin'ny safidin'ny plugin CNI ho an'ny cluster, dia tsara ny manamarika fa Tsy ny tambajotra rehetra plugin no manohana NetworkPolicy. Ohatra, ny Flannel efa voalaza dia tsy mahafantatra ny fomba fanamboarana ny politikan'ny tambajotra, izay voalaza mivantana ao amin'ny tahiry ofisialy. Misy safidy hafa koa voalaza ao - tetikasa Open Source calico, izay manitatra be ny fitambaran'ny API Kubernetes mahazatra amin'ny resaka politikan'ny tambajotra.

Calico ho an'ny tambajotra ao Kubernetes: fampidirana sy traikefa kely

Fahalalana an'i Calico: teoria

Ny plugin Calico dia azo ampiasaina miaraka amin'ny Flannel (subproject Canal) na tsy miankina, mahafaoka ny fifandraisana amin'ny tambajotra sy ny fahaiza-mitantana ny fisiana.

Inona avy ireo fahafahana omen'ny fampiasana ny vahaolana K8s "boaty" sy ny API napetraka avy amin'ny Calico?

Ity ny zavatra natsangana tao amin'ny NetworkPolicy:

  • voafetran’ny tontolo iainana ny mpanao politika;
  • ny politika dia ampiharina amin'ny pods misy marika;
  • Ny fitsipika dia azo ampiharina amin'ny pods, ny tontolo iainana na ny subnets;
  • Ny fitsipika dia mety ahitana protocols, anarana na marika famantarana ny seranan-tsambo.

Toy izao ny fomba fanitarana ireo asa ireo i Calico:

  • azo ampiharina amin'ny zavatra rehetra ny politika: pod, container, milina virtoaly na interface;
  • Ny fitsipika dia mety ahitana hetsika manokana (fandrarana, fahazoan-dàlana, logging);
  • ny tanjona na loharanon'ny fitsipika dia mety ho seranan-tsambo, seranan-tsambo isan-karazany, protocols, toetra HTTP na ICMP, IP na subnet (taranaka faha-4 na faha-6), izay mpifidy (nodes, mpampiantrano, tontolo iainana);
  • Ho fanampin'izany, azonao atao ny mandrindra ny fandalovan'ny fifamoivoizana amin'ny alàlan'ny fanovana DNAT sy ny politikan'ny fandefasana fifamoivoizana.

Ny fanoloran-tena voalohany amin'ny GitHub ao amin'ny tahiry Calico dia niverina tamin'ny Jolay 2016, ary herintaona taty aoriana dia nahazo toerana voalohany tamin'ny fandaminana ny fifandraisana amin'ny tambajotra Kubernetes ny tetikasa - voaporofo izany, ohatra, amin'ny valin'ny fanadihadiana, notarihin'ny The New Stack:

Calico ho an'ny tambajotra ao Kubernetes: fampidirana sy traikefa kely

Vahaolana lehibe maro mitantana miaraka amin'ny K8s, toy ny Amazon EKS, Azure AKS, Google GKE ary ny hafa dia nanomboka nanoro azy io mba hampiasaina.

Raha ny fampisehoana, tsara ny zava-drehetra eto. Tamin'ny fanandramana ny vokatra, ny ekipan'ny fampandrosoana Calico dia naneho ny fahombiazan'ny astronomia, nampandeha kaontenera maherin'ny 50000 tamin'ny node ara-batana 500 miaraka amin'ny tahan'ny famoronana 20 kaontenera isan-tsegondra. Tsy nisy olana hita tamin'ny scaling. Vokatra toy izany nambara efa tamin'ny fanambarana ny dikan-teny voalohany. Ny fanadihadiana tsy miankina mifantoka amin'ny fanjifana sy ny fanjifana loharanon-karena dia manamafy ihany koa fa saika mitovy amin'ny an'ny Flannel ny zava-bitan'i Calico. Ohatra:

Calico ho an'ny tambajotra ao Kubernetes: fampidirana sy traikefa kely

Ny tetikasa dia mivoatra haingana dia haingana, manohana ny asa amin'ny vahaolana malaza mitantana K8s, OpenShift, OpenStack, azo atao ny mampiasa Calico rehefa mametraka cluster mampiasa kops, misy fanondroana ny fananganana tambajotra Service Mesh (ohatra ity ampiasaina miaraka amin'i Istio).

Manaova fanazaran-tena miaraka amin'ny Calico

Amin'ny tranga ankapobeny amin'ny fampiasana vanilla Kubernetes, ny fametrahana CNI dia tonga amin'ny fampiasana ny rakitra calico.yaml, alaina avy amin'ny tranonkala ofisialy, amin'ny fampiasana kubectl apply -f.

Amin'ny maha-fitsipika, ny dikan-teny ankehitriny amin'ny plugin dia mifanaraka amin'ny Kubernetes 2-3 farany: tsy voasedra ny fandidiana amin'ny dikan-teny taloha ary tsy azo antoka. Araka ny filazan'ny mpamorona, Calico dia mihazakazaka amin'ny kernel Linux mihoatra ny 3.10 mihazakazaka CentOS 7, Ubuntu 16 na Debian 8, eo an-tampon'ny iptables na IPVS.

Fitokanana ao anatin'ny tontolo iainana

Mba hahazoana fahatakarana ankapobeny, andeha hojerentsika ny tranga tsotra hahafantarana ny maha-samihafa ny politikan'ny tambajotra ao amin'ny notation Calico amin'ny mahazatra ary ny fomba hanatsorana ny fahaizan'izy ireo vakina sy ny fahafaha-mandrindra ny fomba fiasa amin'ny famoronana fitsipika:

Calico ho an'ny tambajotra ao Kubernetes: fampidirana sy traikefa kely

Misy fampiharana tranonkala 2 napetraka ao amin'ny cluster: ao amin'ny Node.js sy PHP, iray amin'ireo mampiasa Redis. Mba hanakanana ny fidirana amin'ny Redis amin'ny PHP, raha mitazona fifandraisana amin'ny Node.js, ampiharo fotsiny izao politika manaraka izao:

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

Amin'ny ankapobeny dia navelanay ny fifamoivoizana miditra amin'ny seranan-tsambo Redis avy amin'ny Node.js. Ary mazava ho azy fa tsy nandrara zavatra hafa izy ireo. Raha vao miseho ny NetworkPolicy, dia manomboka mitoka-monina avokoa ireo mpifidy voalaza ao, raha tsy misy fepetra manokana. Na izany aza, ny fitsipika mitokana dia tsy mihatra amin'ny zavatra hafa tsy voasaron'ny mpifidy.

Mampiasa ny ohatra apiVersion Kubernetes ivelan'ny boaty, saingy tsy misy manakana anao tsy hampiasa azy io loharano mitovy anarana avy amin'ny fanaterana Calico. Ny syntax ao dia amin'ny antsipiriany kokoa, noho izany dia mila manoratra ny fitsipika ho an'ny tranga etsy ambony ianao amin'ny endrika manaraka:

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

Ireo fananganana voalaza etsy ambony ireo amin'ny famelana na fandavana ny fifamoivoizana rehetra amin'ny alàlan'ny NetworkPolicy API mahazatra dia misy fananganana misy fononteny izay sarotra takarina sy tsaroana. Raha ny momba an'i Calico, hanova ny lojikan'ny fitsipiky ny firewall ho mifanohitra amin'izany dia ovay fotsiny action: Allow amin'ny action: Deny.

Fitokana-monina araka ny tontolo iainana

Alaivo sary an-tsaina ny toe-javatra iray izay mahatonga ny fampiharana iray hamokatra metrika fandraharahana ho an'ny fanangonana ao amin'ny Prometheus sy famakafakana bebe kokoa amin'ny fampiasana Grafana. Mety misy angona saro-pady ny fampiakarana, izay azo jerena ampahibemaso amin'ny alàlan'ny default. Andao hanafina ity angona ity amin'ny prying eyes:

Calico ho an'ny tambajotra ao Kubernetes: fampidirana sy traikefa kely

Prometheus, amin'ny ankapobeny, dia napetraka ao amin'ny tontolo serivisy manokana - amin'ny ohatra dia ho toy izao ny anaran'ny anarana:

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

saha metadata.labels tsy kisendrasendra izany. Araka ny voalaza etsy ambony, namespaceSelector (ary koa podSelector) miasa miaraka amin'ny etikety. Noho izany, mba hamela ny metrika alaina amin'ny pods rehetra amin'ny seranan-tsambo iray manokana dia tsy maintsy manampy karazana marika ianao (na maka amin'ny efa misy), ary avy eo ampiharo ny fanitsiana toy ny:

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

Ary raha mampiasa politika Calico ianao dia ho toy izao ny fehezanteny:

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

Amin'ny ankapobeny, amin'ny fampidirana ireo karazana politika ireo ho an'ny filana manokana dia azonao atao ny miaro amin'ny fitsabahana ratsy na tsy nahy amin'ny fampandehanana ny rindranasa ao amin'ny cluster.

Ny fomba fanao tsara indrindra, araka ny filazan'ny mpamorona ny Calico, dia ny fomba "Sakanana ny zava-drehetra ary sokafy mazava izay ilainao", voarakitra ao amin'ny antontan-taratasy ofisialy (Ny hafa dia manaraka fomba mitovy - indrindra indrindra, amin'ny lahatsoratra efa voalaza).

Mampiasa zavatra Calico fanampiny

Mamelà ahy hampahatsiahy anao fa amin'ny alàlan'ny andian-tsarimihetsika Calico API dia azonao atao ny mifehy ny fisian'ny node, fa tsy voafetra amin'ny pods. Ao amin'ny ohatra manaraka mampiasa GlobalNetworkPolicy mihidy ny fahafahana mandefa ny fangatahana ICMP ao amin'ny cluster (ohatra, pings avy amin'ny pod mankany amin'ny node, eo anelanelan'ny pods, na avy amin'ny node mankany amin'ny 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

Amin'ity tranga etsy ambony ity, dia mbola azo atao ny "mifanatona" amin'ny alàlan'ny ICMP ny node cluster. Ary io olana io dia voavaha amin'ny fomba GlobalNetworkPolicy, ampiharina amin'ny orinasa iray 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"]

Ny raharaha VPN

Farany, hanome ohatra tena izy amin'ny fampiasana ny fiasan'ny Calico aho amin'ny trangan'ny fifaneraserana akaiky, rehefa tsy ampy ny fitsipika napetraka. Mba hidirana amin'ny rindranasa an-tranonkala dia mampiasa tonelina VPN ny mpanjifa, ary io fidirana io dia voafehy tsara ary voafetra amin'ny lisitry ny serivisy manokana azo ampiasaina:

Calico ho an'ny tambajotra ao Kubernetes: fampidirana sy traikefa kely

Mifandray amin'ny VPN amin'ny alàlan'ny seranan-tsambo UDP mahazatra 1194 ny mpanjifa ary, rehefa mifandray, dia mahazo lalana mankany amin'ny zana-tsokajin'ny pods sy serivisy. Ny subnets manontolo dia atosika mba tsy ho very serivisy mandritra ny fanombohana sy fanovana adiresy.

Ny seranan-tsambo ao amin'ny konfigurasi dia manara-penitra, izay mametraka ny nuances sasany amin'ny dingan'ny fanamboarana ny fampiharana sy ny famindrana azy amin'ny cluster Kubernetes. Ohatra, ao amin'ny AWS LoadBalancer ho an'ny UDP dia niseho ara-bakiteny tamin'ny faran'ny taona lasa tao anaty lisitra voafetra ny faritra, ary tsy azo ampiasaina ny NodePort noho ny fandefasana azy amin'ny node cluster rehetra ary tsy azo atao ny manitsy ny isan'ny mpizara ho an'ny. tanjona fandeferana fahadisoana. Fanampin'izay, tsy maintsy manova ny isan'ny seranan-tsambo ianao ...

Vokatry ny fikarohana amin'ny alalan'ny vahaolana azo atao dia ireto no nosafidiana:

  1. Ny pods miaraka amin'ny VPN dia voalahatra isaky ny node hostNetwork, izany hoe mankany amin'ny tena IP.
  2. Ny serivisy dia alefa any ivelany amin'ny ClusterIP. Misy seranana napetraka ara-batana eo amin'ny node, izay azo idirana avy any ivelany miaraka amin'ny famandrihana kely (ny fisian'ny adiresy IP tena izy).
  3. Ny famaritana ny node misy ny pod rose dia mihoatra ny faritry ny tantarantsika. Lazaiko fotsiny fa azonao atao ny "mametaka" ny serivisy amin'ny node na manoratra serivisy kely sidecar izay hanara-maso ny adiresy IP amin'ny serivisy VPN amin'izao fotoana izao ary hanova ny firaketana DNS voasoratra amin'ny mpanjifa - na iza na iza manana saina ampy.

Avy amin'ny fomba fijery zotra, afaka mamantatra manokana ny mpanjifa VPN amin'ny alàlan'ny adiresy IP navoakan'ny mpizara VPN. Ity ambany ity ny ohatra voalohany amin'ny famerana ny fidirana amin'ny serivisy toy izany, aseho amin'ny Redis voalaza etsy ambony:

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]

Eto, ny fifandraisana amin'ny seranan-tsambo 6379 dia voarara mafy, fa miaraka amin'izay koa dia voatahiry ny fiasan'ny serivisy DNS, izay matetika mijaly rehefa mamorona fitsipika. Satria, araka ny voalaza teo aloha, rehefa miseho ny mpifidy iray, dia ampiharina aminy ny politikan'ny fandavana raha tsy misy fepetra hafa.

vokatra

Noho izany, amin'ny fampiasana ny API mandroso an'i Calico, azonao atao ny manitsy sy manova ny lalana ao anatin'ny cluster sy ny manodidina. Amin'ny ankapobeny, ny fampiasana azy dia mety ho toy ny fitifirana fody amin'ny tafondro, ary ny fampiharana tambajotra L3 miaraka amin'ny BGP sy IP-IP tonelina dia toa goavam-be amin'ny fametrahana Kubernetes tsotra amin'ny tambajotra fisaka... Na izany aza, raha tsy izany dia toa azo ampiharina sy mahasoa ilay fitaovana. .

Mety tsy ho azo atao foana ny mitoka-monina mba hamenoana ny fepetra takian'ny fiarovana, ary eto no tonga ny Calico (na vahaolana mitovy amin'izany). Ireo ohatra omena ato amin'ity lahatsoratra ity (miaraka amin'ny fanovana kely) dia ampiasaina amin'ny fametrahana maromaro an'ny mpanjifanay ao amin'ny AWS.

Sal

Vakio ihany koa ao amin'ny bilaoginay:

Source: www.habr.com

Add a comment