Verkko ja lisäosat
Service-tyypit, CoreDNS, CNI-verkkolisäosat, Ingress-controllerit ja RKE2:n oletuskomponentit.
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]| Tyyppi | Näkyvyys | Käyttötarkoitus |
|---|---|---|
| ClusterIP | Vain klusterin sisällä | Oletustyyppi; sisäinen palveluiden välinen liikenne |
| NodePort | Solmun IP + portti (30000–32767) | Yksinkertainen ulkoinen pääsy testeihin |
| LoadBalancer | Ulkoinen kuormantasaaja | Tuotannon 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:
<service>.<namespace>.svc.cluster.localEsimerkiksi 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. - CoreDNS –
rke2-coredns-*: klusterin nimipalvelu. - ingress-nginx –
rke2-ingress-nginx-controller-*: HTTP(S)-reititys ulkoa sisään. - kube-proxy – jokaisella solmulla: Service-liikenteen reititys.
- metrics-server –
rke2-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:
# 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ä:
# 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 web2. Testaa Service klusterin sisältä väliaikaisella podilla:
kubectl run curl --image=curlimages/curl:8.10.1 --rm -it --restart=Never -- \
curl -s http://webVastauksena tulee nginxin oletussivun HTML.
B) Testaa CoreDNS-nimiselvitys podin sisältä
# 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.localnslookup palauttaa Servicen ClusterIP:n – tämän hoitaa CoreDNS.
C) Avaa sovellus ulkomaailmaan Ingressillä
Vaihtoehto 1 – komentoriviltä (deklaratiivinen manifesti):
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
EOFTarkastele Ingressiä ja sille annettua osoitetta:
kubectl get ingress web
kubectl describe ingress webVaihtoehto 2 – Rancherin käyttöliittymästä:
- Avaa Cluster Explorer → Service Discovery → Ingresses.
- Valitse Create, aseta isäntänimi (esim.
web.example.com), polku/ja taustan Serviceksiwebportti80. - 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:
bashcurl -s -H "Host: web.example.com" http://<ingress-controllerin-ip>/
D) Siivoa harjoitus
Poista oma nimiavaruus, mikä poistaa kerralla Deploymentin, Servicen ja Ingressin:
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.