airshipctl/docs/source/providers/cluster_api_docker.md
Rishabh Kumar Jain fd14ed45bf Update Airshipctl and CAPD Documentation
Update the document to use new phases
 - clusterctl-init-ephemeral
 - controlplane-ephemeral
 - initinfra-networking-target
 - clusterctl-init-target
 - clusterctl-move
 - workers-target

Change-Id: If41412b1810cb61092eaccd96161b012b518eaf6
2021-03-23 20:21:44 +00:00

315 lines
9.1 KiB
Markdown
Executable File

# Airshipctl and Cluster API Docker Integration
## Overview
This document demonstrates usage of airshipctl to create kubernetes clusters
locally using docker and kind.
Airshipctl requires an existing Kubernetes cluster accessible via kubectl.
We will use kind as a local bootstrap cluster, to provision a target management
cluster on the docker infrastructure provider. The target management cluster
will then be used to create a workload cluster with one or more worker nodes.
## Workflow
Below are the steps that we will go through to create the kubernetes clusters
locally using docker and kind.
- create a single node kubernetes cluster using kind
- initialize the kind cluster with cluster api management components
- use the kind management cluster to create a target cluster with one control
plane
- apply cni solution on the target cluster
- initialize the target cluster with cluster api management components
- move the cluster api management crds from kind cluster to target management
cluster
- tear down the kind management cluster
- use the target management cluster to create worker nodes
- increase/decrease the worker count as required
## Airshipctl Commands Used And Purpose
`Pull documents from the remote git repository`
> airshipctl document pull
`Initialize the kind cluster with cluster api and docker provider components`
> airshipctl phase run clusterctl-init-ephemeral
`Use the management cluster to create a target cluster with one control plane`
> airshipctl phase run controlplane-ephemeral
`Get multiple contexts for every cluster in the airship site`
> airshipctl cluster get-kubeconfig > ~/.airship/kubeconfig-tmp
`Initialize CNI on target cluster`
> airshipctl phase run initinfra-networking-target
`Initialize Target Cluster with cluster api and docker proivder components`
> airshipctl phase run clusterctl-init-target
`Move managment CRDs from kind management cluster to target management cluster`
> airshipctl phase run clusterctl-move
`Use target management cluster to deploy workers`
> airshipctl phase run workers-target
## Getting Started
### Build [Airshipctl](https://docs.airshipit.org/airshipctl/developers.html)
```
$ git clone https://review.opendev.org/airship/airshipctl
$ cd airshipctl
$ ./tools/deployment/21_systemwide_executable.sh
```
### Create airship configuration
```
$ cat ~/.airship/config
apiVersion: airshipit.org/v1alpha1
managementConfiguration:
dummy_management_config:
type: redfish
insecure: true
useproxy: false
systemActionRetries: 30
systemRebootDelay: 30
contexts:
ephemeral-cluster:
contextKubeconf: ephemeral-cluster_ephemeral
manifest: dummy_manifest
managementConfiguration: dummy_management_config
target-cluster:
contextKubeconf: target-cluster_target
manifest: dummy_manifest
managementConfiguration: dummy_management_config
currentContext: ephemeral-cluster
kind: Config
manifests:
dummy_manifest:
phaseRepositoryName: primary
repositories:
primary:
checkout:
branch: master
force: false
remoteRef: ""
tag: ""
url: https://review.opendev.org/airship/airshipctl
metadataPath: manifests/site/docker-test-site/metadata.yaml
targetPath: /tmp/airship
```
### Deploy Control plane and Workers
```
$ export KIND_EXPERIMENTAL_DOCKER_NETWORK=bridge
$ export KUBECONFIG="${HOME}/.airship/kubeconfig"
$ kind create cluster --name ephemeral-cluster --wait 120s --kubeconfig \
"${HOME}/.airship/kubeconfig" \
--config ./tools/deployment/templates/kind-cluster-with-extramounts
$ kubectl config set-context ephemeral-cluster \
--cluster kind-ephemeral-cluster \
--user kind-ephemeral-cluster --kubeconfig $KUBECONFIG
$ airshipctl document pull -n --debug
$ airshipctl phase run clusterctl-init-ephemeral --debug --wait-timeout 300s
$ airshipctl phase run controlplane-ephemeral --debug --wait-timeout 300s
$ airshipctl cluster get-kubeconfig > ~/.airship/kubeconfig-tmp
$ mv ~/.airship/kubeconfig-tmp "${KUBECONFIG}"
$ airshipctl phase run initinfra-networking-target --debug
$ kubectl --context target-cluster wait \
--for=condition=Ready nodes --all --timeout 300s
$ kubectl get nodes --context target-cluster -A
```
`Note:
Please take note of the control plane node name because it is untainted
in the next step.
For eg. control plane node name could be something like
target-cluster-control-plane-twwsv
`
```
$ kubectl taint node target-cluster-control-plane-twwsv \
node-role.kubernetes.io/master- --context target-cluster --request-timeout 10s
$ airshipctl phase run clusterctl-init-target --debug --wait-timeout 300s
$ kubectl get pods -A --context target-cluster
$ airshipctl phase run clusterctl-move --debug --progress
$ kubectl get machines --context target-cluster
$ kind delete cluster --name "ephemeral-cluster"
$ airshipctl phase run workers-target --debug
$ kubectl get machines --context target-cluster
NAME PROVIDERID PHASE
target-cluster-control-plane-m5jf7 docker:////target-cluster-control-plane-m5jf7 Running
target-cluster-md-0-84db44cdff-r8dkr docker:////target-cluster-md-0-84db44cdff-r8dkr Running
```
## Scale Workers
Worker count can be adjusted in airshipctl/manifests/site/docker-test-site/
target/workers/machine_count.json.
In this example, we have changed it to 3.
```
$ cat /tmp/airship/airshipctl/manifests/site/docker-test-site/target/workers/machine_count.json
[
{ "op": "replace","path": "/spec/replicas","value": 3 }
]
$ airshipctl phase run workers-target --debug
$ kubectl get machines --kubeconfig /tmp/target-cluster.kubeconfig
NAME PROVIDERID PHASE
target-cluster-control-plane-m5jf7 docker:////target-cluster-control-plane-m5jf7 Running
target-cluster-md-0-84db44cdff-b6zp6 docker:////target-cluster-md-0-84db44cdff-b6zp6 Running
target-cluster-md-0-84db44cdff-g4nm7 docker:////target-cluster-md-0-84db44cdff-g4nm7 Running
target-cluster-md-0-84db44cdff-r8dkr docker:////target-cluster-md-0-84db44cdff-r8dkr Running
```
## Clean Up
```
$ kind get clusters
target-cluster
$ kind delete cluster --name target-cluster
```
## More Information
- worker count can be adjusted from airshipctl/manifests/site/docker-test-site/
target/workers/machine_count.json
- control plane count can be adjusted from airshipctl/manifests/site/
docker-test-site/ephemeral/controlplane/machine_count.json
## Reference
### Pre-requisites
* Install [Docker](https://www.docker.com/)
* Install [Kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/)
* Install [Kind](https://kind.sigs.k8s.io/)
* Check [Software Version Information](#Software-Version-Information),
[Special Instructions](#Special-Instructions) and [Virtual Machine
Specification](#Virtual-Machine-Specification)
### Software Version Information
All the instructions provided in the document have been tested using the
software and version, provided in this section.
#### Virtual Machine Specification
All the instructions in the document were perfomed on a Oracle Virtual Box(6.1)
VM running Ubuntu 18.04.4 LTS (Bionic Beaver) with 16G of memory and 4 VCPUs
#### Docker
```
$ docker version
Client: Docker Engine - Community
Version: 19.03.9
API version: 1.40
Go version: go1.13.10
Git commit: 9d988398e7
Built: Fri May 15 00:25:18 2020
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.9
API version: 1.40 (minimum version 1.12)
Go version: go1.13.10
Git commit: 9d988398e7
Built: Fri May 15 00:23:50 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
```
#### Kind
```
$ kind version
kind v0.8.1 go1.14.2 linux/amd64
```
#### Kubectl
```
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.4", GitCommit:"8d8aa39598534325ad77120c120a22b3a990b5ea", GitTreeState:"clean", BuildDate:"2020-03-12T21:03:42Z", GoVersion:"go1.13.8", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.0", GitCommit:"70132b0f130acc0bed193d9ba59dd186f0e634cf", GitTreeState:"clean", BuildDate:"2020-01-14T00:09:19Z", GoVersion:"go1.13.4", Compiler:"gc", Platform:"linux/amd64"}
```
#### Go
```
$ go version
go version go1.14.1 linux/amd64
```
#### OS
```
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.4 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.4 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
```
### Special Instructions
Swap was disabled on the VM using `sudo swapoff -a`