This article explains how to upgrade workload cluster deployed by cluster-api-provider-openstack.
Prerequisites
Workload cluster
Workload cluster is deployed by cluster-api-provider-openstack v0.3.3 as follows.
ubuntu@capi:~$ kubectl --kubeconfig=./${CLUSTER_NAME}.kubeconfig get nodes
NAME STATUS ROLES AGE VERSION
external-control-plane-8l9pd Ready master 9d v1.17.11
external-control-plane-8qcfq Ready master 9d v1.17.11
external-control-plane-ddzxd Ready master 9d v1.17.11
external-md-0-th94m Ready <none> 9d v1.17.11
This cluster will be upgraded to v1.18.14.
Image
New image is built using Kubernetes Image Builder for OpenStack which specified v1.18.14. In this article, new image is named to ubuntu-1804-kube-v1.18.14.
Upgrade control plane machines
Create new OpenStackMachineTemplate
ubuntu@capi:~$ kubectl get openstackmachinetemplates
NAME AGE
external-control-plane 9d
external-md-0 9d
ubuntu@capi:~$ kubectl get openstackmachinetemplates external-control-plane -o yaml > file.yaml
ubuntu@capi:~$ cp file.yaml external-control-plane-v11814.yaml
Edit metadata.name
and spec.template.spec.image
and remove unnecessary annotations.
The result external-control-plane-v11814.yaml is the following.
apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3
kind: OpenStackMachineTemplate
metadata:
annotations:
name: external-control-plane-v11814
namespace: default
spec:
template:
spec:
cloudName: openstack
cloudsSecret:
name: external-cloud-config
namespace: default
flavor: small
image: ubuntu-1804-kube-v1.18.14
sshKeyName: mykey
Apply new OpenStackMachineTemplate
ubuntu@capi:~$ kubectl apply -f external-control-plane-v11814.yaml
openstackmachinetemplate.infrastructure.cluster.x-k8s.io/external-control-plane-v11814 created
ubuntu@capi:~$ kubectl get openstackmachinetemplates
NAME AGE
external-control-plane 9d
external-control-plane-v11814 25s
external-md-0 9d
ubuntu@capi:~$
Edit KubeadmControlPlane
ubuntu@capi:~$ kubectl edit kubeadmcontrolplane
kubeadmcontrolplane.controlplane.cluster.x-k8s.io/external-control-plane edited
Edit spec.infrastructureTemplate.name
and spec.version
as follows.
spec:
infrastructureTemplate:
apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3
kind: OpenStackMachineTemplate
name: external-control-plane-v11814
namespace: default
kubeadmConfigSpec:
clusterConfiguration:
apiServer:
extraArgs:
cloud-provider: external
controllerManager:
extraArgs:
cloud-provider: external
dns: {}
etcd: {}
imageRepository: k8s.gcr.io
networking: {}
scheduler: {}
initConfiguration:
localAPIEndpoint:
advertiseAddress: ""
bindPort: 0
nodeRegistration:
kubeletExtraArgs:
cloud-provider: external
name: '{{ local_hostname }}'
joinConfiguration:
discovery: {}
nodeRegistration:
kubeletExtraArgs:
cloud-provider: external
name: '{{ local_hostname }}'
replicas: 3
version: v1.18.14
Rolling upgrade should start.
ubuntu@capi:~$ kubectl get kubeadmcontrolplane
NAME INITIALIZED API SERVER AVAILABLE VERSION REPLICAS READY UPDATED UNAVAILABLE
external-control-plane true true v1.18.14 4 3 1 1
ubuntu@capi:~$
ubuntu@capi:~$ kubectl get openstackmachines
NAME CLUSTER INSTANCESTATE READY PROVIDERID MACHINE
external-control-plane-8l9pd external ACTIVE true openstack://e6b2445b-17aa-419f-9cdf-f2e7f517b5b7 external-control-plane-cwlfw
external-control-plane-8qcfq external ACTIVE true openstack://211d1a59-97a2-4f0c-8dbb-a44a42106746 external-control-plane-9fm4f
external-control-plane-ddzxd external ACTIVE true openstack://ab4664e3-7e32-481c-8810-414cc5632df2 external-control-plane-v9dld
external-control-plane-v11814-d2qtq external external-control-plane-2ksn7
external-md-0-th94m external ACTIVE true openstack://7579259a-8da2-4538-82f6-f9a174cc0707 external-md-0-84b9fff89c-r5kdz
ubuntu@capi:~$
ubuntu@capi:~$ kubectl get kubeadmcontrolplane
NAME INITIALIZED API SERVER AVAILABLE VERSION REPLICAS READY UPDATED UNAVAILABLE
external-control-plane true true v1.18.14 3 3 3 0
ubuntu@capi:~$ kubectl get openstackmachines -w
NAME CLUSTER INSTANCESTATE READY PROVIDERID MACHINE
external-control-plane-v11814-ctbkw external ACTIVE true openstack://94a1cbb1-2726-4ac3-be6f-20dc7b2dc9a4 external-control-plane-9pb66
external-control-plane-v11814-d2qtq external ACTIVE true openstack://24f82d1d-567a-4968-94ae-db1bd2d782c3 external-control-plane-2ksn7
external-control-plane-v11814-qn9xb external ACTIVE true openstack://1061e602-e38f-4e57-a1ed-9639f6d37052 external-control-plane-b5m8s
external-md-0-th94m external ACTIVE true openstack://7579259a-8da2-4538-82f6-f9a174cc0707 external-md-0-84b9fff89c-r5kdz
ubuntu@capi:~$
Control plane machines are upgraded successfully.
ubuntu@capi:~$ kubectl get machines
NAME PROVIDERID PHASE VERSION
external-control-plane-2ksn7 openstack://24f82d1d-567a-4968-94ae-db1bd2d782c3 Running v1.18.14
external-control-plane-9pb66 openstack://94a1cbb1-2726-4ac3-be6f-20dc7b2dc9a4 Running v1.18.14
external-control-plane-b5m8s openstack://1061e602-e38f-4e57-a1ed-9639f6d37052 Running v1.18.14
external-md-0-84b9fff89c-r5kdz openstack://7579259a-8da2-4538-82f6-f9a174cc0707 Running v1.17.11
ubuntu@capi:~$
Delete old OpenStackMachineTemplate
ubuntu@capi:~$ kubectl delete openstackmachinetemplates external-control-plane
openstackmachinetemplate.infrastructure.cluster.x-k8s.io "external-control-plane" deleted
Upgrade machines managed by a MachineDeployment
Create new OpenStackMachineTemplate
ubuntu@capi:~$ kubectl get openstackmachinetemplates external-md-0 -o yaml > external-md-0.yaml
ubuntu@capi:~$ cp external-md-0.yaml external-md-0-v11814.yaml
ubuntu@capi:~$ vi external-md-0-v11814.yaml
Edit metadata.name
and spec.template.spec.image
and remove unnecessary annotations. The result is the following.
apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3
kind: OpenStackMachineTemplate
metadata:
annotations:
name: external-md-0-v11814
namespace: default
spec:
template:
spec:
cloudName: openstack
cloudsSecret:
name: external-cloud-config
namespace: default
flavor: small
image: ubuntu-1804-kube-v1.18.14
sshKeyName: mykey
Apply new OpenStackMachineTemplate
ubuntu@capi:~$ kubectl apply -f external-md-0-v11814.yaml
openstackmachinetemplate.infrastructure.cluster.x-k8s.io/external-md-0-v11814 created
ubuntu@capi:~$
ubuntu@capi:~$ kubectl get openstackmachinetemplates
NAME AGE
external-control-plane-v11814 34m
external-md-0 9d
external-md-0-v11814 33s
ubuntu@capi:~$
Edit MachineDeployment
ubuntu@capi:~$ kubectl edit machinedeployment external-md-0
machinedeployment.cluster.x-k8s.io/external-md-0 edited
ubuntu@capi:~$
Edit spec.template.spec.infrastructureTemplate.name
and spec.template.spec.version
as follows.
template:
metadata:
labels:
cluster.x-k8s.io/cluster-name: external
cluster.x-k8s.io/deployment-name: external-md-0
spec:
bootstrap:
configRef:
apiVersion: bootstrap.cluster.x-k8s.io/v1alpha3
kind: KubeadmConfigTemplate
name: external-md-0
clusterName: external
failureDomain: nova
infrastructureRef:
apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3
kind: OpenStackMachineTemplate
name: external-md-0-v11814
version: v1.18.14
Upgrade should start.
ubuntu@capi:~$ kubectl get machinedeployment external-md-0
NAME PHASE REPLICAS READY UPDATED UNAVAILABLE
external-md-0 Running 2 1 1 1
ubuntu@capi:~$
ubuntu@capi:~$ kubectl get openstackmachines
NAME CLUSTER INSTANCESTATE READY PROVIDERID MACHINE
external-control-plane-v11814-ctbkw external ACTIVE true openstack://94a1cbb1-2726-4ac3-be6f-20dc7b2dc9a4 external-control-plane-9pb66
external-control-plane-v11814-d2qtq external ACTIVE true openstack://24f82d1d-567a-4968-94ae-db1bd2d782c3 external-control-plane-2ksn7
external-control-plane-v11814-qn9xb external ACTIVE true openstack://1061e602-e38f-4e57-a1ed-9639f6d37052 external-control-plane-b5m8s
external-md-0-th94m external ACTIVE true openstack://7579259a-8da2-4538-82f6-f9a174cc0707 external-md-0-84b9fff89c-r5kdz
external-md-0-v11814-fjlmp external ACTIVE true openstack://10522a90-de2a-473c-88df-213f4942df99 external-md-0-6d87f687f5-pmmnz
ubuntu@capi:~$
ubuntu@capi:~$ kubectl get machinedeployment
NAME PHASE REPLICAS READY UPDATED UNAVAILABLE
external-md-0 Running 1 1 1
ubuntu@capi:~$
ubuntu@capi:~$ kubectl get openstackmachines
NAME CLUSTER INSTANCESTATE READY PROVIDERID MACHINE
external-control-plane-v11814-ctbkw external ACTIVE true openstack://94a1cbb1-2726-4ac3-be6f-20dc7b2dc9a4 external-control-plane-9pb66
external-control-plane-v11814-d2qtq external ACTIVE true openstack://24f82d1d-567a-4968-94ae-db1bd2d782c3 external-control-plane-2ksn7
external-control-plane-v11814-qn9xb external ACTIVE true openstack://1061e602-e38f-4e57-a1ed-9639f6d37052 external-control-plane-b5m8s
external-md-0-v11814-fjlmp external ACTIVE true openstack://10522a90-de2a-473c-88df-213f4942df99 external-md-0-6d87f687f5-pmmnz
ubuntu@capi:~$
Machines managed by MachineDeployment are upgraded successfully.
ubuntu@capi:~$ kubectl get machines
NAME PROVIDERID PHASE VERSION
external-control-plane-2ksn7 openstack://24f82d1d-567a-4968-94ae-db1bd2d782c3 Running v1.18.14
external-control-plane-9pb66 openstack://94a1cbb1-2726-4ac3-be6f-20dc7b2dc9a4 Running v1.18.14
external-control-plane-b5m8s openstack://1061e602-e38f-4e57-a1ed-9639f6d37052 Running v1.18.14
external-md-0-6d87f687f5-pmmnz openstack://10522a90-de2a-473c-88df-213f4942df99 Running v1.18.14
ubuntu@capi:~$
Delete old OpenStackMachineTemplate
ubuntu@capi:~$ kubectl delete openstackmachinetemplates external-md-0
openstackmachinetemplate.infrastructure.cluster.x-k8s.io "external-md-0" deleted
ubuntu@capi:~$