Upgrade workload cluster on Cluster API Provider OpenStack

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:~$

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください