Hyppää sisältöön

Welcome to our weekly research support coffee hour on Zoom! Click here for more information.

Warning!

Puhti scratch disk is becoming very full (80+ % ) resulting in performance degradation. Everybody is advised to only keep actively processed data on scratch, all other data should be deleted, transferred to host institute or stored in Lumi-O. No new quota will be granted. Click here for a tool for examining your disk usage.

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:

  1. Podi, joka ajaa konttia.
  2. Palvelu, joka julkaisee podin sisäisesti ja antaa sille ennakoitavan nimen.
  3. Reitti, joka julkaisee palvelun internetiin ohjaamalla liikenteen osoitteesta <myservice>.2.rahtiapp.fi palveluobjektiin.

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ä.

Network

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:

oc new-project my-project-with-unique-name

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:

oc new-project my-project-with-unique-name --description='csc_project: #######'

Projektien välillä vaihdetaan komennolla oc project:

oc project another-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:

oc get pods mypod

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:

oc create -f pod.yaml

Podin pitäisi nyt näkyä OpenShiftin selainkäyttöliittymän "Overview"-sivulla, kun projektia tarkastellaan.

Podeja voidaan poistaa komennolla oc delete:

oc delete pod mypod

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/ip omalta 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:

Apache test page

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:

oc delete all --selector app=serveapp

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ä.

Suomenkielinen tekoälykäännös

Sisällössä voi esiintyä virheellistä tietoa tekoälykäännöksestä johtuen.

Klikkaa tästä antaaksesi palautetta