-
Verkkoyhteydet
Verkottuminen Rahti-palvelussa
Rahti tarjoaa integroidun IPv4-pohjaisen ohjelmistomääritellyn verkon (SDN) kerroksen, jonka avulla Podit voivat viestiä klusterin sisällä ja ulkomaailman kanssa. Tässä verkossa jokainen Pod saa oman IP-osoitteensa, mikä mahdollistaa suoran viestinnän muiden Podien kanssa. Oletusarvoisesti Pod voi viestiä vain samassa nimiavaruudessa (eli Rahti-projektissa) toimivien Podien kanssa, ellei oletusarvoisia NetworkPolicy-käytäntöjä muuteta. Kun Pod käynnistetään uudelleen tai siirretään, sen IP-osoite muuttuu. Siksi sovelluksille tarjotaan pysyvät IP-osoitteet käyttämällä Service-objekteja, jotka yhdistävät dynaamisesti yhden tai useamman Podin IP-osoitteet kiinteisiin IP-osoitteisiin ja DNS-tietueisiin, joiden avulla Podeihin voidaan ottaa yhteys. Podien ja Service-objektien IP-osoitteet ovat saavutettavissa vain klusterin sisällä. Jos Service halutaan julkaista internetiin, sinun täytyy luoda Route-objekteja. Seuraavaksi selitämme nämä käsitteet yksityiskohtaisesti.
Podien IP-osoitteet
Jokainen Pod saa IP-osoitteen Rahti-verkon osoiteavaruudesta (CIDR: 10.128.0.0/14). Oletusarvoisesti Podit voivat viestiä muiden saman Rahti-projektin (eli nimiavaruuden) Podien kanssa, ja Rahti-verkko huolehtii dynaamisesti Podien välisestä viestinnästä eri noodien välillä. Podien IP-osoitteita ei kuitenkaan suositella käytettäväksi suoraan Podien tavoittamiseen, koska osoitteet ovat väliaikaisia ja voivat muuttua, kun Podit luodaan uudelleen. Voit tarkistaa Podeillesi määritetyt IP-osoitteet seuraavalla komennolla:
Podien portit
Pod voi suorittaa yhtä tai useampaa konttia, ja jokainen kontti voi avata yhden tai useamman portin. Portit määrittävät, mitkä kontin sisäiset verkon päätepisteet on tarkoitettu vastaanottamaan liikennettä. Vaikka Podin sisäisiä portteja ei tarvitse erikseen määritellä Podia luotaessa, niiden määrittely parantaa selkeyttä, mahdollistaa työkaluille sovelluksen tarkastelun ja auttaa määrittämään, miten Service-objektien tai muiden Podien tulisi muodostaa siihen yhteys. Kaksi eri konttia saman Podin sisällä eivät voi kuunnella liikennettä samassa portissa. Voit määritellä konttiesi avaamat portit seuraavan esimerkin mukaisesti:
apiVersion: v1
kind: Pod
metadata:
labels:
app: my-app
name: web-app
namespace: my-rahti-project
spec:
securityContext:
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
containers:
- name: httpd
image: 'image-registry.openshift-image-registry.svc:5000/openshift/httpd:latest'
ports:
- containerPort: 8080
protocol: TCP
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
Service-objektit
Service on abstraktio, joka tarjoaa vakaan tavan käyttää Podien ryhmää. Koska Podit ovat väliaikaisia ja ne voidaan korvata milloin tahansa, myös niiden IP-osoitteet ovat väliaikaisia. Service ratkaisee tämän antamalla Podien ryhmälle pysyvän virtuaalisen IP-osoitteen ja DNS-nimen. Service seuraa automaattisesti, mille Podeille liikenne tulee ohjata tunnisteiden perusteella, ja välittää liikenteen niille toimien kuormantasaajina. Tämä mahdollistaa sovellusten luotettavan keskinäisen viestinnän myös silloin, kun yksittäisiä Podeja korvataan, käynnistetään uudelleen tai skaalataan.
Seuraava YAML-määrittely luo Service-objektin, joka osoittaa kaikkiin Podeihin, joilla on tunniste app: my-app, käyttämällä .spec.selector-kenttää:
apiVersion: v1
kind: Service
metadata:
labels:
app: my-svc
name: my-service
namespace: my-rahti-project
spec:
ports:
- name: my-http-port
port: 80
targetPort: 8080
selector:
app: my-app
sessionAffinity: None
type: ClusterIP
Yllä oleva Service-määrittely kohdistuu vastaavien Podien porttiin 8080 ja julkaisee sen porttina 80. Tämä tarkoittaa, että kaikki osoitteeseen <service-ip-or-dns>:80 lähetetty liikenne välitetään vastaavaan Podiin osoitteeseen <matched-pod-ip>:8080.
Jokainen Rahti-palvelun Service saa DNS-nimen seuraavan hierarkian mukaisesti:
<service-name>.<Rahti-project>.svc.cluster.local
Esimerkiksi Service nimeltä backend Rahti-projektissa my-project saa seuraavan DNS-nimen:
backend.my-project.svc.cluster.local
Tämä on klusterin sisäinen täysin määritelty verkkotunnusnimi (FQDN). Kubernetes tarjoaa myös lyhyempiä aliaksia, kuten backend, jota voidaan käyttää viittaamaan Serviceen nimeltä backend mistä tahansa sovelluksesta, joka toimii samassa Rahti-projektissa, jossa Service on luotu. Vastaavasti backend.my-project-nimeä voidaan käyttää viittaamaan Serviceen muista Rahti-projekteista.
Route-objektit
Kaikki Podeille ja Service-objekteille määritetyt IP-osoitteet ovat yksityisiä eikä niitä voi reitittää julkisesti. Jos haluat julkaista HTTP-sovelluksesi internetiin, sinun täytyy luoda Route. Route mahdollistaa julkisen ja reititettävän isäntänimen yhdistämisen Rahti-projektissasi luotuun Service-objektiin. Seuraavassa esimerkissä kaikki isäntänimeen myapp.rahtiapp.fi lähetetty HTTP-liikenne ohjataan Serviceen nimeltä my-service, joka puolestaan välittää sen oikeille Podeille:
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: my-route
spec:
host: myapp.rahtiapp.fi
to:
kind: Service
name: my-service
port:
targetPort: 80 # This can also refer to the name of the port on the service: my-http-port
.spec.host-kentälle voidaan asettaa mikä tahansa arvo. Route toimii kuitenkin suoraan vain, jos käytät isäntänimessäsi päätettä *.rahtiapp.fi. Muussa tapauksessa tarvitaan lisää määrityksiä mukautettujen verkkotunnusten asettamiseen.
Voit myös määrittää TLS-terminoinnin Routelle. Käytettävissä on kolme vaihtoehtoa:
-
Edge: tämä on yksinkertaisin määritettävä TLS-terminointi, ja sitä käytetään useimmissa Rahti-sovelluksissa. TLS-yhteys päätetään Rahti-reitittimessä, mikä tarkoittaa, että reititin purkaa saapuvan yhteyden salauksen ja välittää tavallisen HTTP-liikenteen taustapalvelun Serviceen/Podiin. Käytä tätä terminointia, jos sovelluksesi ei tarvitse hallita TLS-varmenteita eikä vaadi päästä päähän -salausta. Route, jossa ei ole
tls-osiota, kuten yllä olevassa esimerkissä, palvellaan vain tavallisella HTTP:llä, joten edge-terminointi täytyy pyytää erikseen:Valinnainen asetus
insecureEdgeTerminationPolicy: Redirectsaa reitittimen ohjaamaan tavalliset HTTP-pyynnöt HTTPS:ään. -
Passthrough: Rahti-reititin ei päätä TLS:ää lainkaan. Se vain välittää salatun liikenteen suoraan Serviceen/Podiin. Pod vastaa TLS-salauksen purkamisesta. Käytä tätä, jos sovelluksesi tarvitsee hallita omia TLS-varmenteitaan ja vaatii päästä päähän salatun liikenteen. Lisää seuraava määritys Routeen käyttääksesi passthrough-tilaa:
-
Re-encrypt: tämä on hybriditila. Reititin päättää asiakkaalta tulevan TLS-yhteyden ja muodostaa sitten uuden TLS-yhteyden Podiin. Serviceen liitettyjen Podien odotetaan käyttävän kelvollista varmennetta Servicen DNS-nimelle. Tätä käytetään esimerkiksi silloin, kun haluat käyttää oletusarvoista Rahti-reitittimen varmennetta asiakkaan TLS-istunnoissa, samalla kun yksityistä varmennetta käytetään liikenteen salaamiseen Rahti-klusterin sisällä. Lisää seuraava määritys Routeen käyttääksesi re-encrypt-tilaa:
destinationCACertificate-CA-varmennetta käytetään yksityisen Pod-/Service-varmenteen validoimiseen.
Route-objektit tukevat useita määrityksiä ja ominaisuuksia, kuten nopeusrajoitusta, IP-sallintalistaa (palomuuri), HTTP:stä HTTPS:ään -uudelleenohjausta ja muita vaihtoehtoja, joihin voi tutustua ulkoisessa dokumentaatiossa. Huomaa kuitenkin, että käytössä oleva TLS-terminointi voi rajoittaa käytettävissä olevia ominaisuuksia.
Re-encrypt
Jotta re-encrypt toimisi, sinun on toimitettava oma varmenteesi. Tarvitaan kolme asiaa: (1) PEM-koodatuissa tiedostoissa oleva varmenne-/avainpari, jossa varmenne on kelvollinen Routen isäntänimelle, (2) valinnaisesti erillinen PEM-koodatussa tiedostossa oleva CA-varmenne, joka täydentää varmenneketjun, ja (3) erillinen PEM-koodatussa tiedostossa oleva kohde-CA-varmenne. Jos jotakin näistä ei toimiteta oikein, Route ei toimi.
IP-sallintalista
Yksi Route-objektien tärkeä ominaisuus on IP-sallintalista, eli se, että vain yksi IP-osoite tai IP-osoitealue saa käyttää Route-objektia. Tämä voidaan toteuttaa luomalla Route-objektiin annotaatio avaimella haproxy.router.openshift.io/ip_allowlist ja asettamalla arvoksi välilyönneillä erotettu lista IP-osoitteista ja/tai verkkoalueista. Katso esimerkit alla.
Huomio
IP-osoitteiden lista on muodossa välilyönneillä erotetut arvot.
Esimerkiksi: "192.168.1.0/24 10.0.0.1"
Warning
Jos sallintalistan merkintä on virheellinen, Rahti hylkää sallintalistan ja sallii kaiken liikenteen.
Esimerkki virheellisestä muodosta: "192.168.0" tai '192.168.1.0/24 ' -> Huomaa ylimääräinen välilyönti!
-
Tämä ensimmäinen esimerkki sallii verkon IP-osoitealueen (
193.166.0.0/16): -
On myös mahdollista sallia vain tietty IP-osoite:
-
On myös mahdollista sallia useita IP-osoitteita ja verkkoja samanaikaisesti:
Vaihtoehtoisesti voit asettaa annotation suoraan Route-resurssiin, kun luot sen ensimmäistä kertaa.
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: my-route
namespace: my-rahti-project
annotations:
haproxy.router.openshift.io/ip_allowlist: '192.168.1.0/24 10.0.0.1'
spec:
host: my-app-name.rahtiapp.fi
to:
kind: Service
weight: 100
name: my-service
tls:
insecureEdgeTerminationPolicy: Redirect
termination: edge
status:
ingress: []