Kubernetes toolbox

Export namespace and non namespace objects

ROOT=${HOME}/clusterstate
while read -r resource
do
    echo "  scanning resource '${resource}'"
    while read -r namespace item x
    do
        mkdir -p "${ROOT}/${namespace}/${resource}"
        echo "    exporting item '${namespace} ${item}'"
        kubectl get "$resource" -n "$namespace" "$item" -o yaml > "${ROOT}/${namespace}/${resource}/$item.yaml" &
    done < <(kubectl get "$resource" --all-namespaces 2>&1  | tail -n +2)
done < <(kubectl api-resources --namespaced=true 2>/dev/null | grep -v "events" | tail -n +2 | awk '{print $1}')

wait

Install yq

BINARY=yq_linux_arm64
LATEST=$(wget -qO- https://api.github.com/repos/mikefarah/yq/releases/latest 2>/dev/null | grep browser_download_url | grep $BINARY\"\$|awk '{print $NF}' )
sudo wget -q $LATEST -O /usr/bin/yq && sudo chmod +x /usr/bin/yq

Extract 'last aplied configuration from deployment etc.'

 kubectl get deployment nginx-deployment -o json | jq -r '.metadata.annotations."kubectl.kubernetes.io/last-applied-configuration"' | yq r -P - > deployment_cleaned.yaml

Install k0sctl

VER=$(curl -s https://api.github.com/repos/k0sproject/k0sctl/releases/latest|grep tag_name | cut -d '"' -f 4)
echo $VER
### For 64-bit ###
wget https://github.com/k0sproject/k0sctl/releases/download/${VER}/k0sctl-linux-x64 -O k0sctl

###For ARM64 ###
wget https://github.com/k0sproject/k0sctl/releases/download/${VER}/k0sctl-linux-arm64 -O k0sctl
chmod +x k0sctl
yes | cp -vr k0sctl /usr/local/bin/
### Bash ###
sh -c 'k0sctl completion >/etc/bash_completion.d/k0sctl'

CustomResource - unable to delete

kubectl patch app APP_NAME -p '{"metadata": {"finalizers": null}}' --type merge
kubectl patch crd CRD_NAME -p '{"metadata": {"finalizers": null}}' --type merge

Rolout update

kubectl rollout restart deployment/nginx-deployment

spec:
  replicas: 4
  strategy:
  type: RollingUpdate
  rollingUpdate:
    maxSurge: 3
    maxUnavailable: 1

Install kubectl and add completion

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/arm64/kubectl"

echo 'source <(kubectl completion bash)' >>~/.bashrc
kubectl completion bash >/etc/bash_completion.d/kubectl
echo "alias k=\'kubectl\'" >> ~/.bashrc
echo 'complete -F __start_kubectl k' >>~/.bashrc
source ~/.bashrc
export KUBECONFIG=~/admin.conf

or x64

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
kubectl completion bash >/etc/bash_completion.d/kubectl
export KUBECONFIG=~/admin.conf

Get all logs of deployments from nanespace

for deployment in $(kubectl get deployments -n $namespace -o jsonpath='{.items[*].metadata.name}'); do
  kubectl logs deployment/$deployment -n $namespace --all-containers >> /mnt/nas/_tmp/all_deployments_logs.txt
done

Finalize namespace

When namespace is in Terminating state.

namespaceToDelete=preload-kube-burner
kubectl get namespace "$namespaceToDelete" -o json   | jq 'del(.spec.finalizers)'   | kubectl replace --raw /api/v1/namespaces/$namespaceToDelete/finalize -f -

Fake python api tester client - server

Set server ip in client.py before running.

server.py
import time
import threading
from http.server import BaseHTTPRequestHandler, HTTPServer
from urllib.parse import parse_qs
import json
from datetime import datetime

log_counter = 0

def log_message(message):
    global log_counter
    stars = (log_counter % 5) + 1
    log_counter += 1
    progress = f"[{'*' * stars}{'-' * (5 - stars)}]"
    print(f"{progress} {datetime.now().isoformat()} - {message}")

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        if self.path.startswith("/ping"):
            query_params = parse_qs(self.path[6:])  # Pobieramy parametry z URL
            message = query_params.get("msg", ["No message"])[0]
            log_message(f"Received message: {message}")
            response = {"response": f"Echo: {message}"}

            # Wysyłamy odpowiedź
            self.send_response(200)
            self.send_header("Content-type", "application/json")
            self.end_headers()
            self.wfile.write(json.dumps(response).encode('utf-8'))
        else:
            self.send_response(404)
            self.end_headers()

def run(server_class=HTTPServer, handler_class=SimpleHTTPRequestHandler):
    server_address = ('', 5000)
    httpd = server_class(server_address, handler_class)
    print('Starting server...')
    httpd.serve_forever()

def start_server():
    server_thread = threading.Thread(target=run)
    server_thread.daemon = True
    server_thread.start()

if __name__ == "__main__":
    start_server()
    # Można dodać dodatkowe logowanie serwera, jeśli chcesz
    while True:
        time.sleep(1)
client.py
import urllib.request
import urllib.parse
import json
import time
from datetime import datetime
from urllib.error import URLError, HTTPError

log_counter = 0

def log_message(message):
    global log_counter
    stars = (log_counter % 5) + 1
    log_counter += 1
    progress = f"[{'*' * stars}{'-' * (5 - stars)}]"
    print(f"{progress} {datetime.now().isoformat()} - {message}")

def send_message(msg):
    url = f'http://localhost:5000/ping?msg={urllib.parse.quote(msg)}'
    try:
        # Timeout ustawiony na 1 sekundę
        with urllib.request.urlopen(url, timeout=1) as response:
            response_data = json.load(response)
            log_message(f"Sent: {msg}, Got: {response_data['response']}")
    except URLError as e:
        log_message(f"Failed to connect to server: {e.reason}. Retrying...")
    except HTTPError as e:
        log_message(f"HTTP error occurred: {e.code} - {e.reason}")
    except Exception as e:
        log_message(f"An unexpected error occurred: {e}")

def main():
    i = 0
    while True:
        msg = f"Hello {i}"
        send_message(msg)
        i += 1
        time.sleep(2)

if __name__ == "__main__":
    main()