-
Staattisen verkkopalvelimen käyttöönotto komentoriviltä
Keskitaso
Tarvitset OpenShiftin CLI-työkalun oc ja OpenShiftin Routes -rajapinnan tuntemusta sekä Kubernetesin Pods- ja Services-käsitteiden tuntemusta
Johdanto
Tässä oppaassa käsitellään Kubernetesin ydinkäsitteitä podit, palvelut, reitit ja ReplicationControllerit sekä niiden YAML-esitykset. Näiden Kubernetes API -objektien havainnollistamiseksi rakennetaan Apache HTTP Server -sovellus kirjoittamalla näiden objektien raakatekstimuotoiset YAML-esitykset.
Palvelimen ajamiseen klusterissa tarvitaan vähintään seuraavat määritellyt objektit:
- Podi, joka ajaa konttia.
- Palvelu, joka julkaisee podin sisäisesti ja antaa sille ennakoitavan nimen.
- Reitti, joka julkaisee palvelun internetiin ohjaamalla liikenteen osoitteesta
<myservice>.2.rahtiapp.fipalveluobjektiin.
Info
Käytännössä sovelluksia ei tulisi ottaa käyttöön tässä oppaassa kuvatulla tavalla. Sen sijaan tämän tarkoitus on opettaa Kubernetesin ydinkäsitteitä.
Valmistelut
Varmista, että oc-komentorivikäyttöliittymä on asennettu ja että olet kirjautunut sisään. Katso tarvittaessa ohjeet komentorivityökalun asennukseen.
Projektit
Komento oc projects näyttää projektit, joihin sinulla on käyttöoikeus:
$ oc projects
You have access to the following projects and can switch between them with 'oc
project <projectname>':
someone-elses-public-project
* my-project-with-unique-name
Using project "my-project-with-unique-name" on server "https://api.2.rahti.csc.fi:6443".
Info
Luettelo voi sisältää projekteja, joita muut käyttäjät ovat luoneet julkisten Docker-imagien ylläpitämiseen. Vaikka näihin projekteihin voi vaihtaa, sinulla on niissä vain lukuoikeus ylläpidettyihin Docker-imageihin.
Jos sopivaa projektia ei ole, uuden voi luoda komennolla oc
new-project:
Projektin nimen on oltava yksilöllinen koko Rahti-konttipilvessä. Lisäksi nimi saa sisältää vain kirjaimia, numeroita ja yhdysmerkkejä, eikä siinä huomioida kirjainkokoa. Käytännössä nimen täytyy soveltua osaksi DNS-nimeä.
Jos kuulut useaan CSC-projektiin, joilla on pääsy Rahtiin, projektin kuvauksen
on sisällettävä csc_project: #######, missä ####### on laskutettava projekti
(katso
Projektit ja kiintiöt).
Kuvauksen voi lisätä new-project-komentoon:
Projektien välillä vaihdetaan komennolla oc project:
Podit ja komentorivikäyttöliittymä
Podit ovat objekteja, jotka ajavat yhtä tai useampaa konttia. Podin kontit
jakavat IP-osoitteen, ja ne voivat kommunikoida localhost-osoitteen tai jaetun muistin kautta.
Siksi ne täytyy suorittaa samalla fyysisellä solmulla.
Meidän tapauksessamme podi ajaa kontti-imagen, johon on asennettu verkkopalvelin:
pod.yaml:
apiVersion: v1
kind: Pod
metadata:
name: mypod
labels:
app: serveapp
pool: servepod
spec:
containers:
- name: serve-cont
image: "image-registry.openshift-image-registry.svc:5000/openshift/httpd"
Tämä podi ajaa yhden kontti-imagen, joka on määritelty kentässä
spec.containers.image.
Podin nimi annetaan kentässä metadata.name. Podiin voidaan viitata
oc:lla:
Kenttä metadata.labels.pool on mielivaltainen avain-arvo-pari, jonka avulla
podit voidaan ryhmitellä ja niihin voidaan viitata esimerkiksi palveluilla.
Kubernetes API -objektit esitetään YAML-muodossa. Lyhyt johdanto YAMLiin.
Podit ja muut Kubernetes/OpenShift API -objektit luodaan oc-
komentorivityökalulla:
Podin pitäisi nyt näkyä OpenShiftin selainkäyttöliittymän "Overview"-sivulla, kun projektia tarkastellaan.
Podeja voidaan poistaa komennolla oc delete:
Tämän seurauksena podin pitäisi kadota OpenShiftin selainkäyttöliittymästä, mutta pidetään tämä toistaiseksi käynnissä.
Resurssipyynnöt ja -rajat
Tyypillisesti konteille varataan resursseja käyttämällä pyyntöjä ja rajoja, mutta näissä esimerkeissä emme tee niin lyhyyden vuoksi. Jos arvoja ei anneta, käytetään oletusarvoja. Sama podi kuin yllä, mutta muisti- ja CPU-resursseilla 200 Mt:stä 1 Gt:hen ja 0,2 CPU:sta 1 CPU:hun, näyttäisi tältä:
pod.yaml:
apiVersion: v1
kind: Pod
metadata:
name: mypod
labels:
app: serveapp
pool: servepod
spec:
containers:
- name: serve-cont
image: "image-registry.openshift-image-registry.svc:5000/openshift/httpd"
resources:
requests:
memory: "200M"
cpu: "200m"
limits:
memory: "1G"
cpu: "1"
Lue lisää pyynnöistä ja rajoista Kubernetesin dokumentaatiosta.
Palvelu
Podien IP-osoitteet eivät ole pysyviä, ja ne voivat muuttua, jos esimerkiksi podi lopetetaan ja luodaan uudelleen. Jotta podiin voidaan siis päästä luotettavasti käsiksi, sen IP-osoitetta täytyy seurata ja tallentaa. Palveluobjektit tekevät juuri tämän, ja sen seurauksena ne tarjoavat podeille pysyvän verkkoidentiteetin:
service.yaml:
apiVersion: v1
kind: Service
metadata:
name: serve
labels:
app: serveapp
spec:
ports:
- name: 8081-tcp
port: 8081
protocol: TCP
targetPort: 8080
selector:
pool: servepod
Tämä palvelu ohjaa TCP-liikenteen projektin portista 8081 sisäisesti
niiden podien porttiin 8080, joiden tunnisteet on lueteltu kohdassa spec.selector. Tässä
tapauksessa liikenne ohjataan podeihin, joilla on tunniste pool: servepod. Jos
spec.selector vastaa useita podeja, liikenne jaetaan
niiden kesken. Oletuksena jako tehdään vuorotteluperiaatteella.
Kentässä spec.ports ainoa pakollinen kenttä on port. Jos
protocol jätetään pois, oletuksena käytetään TCP:tä, ja jos targetPort jätetään pois, oletuksena käytetään
kentän port arvoa.
Varmistetaan, että palvelu on määritelty, avaamalla etäkuori
podissa mypod ajettavaan konttiin ja kysymällä sisäiseltä DNS-palvelulta:
$ oc rsh mypod
sh-4.2$ nslookup serve
Server: 172.30.0.10
Address: 172.30.0.10#53
Name: serve.test-sidecar.svc.cluster.local
Address: 172.30.103.178
Reitti
Reitti-objekti on OpenShiftin Kubernetesiin tekemä laajennus, joka ohjaa HTTP- liikenteen internetistä (tai mistä tahansa verkosta, johon OpenShift-klusteri on kytketty) OpenShift-klusterin palveluihin.
route.yaml:
apiVersion: route.openshift.io/v1
kind: Route
metadata:
labels:
app: serveapp
name: myservice
annotations:
haproxy.router.openshift.io/ip_allowlist: 192.168.1.0/24 10.0.0.1
spec:
host: <myroute>.2.rahtiapp.fi
to:
kind: Service
name: serve
weight: 100
Tämä reitti ohjaa liikenteen internetistä siihen klusterin palveluun,
jonka metadata.name on sama kuin spec.to.name.
- Sinun täytyy korvata
<myroute>millä tahansa arvolla, joka on kelvollinen DNS-nimi (suositeltavaa on käyttää projektin nimeä).
Kyseinen reitti sallii lisäksi liikenteen vain aliverkosta 192.168.1.0/24 ja
IP-osoitteesta 10.0.0.1. Tietoturvan kannalta on erittäin suositeltavaa käyttää IP-
sallintalistaa palveluille, joiden ei ole tarkoitus näkyä koko
internetiin.
- Jotta voit muodostaa yhteyden, sinun täytyy lisätä (tai korvata) oma IP-osoitteesi tai aliverkon peite, joka sisältää IP-osoitteesi. Voit selvittää IP-osoitteesi esimerkiksi komennolla
curl ipinfo.io/ipomalta tietokoneeltasi. Toinen vaihtoehto on poistaa annotaatio kokonaan; tällöin kuka tahansa maailmassa voi muodostaa yhteyden.
Voit nyt siirtyä selaimeesi ja kirjoittaa asettamasi osoitteen: <myservice>.2.rahtiapp.fi. Sen pitäisi palauttaa Apache-testisivu:

Warning
Jos sallintalistan merkintä on virheellinen, OpenShift hylkää sallintalistan ja sallii kaiken liikenteen.
Oletuksena isäntänimi on metadata.name + - + project name
+ .2.rahtiapp.fi, ellei kohdassa spec.host ole määritelty muuta.
Tähän mennessä olemme määrittäneet podin, palvelun ja reitin. Jos fyysinen palvelin,
jolla podi sijaitsee, sammuu, sinun täytyy käynnistää podi manuaalisesti uudelleen komennolla
oc create -f pod.yaml. ReplicationController- ja ReplicaSet-objektit ovat
mekanismi, joka tekee tämän karkeasti ottaen käyttäjän puolesta.
ReplicationController
ReplicationControlers vanhentuneita
ReplicationControlerit ovat yhdessä DeploymentConfigien kanssa vanhentuneita nykyisissä OpenShift OKD:n versioissa. Katso DeploymentConfigin muuntaminen Deploymentiksi.
ReplicationController varmistaa, että klusterissa on käynnissä spec.replicas kappaletta podeja,
joiden tunnisteet vastaavat spec.selector-kenttää. Jos podeja on liikaa,
ReplicationController sammuttaa ylimääräiset, ja jos niitä on liian vähän,
se käynnistää podeja spec.template-kentän mukaisesti. Käytännössä
template-kenttä on täsmälleen sama podi kuin pod.yaml-tiedostossa, paitsi että kentät
apiVersion ja kind puuttuvat.
ReplicationController.yaml:
apiVersion: v1
kind: ReplicationController
metadata:
labels:
app: serveapp
name: blogtest-replicator
spec:
replicas: 1
selector:
app: serveapp
pool: servepod
template:
metadata:
name: mypod
labels:
app: serveapp
pool: servepod
spec:
containers:
- name: serve-cont
image: "image-registry.openshift-image-registry.svc:5000/openshift/httpd"
ReplicationControllerit ovat toiminnallisesti lähellä ReplicaSettejä, joita käsitellään
luvussa "Kubernetes- ja OpenShift-käsitteet".
ReplicationController voidaan muuntaa ReplicaSetiksi
muuttamalla spec.selector muotoon spec.selector.matchLabels ja asettamalla
kind: ReplicaSet.
Info
Kubernetesin keskeinen käsite, reconciliation loop, ilmenee ReplicationControllereissa. Reconciliation loop on mekanismi, joka mittaa järjestelmän todellisen tilan, muodostaa mittauksen perusteella järjestelmän nykyisen tilan ja suorittaa sellaisia toimia, että järjestelmän tila vastaisi haluttua tilaa.
Tässä terminologiassa ReplicationControllerit ovat objekteja, jotka kuvaavat klusterin
haluttua tilaa. Toinen tällainen objekti on aiemmin kohdattu palveluobjekti.
Siinä toinen reconciliation loop vertaa palvelun endpointteja todellisiin valmiina oleviin podeihin ja säätää niitä
vastaavasti. Tämän seurauksena palvelun endpointit osoittavat aina podeihin,
jotka ovat valmiita, ja vain niihin podeihin, joiden tunnisteet sisältävät kaikki
palveluobjektin valitsimessa määritellyt kentät. Itse asiassa jokainen spec-
esiintymä Kubernetes-objektin YAML-esityksessä kuvaa reconciliation loopin
määritystä. Podien loopit vain sattuvat olemaan sidottuja Kubernetesin
työsolmuihin, ja siksi ne voivat poistua, jos tai kun
työsolmujen provisiointi puretaan.
Siivoaminen
Kun olemme tyytyväisiä sovellukseen, emme jätä sitä käyntiin
klusteriin, vaan poistamme sen komennolla oc delete:
Tämä poistaa kaikki objektit, joilla on tunniste app: serveapp.
Yhteenveto
Tässä oppaassa otettiin käyttöön staattisen verkkosivun palvelin YAML-tiedostojen avulla, jotka esittävät Kubernetes-objekteja. Luotuja objekteja voidaan muokata edelleen OpenShiftin selainkäyttöliittymässä, jossa:
- Reittejä voidaan muokata turvallisiksi TLS:llä salatuiksi reiteiksi.
- ReplicationControllereihin voidaan lisätä automaattisia skaalaajia, pysyvää tallennustilaa, resurssirajoja ja terveystarkistuksia.
- Palveluihin voidaan lisätä uusia reittejä.