Rotate cluster certificates

    Introduction

    Kubernetes uses PKI certificates for authentication over TLS. Lokomotive generates the required certificates automatically, and the Certificate Authority (CA) has an expiration date of 1 year by default. To continue operating the cluster, please rotate the certificates before their expiration date.

    This document provides a step by step guide on rotating the cluster certificates.

    Prerequisites

    • A Lokomotive cluster accessible via kubectl
    • The OpenSSL CLI tool

    Steps

    Step 1: Check current CA expiration date

    Find out the address of the cluster:

    kubectl cluster-info
    

    Check expiration date of the cluster CA certificate:

    openssl s_client -connect cluster.example.com:6443 -servername cluster.example.com 2> /dev/null | openssl x509 -noout  -dates
    

    The output will be similar to the following:

    notBefore=May 16 15:13:58 2020 GMT
    notAfter=May 16 15:13:58 2021 GMT
    

    The date in the notAfter line is the expiration date of the cluster CA certificate.

    Step 2: Rotate certificates

    Lokoctl transfers the newly generated certificates to the controller nodes over SSH. Run the following command to load one of the SSH keys specified in the cluster configuration (in this case ~/.ssh/id_rsa):

    eval "$(ssh-agent)"
    ssh-add ~/.ssh/id_rsa
    

    NOTE: For an Equinix Metal based cluster, the public IP address of the client machine — the machine where you will run lokoctl from — should be in the management_cidrs.

    Run the lokoctl certificate rotation command:

    lokoctl cluster certificate rotate
    

    Lokomotive will make sure your cluster is up to date and will start the certificate rotation process. This process takes about 20 minutes and will restart the cluster control plane components several times, so you might lose access to the cluster in a non-HA setup.

    Step 3: Check new CA expiration date

    Run the same command as in Step 1 and check the CA certificate has a new expiration date 1 year from now:

    openssl s_client -connect cluster.example.com:6443 -servername cluster.example.com 2> /dev/null | openssl x509 -noout  -dates
    

    Assuming we rotated certificates on May 12 2021, the output should be similar to the following:

    notBefore=May 12 09:13:58 2021 GMT
    notAfter=May 12 09:13:58 2022 GMT
    

    Note the expiration date is one year after the time we did the rotation.