Skip to content

Commit

Permalink
Add sections to create and expose deployment
Browse files Browse the repository at this point in the history
  • Loading branch information
jonasbjoralt committed Sep 9, 2024
1 parent 4b90f39 commit 3801b54
Show file tree
Hide file tree
Showing 4 changed files with 153 additions and 31 deletions.
131 changes: 100 additions & 31 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,21 @@
# Introduksjon til Kubernetes

# 0 - Før oppstart
# 0 - Installer pakker
Sørg for å ha følgende installert:
- Docker, containerd, eller podman
- kubectl
- Ha et lokalt cluster, f eks via minikube
- Docker, containerd, eller podman: `brew install docker`
- kubectl `brew install kubectl`
- minikube `brew install minikube`

Start clusteret:
```
minikube start --addons ingress
```

Og test tilkoblingen:
```
kubectl get pod
```

# Del 1: Hallo verden
## 1.1 - Deploy et enkelt API
Før vi starter, la oss se om vi har noen pods kjørende:
Expand All @@ -24,9 +35,9 @@ Så kan vi spinne opp helt enkelt API i én pod:
kubectl run --image ghcr.io/varianter/k8s-101:v1.0.1 myapi
```

Voila! Da kjører apiet fint. Men - åssen kan vi få brukt det?
Voila! Da kjører apiet fint. Men - det kan fortsatt bare nås av andre pods i clusteret.

## 1.2 - Eksponer APIet
## 1.2 - Si Hei
Først - la oss få litt mer info om poden:
```
kubectl get pod -o wide
Expand All @@ -37,35 +48,102 @@ Derfor skal vi først pinge den fra inni clusteret:
```
kubectl run --image nginx tmp #Start en pod vi kan kjøre curl fra
kubectl exec -it tmp -- curl <IP>/info #Ping
kubectl delete pod tmp #Rydde opp
```

Så må vi få eksponert appen utad også
### 1.2.1 - Test eksperimentelt endepunkt
Vi har også en nytt, _eksperimentelt_ endepunkt, `/experimental`
Kall det via: (Bruk pil opp og endre forrige kommando)
```
kubectl expose pod myapi --target-port 8080 --type NodePort --name myservice
kubectl exec -it tmp -- curl <IP>/experimental
```
Dette lager en _NodePort_ -service som lar oss nå poden via _Noden den kjører på_. Typisk i produksjon vil du heller bruke en _IngressController_ el.

For Minikube, bruk følgende for å få en link til å nå serivcen vi laget, og kopier den.
Og sjekk igjen at `/info` virker:
```
# Mac:
minikube service myservice --url | pbcopy
kubectl exec -it tmp -- curl <IP>/info
```

Prøv å åpne `<URL>/swagger` i nettleseren.
Uuups.. Kanskje vi burde hatt mer robusthet her?
## 1.3 - Rydde opp
Vi kan sikkert bare ta ned APIet, der var vel ingen brukere uansett. Slett unna debug-poden tmp også.

```
kubectl delete pod myapi tmp
```


- deploye en applikasjon `k create deploy myapp --image=img` eller via yaml
- Konfigurere med miljøvariabler
- Koble på en service og eksponer appen
- Skalere opp
## 1.2 - Slides om hva vi nettopp gjorde
## 1.4 - Slides om hva vi nettopp gjorde
Forklar:
- Nodes, Control Plane
- Deployment, pods
- Services

## 2 - Deployments
## 2.1 - Lag en basic deployment
Før vi går i produksjon, trenger vi åpenbart litt mer robusthet.
Lag en .yaml-fil med følgende innhold (se `ressurser/yaml-eksempler/deploy-basic.yaml`):
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: simple-api
name: simple-api-deployment
spec:
replicas: 2
selector:
matchLabels:
app: simple-api
template:
metadata:
creationTimestamp: null
labels:
app: simple-api
spec:
containers:
- image: "ghcr.io/varianter/k8s-101:v1.0.1"
name: api
ports:
- containerPort: 8080
resources: {}
status: {}
```
Når du har lagret, spinn det opp via: (NB! Bruk rett filnavn ift. plassering osv. Bruk tabs for å fullføre filnavnet)
```
kubectl create -f deploy-basic.yaml
```

# Del 2: Oppdater
## 2.2 - Expose APIet utad
Her skal vi gjøre at domenet `api.local` kan brukes til å nå APIet vårt.
Da må vi først lage en service som tar hånd om å velge pods. Deretter lager vi en ingress-regel for å knytte innkommende trafikk til servicen. Til slutt registrerer vi domenet lokalt.
### 2.2.1 - Lag en Service
Så må vi få eksponert appen utad også
```
kubectl create -f service.yaml
```

### 2.2.2 - Sett opp ingress
Først - sett opp en ingress-tjeneste. Vi skal ikke i stor detalj her, så vi har en ferdig-kokt yaml:
```
kubectl create -f ingress.yaml
```
Denne knytter domenet 'api.local' til servicen vi lagde i forrige steg.

### 2.2.3 - Registrere domenet
Hos kunde bruker du en leverandør til å sette opp ekte domener. Her skal vi kun jobbe _lokalt_, så vi bruker heller en liten juksekode:
```
sudo sh -c "echo '$(minikube ip) api.local' >> /etc/hosts"
```

Denne legger til en linje i `/etc/hosts`, som gjør at maskina di bruker IPen til clusteret når du skriver `api.local` i nettleseren.

### 2.2.4 - Test
Gå til nettleseren din, og åpne `api.local/swagger`
Voila!

# Pause

# Del 3: Mer robusthet, Oppdateringer
## 2.1 Gjøre ting
- Sette på readiness- og livenessProbes
- Oppdater til neste versjon. Denne krever tilkobling til DB og failer derfor
Expand All @@ -74,13 +152,4 @@ Prøv å åpne `<URL>/swagger` i nettleseren.
- Gå til neste seksjon -> lage en database
## 2.2 Slides om åssen deployments endres, replicasets osv

# Pause
# Del 3: Legg på en database
// Denne delen kan bli lang - Vi kan vurdere å droppe den. Eller lage noen snarveier kanskje
## 3.1 - Bruk en secret for å legge database-passord, evt connection-string

## 3.2 - Sett opp persistent volum, claim

## 3.3 - Kjør database i cluster

## 3.4 - Oppdater app til å bruke database
# Pause
25 changes: 25 additions & 0 deletions ressurser/yaml-eksempler/deploy-basic.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: simple-api
name: simple-api-deployment
spec:
replicas: 2
selector:
matchLabels:
app: simple-api
template:
metadata:
creationTimestamp: null
labels:
app: simple-api
spec:
containers:
- image: "ghcr.io/varianter/k8s-101:v1.0.1"
name: api
ports:
- containerPort: 8080
resources: {}
status: {}
17 changes: 17 additions & 0 deletions ressurser/yaml-eksempler/ingress.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api-ingress
spec:
ingressClassName: nginx
rules:
- host: api.local
http:
paths:
- backend:
service:
name: api-service
port:
number: 8080
path: /
pathType: Prefix
11 changes: 11 additions & 0 deletions ressurser/yaml-eksempler/service.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
kind: Service
apiVersion: v1
metadata:
name: api-service
spec:
selector:
app: simple-api
ports:
# Default port used by the image
- port: 8080
targetPort: 8080

0 comments on commit 3801b54

Please sign in to comment.