Skip to content

Instantly share code, notes, and snippets.

@dictcp
Last active June 23, 2021 02:27
Show Gist options
  • Select an option

  • Save dictcp/b0deb9e4f03e5bbcb337d3a689bb7693 to your computer and use it in GitHub Desktop.

Select an option

Save dictcp/b0deb9e4f03e5bbcb337d3a689bb7693 to your computer and use it in GitHub Desktop.
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

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 (local installation, recommended)
    • [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
  1. Execute multipass shell fluxcd-workshop to obtain shell in the VMs

DigitalOcean VM

Install k3s Kubernetes on your VM

  1. Execute curl -sfL https://get.k3s.io | sh - in the VM
  2. Depends on network condition, you need to wait for 5-10 mins.
  3. 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 2 commands:

sudo snap install kubectl --classic
sudo snap install helm --classic --channel=3.0/stable
sudo snap install fluxctl --classic

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment