Uke 3 - Veien mot skyene
Timer
Denne uken: 26 (syk to dager)
Totalt: 93 đ
Fredag
I dag ble tiden brukt pÄ Ä se pÄ monitorering av Kubernetes klusteret og Tomcat serveren som kjÞrer applikasjonen.
Ulike nivÄer av monitorering
Det er ulike nivÄer vi Þnsker Ä kunne monitorere og logge pÄ:
- Infrastruktur nivÄ
- Kubernetes nivÄ
- Tomcat / JVM nivÄ
- ApplikasjonsnivÄet
PÄ infrastruktur nivÄet Þnsker vi Ä fÄ informasjon om hvor mange ressurser vi har i Azure, som VM instanser og Kubernetes klustre.
PÄ Kubernetes nivÄet Þnsker vi oversikt over blandt annet CPU, minnebruk, fillagring og nettverks bruk for selve klusteret. Men vi Þnsker ogsÄ detaljert informasjon om hver enkelt Pod.
PÄ Tomcat og JVM nivÄet Þnsker vi detaljert informasjon om for eksempel hvor mange trÄder som kjÞrer, hvor mange feilmeldinger, telle antall forespÞrsler mot hvert enkelt REST-endpoint for eksempel /location
, hvor mye minne JVM'en bruker.
Og til slutt pÄ Applikasjons laget sÄ Þnsker vi Ä kunne analysere loggene, indeksere de, og kunne sÞke og prosessere loggene.
Prometheus og Grafana
Prometheus er et monitorerings system og en tidsseriedatabase. Prometheus er gode pÄ dataer som man monitorerer, for eksempel CPU og minnebruk. For applikasjons logger, der vi mÄ analysere innholdet mÄ vi bruke andre alternativer som ELK-stacken (Elasticsearch). Det finnes ogsÄ en mer lettvekt lÞsning for logger til Prometheus ogsÄ, Loki, som er laget av Grafana.
Grafana er ett verktĂžy for Ă„ data visualisering og monitorering, som man bruker sammen med tjenester som Prometheus, Elasticsearch og InfluxDB.
BÄde Kubernetes og Docker har innebygget stÞtte for Prometheus, og med Kubernetes sÄ vil Prometheus kunne oppdage tjenestene selv (self-discovering) som er svÊrt viktig nÄr ressursene i Kubernetes blir laget dynamisk.
premain
JMX Exporter, Java Agent og For Ä kunne monitorere Tomcat serveren vi mÄ servere dataene til Prometheus over HTTP, og skal vi dra nytte av Kubernetes sin stÞtte til Prometheus mÄ monitorerings dataene bli servert pÄ /metrics
. Siden vi har mye eksisterende kode, er det nÞdvendig Ä finne en lÞsning slik at vi kan monitorere applikasjone uten Ä mÄtte endre den eksisterende kodebasen. Her kommer vi over Java Agent.
Java Agent
En Java agent er en vanlig Java klasse med litt strengere regler, den mÄ implementere metoden:
public static void premain(String agentArgs, Instrumentation inst)
premain
metoden blir en agent entry point, lignende den vanlige main
vi er vandt med i vanlige Java applikasjoner.
NÄr Java Virtuell Maskin (JVM) har blitt initialisert, vil hver premain(String agentArgs, Instrumentation inst)
bli kalt i den rekkefÞlgen agentene ble spesifisert nÄr JVM'en startet. NÄr alle premain
metodene er initialisert vil den ekte Java applikasjon main
metoden bli kalt.
Med denne metoden kan man injisere og modifisere eksisterende kode, ved Ă„ manipulere byte-koden. Her er det laget noen rammeverk, men i korte trekk blir det lagt til ekstra kode i for eksempel Interfacet javax.servlet.Servlet
. Hvor vi da kan lytte pÄ Servletene og telle for mange forespÞrsler det kommer til for eksempel /eksempel
.
JMX Exporter
Prometheus har heldigvis laget en JMX Exporter som kjÞres som en Java Agent og serverer metrics pÄ url:port/metrics
, denne tar hÄnd om de fleste JVM mÄlingene vi er interessert i, og prosjektet ligger Äpen pÄ GitHub sÄ her kan vi ogsÄ videre utvikle etter vÄrt eget behov.
JMX Exporter prosjektet har ogsÄ ett Grafana dashboard som vi kan bruke til Ä videre utvikle.
Kubernetes og Prometheus
Jeg kom over ett Kubernetes oppsett for Prometheus og Grafana som jeg kunne kjapt teste litt ut. MÄlet her er at vi ogsÄ skal kjÞre Prometheus i selve Kubernetes klusteret.
Prosjektet er satt opp med en fin one-liner quick install som setter opp alt under namespacet monitoring
i det eksisterende klusteret vÄrt:
kubectl apply \
--filename https://raw.githubusercontent.com/giantswarm/kubernetes-prometheus/master/manifests-all.yaml
SÄ kan vi videre sende porten inni klusteret til vÄr lokale maskin ved Ä kjÞre kommandoen:
kubectl port-forward --namespace=monitoring grafana-core 3000:3000
Ă
pner vi http://localhost:3000
pÄ maskinen vil vi kunne se Grafana dashboardet
Videre
Jobben videre blir Ä knytte sammen applikasjonen vÄr og Prometheus i Kubernetes klusteret. For Ä fÄ dette til mÄ vi konfigurere Prometheus Annotations i Helm sin deployment fil. I metadata seksjonen under template i spec seksjonen mÄ vi definere tre variabler:
prometheus.io/scrape
: Om Prometheus skal skrape Pod'enprometheus.io/path
: Hvilken sti metrics vil bli servert pÄ (standard/metrics
)prometheus.io/port
: Hvilken port Prometheus skal skrape pÄ.
Neste uke, pÄ mandag, skal jeg og ett par fra teamet mitt, samt Kubernetes eksperten fra tidligere i uken, ta et mÞte for Ä gÄ igjennom og se hvor langt vi har kommet i prosjektet. Hva som gjenstÄr, hva som er gjort og hvor vi Þnsker Ä bevege oss videre.
Torsdag
Jeg fikk testet ut Azure Pipeline i dag. Sammenkoblingen mot ACR og AKS er smertefritt, alt er integrert i lÞsninen via en grafisk pipeline bygger. Men jeg fikk ett stort problem, i vÄr lÞsning med mono-repo og thrunk-based master er vi avhenging av git tags
som versjonerer kodebasen etterhvert som Jenkins bygger prosjektet og byggingen blir vellyket. Denne metodikken Ăžnsker vi Ă„ fortsette med, siden vi da kan bruke taggen fra git til Ă„ tagge docker imaget.
Desverre stĂžtter ikke Azure Pipelines Ă„ lese git tags
fra Bitbucket, hvor vi hoster alle repositoriene vÄre. Azure Pipelines har muligheten dersom man bruker Azure DevOps egne repositories. Men vi kan ikke flytte alle vÄre repositories fra Bitbucket til Azure DevOps over natten, pÄ grunn av vi bruker Jira og Confluence hos Atlassian. Skal vi gÄ over, vil det generere en god del ekstra arbeid utennom dette prosjektet. Derfor gÄr jeg tilbake til Bitbucket Pipelines.
Pipelinen min i Bitbucket deployer i siste steg til AKS. Vi skal bruke Kubernetes package manager'en Helm til Ä deploye nye Docker images til klusteret. Dette var egentlig grunnen til at jeg ville prÞve ut Azure Pipeline, fordi integrasjonen allerede var laget. SÄ nÄ mÄ jeg sette det opp selv.
Kubernetes eksperten fra i gÄr, hjalp meg med Ä designe Helm Chartet for test applikasjonen vÄr.
For Ă„ kunne deploye til AKS med Helm trenger jeg noen verktĂžy i Pipelinen min:
az
- Azure CLI for autentiseringhelm
- Helm klient for Ă„ kunne oppdatere Helm Chartetkubectl
- Kubernetes CLI for Ă„ kunne autentisere mot klusteret og sette riktig kontekst.
Dette lĂžste jeg med Ă„ lage ett eget Dockerimage som inneholder nettopp disse verktĂžyene, som jeg kan importere i Pipelinen.
FROM microsoft/azure-cli
ENV KUBE_LATEST_VERSION="v1.12.2"
ENV HELM_LATEST_VERSION="v2.11.0"
RUN apk add --update ca-certificates \
&& apk add --update -t deps curl \
&& curl -L https://storage.googleapis.com/kubernetes-release/release/${KUBE_LATEST_VERSION}/bin/linux/amd64/kubectl -o /usr/local/bin/kubectl \
&& chmod +x /usr/local/bin/kubectl \
&& wget http://storage.googleapis.com/kubernetes-helm/helm-${HELM_LATEST_VERSION}-linux-amd64.tar.gz \
&& tar -xvf helm-${HELM_LATEST_VERSION}-linux-amd64.tar.gz \
&& mv linux-amd64/helm /usr/local/bin \
&& rm -f /helm-${HELM_LATEST_VERSION}-linux-amd64.tar.gz \
&& apk del --purge deps \
&& rm /var/cache/apk/*
Pipelinen ser etterpÄ slik ut (fjernet noen verdier <variabel>
):
pipelines:
tags:
'*':
- step:
name: Build and deploy to Docker registry
services:
- docker
script:
- export IMAGE_NAME=$DOCKER_REGISTRY/$APP_NAME:$BITBUCKET_TAG
- export IMAGE_NAME_LATEST=$DOCKER_REGISTRY/$APP_NAME:latest
- docker build -t $IMAGE_NAME -t $IMAGE_NAME_LATEST .
- docker login <registry_name>.azurecr.io -u $DOCKER_USERNAME --password $DOCKER_PASSWORD
- docker push $IMAGE_NAME
- docker push $IMAGE_NAME_LATEST
- step:
name: Deploy to Kubernetes
deployment: test
image:
name: <registry_name>.azurecr.io/az-cli-kubectl-helm:0.1.1
username: $DOCKER_USERNAME
password: $DOCKER_PASSWORD
script:
- az login --service-principal --username $AZURE_CLIENT_ID --password $AZURE_SECRET --tenant $AZURE_TENANT --subscription $AZURE_SUBSCRIPTION_ID
- helm init --client-only
- az acr helm repo add -n <registry_name>
- echo $KUBE_TOKEN | base64 -d > ./kube_token
- echo $KUBE_CA | base64 -d > ./kube_ca
- kubectl config set-cluster <cluster_name> --server=$KUBERNETES_HOST --certificate-authority="$(pwd)/kube_ca"
- kubectl config set-credentials bitbucket --token="$(cat ./kube_token)"
- kubectl config set-context development --cluster=<cluser_name> --user=bitbucket
- kubectl config use-context development
- helm upgrade $APP_NAME --install <registry_name>/$APP_NAME --set image.tag=$BITBUCKET_TAG --namespace development
Planen i morgen er Ä fÄ oversikt over hvordan vi skal ta hÄnd om deployments som ikke er gyldige, Helm har innebygget funksjonalitet for Ä kunne kjÞre roll-back. Men det mÄ ligge noe over for Ä styre dette.
Videre punkter som mÄ undersÞkes er logging, monitorering og sikkerhet bÄde for selve Kubernetes klusteret, Tomcat serveren som kjÞrer inni containeren og Java applikasjonen.
Onsdag
I dag hadde jeg sammen med en kollega mÞte med en Kubernetes ekspert fra firmaet som drifter mye av infrastrukturen til Stacc. Han skal hjelpe oss pÄ veien med Ä sette opp infrastrukturen rundt Kubernetes i Veien mot skyene prosjektet.
Siden jeg forrige uke fikk satt opp Azure Container Registry med Ansibe kunne jeg i dag gÄ videre pÄ faktisk pushe Dockerimages til ACR.
Jeg fikk satt opp Bitbucket Pipeline til demo modulen vÄr, sÄ nÄr det kommer en git tag
vil pipelinen starte.
Pipelinen bestÄr av fÞlgende:
- Bygge et Dockerimage
- Deploye til Azure Container Registry
- Koble seg til Azure Kubernetes Service (AKS) via
kubectl
- Deploye Dockerimaget til Kubernetes klusteret (AKS)
Etter ett nytt mÞte for Ä diskutere stegene fremover, diskuterte vi litt om hva vi skal gjÞre med delte biblioteker som i dag blir hostet inhouse via Nexus Repository. Disse vil ikke Bitbucket Pipeline fÄ tilgang til. Derfor vurderer jeg nÄ og se pÄ Azure Artifacts, fordelen med at dette er en Azure tjeneste er mye tettere integrering med ACR og AKS, som blandt annet automatisk autentisering.
Azure Artifacts er en undertjeneste i Azure DevOps, sÄ det kan kanskje ogsÄ vÊre smart Ä ta i bruk Azure Pipelines som ogsÄ ligger i Azure DevOps nÄr muligheten ligger der.
Mandag og tirsdag
Syk