Airshipctl and Azure Cloud Platform Integration¶
This document provides the instructions to setup and execute airshipctl commands to deploy a Target cluster in Azure cloud platform. The manifest for the Target cluster deployment can be found at manifest/site/az-test-site/target/azure-target. It will deploy:
CAPZ v0.4.5 Management component
Region: US East
Control Plane: 1 VM (Standard_B2s)
Worker: 2 VMs (Standard_B2s)
Deploying K8S 1.18.3
Pre-requisites¶
The list below are the expected pre-requisites for this integration.
Create your $HOME/.airship/config
Instantiate the Management cluster using Kind
Update the manifest manifest/function/capz/v.4.5/default/credentials.yaml with the Azure subscription credentials
TODO: Azure subscription credentials to be passed as environment variables
Steps to create a Management cluster with Kind¶
The list of commands below creates a K8S cluster to be used as Management cluster
$ kind create cluster --name airship2-kind-api --kubeconfig /your/folder/kubeconfig.yaml
$ cp /your/folder/kubeconfig.yaml $HOME/.airship/kubeconfig
$ cp /your/folder/kubeconfig.yaml $HOME/.kube/config
Initialize Management cluster¶
Execute the following command to initialize the Management cluster with CAPI and CAPZ components.
$ airshipctl cluster init
Deploy Target cluster on Azure¶
To deploy the Target cluster on Azure cloud execute the following command.
$ airshipctl phase apply azure-target
Verify the status of Target cluster deployment
$ kubectl get cluster --all-namespaces
Check status of Target cluster KUBEADM control plane deployment
$ kubectl get kubeadmcontrolplane --all-namespaces
Retrieve the kubeconfig of Target cluster
$ kubectl --namespace=default get secret/az-target-cluster-kubeconfig -o jsonpath={.data.value} \
| base64 --decode > ./az-target-cluster.kubeconfig
Check the list of nodes create for the Target cluster
  $ kubectl --kubeconfig=./az-target-cluster.kubeconfig get nodes
When all control plane and worker nodes have been created, they will stay in Not Ready state until CNI is configured. See next step below.
Configure CNI on the Target cluster with Calico¶
Calico will be initialized as part of control plane VM postKubeadmCommands, which executes the sudo kubectl –kubeconfig /etc/kubernetes/admin.conf apply -f https://raw.githubusercontent.com/kubernetes-sigs/cluster-api-provider-azure/master/templates/addons/calico.yaml command.
See snippet of manifest integrating Calico initialization below:
apiVersion: controlplane.cluster.x-k8s.io/v1alpha3
kind: KubeadmControlPlane
metadata:
  name: az-target-cluster-control-plane
  namespace: default
spec:
  infrastructureTemplate:
    apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3
    kind: AzureMachineTemplate
    name: az-target-cluster-control-plane
  kubeadmConfigSpec:
...
    files:
    - path: /calico.sh
      owner: root:root
      permissions: "0755"
      content: |
        #!/bin/bash -x
        sudo kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://raw.githubusercontent.com/kubernetes-sigs/cluster-api-provider-azure/master/templates/addons/calico.yaml
...
    postKubeadmCommands:
      - /calico.sh
    useExperimentalRetryJoin: true
  replicas: 3
  version: v1.18.2
This approach automates the initialization of Calico and saves the need to execute manually the list of commands described below.
First we need to provision the Target cluster context in the airship config file
Add Target Cluster manifest to azure_manifest
$ airshipctl config import ./az-target-cluster.kubeconfig
Replace Target Cluster kubeconfig Context in the airship config file
$ airshipctl config set-context az-target-cluster-admin@az-target-cluster --manifest azure_manifest
Set Current Context to the Target Cluster kubeconfig Context in the airship config file
$ airshipctl config use-context az-target-cluster-admin@az-target-cluster
Now we can trigger the configuration of Calico on the Target Cluster
$ airshipctl phase apply calico --kubeconfig az-target-cluster.kubeconfig
Once the Calico provisioning has been completed you should see all the nodes instantiated for the Target cluster in Ready state.
$ kubectl --kubeconfig=./az-target-cluster.kubeconfig get nodes
NAME                                    STATUS   ROLES    AGE   VERSION
az-target-cluster-control-plane-28ghk   Ready    master   17h   v1.18.2
az-target-cluster-md-0-46zfv            Ready    <none>   17h   v1.18.2
az-target-cluster-md-0-z5lff            Ready    <none>   17h   v1.18.2
APPENDIX: $HOME/.airship/config¶
apiVersion: airshipit.org/v1alpha1
contexts:
  az-target-cluster-admin@az-target-cluster:
    manifest: azure_manifest
currentContext: az-target-cluster-admin@az-target-cluster
kind: Config
managementConfiguration:
  azure_management_config:
    insecure: true
    systemActionRetries: 30
    systemRebootDelay: 30
    type: azure
  default:
    systemActionRetries: 30
    systemRebootDelay: 30
    type: azure
manifests:
  azure_manifest:
    phaseRepositoryName: primary
    metadataPath: manifests/site/az-test-site/metadata.yaml
    repositories:
      primary:
        checkout:
          branch: master
          commitHash: ""
          force: false
          tag: ""
        url: https://opendev.org/airship/airshipctl
    targetPath: /tmp/airship
  default:
    phaseRepositoryName: primary
    metadataPath: manifests/metadata.yaml
    repositories:
      primary:
        checkout:
          branch: master
          commitHash: ""
          force: false
          tag: ""
        url: https://opendev.org/airship/treasuremap
    targetPath: /tmp/default