Add lab1 workload cluster manifest; workers sized 4 vCPU / 4 GiB
Generated with clusterctl v1.12.11 + the six runbook edits (pod CIDR, kube-vip v1.2.4, no qcow2, VLAN 4, worker size, no MD replicas); passes server-side dry run. Inflate test pods lowered to 1Gi to stay CPU-bound, capacity annotation 4Gi, decision #15. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,294 @@
|
||||
# Workload cluster lab1 (phase-1 Step 3). Generated 2026-09-27 with clusterctl v1.12.11:
|
||||
#
|
||||
# PROXMOX_SOURCENODE=pv1-1 TEMPLATE_VMID=101 ALLOWED_NODES="[pv1-1]" \
|
||||
# VM_SSH_KEYS="$(cat ~/.ssh/id_ed25519.pub)" \
|
||||
# CONTROL_PLANE_ENDPOINT_IP=192.168.4.30 NODE_IP_RANGES="[192.168.4.31-192.168.4.39]" \
|
||||
# GATEWAY=192.168.4.8 IP_PREFIX=24 DNS_SERVERS="[8.8.8.8, 1.1.1.1]" BRIDGE=vmbr0 \
|
||||
# BOOT_VOLUME_DEVICE=scsi0 BOOT_VOLUME_SIZE=40 NUM_SOCKETS=1 NUM_CORES=2 MEMORY_MIB=4096 \
|
||||
# clusterctl generate cluster lab1 --infrastructure proxmox:v0.9.1 --kubernetes-version v1.35.9 \
|
||||
# --control-plane-machine-count 1 --worker-machine-count 1 --target-namespace default
|
||||
#
|
||||
# Hand edits (docs/phase-1-proxmox-capi.md Step 3):
|
||||
# 1. pod CIDR 192.168.0.0/16 -> 10.244.0.0/16 (overlaps the lab LAN)
|
||||
# 2. kube-vip v0.7.1 -> v1.2.4 (kube-vip-prepare.sh kept)
|
||||
# 3. `format: qcow2` removed from both ProxmoxMachineTemplates (local-lvm is LVM-thin, raw only)
|
||||
# 4. `vlan: 4` on net0 of both ProxmoxMachineTemplates
|
||||
# 5. lab1-worker: 1 socket x 4 cores, 4096 MiB (owner's choice; runbook said 8192)
|
||||
# 6. MachineDeployment lab1-workers: `replicas` removed (the autoscaler owns it)
|
||||
apiVersion: cluster.x-k8s.io/v1beta2
|
||||
kind: Cluster
|
||||
metadata:
|
||||
labels:
|
||||
cluster.x-k8s.io/cluster-name: lab1
|
||||
name: lab1
|
||||
namespace: default
|
||||
spec:
|
||||
clusterNetwork:
|
||||
pods:
|
||||
cidrBlocks:
|
||||
- 10.244.0.0/16
|
||||
controlPlaneRef:
|
||||
apiGroup: controlplane.cluster.x-k8s.io
|
||||
kind: KubeadmControlPlane
|
||||
name: lab1-control-plane
|
||||
infrastructureRef:
|
||||
apiGroup: infrastructure.cluster.x-k8s.io
|
||||
kind: ProxmoxCluster
|
||||
name: lab1
|
||||
---
|
||||
apiVersion: infrastructure.cluster.x-k8s.io/v1alpha2
|
||||
kind: ProxmoxCluster
|
||||
metadata:
|
||||
labels:
|
||||
cluster.x-k8s.io/cluster-name: lab1
|
||||
name: lab1
|
||||
namespace: default
|
||||
spec:
|
||||
allowedNodes:
|
||||
- pv1-1
|
||||
controlPlaneEndpoint:
|
||||
host: 192.168.4.30
|
||||
port: 6443
|
||||
dnsServers:
|
||||
- 8.8.8.8
|
||||
- 1.1.1.1
|
||||
ipv4Config:
|
||||
addresses:
|
||||
- 192.168.4.31-192.168.4.39
|
||||
gateway: 192.168.4.8
|
||||
prefix: 24
|
||||
---
|
||||
apiVersion: controlplane.cluster.x-k8s.io/v1beta2
|
||||
kind: KubeadmControlPlane
|
||||
metadata:
|
||||
name: lab1-control-plane
|
||||
namespace: default
|
||||
spec:
|
||||
kubeadmConfigSpec:
|
||||
files:
|
||||
- content: |
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: kube-vip
|
||||
namespace: kube-system
|
||||
spec:
|
||||
containers:
|
||||
- args:
|
||||
- manager
|
||||
env:
|
||||
- name: cp_enable
|
||||
value: "true"
|
||||
- name: vip_interface
|
||||
value: ""
|
||||
- name: address
|
||||
value: 192.168.4.30
|
||||
- name: port
|
||||
value: "6443"
|
||||
- name: vip_arp
|
||||
value: "true"
|
||||
- name: vip_leaderelection
|
||||
value: "true"
|
||||
- name: vip_leaseduration
|
||||
value: "15"
|
||||
- name: vip_renewdeadline
|
||||
value: "10"
|
||||
- name: vip_retryperiod
|
||||
value: "2"
|
||||
image: ghcr.io/kube-vip/kube-vip:v1.2.4
|
||||
imagePullPolicy: IfNotPresent
|
||||
name: kube-vip
|
||||
resources: {}
|
||||
securityContext:
|
||||
capabilities:
|
||||
add:
|
||||
- NET_ADMIN
|
||||
- NET_RAW
|
||||
volumeMounts:
|
||||
- mountPath: /etc/kubernetes/admin.conf
|
||||
name: kubeconfig
|
||||
hostAliases:
|
||||
- hostnames:
|
||||
- localhost
|
||||
- kubernetes
|
||||
ip: 127.0.0.1
|
||||
hostNetwork: true
|
||||
volumes:
|
||||
- hostPath:
|
||||
path: /etc/kubernetes/admin.conf
|
||||
type: FileOrCreate
|
||||
name: kubeconfig
|
||||
status: {}
|
||||
owner: root:root
|
||||
path: /etc/kubernetes/manifests/kube-vip.yaml
|
||||
- content: |
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright 2020 The Kubernetes Authors.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
set -e
|
||||
|
||||
# Configure the workaround required for kubeadm init with kube-vip:
|
||||
# xref: https://github.com/kube-vip/kube-vip/issues/684
|
||||
|
||||
# Nothing to do for kubernetes < v1.29
|
||||
KUBEADM_MINOR="$(kubeadm version -o short | cut -d '.' -f 2)"
|
||||
if [[ "$KUBEADM_MINOR" -lt "29" ]]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
IS_KUBEADM_INIT="false"
|
||||
|
||||
# cloud-init kubeadm init
|
||||
if [[ -f /run/kubeadm/kubeadm.yaml ]]; then
|
||||
IS_KUBEADM_INIT="true"
|
||||
fi
|
||||
|
||||
# ignition kubeadm init
|
||||
if [[ -f /etc/kubeadm.sh ]] && grep -q -e "kubeadm init" /etc/kubeadm.sh; then
|
||||
IS_KUBEADM_INIT="true"
|
||||
fi
|
||||
|
||||
if [[ "$IS_KUBEADM_INIT" == "true" ]]; then
|
||||
sed -i 's#path: /etc/kubernetes/admin.conf#path: /etc/kubernetes/super-admin.conf#' \
|
||||
/etc/kubernetes/manifests/kube-vip.yaml
|
||||
fi
|
||||
owner: root:root
|
||||
path: /etc/kube-vip-prepare.sh
|
||||
permissions: "0700"
|
||||
initConfiguration:
|
||||
nodeRegistration:
|
||||
kubeletExtraArgs:
|
||||
- name: provider-id
|
||||
value: proxmox://'{{ ds.meta_data.instance_id }}'
|
||||
joinConfiguration:
|
||||
nodeRegistration:
|
||||
kubeletExtraArgs:
|
||||
- name: provider-id
|
||||
value: proxmox://'{{ ds.meta_data.instance_id }}'
|
||||
preKubeadmCommands:
|
||||
- /etc/kube-vip-prepare.sh
|
||||
users:
|
||||
- name: root
|
||||
sshAuthorizedKeys:
|
||||
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINQxxkqmvtVI+8c5BkTaJ5c2HfBFRXJWMmEcevvfP9tV
|
||||
jan.novak@Jans-MacBook-Air.local
|
||||
machineTemplate:
|
||||
spec:
|
||||
infrastructureRef:
|
||||
apiGroup: infrastructure.cluster.x-k8s.io
|
||||
kind: ProxmoxMachineTemplate
|
||||
name: lab1-control-plane
|
||||
replicas: 1
|
||||
version: v1.35.9
|
||||
---
|
||||
apiVersion: infrastructure.cluster.x-k8s.io/v1alpha2
|
||||
kind: ProxmoxMachineTemplate
|
||||
metadata:
|
||||
name: lab1-control-plane
|
||||
namespace: default
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
disks:
|
||||
bootVolume:
|
||||
disk: scsi0
|
||||
sizeGb: 40
|
||||
full: true
|
||||
memoryMiB: 4096
|
||||
network:
|
||||
networkDevices:
|
||||
- bridge: vmbr0
|
||||
model: virtio
|
||||
name: net0
|
||||
vlan: 4
|
||||
numCores: 2
|
||||
numSockets: 1
|
||||
sourceNode: pv1-1
|
||||
templateID: 101
|
||||
---
|
||||
apiVersion: cluster.x-k8s.io/v1beta2
|
||||
kind: MachineDeployment
|
||||
metadata:
|
||||
labels:
|
||||
cluster.x-k8s.io/cluster-name: lab1
|
||||
name: lab1-workers
|
||||
namespace: default
|
||||
spec:
|
||||
clusterName: lab1
|
||||
selector:
|
||||
matchLabels: null
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
cluster.x-k8s.io/cluster-name: lab1
|
||||
node-role.kubernetes.io/node: ""
|
||||
spec:
|
||||
bootstrap:
|
||||
configRef:
|
||||
apiGroup: bootstrap.cluster.x-k8s.io
|
||||
kind: KubeadmConfigTemplate
|
||||
name: lab1-worker
|
||||
clusterName: lab1
|
||||
infrastructureRef:
|
||||
apiGroup: infrastructure.cluster.x-k8s.io
|
||||
kind: ProxmoxMachineTemplate
|
||||
name: lab1-worker
|
||||
version: v1.35.9
|
||||
---
|
||||
apiVersion: infrastructure.cluster.x-k8s.io/v1alpha2
|
||||
kind: ProxmoxMachineTemplate
|
||||
metadata:
|
||||
name: lab1-worker
|
||||
namespace: default
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
disks:
|
||||
bootVolume:
|
||||
disk: scsi0
|
||||
sizeGb: 40
|
||||
full: true
|
||||
memoryMiB: 4096
|
||||
network:
|
||||
networkDevices:
|
||||
- bridge: vmbr0
|
||||
model: virtio
|
||||
name: net0
|
||||
vlan: 4
|
||||
numCores: 4
|
||||
numSockets: 1
|
||||
sourceNode: pv1-1
|
||||
templateID: 101
|
||||
---
|
||||
apiVersion: bootstrap.cluster.x-k8s.io/v1beta2
|
||||
kind: KubeadmConfigTemplate
|
||||
metadata:
|
||||
name: lab1-worker
|
||||
namespace: default
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
joinConfiguration:
|
||||
nodeRegistration:
|
||||
kubeletExtraArgs:
|
||||
- name: provider-id
|
||||
value: proxmox://'{{ ds.meta_data.instance_id }}'
|
||||
users:
|
||||
- name: root
|
||||
sshAuthorizedKeys:
|
||||
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINQxxkqmvtVI+8c5BkTaJ5c2HfBFRXJWMmEcevvfP9tV
|
||||
jan.novak@Jans-MacBook-Air.local
|
||||
@@ -1,4 +1,6 @@
|
||||
# apply to the workload cluster; scale replicas to trigger scale-up (≈2 pods per 4 vCPU / 8 GiB worker)
|
||||
# apply to the workload cluster; scale replicas to trigger scale-up
|
||||
# 2 pods per 4 vCPU / 4 GiB worker: CPU-bound (2 × 1500m); 1Gi keeps memory from binding first
|
||||
# (a 4 GiB node has ~3.3–3.6 GiB allocatable, which would fit only one 2Gi pod)
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
@@ -15,4 +17,4 @@ spec:
|
||||
- name: pause
|
||||
image: registry.k8s.io/pause:3.10
|
||||
resources:
|
||||
requests: { cpu: "1500m", memory: "2Gi" }
|
||||
requests: { cpu: "1500m", memory: "1Gi" }
|
||||
|
||||
Reference in New Issue
Block a user