Calico ad networking in Kubernetes: introductio et experientiae parum

Calico ad networking in Kubernetes: introductio et experientiae parum

Propositum articuli lectorem introducere ad fundamenta retis et administrandi rationes retiaculas in Kubernetes, itemque ad tertiam partem Calico plugin quae normae facultates porrigit. In via, facilitas schematismi et quaedam lineamenta demonstrabuntur utentibus exemplis realibus experientiae nostrae operantis.

A velox introductio ad Kubernetes networking appliance

Botrus Kubernetes sine retis cogitari non potest. Materias in basics suas iam editas habemus: "Dux illustratus ad networking in Kubernetes"Et"Introductio ad Kubernetes Network Politiae pro Securitatis Professionals".

In contextu huius articuli, interest notare ipsum K8s non esse responsabilitatem retis inter continentes et nodos: hoc enim variae CNI plugins (Container Networking Interface). Plura de hoc conceptu illi etiam ad me.

Exempli gratia, horum plugins frequentissimus est flannel β€” Connexionem retis plenam praebet inter omnes nodi nodos, pontes in unaquaque nodo erigendo, ei subnet assignando. Sed accessibilitas perfecta et irregularis non semper prodest. Ut quamdam minimam solitudinem in botro praebeat, in configuratione firewall intervenire necesse est. Generaliter in casu, sub eiusdem CNI potestate ponitur, quam ob rem quaelibet tertia partium interpellatio in iptables perperam vel omnino neglecta interpretari potest.

Et "ex archa" pro retis ordinandis administratione in botro Kubernetes providetur NetworkPolicy API. Subsidium hoc, per spatia nomina selecta distributum, potest continere regulas ad differentiam accessus ab uno applicatione ad alterum. Etiam permittit ut accessibilitatem configurare inter siliquas specificas, ambitus (nominum) vel clausos inscriptionum 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

Hoc est primitivum exemplum officialis documenta ut semel et pro omnibus dehortetur cupiditatem intelligendi logicam quomodo agendi retis operantur. Sed adhuc probabimus percipere principia fundamentalia ac modos processus negotiationis fluit utentes retis agendis...

Consentaneum est quod 2 genera negotiationis sunt: ​​vasculum (Ingress) et exitus ab eo (Egress).

Calico ad networking in Kubernetes: introductio et experientiae parum

Nam politica dividitur in 2 praedicamenta secundum directionem motus.

Sequens attributum requiritur electrix; unum cui iuris est. Hoc vasculum esse potest (vel globus siliquarum) vel ambitus (i.e. spatii nominandi). Singula res magni momenti: utraque genera harum rerum pittacium continere debent (label in terminologia Kubernetes) - hi sunt qui politici operantur.

Praeter finitos selectores aliquo genere pittacii coniuncti, regulas scribere sicut "Permitte/nega/omnis" in variis variationibus. Ad hoc, constructiones formae adhibentur;

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

β€” hoc exemplo, siliquae omnes in ambitu obstruuntur ab ineunte commercio. Morum contrarium effici potest cum hac constructione:

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

Similiter ad exitum;

  podSelector: {}
  policyTypes:
  - Egress

β€” Vertere. Et hic quid includam:

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

Revertere ad electionem plugin in botro CNI, notatu dignum est non omnis network plugin sustinet NetworkPolicy. Exempli gratia, iam dictus Flannel nescit quomodo machinas retis configurare, quae suus 'protinus dixit in repositio officialis. Vel etiam ibi memoratur - Open Source project Calico, quod signanter ampliat vexillum APIs Kubernetes secundum rationes agendi retis.

Calico ad networking in Kubernetes: introductio et experientiae parum

Ut cognoscat Calico: theoria

Plugin Calico in integratione cum Flannel adhiberi potest (subproject Canal) vel independenter, utrasque connectivity network et disponibilitate administrationis facultates protegens.

Quas occasiones solutionem K8s "coscentem" utens et API a Calico positos praebet?

Ecce quid aedificatur in NetworkPolicy:

  • politici ambitu circumscribi;
  • politiae siliquae cum pittaciis notatae applicantur;
  • regulae siliquis, ambitus vel subnetis applicari possunt;
  • praecepta continere possunt protocolla, nominata vel specificata portum symbolicum.

Ecce quomodo haec munera Calico extendit;

  • consilia ad quodlibet objectum applicari possunt: ​​vasculum, continens, virtualis machina vel interface;
  • praecepta continere possunt actionem specificam (prohibitio, permissio, logging);
  • scopum vel fons regularum possunt esse portus, range portuum, protocolla, HTTP vel ICMP attributa, IP vel subnet (4th vel 6th generation), selectores (nodi, exercituum, ambitus);
  • Insuper regere potes transitum negotiationis utendi DNAT occasus ac negotiationes rationesque mittentes.

Prima committit in GitHub in repositorio Calico ad diem Iulii 2016 repositum, et post annum consilium praecipuum locum in connexione reticulari Kubernetes ordinando cepit - hoc patet, exempli gratia, per proventus percontationum. conducted per The New Stack:

Calico ad networking in Kubernetes: introductio et experientiae parum

Multae magnae solutiones tractatae cum K8s, ut Amazon EKS, Caeruleus AKS, Google GKE et alii ad usum commendare coeperunt.

In consequat, magna in hendrerit in. In probatione eorum producto, turma evolutionis Calico demonstrata astronomicae operationis, plus quam 50000 milia continens in 500 nodis physicis cum rate de 20 vasis per alterum creationis. Nullae difficultates cum scalis identificabantur. Tales eventus nuntiata sunt iam in annuntiatione primae versionis. Studia independentia in perput ac facultates positis consumptio etiam confirmant effectum Calico prope bonum ac scriptor Flannel. exempli gratia:

Calico ad networking in Kubernetes: introductio et experientiae parum

Propositum celerrime explicatur, laborem in solutionibus popularibus tractatum sustinet K8s, OpenShift, OpenStack, uti potest Calico cum disponendis botri utendo kops, habentur ad constructionem reticulorum servitii Mesh (Hic est exemplum in cum Istio).

Exercere cum Calico

In universali casu utendi vanilla Kubernetes, insertis CNI descendet utendi tabella calico.yaml, downloaded in rutrum, ab usura kubectl apply -f.

Pro regula, versio currentis plugin compatitur cum ultimis 2-3 versionibus Kubernetes: operatio in vetustioribus versionibus non probatur nec praestatur. Secundum tincidunt, Calico in nucleis Linux decurrit supra 3.10 currentem CentOS 7, Ubuntu 16 vel Debian 8, super iptables vel IPVS.

Solitudo in environment

Ad intellectum generalem, inspiciamus causam simplicem intelligere quomodo agendi retis notatio in Calico a normarum differant et quomodo accessus ad regulas creandas simplices eorum faciliorem et conformationem flexibilitatem reducit;

Calico ad networking in Kubernetes: introductio et experientiae parum

Sunt 2 applicationes interretiales in botro: in Node.js et PHP, quarum una Redis utitur. Ad accessum ad Redis ab PHP intercludere, servata connectivity cum Node.js, sequentia consilia applica modo:

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

Essentialiter permisimus mercaturam in Redis portum a Node.js advenientem. Et plane nihil aliud prohibuerunt. Cum primum NetworkPolicy apparet, omnes selectores in ea de quibus incipiunt secludere, nisi aliud constet. Sed regulae solitariae in aliis obiectis non teguntur a selectore non applicantur.

Exemplum usus apiVersion Kubernetes ex archa, sed nihil prohibet te uti eop. Syntaxis accuratior est, ut regulam pro casu praedicto in hac forma rescribere debebis.

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

Praedicta constructio ad omnem mercaturam permittendi vel negandi per NetworkPolicy regularem API constructa continent cum parenthesi, qui difficile est intellectu et memoria tenere. In Calicone, firewall logicam mutandi regulam in opposito, modo mutationem action: Allow on action: Deny.

Solitudo a environment

Nunc condicionem finge ubi applicatio metri negotium metri ad collectionem in Prometheo gignit et in Grafana ulteriore analysi utens. Notatio sensibilis notitias continere potest, quae iterum per defaltam palam spectabilis est. Abscondamus haec notitia ex oculis emissiciis:

Calico ad networking in Kubernetes: introductio et experientiae parum

Prometheus, ut regula, in ambitu separato servitutis ponitur - in exemplo erit huius spatii nominativus:

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

agri metadata.labels hoc nullum accidens evasit. Ut supra, namespaceSelector (Ut etiam podSelector) Cum pittaciis operatur. Ut ergo metri siliquis ex omnibus in certo portu desumi permittas, debebis adjicere aliquod genus pittacii (vel ex existentibus) ac deinde conformationem similem appone;

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

Et si Calico uteris consiliis, syntax haec erit:

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

In genere, addendo has rationes agendi pro certis necessitatibus, tueri potes contra impedimentum malitiosum vel accidentalem in operatione applicationis in botro.

Optima praxis, iuxta creatores Caliconis, est β€œobstrue omnia et explicite aperi quod tibi opus est” accedunt, documenta sunt in officialis documenta Sequuntur alii similem ac- tionem, in iam dictum est articulum).

Additional uti Calico objecta

Admoneam te per extensum Caliconis ordinem APIs disponibilitatem nodis, non siliquis limitatam, moderari posse. In hoc exemplo utens GlobalNetworkPolicy facultas petitionum IMP transiendi in botro clauditur (exempli gratia, pings ex legumine ad nodi, inter siliquas, vel a nodo ad IP vasculum);

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

In casu superiore, adhuc nodi botri fieri potest per ICMP inter se "extendere". Atque haec quaestio per GlobalNetworkPolicyApplicata ente 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"]

The VPN Case

Verissimum denique exemplum dabo utendi Calico functionibus pro casu botri commercii, cum norma ratio agendi non sufficit. Ad applicationem interretialem accedere, clientes cuniculo VPN utuntur, et hic aditus arcte moderatur et limitatur ad certum indicem officiorum usui datum;

Calico ad networking in Kubernetes: introductio et experientiae parum

Clientes ad VPN per vexillum UDP portum 1194 iungunt et, cum conexi, vias accipiunt ad subnets siliquarum et operarum. Totae subnetes impelluntur ne officia per sileo et mutationes inscriptionis amittant.

Portus in configuratione vexillum est, quod nonnullas nuances imponit in processu applicationis conformandi et ad botrum Kubernetes transferendi. Exempli gratia, in eodem AWS LoadBalancer pro UDP ad litteram exeunte anno in limitata regionum indice apparuit, et NodePort adhiberi non potest propter missionem in omnibus nodis botris et impossibile est numerum instantiarum ministrantium ascendere. tolerantiam culpae proposita. Plus, debebis mutare defaltam latitudinem portuum...

Ex investigatione per solutiones possibilium, haec electa sunt:

  1. Siliquae cum VPN accedant per nodi in hostNetworkid est ad ipsam IP.
  2. Ministerium extra per " ClusterIP. Portus physice in nodo constitutus est, qui extrinsecus accessus cum exceptionibus minoribus (conditionalis praesentiae IP oratio verae).
  3. Nodum constituimus, in quo vasculum rosae excedit ambitum fabulae nostrae. Modo dicam te officium nodi "clavum" stricte scribere vel munus parvum scribere, quod current IP oratio VPN servitii monitor erit et DNS monumenta cum clientibus descripti recensebis - quisquis satis habet imaginationem.

Ex fuso prospectu, clientem VPN singulariter agnoscere possumus ab inscriptione IP sua a VPN servo edita. Infra exemplum primitivum restringendi talem clientem accessum ad officia, illustrantia in Redis memoratis:

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]

Hic connectens portum 6379 stricte prohibetur, sed simul conservatur operatio DNS servitii, cuius operatio saepius in edendis regulis laborat. Quia, ut ante dictum est, cum electrix apparet, defectus negant consilium applicari ei, nisi aliud datum est.

results

Sic, adhibito Calico progressu API, flexibiliter configurare potes et dynamice mutare fusum in et circa botrum. In genere, usus eius potest inspicere sicut passeres cum bombardis, et exsequens reticulum L3 cum BGP et IP-IP cuniculis monstrosum spectat in simplici Kubernetes institutionem in retis planis... Aliter tamen instrumentum satis viabile et utile spectat. .

Botrus segregans ad securitatem requisita non semper fieri potest, et hoc est ubi Calico (vel similis solutio) subvenit. Exempla in hoc articulo posita (cum modificationibus minoribus) in pluribus institutionibus clientium nostrorum AWS adhibentur.

PS

Lege etiam in nostro diario:

Source: www.habr.com