- docker-30/zot: add Zot OCI registry with on-demand sync to docker.io, registry.k8s.io, ghcr.io, quay.io - kubernetes-kvm-terraform: wire Kanidm OIDC via structured AuthenticationConfiguration; add reference apiserver manifest and join-node-02 helper - servers: reorganize shadow/ under servers/, add saint vhost config and utility-101 VM definition, add shadow hrajfrisbee.cz vhost and storage-23 notes - experiments: add notes and configs for e2b dev VM, kata + firecracker on kube, microsandbox, orb-stack k3s (terraform + cloud-init), rke2 - vms/docker: document tailscale + node-exporter setup - blog: stub post on Gateway API - chore: gitignore tmp/, smtp_password, and the two local-only credential caches; add per-project .claude/settings.json Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
219 lines
5.7 KiB
Markdown
219 lines
5.7 KiB
Markdown
## install
|
|
|
|
```bash
|
|
# master node
|
|
curl -sfL https://get.rke2.io | INSTALL_RKE2_VERSION=v1.32.12+rke2r1 sh -
|
|
systemctl enable rke2-server.service
|
|
systemctl start rke2-server.service
|
|
journalctl -u rke2-server -f
|
|
|
|
# open firewalld
|
|
sudo firewall-cmd --permanent --add-port=9345/tcp
|
|
sudo firewall-cmd --permanent --add-port=6443/tcp
|
|
sudo firewall-cmd --permanent --add-port=10250/tcp # Kubelet
|
|
sudo firewall-cmd --reload
|
|
|
|
# install nerdctl
|
|
# Set the version
|
|
VERSION="2.2.1" # Check GitHub for the latest version
|
|
|
|
# Download the tarball
|
|
wget https://github.com/containerd/nerdctl/releases/download/v${VERSION}/nerdctl-${VERSION}-linux-arm64.tar.gz
|
|
|
|
# Extract to your path
|
|
sudo tar -C /usr/local/bin -xzvf nerdctl-${VERSION}-linux-arm64.tar.gz nerdctl
|
|
|
|
# configure nerdctl
|
|
sudo mkdir -p /etc/nerdctl
|
|
sudo tee /etc/nerdctl/nerdctl.toml <<EOF
|
|
address = "unix:///run/k3s/containerd/containerd.sock"
|
|
namespace = "k8s.io"
|
|
EOF
|
|
|
|
# install buildkit
|
|
# Set current stable version
|
|
BK_VER="0.28.0"
|
|
|
|
# Download arm64 binary
|
|
wget https://github.com/moby/buildkit/releases/download/v${BK_VER}/buildkit-v${BK_VER}.linux-arm64.tar.gz
|
|
|
|
# Extract only the binaries to /usr/local/bin
|
|
sudo tar -C /usr/local/bin -xzvf buildkit-v${BK_VER}.linux-arm64.tar.gz --strip-components=1 bin/
|
|
|
|
# Create the service file
|
|
sudo tee /etc/systemd/system/buildkit.service <<EOF
|
|
[Unit]
|
|
Description=BuildKit
|
|
Documentation=https://github.com/moby/buildkit
|
|
|
|
[Service]
|
|
ExecStart=/usr/local/bin/buildkitd --addr unix:///run/buildkit/buildkitd.sock
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
# Reload and Start
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable --now buildkit
|
|
|
|
# ---------------------------------------------
|
|
|
|
|
|
# agent/worker node
|
|
curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE="agent" INSTALL_RKE2_VERSION=v1.32.12+rke2r1 sh -
|
|
systemctl enable rke2-agent.service
|
|
mkdir -p /etc/rancher/rke2/
|
|
# token from master node
|
|
# cat /var/lib/rancher/rke2/server/node-token
|
|
cat <<EOF | sudo tee /etc/rancher/rke2/config.yaml
|
|
server: https://192.168.64.3:9345
|
|
token: K107618960f87b9efb3a3255ce00a9743d29f1db9376820c9144cb85fa3c554dc69::server:06b2effdf0c9ce3952efc8a5d80bf084
|
|
EOF
|
|
systemctl start rke2-agent.service
|
|
journalctl -u rke2-agent -f
|
|
|
|
|
|
# Set up kubectl on the server node
|
|
echo 'export KUBECONFIG=/etc/rancher/rke2/rke2.yaml' >> ~/.bashrc
|
|
echo 'export PATH=$PATH:/var/lib/rancher/rke2/bin' >> ~/.bashrc
|
|
source ~/.bashrc
|
|
```
|
|
|
|
|
|
|
|
## build and deploy application
|
|
|
|
```bash
|
|
# build container with nerdctl
|
|
nerdctl --namespace k8s.io build --tag hello-world:latest .
|
|
|
|
# export image as tar on master node
|
|
nerdctl save hello-world:latest -o hello-world.tar
|
|
# copy it over to worker node
|
|
scp hello-world.tar novakj@192.168.64.4:~/
|
|
# import image on the agent node
|
|
sudo /var/lib/rancher/rke2/bin/ctr --address /run/k3s/containerd/containerd.sock -n k8s.io images import hello-world.tar
|
|
|
|
kubectl create namespace rke2-apps
|
|
|
|
cat <<EOF > deployment.yaml
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: hello-world-deployment
|
|
namespace: rke2-apps
|
|
labels:
|
|
type: staticwebapp
|
|
spec:
|
|
replicas: 1
|
|
selector:
|
|
matchLabels:
|
|
type: staticwebapp
|
|
template:
|
|
metadata:
|
|
labels:
|
|
type: staticwebapp
|
|
spec:
|
|
containers:
|
|
- name: staticwebapp
|
|
image: hello-world:latest
|
|
imagePullPolicy: Never
|
|
ports:
|
|
- containerPort: 80
|
|
resources:
|
|
requests:
|
|
memory: "32Mi"
|
|
cpu: "200m"
|
|
limits:
|
|
memory: "64Mi"
|
|
cpu: "300m"
|
|
EOF
|
|
|
|
kubectl create -f deployment.yaml
|
|
|
|
# expose deployment
|
|
kubectl expose deployment hello-world-deployment --name hello-world-service --port=8080 --target-port=80 -n rke2-apps
|
|
|
|
# install ingress-nginx (even though i thought that there is ingress controller already deployed)
|
|
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.2/deploy/static/provider/cloud/deploy.yaml
|
|
|
|
# create ingress with "localhost" as host
|
|
kubectl create ingress hello-world-ingress --class=nginx --rule="test-host/*=hello-world-service:8080" -n rke2-apps
|
|
kubectl port-forward -n ingress-nginx service/ingress-nginx-controller 8081:80
|
|
|
|
|
|
|
|
# incomplete completion configuration ;-)
|
|
dnf install bash-completion -y
|
|
alias 'k=kubectl'
|
|
|
|
# ~/.bashrc
|
|
|
|
# 1. Load the main bash-completion package first
|
|
# On Rocky/RHEL, it's usually at this path:
|
|
[[ -r "/usr/share/bash-completion/bash_completion" ]] && . "/usr/share/bash-completion/bash_completion"
|
|
|
|
# Enable kubectl bash completion
|
|
source <(kubectl completion bash)
|
|
|
|
# Set up the alias
|
|
alias k=kubectl
|
|
|
|
# Link the kubectl completion logic to the 'k' alias
|
|
complete -o default -F __start_kubectl k
|
|
```
|
|
|
|
|
|
|
|
## upgrading RKE2
|
|
|
|
```bash
|
|
# install upgrade controller
|
|
kubectl apply -f https://github.com/rancher/system-upgrade-controller/releases/download/v0.9.1/system-upgrade-controller.yaml
|
|
|
|
# server upgrade
|
|
cat <<EOF | kubectl apply -f -
|
|
apiVersion: upgrade.cattle.io/v1
|
|
kind: Plan
|
|
metadata:
|
|
name: rke2-server-upgrade
|
|
namespace: system-upgrade
|
|
spec:
|
|
concurrency: 1
|
|
cordon: true
|
|
nodeSelector:
|
|
matchExpressions:
|
|
- key: node-role.kubernetes.io/control-plane
|
|
operator: In
|
|
values: ["true"]
|
|
serviceAccountName: system-upgrade
|
|
upgrade:
|
|
image: rancher/rke2-upgrade
|
|
version: v1.33.9+rke2r1
|
|
EOF
|
|
|
|
# agent upgrade
|
|
cat <<EOF | kubectl apply -f -
|
|
apiVersion: upgrade.cattle.io/v1
|
|
kind: Plan
|
|
metadata:
|
|
name: rke2-agent-upgrade
|
|
namespace: system-upgrade
|
|
spec:
|
|
concurrency: 1
|
|
cordon: true
|
|
nodeSelector:
|
|
matchExpressions:
|
|
- key: node-role.kubernetes.io/control-plane
|
|
operator: DoesNotExist
|
|
prepare:
|
|
# Logic: "Don't start workers until servers are done"
|
|
args: ["wait-for-plan", "rke2-server-upgrade"]
|
|
image: rancher/rke2-upgrade
|
|
serviceAccountName: system-upgrade
|
|
upgrade:
|
|
image: rancher/rke2-upgrade
|
|
version: v1.33.9+rke2r1
|
|
EOF
|
|
``` |