Skip to main content

Primary links

  • Home
  • AI
  • Kubernetes
  • Incus
  • Ansible
  • Terraform
  • OpenStack
  • Virtualization
  • Linux
  • SmartHome
  • HowTo

Misc

  • XEN
  • Linux
  • Hardware
  • Programming
  • Databases
  • CLI
  • Multimedia
  • Plugins
  • Windows
  • Contact

Cloud

  • OpenStack
  • cloud-config
  • nextcloud

Virtualization

  • Virtualization
  • Docker
  • KVM
  • Kubernetes
  • LXC
  • LXD
  • QEMU
  • VMware
  • VirtualBox
  • multipass
  • podman
  • vagrant
  • Incus

Network

  • DNS
  • Firewall
  • Linux
  • OpenvSwitch
  • SSL
  • VLAN
  • VPN
  • iPXE
  • namespaces
  • nmcli
  • tcpdump

Storage

  • CEPH
  • DRBD
  • LVM
  • S3
  • ZFS
  • btrfs

Automation / CI/CD

  • Install
  • Ansible
  • GitLab
  • LLM
  • Preseed
  • Puppet
  • Terraform
  • Ubuntu autoinstall

Monitoring / Visualisation

  • Grafana
  • Icinga
  • Prometheus
  • Monitoring
  • ELK
  • mermaid

k9s

Install k9s
https://github.com/derailed/k9s/releases

RELEASE=$(curl -s https://api.github.com/repos/derailed/k9s/releases/latest | jq -r .tag_name)
wget -q https://github.com/derailed/k9s/releases/download/${RELEASE}/k9s_linux_amd64.deb -P /tmp/
sudo dpkg -i /tmp/k9s_linux_amd64.deb

Install k9s with Ansible
https://github.com/derailed/k9s/releases

- hosts: localhost
  tasks:
    - name: Install k9s from https://github.com/derailed/k9s/releases
      become: true
      block:
        - name: Get latest k9s version
          ansible.builtin.uri:
            url: "https://api.github.com/repos/derailed/k9s/releases/latest"
            return_content: yes
          register: k9s_version

        - name: Set k9s version
          ansible.builtin.set_fact:
            k9s_release: "{{ k9s_version.json.tag_name }}"      

        - name: Install k9s binary
          ansible.builtin.apt:
            deb: https://github.com/derailed/k9s/releases/download/{{ k9s_release }}/k9s_linux_amd64.deb

Gardener

getting-started
https://gardener.cloud/docs/getting-started/

Releases
https://github.com/gardener/gardener/releases

Introduction
https://www.youtube.com/watch?v=PQMVVeYRzYU

Get vGarden cluster credentials

export KUBECONFIG=~/.kube/api.v.gardener.stage.example.com.yaml
kubectl get shoots -A

Create shoot
https://github.com/gardener/gardener/blob/master/example/90-shoot.yaml

# cat my-botany1.yaml
apiVersion: core.gardener.cloud/v1beta1
kind: Shoot
metadata:
  name: my-botany1
  namespace: garden-dev
spec:
  secretBindingName: gardenshoot1
  cloudProfileName: ch-zh1
  region: ch-zh1
  purpose: production
  provider:
    type: openstack
    infrastructureConfig:
      apiVersion: openstack.provider.extensions.gardener.cloud/v1alpha1
      kind: InfrastructureConfig
      floatingPoolName: public
      networks:
        workers: 10.250.10.0/16
    controlPlaneConfig:
      apiVersion: openstack.provider.extensions.gardener.cloud/v1alpha1
      kind: ControlPlaneConfig
      loadBalancerProvider: amphora
    workers:
    - name: worker
      cri:
        name: containerd
      minimum: 2
      maximum: 5
      machine:
        type: e1.xlarge
        image:
          name: ubuntu
          version: 22.04.20231101
      zones:
        - ch-zh1-az1
        - ch-zh1-az2
  kubernetes:
    version: 1.29.4
  dns:
    domain: my-botany1.dev.gardener.example.com
  extensions: []
  networking:
    type: calico # {calico,cilium}
    ipFamilies:
    - IPv4
    pods: 100.96.0.0/11
    nodes: 10.250.0.0/16
    services: 100.64.0.0/13
  maintenance:
    timeWindow:
      begin: 220000+0100
      end: 230000+0100
    autoUpdate:
      kubernetesVersion: true
      machineImageVersion: true
  monitoring:
    alerting:
      emailReceivers:
      - foo@example.com
  addons:
    nginxIngress:
      enabled: false
    kubernetesDashboard:
      enabled: false

kubectl apply -f my-botany1.yaml

Delete shoot
https://gardener.cloud/docs/dashboard/project-operations/

Install minikube

Install docker
http://www.panticz.de/docker

Install minikube
https://minikube.sigs.k8s.io/docs/start/

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_$(dpkg --print-architecture).deb
sudo dpkg -i minikube_latest_*.deb
rm minikube_latest_*.deb

sudo usermod -aG docker $USER && newgrp docker

minikube start

minikube addons enable ingress

Install kubectl
https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/#install-using-native-package-management

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubectl

kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl
source /etc/bash_completion.d/kubectl

echo "alias k=kubectl" >> ~/.bashrc
echo "complete -o default -F __start_kubectl k" >> ~/.bashrc

Test configuration

kubectl get all --all-namespaces -o wide

Install k9s
https://github.com/derailed/k9s/releases

K9S_VERSION=0.32.4
wget -q https://github.com/derailed/k9s/releases/download/v${K9S_VERSION}/k9s_linux_$(dpkg --print-architecture).deb -P /tmp/
sudo dpkg -i /tmp/k9s_linux_$(dpkg --print-architecture).deb
rm /tmp/k9s_linux_*.deb

Configure port forwad to minikube

Deploy kubernetes cluster with kubeadm

Prepare VM for Container Runtime
https://kubernetes.io/docs/setup/production-environment/container-runtimes/

# run on all nodes

cat <


<strong>Install containerd</strong>
https://github.com/containerd/containerd/blob/main/docs/getting-started.md
https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository
<code>
# run on all nodes

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
     sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update

# Install containerd
sudo apt-get install -y containerd.io

# Verify
systemctl status containerd.service

Configure systemd cgroup driver
https://kubernetes.io/docs/setup/production-environment/container-runtimes/#cgroup-drivers
https://kubernetes.io/docs/setup/production-environment/container-runtimes/#containerd-systemd

# run on all nodes

containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
sudo systemctl restart containerd

# Verify
# crictl ps -a

Installing kubeadm, kubelet and kubectl
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#installing-kubeadm-kubelet-and-kubectl

Kubernetes the hard way

Links
https://github.com/kelseyhightower/kubernetes-the-hard-way

Configure OpenStack application credentials

mkdir -p ~/.config/openstack

cat < ~/.config/openstack/clouds.yaml
clouds:
  dev-foo:
    auth_type: "v3applicationcredential"
    auth:
      auth_url: https://keystone.service.dev.example.com/v3
      application_credential_id: "YOUR_CREDENTIAL_ID"
      application_credential_secret: "YOUR_CREDENTIAL_PASS"
EOF

Install Terraform

cat < /tmp/install-terraform.yml 
---
- hosts: localhost
  tasks:
    - name: Get latest Terraform version
      uri:
        url: https://checkpoint-api.hashicorp.com/v1/check/terraform
      register: response

    - set_fact:
        terraform_download_url: "{{ response.json.current_download_url }}"
        terraform_version: "{{ response.json.current_version }}"

    - name: Download Terraform {{ terraform_version }}
      unarchive:
        src: "{{ terraform_download_url }}terraform_{{ terraform_version }}_{{ ansible_system | lower }}_amd64.zip"
        remote_src: yes
        dest: ~/bin
        creates: ~/bin/terraform
        mode: 0550
EOF

ansible-playbook /tmp/install-terraform.yml

Create test env on OpenStack

kubectl - Kubernetes CLI client

Client

sudo apt-get update
sudo apt-get install -y apt-transport-https
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubectl kubeadm

Bash completion

kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl

Manual installation

curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl

Test

kubectl get nodes -o wide
kubectl get all --insecure-skip-tls-verify

kubectl-commands
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

Links
https://kubernetes.io/docs/tasks/tools/install-kubectl/
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/

OpenStack: Magnum

Documentation
https://docs.openstack.org/magnum/latest/user/

Pre-requirements

# install OSC magnum client to fix "a bytes-like object is required, not 'str'"
echo "deb http://archive.ubuntu.com/ubuntu hirsute main restricted" > /etc/apt/sources.list.d/hirsute.list
apt update
apt install -y python3-magnumclient

# install kubectl
snap install kubectl --classic

CLI

openstack stack list
openstack stack show d8a1c3af-7993-4493-91be-19cfce38a870
openstack coe cluster update k8s-cluster replace node_count=2

Configure deployment kolla-ansible

# cat /etc/kolla/config/magnum.conf 
[cinder]
default_docker_volume_type = VT1

[trust]
cluster_user_trust = True

/etc/kolla/config/heat.conf 
[DEFAULT]
#region_name = ch-zh1
region_name_for_services = RegionOne

# /etc/kolla/globals.yml 
# magnum_tag: "7.0.0.1"
enable_magnum: "yes"

Redeploy / Reconfigure container

kolla-ansible -i /etc/kolla/inventory-hosts deploy -t magnum

Get Fedora AtomicHost images
https://dl.fedoraproject.org/pub/alt/atomic/stable/?C=M;O=D

Kubernetes dashboard UI

Add user and configure permissions

cat < /tmp/dashboard-adminuser.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system
EOF
kubectl apply -f /tmp/dashboard-adminuser.yaml
cat < /tmp/kubernetes-dashboard-admin.rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kube-system
EOF
kubectl apply -f /tmp/kubernetes-dashboard-admin.rbac.yaml

Get dashboard token

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}') | grep token: | awk '{print $2}'

Start proxy and open Kubernetes Dashboard

CLUSTER=foo-k8s-cluster1
CLUSTER_IP=$(openstack coe cluster show ${CLUSTER} -c master_addresses -f value | cut -d"'" -f2)
echo ${CLUSTER_IP}

#ssh -L 8001:localhost:8080 fedora@10.0.10.111
ssh -L 8001:localhost:8080 fedora@${CLUSTER_IP}
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

kubectl proxy

Kubernetes Dashboard URL
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

Links
https://github.com/kubernetes/dashboard/wiki/Creating-sample-user
https://www.twblogs.net/a/5c4adb6fbd9eee6e7e06a9b0
https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/
https://github.com/kubernetes/dashboard/wiki/Access-control#admin-privileges

Kubernetes

Changelog
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG.md

Dump Kubernetes Objects

Kubernetes