--- apiVersion: v1 kind: ConfigMap metadata: name: config-cluster-autoscaler namespace: kube-system data: autoscaler.json: | { "use-external-etcd": false, "distribution": "k3s", "plateform": "vsphere", "image-credential-provider-bin-dir": "/var/lib/rancher/credentialprovider/bin", "image-credential-provider-config": "/var/lib/rancher/credentialprovider/config.yaml", "listen": "unix:/var/run/cluster-autoscaler/autoscaler.sock", "secret": "vsphere", "minNode": 0, "maxNode": 9, "maxPods": 110, "maxNode-per-cycle": 2, "nodegroup": "vsphere-dev-k3s", "node-name-prefix": "autoscaled", "managed-name-prefix": "managed", "controlplane-name-prefix": "master", "nodePrice": 0, "podPrice": 0, "use-etc-hosts": false, "use-cloudinit-config": false, "cloudinit-file-owner": "root:adm", "cloudinit-file-mode": 420, "allow-upgrade": false, "optionals": { "pricing": false, "getAvailableMachineTypes": false, "newNodeGroup": false, "templateNodeInfo": false, "createNodeGroup": false, "deleteNodeGroup": false }, "k3s": { "address": "192.168.2.80:6443", "token": "...." }, "default-machine": "medium", "cloud-init": { "package_update": false, "package_upgrade": false, "growpart": { "ignore_growroot_disabled": false, "mode": "auto", "devices": [ "/" ] }, "runcmd": [ ] }, "ssh-infos": { "wait-ssh-ready-seconds": 180, "user": "kubernetes", "ssh-private-key": "/etc/ssh/id_rsa" }, "autoscaling-options": { "scaleDownUtilizationThreshold": 0.5, "scaleDownGpuUtilizationThreshold": 0.5, "scaleDownUnneededTime": "1m", "scaleDownUnreadyTime": "1m", "maxNodeProvisionTime": "15m", "zeroOrMaxNodeScaling": false, "ignoreDaemonSetsUtilization": true }, "credential-provider-config": { "apiVersion": "kubelet.config.k8s.io/v1", "kind": "CredentialProviderConfig", "providers": [ { "name": "ecr-credential-provider", "matchImages": [ "*.dkr.ecr.*.amazonaws.com", "*.dkr.ecr.*.amazonaws.cn", "*.dkr.ecr-fips.*.amazonaws.com", "*.dkr.ecr.us-iso-east-1.c2s.ic.gov", "*.dkr.ecr.us-isob-east-1.sc2s.sgov.gov" ], "defaultCacheDuration": "12h", "apiVersion": "credentialprovider.kubelet.k8s.io/v1", "args": [ "get-credentials" ], "env": [ { "name": "AWS_ACCESS_KEY_ID", "value": "<TO FILL>" }, { "name": "AWS_SECRET_ACCESS_KEY", "value": "<TO FILL>" } ] } ] } } grpc-config.yaml: | address: unix:/var/run/cluster-autoscaler/autoscaler.sock machines.json: |- { "tiny": { "memsize": 2048, "vcpus": 2, "disksize": 10240 }, "small": { "memsize": 4096, "vcpus": 2, "disksize": 20480 }, "medium": { "memsize": 4096, "vcpus": 4, "disksize": 20480 }, "large": { "memsize": 8192, "vcpus": 4, "disksize": 51200 }, "xlarge": { "memsize": 16384, "vcpus": 4, "disksize": 102400 }, "2xlarge": { "memsize": 16384, "vcpus": 8, "disksize": 102400 }, "4xlarge": { "memsize": 32768, "vcpus": 8, "disksize": 102400 } } provider.json: | { "url": "https://administrator@acme.com:password@vsphere.acme.com/sdk", "uid": "administrator@acme.com", "password": "password", "insecure": true, "dc": "DC01", "datastore": "datastore", "resource-pool": "ALDUNE/Resources/FR", "vmFolder": "HOME", "timeout": 300, "template-name": "noble-kubernetes-k3s-v1.30.2+k3s1-amd64", "template": false, "linked": false, "customization": "", "region": "home", "zone": "office", "use-bind9": true, "bind9-host": "192.168.2.1:53", "rndc-key-file": "/etc/cluster/rndc.key", "start-delay": 10, "stop-delay": 10, "network": { "domain": "aldunelabs.private", "dns": { "search": [ "aldunelabs.private" ], "nameserver": [ "192.168.2.1" ] }, "interfaces": [ { "enabled": true, "primary": true, "exists": true, "network": "VLAN20", "adapter": "vmxnet3", "mac-address": "generate", "nic": "eth0", "dhcp": true, "use-dhcp-routes": false, "address": "192.168.2.83", "netmask": "255.255.255.0", "routes": [ { "to": "default", "via": "192.168.2.254", "metric": 100 } ] }, { "enabled": true, "primary": false, "exists": false, "network": "VM Network", "adapter": "vmxnet3", "mac-address": "generate", "nic": "eth1", "dhcp": true, "use-dhcp-routes": true, "routes": [ { "to": "172.30.0.0/16", "via": "10.0.0.168", "metric": 100 } ] } ] } } rndc.key: |- key "rndc-key" { algorithm hmac-sha256; secret "...."; }; --- apiVersion: v1 kind: Secret metadata: name: autoscaler-ssh-keys namespace: kube-system data: id_rsa: Y29udGFpbnMgZXh0ZXJuYWwgZXRjZCBmaWxlcyBzc2wK id_rsa.pub: Y29udGFpbnMgZXh0ZXJuYWwgZXRjZCBmaWxlcyBzc2wK --- apiVersion: v1 kind: ServiceAccount metadata: labels: k8s-addon: cluster-autoscaler.addons.k8s.io k8s-app: cluster-autoscaler name: cluster-autoscaler namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: cluster-autoscaler labels: k8s-addon: cluster-autoscaler.addons.k8s.io k8s-app: cluster-autoscaler rules: - apiGroups: - "" resources: - events - endpoints verbs: - create - patch - apiGroups: - "" resources: - pods/eviction verbs: - create - apiGroups: - "" resources: - nodes/status verbs: - update - apiGroups: - "" resources: - pods/status verbs: - update - apiGroups: - "" resources: - endpoints resourceNames: - cluster-autoscaler verbs: - get - update - delete - apiGroups: - "" resources: - nodes verbs: - watch - list - get - update - delete - patch - apiGroups: - "" resources: - secrets verbs: - get - delete - apiGroups: - "" resources: - pods - namespaces - services - replicationcontrollers - persistentvolumeclaims - persistentvolumes verbs: - watch - list - get - update - apiGroups: - extensions resources: - replicasets - daemonsets verbs: - watch - list - get - apiGroups: - policy resources: - poddisruptionbudgets verbs: - watch - list - apiGroups: - apps resources: - statefulsets - replicasets - daemonsets verbs: - watch - list - get - delete - apiGroups: - storage.k8s.io resources: - storageclasses - csinodes verbs: - get - list - watch - apiGroups: - batch resources: - jobs - cronjobs verbs: - watch - list - get - apiGroups: - coordination.k8s.io resources: - leases verbs: - create - apiGroups: - coordination.k8s.io resourceNames: - cluster-autoscaler - kubernetes-cloud-autoscaler resources: - leases verbs: - get - update - apiGroups: - storage.k8s.io resources: - csistoragecapacities - csidrivers verbs: - list - get - update - watch - apiGroups: - nodemanager.aldunelabs.com resources: - '*' verbs: - list - get - update - watch - delete - patch - apiGroups: - apiextensions.k8s.io resources: - customresourcedefinitions verbs: - list - get - update - watch - delete - create --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: cluster-autoscaler namespace: kube-system labels: k8s-addon: cluster-autoscaler.addons.k8s.io k8s-app: cluster-autoscaler rules: - apiGroups: - "" resources: - configmaps verbs: - create - apiGroups: - "" resources: - configmaps resourceNames: - cluster-autoscaler-status verbs: - delete - get - update --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: cluster-autoscaler labels: k8s-addon: cluster-autoscaler.addons.k8s.io k8s-app: cluster-autoscaler roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-autoscaler subjects: - kind: ServiceAccount name: cluster-autoscaler namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: cluster-autoscaler namespace: kube-system labels: k8s-addon: cluster-autoscaler.addons.k8s.io k8s-app: cluster-autoscaler roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: cluster-autoscaler subjects: - kind: ServiceAccount name: cluster-autoscaler namespace: kube-system --- apiVersion: apps/v1 kind: Deployment metadata: name: cluster-autoscaler namespace: kube-system labels: k8s-app: cluster-autoscaler spec: replicas: 1 selector: matchLabels: k8s-app: cluster-autoscaler template: metadata: labels: k8s-app: cluster-autoscaler spec: priorityClassName: system-cluster-critical serviceAccountName: cluster-autoscaler securityContext: runAsUser: 65532 runAsGroup: 65532 fsGroup: 65532 fsGroupChangePolicy: OnRootMismatch nodeSelector: master: "true" tolerations: - key: node-role.kubernetes.io/master effect: NoSchedule - key: node-role.kubernetes.io/control-plane effect: NoSchedule initContainers: - image: busybox name: cluster-autoscaler-init securityContext: privileged: true command: - /bin/sh - -c - rm -f /var/run/cluster-autoscaler/autoscaler.sock volumeMounts: - name: cluster-socket mountPath: /var/run/cluster-autoscaler containers: - image: fred78290/kubernetes-cloud-autoscaler:v1.30.0 name: kubernetes-cloud-autoscaler resources: limits: cpu: 100m memory: 300Mi requests: cpu: 100m memory: 300Mi command: - /usr/local/bin/kubernetes-cloud-autoscaler - --distribution=k3s - --nodegroup=vsphere-dev-k3s - --plateform=vsphere - --plateform-config=/etc/cluster/provider.json - --config=/etc/cluster/autoscaler.json - --machines=/etc/cluster/machines.json - --grpc-provider=externalgrpc - --cloud-provider=external - --image-credential-provider-bin-dir=/var/lib/rancher/credentialprovider/bin - --image-credential-provider-config=/var/lib/rancher/credentialprovider/config.yaml - --min-memory=0 - --max-memory=98304 - --min-cpus=0 - --max-cpus=24 - --min-nodes=0 - --max-nodes=9 - --min-managednode-cpus=0 - --max-managednode-cpus=12 - --min-managednode-memory=0 - --max-managednode-memory=49152 - --min-managednode-disksize=10240 - --max-managednode-disksize=1048576 - --save=/var/run/cluster-autoscaler/state.json - --log-level=info imagePullPolicy: Always volumeMounts: - name: cluster-socket mountPath: /var/run/cluster-autoscaler - name: config-cluster-autoscaler mountPath: /etc/cluster - name: autoscaler-ssh-keys mountPath: /etc/ssh - image: registry.k8s.io/autoscaling/cluster-autoscaler:v1.30.0 name: cluster-autoscaler resources: limits: cpu: 100m memory: 300Mi requests: cpu: 100m memory: 300Mi command: - ./cluster-autoscaler - --v=1 - --stderrthreshold=info - --cloud-provider=externalgrpc - --cloud-config=/etc/cluster/grpc-config.yaml - --nodes=0:9:true/vsphere-dev-k3s - --max-nodes-total=9 - --cores-total=0:24 - --memory-total=0:96 - --node-autoprovisioning-enabled - --max-autoprovisioned-node-group-count=1 - --scale-down-utilization-threshold=0.5 - --scale-down-gpu-utilization-threshold=0.5 - --scale-down-enabled=true - --scale-down-delay-after-add=1m - --scale-down-delay-after-delete=1m - --scale-down-delay-after-failure=1m - --scale-down-unneeded-time=1m - --scale-down-unready-time=1m - --max-node-provision-time=15m - --ignore-daemonsets-utilization=true - --unremovable-node-recheck-timeout=1m imagePullPolicy: Always volumeMounts: - name: cluster-socket mountPath: /var/run/cluster-autoscaler - name: ssl-certs mountPath: /etc/ssl/certs/ca-certificates.crt readOnly: true - name: config-cluster-autoscaler mountPath: /etc/cluster readOnly: true volumes: - name: cluster-socket emptyDir: {} - name: config-cluster-autoscaler configMap: name: config-cluster-autoscaler - name: ssl-certs hostPath: path: /etc/ssl/certs/ca-certificates.crt - name: autoscaler-ssh-keys secret: secretName: autoscaler-ssh-keys defaultMode: 416