Kubernetes perusteet

Verkko ja lisäosat

Service-tyypit, CoreDNS, CNI-verkkolisäosat, Ingress-controllerit ja RKE2:n oletuskomponentit.

5 min lukuaika

Verkko ja lisäosat

Tässä osiossa opit, miten liikenne kulkee Kubernetes-klusterissa: miten Podit kommunikoivat, miten sovellus julkaistaan Servicen ja Ingressin avulla ja mitä verkkoon liittyviä lisäosia (add-ons) RKE2 asentaa oletuksena. Lopussa avaat sovelluksen ulkomaailmaan ja testaat klusterin nimipalvelua (CoreDNS) podin sisältä.


1. Kubernetes-verkon perusperiaatteet

Kubernetes-verkko noudattaa muutamaa perussääntöä:

  • Jokaisella Podilla on oma IP-osoite. Podin sisällä olevat kontit jakavat saman verkon ja voivat puhua keskenään localhost-osoitteen kautta.
  • Kaikki Podit voivat tavoittaa toisensa ilman NAT:ia – klusteri on yksi litteä verkko (flat network).
  • Pod-IP:t ovat lyhytikäisiä. Kun Pod käynnistyy uudelleen, se saa uuden IP:n. Siksi liikennettä ei osoiteta suoraan Podeihin vaan Servicen kautta.

Tämä tarkoittaa, että tarvitsemme pysyvän tavan tavoittaa joukko Podeja – siihen käytetään Serviceä.


2. CNI-verkkolisäosat

CNI (Container Network Interface) on rajapinta, jonka avulla verkkolisäosa toteuttaa Podien välisen verkon: antaa Podeille IP:t ja reitittää liikenteen solmujen välillä.

  • RKE2:n oletus-CNI on Canal (yhdistelmä Calico + Flannel): Flannel hoitaa Podien välisen verkon ja Calico verkkopolitiikat (NetworkPolicy).
  • Vaihtoehtoina RKE2 tukee myös Ciliumia ja Calicoa yksinään.

CNI on välttämätön: ilman sitä Podit eivät saa verkkoa eivätkä käynnisty Ready-tilaan.


3. Service-tyypit

Service antaa joukolle Podeja pysyvän nimen ja IP:n (virtual IP). Se valitsee taustan Podit labelien perusteella ja jakaa liikenteen niille. kube-proxy toteuttaa reitityksen jokaisella solmulla.

flowchart LR
    Client[Asiakas] --> SVC[Service · ClusterIP]
    SVC --> P1[Pod 1]
    SVC --> P2[Pod 2]
    SVC --> P3[Pod 3]
TyyppiNäkyvyysKäyttötarkoitus
ClusterIPVain klusterin sisälläOletustyyppi; sisäinen palveluiden välinen liikenne
NodePortSolmun IP + portti (30000–32767)Yksinkertainen ulkoinen pääsy testeihin
LoadBalancerUlkoinen kuormantasaajaTuotannon ulkoinen pääsy (pilven LB tai RKE2:n svclb)
  • ClusterIP – tavoitettavissa vain klusterin sisältä nimellä <service>.<namespace>.svc.cluster.local.
  • NodePort – avaa saman portin jokaisella solmulla ja ohjaa sen Serviceen.
  • LoadBalancer – pyytää ulkoisen kuormantasaajan. Pilvessä sen tarjoaa pilven LB; RKE2:ssa on myös sisäänrakennettu svclb-toteutus.

💡 Käytännössä ulkoinen HTTP-liikenne julkaistaan yleensä Ingressin kautta, ei suoraan LoadBalancer-Servicellä jokaiselle sovellukselle.


4. CoreDNS – klusterin nimipalvelu

CoreDNS on klusterin sisäinen DNS-palvelin. Se antaa Serviceille ja Podeille nimet, joilla ne löytävät toisensa ilman kovakoodattuja IP-osoitteita (service discovery).

Servicen DNS-nimi muodostuu näin:

text
<service>.<namespace>.svc.cluster.local

Esimerkiksi Service web nimiavaruudessa default löytyy nimellä web.default.svc.cluster.local – tai samassa nimiavaruudessa pelkällä nimellä web.

RKE2 asentaa CoreDNS:n oletuksena osana klusteria (rke2-coredns-* Podit kube-system-nimiavaruudessa).


5. Ingress ja Ingress-controllerit

Ingress on sääntökokoelma, joka reitittää klusterin ulkopuolelta tulevan HTTP(S)- liikenteen oikeille Serviceille isäntänimen (host) ja polun (path) perusteella. Se mahdollistaa myös TLS-päätöksen (HTTPS).

Ingress on pelkkä sääntömäärittely – sen toteuttaa Ingress-controller:

  • RKE2:n oletus-Ingress-controller on ingress-nginx (rke2-ingress-nginx-*).
  • Yksi controller voi palvella montaa sovellusta eri isäntänimillä ja poluilla.
flowchart LR
    User[Käyttäjä] -->|shop.example.com| ING[Ingress-controller · nginx]
    ING -->|/| SVC1[Service: web]
    ING -->|/api| SVC2[Service: api]
    SVC1 --> P1[web-podit]
    SVC2 --> P2[api-podit]

Ingress toimii OSI-kerroksella 7 (HTTP), joten se osaa reitittää polun ja isäntänimen perusteella. Service (kerros 4) reitittää vain porttien perusteella.


6. RKE2:n verkkoon liittyvät oletuskomponentit

RKE2 asentaa verkon ja peruspalvelut automaattisesti käynnistyessään (helm-controller hoitaa asennuksen). Keskeiset kube-system-nimiavaruudessa näkyvät komponentit:

  • Canal (CNI)rke2-canal-*: Podien välinen verkko ja verkkopolitiikat.
  • CoreDNSrke2-coredns-*: klusterin nimipalvelu.
  • ingress-nginxrke2-ingress-nginx-controller-*: HTTP(S)-reititys ulkoa sisään.
  • kube-proxy – jokaisella solmulla: Service-liikenteen reititys.
  • metrics-serverrke2-metrics-server-*: resurssimittarit (kubectl top).

7. Hands-on: sovelluksen julkaisu ja nimiselvitys

Julkaise sovellus ulkomaailmaan Servicen ja Ingressin avulla sekä testaa CoreDNS- nimiselvitystä podin sisältä. Varmista ensin, että sinulla on klusterin kubeconfig käytössä (ks. arkkitehtuuri-osion harjoitus) ja pääsy Rancheriin.

Luo ja ota käyttöön oma nimiavaruutesi (namespace), jossa työskentelet:

bash
# Korvaa <oma-nimi> omalla nimelläsi
kubectl create namespace <oma-nimi> --dry-run=client -o yaml | kubectl apply -f -
kubectl config set-context --current --namespace=<oma-nimi>

Tämän jälkeen kaikki alla olevat komennot kohdistuvat omaan nimiavaruuteesi.

A) Ota sovellus käyttöön ja luo Service

1. Luo Deployment ja Service komentoriviltä:

bash
# Luo esimerkkisovellus
kubectl create deployment web --image=nginx

# Anna sille pysyvä osoite klusterin sisällä (ClusterIP)
kubectl expose deployment web --port=80 --target-port=80

# Tarkastele Serviceä ja sen valitsemia Podeja
kubectl get svc web -o wide
kubectl get endpoints web

2. Testaa Service klusterin sisältä väliaikaisella podilla:

bash
kubectl run curl --image=curlimages/curl:8.10.1 --rm -it --restart=Never -- \
  curl -s http://web

Vastauksena tulee nginxin oletussivun HTML.

B) Testaa CoreDNS-nimiselvitys podin sisältä

bash
# Lyhyt nimi samassa nimiavaruudessa
kubectl run dnstest --image=busybox:1.36 --rm -it --restart=Never -- \
  nslookup web

# Täydellinen DNS-nimi (korvaa <oma-nimi> nimiavaruudellasi)
kubectl run dnstest --image=busybox:1.36 --rm -it --restart=Never -- \
  nslookup web.<oma-nimi>.svc.cluster.local

nslookup palauttaa Servicen ClusterIP:n – tämän hoitaa CoreDNS.

C) Avaa sovellus ulkomaailmaan Ingressillä

Vaihtoehto 1 – komentoriviltä (deklaratiivinen manifesti):

bash
cat <<'EOF' | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web
spec:
  ingressClassName: nginx
  rules:
    - host: web.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web
                port:
                  number: 80
EOF

Tarkastele Ingressiä ja sille annettua osoitetta:

bash
kubectl get ingress web
kubectl describe ingress web

Vaihtoehto 2 – Rancherin käyttöliittymästä:

  1. Avaa Cluster Explorer → Service Discovery → Ingresses.
  2. Valitse Create, aseta isäntänimi (esim. web.example.com), polku / ja taustan Serviceksi web portti 80.
  3. Tallenna ja tarkista, että Ingress näkyy myös komennolla kubectl get ingress.

🔎 Testaus: Jos isäntänimi ei ole oikeassa DNS:ssä, voit testata suoraan Ingress-controllerin osoitetta ja asettaa isäntänimen pyyntöön:

bash
curl -s -H "Host: web.example.com" http://<ingress-controllerin-ip>/

D) Siivoa harjoitus

Poista oma nimiavaruus, mikä poistaa kerralla Deploymentin, Servicen ja Ingressin:

bash
kubectl delete namespace <oma-nimi>

Yhteenveto

  • Jokaisella Podilla on oma IP; pysyvä pääsy toteutetaan Servicellä, jonka reitityksen hoitaa kube-proxy.
  • Service-tyypit: ClusterIP (sisäinen), NodePort (solmun portti), LoadBalancer (ulkoinen kuormantasaaja).
  • CoreDNS antaa Serviceille nimet muotoa <service>.<namespace>.svc.cluster.local.
  • CNI (RKE2:ssa oletuksena Canal) toteuttaa Podien välisen verkon.
  • Ingress reitittää ulkoisen HTTP(S)-liikenteen isäntänimen ja polun perusteella; RKE2:n oletuscontroller on ingress-nginx.
  • RKE2 asentaa nämä verkkokomponentit oletuksena kube-system-nimiavaruuteen.