Skip to content

Instantly share code, notes, and snippets.

@dictcp

dictcp/README.md

Last active Oct 26, 2020
Embed
What would you like to do?
Automating Kubernetes with GitOps Workshop

Automating Kubernetes with GitOps Workshop

@dictcp (https://dictcp.men)

About the workshop

Session at HKOSCon 2020: https://hkoscon.org/2020/topics/automating-kubernetes-gitops

Video recording: https://www.youtube.com/watch?v=xykc3AsMQ04

Slide: https://docs.google.com/presentation/d/1rA6bhCGMydP-NOmFu7fv0zbBSzGvK9GLn63H8dHLP2g

Context

Hands-on Preparation

You need

  • a GitHub account (to access this material and setup gitops flow)
  • a working Kubernetes in the hands-on session (to s)

multipass VM

  1. Install multipass on https://multipass.run
    • support Windows 10 Pro+, Mac OS X, Linux
    • Mac OS X (with homebrew installed): brew cask install multipass
    • Ubuntu (or any Linux distro with snap installed): sudo snap install multipass --classic
  2. Start Command prompt / Terminal
  3. Execute multipass launch -d 30G -m 2G --name fluxcd-workshop 18.04
  4. Depends on network condition, you need to wait for 5-20 mins.
  5. Check the IP of your VM via command multipass info fluxcd-workshop
Name:           fluxcd-workshop
State:          Running
IPv4:           192.168.64.15
Release:        Ubuntu 18.04.4 LTS
Image hash:     55646c02a8bc (Ubuntu 18.04 LTS)
Load:           1.46 5.28 3.97
Disk usage:     4.5G out of 28.9G
Memory usage:   1.5G out of 1.9G
  1. Execute multipass shell fluxcd-workshop to obtain shell in the VMs

DigitalOcean VM

  1. (If need) Signup DigitalOcean via https://m.do.co/c/3c4b5bb5da42
  2. create a droplet with 2GB and Ubuntu 18.04
  3. Wait a few minutes, and you can connect to the ssh root@<<YOUR_DROPLET_IP>>

Install k3s Kubernetes on your VM

  1. Connect to the shell of the VM set up
  2. Execute curl -sfL https://get.k3s.io | sh - in the VM
  3. Depends on network condition, you need to wait for 5-10 mins.
  4. You should have your local Kubernetes cluster installed. To verify, execute sudo -i k3s kubectl get nodes, it should give you something like
NAME              STATUS   ROLES    AGE     VERSION
fluxcd-workshop   Ready    master   5m53s   v1.18.3+k3s1`
  1. Make sure the cluster setup is avaiable by the following commands:
$ mkdir .kube
$ sudo cat /etc/rancher/k3s/k3s.yaml > .kube/config

Install Helm & fluxctl

Normally you can install helm and fluxctl with the following 4 commands:

sudo snap install kubectl --classic
sudo snap install helm --classic --channel=3.0/stable
sudo snap install fluxctl --classic
sudo rm /usr/local/bin/kubectl

Manual steps (if the above does not work)

  • Helm
$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
$ chmod 700 get_helm.sh
$ ./get_helm.sh
$ helm version
version.BuildInfo{Version:"v3.2.3", GitCommit:"8f832046e258e2cb800894579b1b3b50c2d83492", GitTreeState:"clean", GoVersion:"go1.13.12"}
  • fluxctl
wget -O fluxctl https://github.com/fluxcd/flux/releases/download/1.19.0/fluxctl_linux_amd64
chmod +x fluxctl
sudo mv fluxctl /usr/local/bin/

Prepare the git repository for GitOps

  1. Fork https://github.com/dictcp/flux-get-started in GitHub to your own account

Install fluxcd

  1. Setup the chart repository for flux
helm repo add fluxcd https://charts.fluxcd.io
  1. Install flux on Kubernetes cluster via Helm, with following commands
$ export GHUSER="dictcp"

$ kubectl create ns flux
$ helm upgrade -i flux fluxcd/flux \
  --set git.url=git@github.com:${GHUSER}/flux-get-started \
  --set 'git.path=namespaces\,workloads' \
  --namespace flux
  1. Copy the public SSH key
fluxctl identity --k8s-fwd-ns flux
  1. Setup the in GitHub (eg. https://github.com/${GHUSER}/flux-get-started/settings/keys) Remember to enable Allow write access

  2. Trigger sync

fluxctl sync --k8s-fwd-ns flux
  1. View the applied change (you should see a demo namespace
kubectl get ns

fluxcd playaround

  1. copy manifests-sample/podinfo-dep.yaml and manifests-sample/podinfo-svc.yaml to workloads/ in your flux-get-started repos; commit change and push

  2. check deployment progress watch kubectl -n demo get pod

Install Helm operator

  1. Install the CRD for HelmRelease
kubectl apply -f https://raw.githubusercontent.com/fluxcd/helm-operator/1.1.0/deploy/crds.yaml
  1. Install Helm Operator via Helm
helm upgrade -i helm-operator fluxcd/helm-operator \
--set git.ssh.secretName=flux-git-deploy \
--set helm.versions=v3 \
--namespace flux

Helm operator playaround

  1. copy releases/ghost.yaml as workloads/ghost.yaml in your flux-get-started repos; commit change and push OR running command
cat <<EOF | kubectl apply -f -
---
apiVersion: helm.fluxcd.io/v1
kind: HelmRelease
metadata:
  name: ghost
  namespace: demo
  annotations:
    fluxcd.io/automated: "false"
    fluxcd.io/tag.chart-image: glob:3.1.1-debian-9-*
spec:
  releaseName: ghost
  chart:
    git: ssh://git@github.com/fluxcd/flux-get-started
    ref: master
    path: charts/ghost
  values:
    image:
      repository: bitnami/ghost
      tag: 3.1.1-debian-9-r0
    persistence:
      enabled: false
    resources:
      requests:
        memory: 32Mi
        cpu: 10m
    service:
      type: ClusterIP
    mariadb:
      master:
        persistence:
          enabled: false
EOF
  1. check Helm install progress watch kubectl -n demo get hr

  2. Port-forward the result kubectl -n demo port-forward --address 0.0.0.0 service/ghost 8080:80

  3. Open browser and check the result

Set up Lens

  1. install Lens at https://k8slens.dev/

    • Mac OS X (with homebrew installed): brew cask install lens
  2. Add clusters with your KUBECONFIG

  3. check it out

Continuous Delivery

  1. Check into the magic of annotations fluxcd.io/automated: "true"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment