Skip to content

Instantly share code, notes, and snippets.

@hasmukhlalpatel
Last active October 22, 2025 22:31
Show Gist options
  • Select an option

  • Save hasmukhlalpatel/2e4c0567c2f999176ac302a7414eacf7 to your computer and use it in GitHub Desktop.

Select an option

Save hasmukhlalpatel/2e4c0567c2f999176ac302a7414eacf7 to your computer and use it in GitHub Desktop.
K3S setup on Docker container

Setup K3S on Docker

Found at: Dev.to

Prerequisites

  • Docker installed on your machine
  • Basic knowledge of Docker and Kubernetes
  • A terminal or command prompt
  • Internet connection
  • Sufficient system resources (CPU, RAM, Disk Space)
  • Optional: Docker Compose installed for easier management of multi-container applications

Steps to Set Up K3S on Docker

  1. Pull the K3S Docker Image: Open your terminal and run the following command to pull the K3S Docker image:

    docker pull rancher/k3s:latest
  2. Run the K3S Container: Start a K3S container with the following command:

    docker run -d --name k3s-server --privileged -p 6443:6443 rancher/k3s:latest server --docker

    This command runs the K3S server in a detached mode, exposing the Kubernetes API server on port 6443.

  3. Setup Volumes: To persist data, you can mount volumes to the container. Modify the docker run command to include volume mounts:

    docker run -d --name k3s-server \
      --privileged \
      -p 6443:6443 \
      -v /var/lib/rancher/k3s:/var/lib/rancher/k3s \
      -v /etc/rancher/k3s:/etc/rancher/k3s \
      rancher/k3s:latest server --docker
  4. Mounting Volumes Using Docker Named Volumes: Alternatively, you can use Docker named volumes to manage persistent storage:

    docker volume create k3s-data
    docker volume create k3s-etc
    docker run -d --name k3s-server \
      --privileged \
      -p 6443:6443 \
      -v k3s-data:/var/lib/rancher/k3s \
      -v k3s-etc:/etc/rancher/k3s \
      rancher/k3s:latest server --docker
  5. Setup Networking: Ensure that your Docker network settings allow the K3S server to communicate with other containers and services. You might need to configure firewall rules or Docker network settings depending on your environment.

  docker network create k3s-net
  docker network connect k3s-net k3s

Restart the server on this network:

	docker run -d --name k3s-server \
	 --privileged \
	 -p 6443:6443 \
	 -v /var/lib/rancher/k3s:/var/lib/rancher/k3s \
	 -v /etc/rancher/k3s:/etc/rancher/k3s \
	 --network k3s-net \
	 --hostname k3s-server \
	 rancher/k3s:latest server \
	 --node-name k3s-server
	 --docker
  1. Retrieve the Node Token: If you plan to add worker nodes to your K3S cluster, you'll need the node token. You can retrieve it from the running container:
    docker exec -it k3s-server cat /var/lib/rancher/k3s/server/node-token

The output is a lengthy string (e.g., K10abc123...::node:xyz789...), generated when the server starts. This token ensures the secure registration of worker nodes. Copy it for the next step. 7. Add Worker Nodes (Optional): If you want to add worker nodes to your K3S cluster, run the following command on each worker node, replacing <K3S_SERVER_IP> with the IP address of your K3S server and <NODE_TOKEN> with the token you retrieved in the previous step:

docker run -d --name k3s-agent-1 \
  --privileged \
  --network k3s-net \
  -e K3S_URL=https://k3s-server:6443 \
  -e K3S_TOKEN=<NODE_TOKEN> \
  rancher/k3s:latest agent --docker

Full example:

docker stop k3s-agent-1
docker rm k3s-agent-1
docker run -d --name k3s-agent-1 \
  --privileged \
  --network k3s-net \
  --hostname k3s-agent-1 \
  rancher/k3s agent \
  --server https://k3s-server:6443 \
  --token <NODE_TOKEN> \
  --node-name k3s-agent-1
  1. Check the K3S Server Logs: To ensure that the K3S server is running correctly, check the logs with:
    docker logs -f k3s-server
    Look for messages indicating that the server has started successfully.
  2. Set Up Kubeconfig: To interact with your K3S cluster, you need to set up the kubeconfig file. Copy the kubeconfig from the container to your local machine:
    docker cp k3s-server:/etc/rancher/k3s/k3s.yaml ./k3s.yaml
    Then, set the KUBECONFIG environment variable to point to this file:
    export KUBECONFIG=$(pwd)/k3s.yaml

Post-Setup Steps

  1. Verify K3S Installation: After the container is running, you can verify the installation by checking the status of the K3S server:
docker exec -it k3s-server k3s kubectl get nodes
kubectl run nginx --image=nginx --restart=Never
kubectl get pods -o wide
kubectl get pods
kubectl expose pod nginx --port=80 --type=NodePort
kubectl get svc

This command should show the K3S server node in a Ready state.

Launch a BusyBox pod to test the service:

kubectl run busybox --image=busybox --restart=Never --rm -it -- sh
wget -qO- http://<NodeIP>:<NodePort>
wget -qO- http://10.43.4.246:80

Port Forwarding

kubectl port-forward svc/nginx 8080:80
kubectl port-forward service/nginx 8080:80
curl http://localhost:8080

NodePort Access - Expose the NodePort on the server container:

docker run -d --name k3s-server \
  --privileged \
  -p 6443:6443 \
  -p 30000-32767:30000-32767 \
  -v /var/lib/rancher/k3s:/var/lib/rancher/k3s \
  -v /etc/rancher/k3s:/etc/rancher/k3s \
  --network k3s-net \
  --hostname k3s-server \
  rancher/k3s:latest server \
  --node-name k3s-server
  --docker

or

docker stop k3s-server
docker rm k3s-server
docker run -d --name k3s-server \
  --privileged \
  -p 6443:6443 -p 32116:32116 \
  -v k3s-data:/var/lib/rancher/k3s \
  --network k3s-net \
  --hostname k3s-server \
  rancher/k3s server \
  --node-name k3s-server
  --docker

Test NodePort access:

curl http://127.0.0.1:32116

Health Checks and Cluster Info

kubectl get nodes
kubectl get pods --all-namespaces
kubectl cluster-info

Component Health

kubectl get componentstatuses
kubectl get pods -n kube-system

Workload Health

kubectl get deployments --all-namespaces
kubectl get replicasets --all-namespaces
kubectl get daemonsets --all-namespaces
kubectl logs nginx
kubectl describe pod nginx
  1. Delete and Recreate: Remove the node and restart the container:
    kubectl delete node e36b344d4930
    docker stop k3s-agent-1
    docker rm k3s-agent-1
    docker run -d --name k3s-agent-1 \
      --privileged \
      --network k3s-net \
      --hostname k3s-agent-1 \
      rancher/k3s agent \
      --server https://k3s-server:6443 \
      --token <NODE_TOKEN> \
      --node-name k3s-agent-1
    Then recreate it with the same command used earlier.

Delete K3S

To delete the K3S setup, stop and remove the containers:

   docker stop k3s-server
   docker stop k3s-agent-1
   docker rm k3s-server
   docker rm k3s-agent-1
   docker network rm k3s-net
   docker volume rm k3s-data
   docker volume rm k3s-etc

Managing the Cluster

Removing a Node To remove k3s-agent-1:

   kubectl delete node k3s-agent-1
   docker stop k3s-agent-1
   docker rm k3s-agent-1

Resetting the Cluster

Wipe everything:

   docker stop k3s-server
   docker rm k3s-server
   docker volume rm k3s-data
   docker volume rm k3s-etc

Then recreate the server with the same command used earlier.

Run with powershell

# K3s Network Policy Controller Fix - Multiple Solutions

# SOLUTION 1: Disable Network Policy (Simplest)
# This disables the network policy controller entirely
Write-Host "=== SOLUTION 1: Disable Network Policy ===" -ForegroundColor Cyan

docker stop k3s-server 2>$null
docker rm k3s-server 2>$null

docker run -d --name k3s-server `
  --privileged `
  -p 6443:6443 `
  -v k3s-data:/var/lib/rancher/k3s `
  --network k3s-net `
  --hostname k3s-server `
  rancher/k3s server `
  --node-name k3s-server `
  --flannel-backend=none `
  --disable-network-policy `
  --cluster-cidr=10.42.0.0/16 `
  --service-cidr=10.43.0.0/16

Write-Host "Started K3s with network policy disabled" -ForegroundColor Green

# SOLUTION 2: Specify Node IP (If you need network policies)
Write-Host "`n=== SOLUTION 2: With Specific Node IP ===" -ForegroundColor Cyan

# First, get the container IP from the k3s-net network
$networkInfo = docker network inspect k3s-net | ConvertFrom-Json
$subnet = $networkInfo.IPAM.Config[0].Subnet
Write-Host "K3s Network Subnet: $subnet" -ForegroundColor Yellow

Get token

$token = docker exec k3s-server cat /var/lib/rancher/k3s/server/node-token 2>$null

Run agent

docker run -d --name k3s-agent-1 `
      --privileged `
      --network k3s-net `
      --hostname k3s-agent-1 `
      rancher/k3s agent `
      --server https://k3s-server:6443 `
      --token $token `
      --node-name k3s-agent-1

check nodes

Goto the k3s-server container and check nodes from command line

kubectl get nodes

stat container registry

docker volume create registry-data
docker run -d --name local-registry `
  -p 5000:5000 `
  -v registry-data:/var/lib/registry `
  --network k3s-net `
  --hostname local-registry `
  --restart unless-stopped `
  registry:2

start container registry with host netowking

    # Start local container registry
    docker run -d --name local-registry `
      -p 5000:5000 `
      -v registry-data:/var/lib/registry `
      --network host `
      --hostname local-registry `
      --restart unless-stopped `
      registry:2
# K3s Server PowerShell Commands
# Stop and remove existing container (if exists)
docker stop k3s-server
docker rm k3s-server
# Create network if it doesn't exist
docker network create k3s-net --driver bridge
# Start K3s Server with network policy fixes
docker run -d --name k3s-server `
--privileged `
-p 6443:6443 `
-v k3s-data:/var/lib/rancher/k3s `
--network k3s-net `
--hostname k3s-server `
rancher/k3s server `
--node-name k3s-server `
--flannel-backend=none `
--disable-network-policy `
--cluster-cidr=10.42.0.0/16 `
--service-cidr=10.43.0.0/16
# Alternative: If you need network policies, use this instead:
# docker run -d --name k3s-server `
# --privileged `
# -p 6443:6443 `
# -v k3s-data:/var/lib/rancher/k3s `
# --network k3s-net `
# --hostname k3s-server `
# -e K3S_NODE_IP=172.18.0.10 `
# rancher/k3s server `
# --node-name k3s-server `
# --node-ip=172.18.0.10 `
# --bind-address=0.0.0.0 `
# --cluster-cidr=10.42.0.0/16 `
# --service-cidr=10.43.0.0/16
# Wait for server to be ready and get token
Write-Host "Waiting for K3s server to start..." -ForegroundColor Yellow
Start-Sleep -Seconds 15
# Get the node token
$nodeToken = docker exec k3s-server cat /var/lib/rancher/k3s/server/node-token
Write-Host "Node Token: $nodeToken" -ForegroundColor Green
# Start K3s Agent
docker stop k3s-agent-1
docker rm k3s-agent-1
docker run -d --name k3s-agent-1 `
--privileged `
--network k3s-net `
--hostname k3s-agent-1 `
rancher/k3s agent `
--server https://k3s-server:6443 `
--token $nodeToken `
--node-name k3s-agent-1
Write-Host "K3s cluster started successfully!" -ForegroundColor Green
# Verify cluster status
Write-Host "`nChecking cluster nodes..." -ForegroundColor Yellow
docker exec k3s-server kubectl get nodes
# K3s Cluster Management Script for PowerShell with Local Registry
param(
[Parameter(Mandatory=$false)]
[ValidateSet("start", "stop", "restart", "status", "token", "add-agent", "logs", "clean", "kubeconfig", "start-registry", "stop-registry", "registry-status", "help")]
[string]$Command = "help"
)
# Example aliases
Set-Alias k kubectl
if (Get-Command docker -ErrorAction SilentlyContinue) {
Write-Host "Docker is installed and the command is available."
} else {
Write-Host "Docker is NOT installed."
Set-Alias docker podman
}
function Show-Help {
Write-Host "K3s Docker Management Script for PowerShell" -ForegroundColor Cyan
Write-Host ""
Write-Host "Usage: .\k3s-manage.ps1 -Command <COMMAND>" -ForegroundColor White
Write-Host ""
Write-Host "Commands:" -ForegroundColor Yellow
Write-Host " start - Start the K3s cluster (server only initially)" -ForegroundColor White
Write-Host " stop - Stop the K3s cluster" -ForegroundColor White
Write-Host " restart - Restart the K3s cluster" -ForegroundColor White
Write-Host " status - Show status of services" -ForegroundColor White
Write-Host " token - Get the node token from server" -ForegroundColor White
Write-Host " add-agent - Add agent to cluster (gets token automatically)" -ForegroundColor White
Write-Host " logs - Show logs for server and agent" -ForegroundColor White
Write-Host " clean - Stop and remove all containers and volumes" -ForegroundColor White
Write-Host " kubeconfig - Get kubeconfig for kubectl access" -ForegroundColor White
Write-Host " start-registry - Start local container registry" -ForegroundColor White
Write-Host " stop-registry - Stop local container registry" -ForegroundColor White
Write-Host " registry-status - Show registry status" -ForegroundColor White
Write-Host " help - Show this help message" -ForegroundColor White
Write-Host ""
Write-Host "Examples:" -ForegroundColor Yellow
Write-Host " .\k3s-manage.ps1 -Command start" -ForegroundColor Gray
Write-Host " .\k3s-manage.ps1 -Command start-registry" -ForegroundColor Gray
Write-Host " .\k3s-manage.ps1 -Command add-agent" -ForegroundColor Gray
Write-Host " .\k3s-manage.ps1 -Command status" -ForegroundColor Gray
}
function Start-LocalRegistry {
Write-Host "Starting local container registry..." -ForegroundColor Yellow
# Create network if it doesn't exist
$networkExists = docker network ls --format "{{.Name}}" | Select-String -Pattern "^k3s-net$"
if (-not $networkExists) {
Write-Host "Creating k3s-net network..." -ForegroundColor Blue
docker network create k3s-net --driver bridge
}
# Stop and remove existing registry container if it exists
$registryExists = docker ps -a --format "{{.Names}}" | Select-String -Pattern "^local-registry$"
if ($registryExists) {
Write-Host "Stopping existing local-registry container..." -ForegroundColor Blue
docker stop local-registry | Out-Null
docker rm local-registry | Out-Null
}
# Create registry data directory if it doesn't exist
$registryDir = "registry-data"
if (-not (Test-Path $registryDir)) {
New-Item -ItemType Directory -Path $registryDir | Out-Null
Write-Host "Created registry data directory: $registryDir" -ForegroundColor Blue
}
# Start local container registry
docker run -d --name local-registry `
-p 5000:5000 `
-v registry-data:/var/lib/registry `
--network k3s-net `
--hostname local-registry `
--restart unless-stopped `
registry:2
Write-Host "Waiting for registry to be ready..." -ForegroundColor Blue
$timeout = 30
$counter = 0
do {
Start-Sleep -Seconds 2
$counter += 2
try {
$response = Invoke-WebRequest -Uri "http://localhost:5000/v2/" -UseBasicParsing -TimeoutSec 5 2>$null
if ($response.StatusCode -eq 200) {
Write-Host "Local registry is ready!" -ForegroundColor Green
Write-Host "Registry URL: http://localhost:5000" -ForegroundColor Green
Write-Host "Registry catalog: http://localhost:5000/v2/_catalog" -ForegroundColor Green
Write-Host "Registry re-tag image: podman tag nginx:latest localhost:5000/nginx:latest" -ForegroundColor Green
Write-Host "Registry push image: podman push --tls-verify=false localhost:5000/nginx:latest" -ForegroundColor Green
Write-Host "Internal URL (for K3s): http://local-registry:5000" -ForegroundColor Green
return $true
}
} catch {
# Continue waiting
}
Write-Host "Waiting for registry... ($counter/$timeout)" -ForegroundColor Gray
} while ($counter -lt $timeout)
Write-Host "Registry failed to start within timeout" -ForegroundColor Red
return $false
}
function Stop-LocalRegistry {
Write-Host "Stopping local registry..." -ForegroundColor Yellow
$registryExists = docker ps -a --format "{{.Names}}" | Select-String -Pattern "^local-registry$"
if ($registryExists) {
Write-Host "Stopping local-registry..." -ForegroundColor Blue
docker stop local-registry | Out-Null
Write-Host "Local registry stopped" -ForegroundColor Green
} else {
Write-Host "Local registry is not running" -ForegroundColor Yellow
}
}
function Show-RegistryStatus {
Write-Host "=== Local Registry Status ===" -ForegroundColor Cyan
Write-Host ""
$registryStatus = docker ps -a --filter "name=local-registry" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
if ($registryStatus) {
Write-Host $registryStatus -ForegroundColor White
# Check if registry is responding
try {
$response = Invoke-WebRequest -Uri "http://localhost:5000/v2/" -UseBasicParsing -TimeoutSec 5 2>$null
if ($response.StatusCode -eq 200) {
Write-Host "Registry is responding at http://localhost:5000" -ForegroundColor Green
# Try to list repositories
try {
$catalogResponse = Invoke-WebRequest -Uri "http://localhost:5000/v2/_catalog" -UseBasicParsing -TimeoutSec 5 2>$null
$catalog = $catalogResponse.Content | ConvertFrom-Json
Write-Host ""
Write-Host "=== Registry Repositories ===" -ForegroundColor Cyan
if ($catalog.repositories.Count -gt 0) {
foreach ($repo in $catalog.repositories) {
Write-Host "- $repo" -ForegroundColor White
}
} else {
Write-Host "No repositories found" -ForegroundColor Gray
}
} catch {
Write-Host "Could not fetch repository list" -ForegroundColor Yellow
}
}
} catch {
Write-Host "Registry is not responding" -ForegroundColor Red
}
} else {
Write-Host "local-registry - Not found" -ForegroundColor Red
}
Write-Host ""
Write-Host "Usage examples:" -ForegroundColor Yellow
Write-Host " docker tag myapp:latest localhost:5000/myapp:latest" -ForegroundColor Gray
Write-Host " docker push localhost:5000/myapp:latest" -ForegroundColor Gray
Write-Host " kubectl create deployment myapp --image=local-registry:5000/myapp:latest" -ForegroundColor Gray
}
function Start-K3sServer {
Write-Host "Starting K3s server..." -ForegroundColor Yellow
# Create network if it doesn't exist
$networkExists = docker network ls --format "{{.Name}}" | Select-String -Pattern "^k3s-net$"
if (-not $networkExists) {
Write-Host "Creating k3s-net network..." -ForegroundColor Blue
docker network create k3s-net --driver bridge
}
# Stop and remove existing server container if it exists
$serverExists = docker ps -a --format "{{.Names}}" | Select-String -Pattern "^k3s-server$"
if ($serverExists) {
Write-Host "Stopping existing k3s-server container..." -ForegroundColor Blue
docker stop k3s-server | Out-Null
docker rm k3s-server | Out-Null
}
# Check if local registry is running
$registryRunning = docker ps --filter "name=local-registry" --format "{{.Names}}" | Select-String -Pattern "^local-registry$"
$registryMirror = ""
if ($registryRunning) {
Write-Host "Local registry detected, configuring K3s to use it..." -ForegroundColor Blue
$registryMirror = "--registry-mirror local-registry:5000"
}
# Start K3s server with network policy fixes
docker run -d --name k3s-server `
--privileged `
-p 6443:6443 `
-v k3s-data:/var/lib/rancher/k3s `
--network k3s-net `
--hostname k3s-server `
rancher/k3s server `
--node-name k3s-server `
--disable=metrics-server `
--kubelet-arg=fail-swap-on=false `
--cluster-cidr=10.42.0.0/16 `
--service-cidr=10.43.0.0/16 `
--node-ip 192.168.1.17
# --flannel-backend=none `
# --disable-network-policy `
# -v "$(Get-Location)\k3s-config\registries.yaml:/etc/rancher/k3s/registries.yaml:ro" `
Write-Host "Waiting for K3s server to be ready..." -ForegroundColor Blue
$timeout = 60
$counter = 0
do {
Start-Sleep -Seconds 2
$counter += 2
$ready = docker exec k3s-server kubectl get nodes 2>$null
if ($LASTEXITCODE -eq 0) {
Write-Host "K3s server is ready!" -ForegroundColor Green
if ($registryRunning) {
Write-Host "K3s is configured to use local registry at local-registry:5000" -ForegroundColor Green
}
return $true
}
Write-Host "Waiting for server... ($counter/$timeout)" -ForegroundColor Gray
} while ($counter -lt $timeout)
Write-Host "Server failed to start within timeout" -ForegroundColor Red
return $false
}
function Get-NodeToken {
Write-Host "Getting node token from K3s server..." -ForegroundColor Blue
$token = docker exec k3s-server cat /var/lib/rancher/k3s/server/node-token 2>$null
if ($LASTEXITCODE -eq 0) {
Write-Host "Node token: $token" -ForegroundColor Green
return $token
} else {
Write-Host "Failed to get node token. Is the server running?" -ForegroundColor Red
return $null
}
}
function Add-K3sAgent {
Write-Host "Adding K3s agent to cluster..." -ForegroundColor Yellow
# Get token
$token = Get-NodeToken
if (-not $token) {
Write-Host "Cannot add agent without token" -ForegroundColor Red
return
}
# Stop and remove existing agent container if it exists
$agentExists = docker ps -a --format "{{.Names}}" | Select-String -Pattern "^k3s-agent-1$"
if ($agentExists) {
Write-Host "Stopping existing k3s-agent-1 container..." -ForegroundColor Blue
docker stop k3s-agent-1 | Out-Null
docker rm k3s-agent-1 | Out-Null
}
# Start K3s agent
docker run -d --name k3s-agent-1 `
--privileged `
--network k3s-net `
--hostname k3s-agent-1 `
rancher/k3s agent `
--server https://k3s-server:6443 `
--token $token `
--node-name k3s-agent-1
Write-Host "Agent started successfully!" -ForegroundColor Green
}
function Stop-K3sCluster {
Write-Host "Stopping K3s cluster..." -ForegroundColor Yellow
$containers = @("k3s-agent-1", "k3s-server")
foreach ($container in $containers) {
$exists = docker ps -a --format "{{.Names}}" | Select-String -Pattern "^$container$"
if ($exists) {
Write-Host "Stopping $container..." -ForegroundColor Blue
docker stop $container | Out-Null
}
}
Write-Host "K3s cluster stopped" -ForegroundColor Green
}
function Show-Status {
Write-Host "=== K3s Cluster Status ===" -ForegroundColor Cyan
Write-Host ""
$containers = @("k3s-server", "k3s-agent-1")
foreach ($container in $containers) {
$status = docker ps -a --filter "name=$container" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
if ($status) {
Write-Host $status -ForegroundColor White
} else {
Write-Host "$container - Not found" -ForegroundColor Red
}
}
Write-Host ""
Write-Host "=== Registry Status ===" -ForegroundColor Cyan
$registryStatus = docker ps -a --filter "name=local-registry" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
if ($registryStatus) {
Write-Host $registryStatus -ForegroundColor White
} else {
Write-Host "local-registry - Not found" -ForegroundColor Red
}
Write-Host ""
Write-Host "=== K3s Nodes ===" -ForegroundColor Cyan
$nodes = docker exec k3s-server kubectl get nodes 2>$null
if ($LASTEXITCODE -eq 0) {
Write-Host $nodes -ForegroundColor White
Write-Host ""
Write-Host "=== K3s System Pods ===" -ForegroundColor Cyan
$pods = docker exec k3s-server kubectl get pods -A 2>$null
if ($LASTEXITCODE -eq 0) {
Write-Host $pods -ForegroundColor White
}
} else {
Write-Host "K3s server not ready or not running" -ForegroundColor Red
}
}
function Show-Logs {
Write-Host "=== K3s Server Logs ===" -ForegroundColor Cyan
docker logs k3s-server --tail 20
Write-Host ""
Write-Host "=== K3s Agent Logs ===" -ForegroundColor Cyan
docker logs k3s-agent-1 --tail 20 2>$null
Write-Host ""
Write-Host "=== Registry Logs ===" -ForegroundColor Cyan
docker logs local-registry --tail 20 2>$null
Write-Host ""
Write-Host "Use 'docker logs <container-name>' for full logs" -ForegroundColor Gray
}
function Clean-K3sCluster {
Write-Host "This will remove all K3s containers, registry, and data volumes." -ForegroundColor Yellow
$confirm = Read-Host "Are you sure? This will delete all data. (y/N)"
if ($confirm -eq 'y' -or $confirm -eq 'Y') {
Write-Host "Cleaning up K3s cluster and registry..." -ForegroundColor Red
# Stop and remove containers
$containers = @("k3s-agent-1", "k3s-server", "local-registry")
foreach ($container in $containers) {
docker stop $container 2>$null | Out-Null
docker rm $container 2>$null | Out-Null
}
# Remove volumes
docker volume rm k3s-data 2>$null | Out-Null
# Remove network
docker network rm k3s-net 2>$null | Out-Null
# Optionally remove registry data directory
$removeData = Read-Host "Remove registry data directory? (y/N)"
if ($removeData -eq 'y' -or $removeData -eq 'Y') {
Remove-Item -Path "registry-data" -Recurse -Force -ErrorAction SilentlyContinue
Write-Host "Registry data directory removed" -ForegroundColor Blue
}
Write-Host "Cleanup complete" -ForegroundColor Green
} else {
Write-Host "Cleanup cancelled" -ForegroundColor Yellow
}
}
function Get-Kubeconfig {
Write-Host "Getting kubeconfig..." -ForegroundColor Blue
$kubeconfigDir = "kubeconfig"
if (-not (Test-Path $kubeconfigDir)) {
New-Item -ItemType Directory -Path $kubeconfigDir | Out-Null
}
$kubeconfig = docker exec k3s-server cat /etc/rancher/k3s/k3s.yaml 2>$null
if ($LASTEXITCODE -eq 0) {
# Replace server URL for local access
$kubeconfig = $kubeconfig -replace '127.0.0.1', 'localhost'
$kubeconfigPath = Join-Path $kubeconfigDir "kubeconfig.yaml"
Set-Content -Path $kubeconfigPath -Value $kubeconfig
Write-Host "Kubeconfig saved to $kubeconfigPath" -ForegroundColor Green
Write-Host ""
Write-Host "To use kubectl with this cluster:" -ForegroundColor Yellow
Write-Host "`$env:KUBECONFIG = `"$(Resolve-Path $kubeconfigPath)`"" -ForegroundColor Gray
Write-Host "kubectl get nodes" -ForegroundColor Gray
} else {
Write-Host "Failed to get kubeconfig. Is the server running?" -ForegroundColor Red
}
}
# Main script logic
switch ($Command.ToLower()) {
"start" {
Start-K3sServer | Out-Null
}
"stop" {
Stop-K3sCluster
}
"restart" {
Stop-K3sCluster
Start-Sleep -Seconds 2
Start-K3sServer | Out-Null
}
"status" {
Show-Status
}
"token" {
Get-NodeToken | Out-Null
}
"add-agent" {
Add-K3sAgent
}
"logs" {
Show-Logs
}
"clean" {
Clean-K3sCluster
}
"kubeconfig" {
Get-Kubeconfig
}
"start-registry" {
Start-LocalRegistry | Out-Null
}
"stop-registry" {
Stop-LocalRegistry
}
"registry-status" {
Show-RegistryStatus
}
"help" {
Show-Help
}
default {
Write-Host "Unknown command: $Command" -ForegroundColor Red
Write-Host ""
Show-Help
}
}
#!/bin/bash
# K3s Docker Compose Management Script
set -e
COMPOSE_FILE="docker-compose.yml"
show_help() {
echo "K3s Docker Compose Management Script"
echo ""
echo "Usage: $0 [COMMAND]"
echo ""
echo "Commands:"
echo " start - Start the K3s cluster (server only initially)"
echo " stop - Stop the K3s cluster"
echo " restart - Restart the K3s cluster"
echo " status - Show status of services"
echo " token - Get the node token from server"
echo " add-agent - Add agent to cluster (gets token automatically)"
echo " logs - Show logs for all services"
echo " clean - Stop and remove all containers and volumes"
echo " kubeconfig - Get kubeconfig for kubectl access"
echo " help - Show this help message"
}
start_server() {
echo "Starting K3s server..."
docker-compose up -d k3s-server
echo "Waiting for K3s server to be ready..."
sleep 10
# Wait for server to be healthy
timeout=60
counter=0
while [ $counter -lt $timeout ]; do
if docker exec k3s-server kubectl get nodes &>/dev/null; then
echo "K3s server is ready!"
break
fi
echo "Waiting for server... ($counter/$timeout)"
sleep 2
counter=$((counter + 2))
done
if [ $counter -ge $timeout ]; then
echo "Server failed to start within timeout"
exit 1
fi
}
get_token() {
echo "Getting node token from K3s server..."
TOKEN=$(docker exec k3s-server cat /var/lib/rancher/k3s/server/node-token)
echo "Node token: $TOKEN"
echo $TOKEN
}
add_agent() {
echo "Adding K3s agent to cluster..."
# Get token
TOKEN=$(get_token)
# Stop agent if running
docker-compose stop k3s-agent-1 2>/dev/null || true
docker-compose rm -f k3s-agent-1 2>/dev/null || true
# Set token and start agent
K3S_TOKEN="$TOKEN" docker-compose up -d k3s-agent-1
echo "Agent started with token: $TOKEN"
}
show_status() {
echo "=== Docker Compose Status ==="
docker-compose ps
echo ""
echo "=== K3s Nodes ==="
if docker exec k3s-server kubectl get nodes 2>/dev/null; then
echo ""
echo "=== K3s Pods ==="
docker exec k3s-server kubectl get pods -A
else
echo "K3s server not ready or not running"
fi
}
get_kubeconfig() {
echo "Getting kubeconfig..."
mkdir -p ./kubeconfig
docker exec k3s-server cat /etc/rancher/k3s/k3s.yaml | sed 's/127.0.0.1/localhost/' > ./kubeconfig/kubeconfig.yaml
echo "Kubeconfig saved to ./kubeconfig/kubeconfig.yaml"
echo ""
echo "To use kubectl with this cluster:"
echo "export KUBECONFIG=\$(pwd)/kubeconfig/kubeconfig.yaml"
echo "kubectl get nodes"
}
case "$1" in
start)
start_server
;;
stop)
echo "Stopping K3s cluster..."
docker-compose down
;;
restart)
echo "Restarting K3s cluster..."
docker-compose down
start_server
;;
status)
show_status
;;
token)
get_token
;;
add-agent)
add_agent
;;
logs)
docker-compose logs -f
;;
clean)
echo "Cleaning up K3s cluster (this will remove all data)..."
read -p "Are you sure? This will delete all volumes and data. (y/N): " confirm
if [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]]; then
docker-compose down -v
docker volume rm $(docker volume ls -q | grep k3s) 2>/dev/null || true
echo "Cleanup complete"
else
echo "Cleanup cancelled"
fi
;;
kubeconfig)
get_kubeconfig
;;
help|--help|-h)
show_help
;;
*)
echo "Unknown command: $1"
echo ""
show_help
exit 1
;;
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment