# 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](#hands-on-preparation) - [Install k3s Kubernetes on your VM](#install-k3s-kubernetes-on-your-vm) - [Install Helm & fluxctl](#install-helm---fluxctl) - [Prepare the git repository for GitOps](#prepare-the-git-repository-for-gitops) - [Install fluxcd](#install-fluxcd) - [fluxcd playaround](#fluxcd-playaround) - [Install Helm operator](#install-helm-operator) (bonus) - [Helm operator playaround](#helm-operator-playaround) (bonus) - [Set up Lens](set-up-lens) (bonus) - [Continuous Delivery](continuous-delivery) (bonus) ## 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](#multipass-vm) (local installation, recommended) - [DigitalOcean VM](#digitalocean-vm) (remote installation) ### 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 ``` 6. 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 - https://cloud.digitalocean.com/droplets/new?size=s-2vcpu-2gb®ion=sgp1&distro=ubuntu&distroImage=ubuntu-18-04-x64 - You may set up Password Authentication for simpicity 3. Wait a few minutes, and you can connect to the `ssh root@<>` ## 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` ``` 5. 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 ``` 2. Install flux on Kubernetes cluster via Helm, with following commands ```shell $ 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 ``` 3. Copy the public SSH key ``` fluxctl identity --k8s-fwd-ns flux ``` 4. Setup the in GitHub (eg. `https://github.com/${GHUSER}/flux-get-started/settings/keys`) Remember to enable `Allow write access` 5. Trigger sync ``` fluxctl sync --k8s-fwd-ns flux ``` 6. 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 ``` 2. 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 <