docs/doc/source/airship2/site-deployment.rst
bijayasharma 98bad7dec2 Fixed some typos and links in Airship docs
Signed-off-by: bijayasharma <vetbijaya@gmail.com>
Change-Id: I5d453720a586368d7ca37536511c0043fd418fde
2021-10-05 15:20:13 -04:00

447 lines
15 KiB
ReStructuredText

.. _site_deployment_guide:
Site Deployment Guide
=====================
This document is the Airship 2 site deployment guide for a standard greenfield
bare metal deployment. The following sections describes how to apply the site
manifests for a given site.
Prerequisites
~~~~~~~~~~~~~
Before starting, ensure that you have completed :ref:`system requirements and set up <site_setup_guide>`,
including the the BIOS and Redfish settings, hardware RAID configuration etc.
.. warning::
Ensure all the hosts are powered off, including ephemeral node, controller
nodes and worker nodes.
Airshipctl Phases
~~~~~~~~~~~~~~~~~
A new concept with Airship 2 is :term:`phases<Phase>`. A phase is a step to be
performed in order to achieve a desired state of the managed site. Phases group
sets of commands together for a particular deployment step into one phase apply
command. This greatly simplifies executing deployment.
The Airship 2 deployment uses heavily the ``airshipctl`` commands, especially the
``airshipctl phase run`` commands. You may find it helpful to get familiarized with
the `airshipctl command reference`_ and `example usage`_.
To facilitate the site deployment, the Airship Treasuremap project provides a
set of deployment scripts in the ``tools/deployment`` directory. These scripts
are wrappers of the `airshipctl` commands with additional flow controls. They
are numbered sequentially in the order of the deployment operations.
The instructions in this document will be based upon the Treasuremap deployment
scripts.
.. _airshipctl command reference:
https://docs.airshipit.org/airshipctl/cli/airshipctl.html
.. _example usage:
https://docs.airshipit.org/airshipctl/architecture.html#example-usage
Environment Variables
~~~~~~~~~~~~~~~~~~~~~
The deployment steps below use a few additional environment variables that are
already configured with default values for a typical deployment or inferred
from other configuration files or site manifests. In most situations, users
do not need to manually set the values for these environment variables.
* ``KUBECONFIG``: The location of kubeconfig file. Default value:
``$HOME/.airship/kubeconfig``.
* ``KUBECONFIG_TARGET_CONTEXT``: The name of the kubeconfig context for the
target cluster. Default value: "target-cluster". You can find it defined
in the Airshipctl configuration file.
* ``KUBECONFIG_EPHEMERAL_CONTEXT``: The name of the kubeconfig context for
the ephemeral cluster. Default value: "ephemeral-cluster". You can find it
defined in the Airshipctl configuration file.
* ``TARGET_IP``: The control plane endpoint IP or host name. Default value:
derived from site documents for the ``controlplane-target`` phase. You
can run the following command to extract the defined value:
.. code-block:: bash
airshipctl phase render controlplane-target \
-k Metal3Cluster -l airshipit.org/stage=initinfra \
2> /dev/null | yq .spec.controlPlaneEndpoint.host | sed 's/"//g'
* ``TARGET_PORT``: The control plane endpoint port number. Default value:
derived from site documents for the ``controlplane-target`` phase. You
can run the following command to extract the defined value:
.. code-block:: bash
airshipctl phase render controlplane-target \
-k Metal3Cluster -l airshipit.org/stage=initinfra 2> /dev/null | \
yq .spec.controlPlaneEndpoint.port
* ``TARGET_NODE``: The host name of the first controller node. Default
value: derived from site documents for the ``controlplane-ephemeral``
phase. You can run the following command to extract the defined value:
.. code-block:: bash
airshipctl phase render controlplane-ephemeral \
-k BareMetalHost -l airshipit.org/k8s-role=controlplane-host 2> /dev/null | \
yq .metadata.name | sed 's/"//g'
* ``WORKER_NODE``: The host name of the worker nodes. Default value: derived
from site documents for the ``workers-target`` phase. You can run the
following command to extract the defined value:
.. code-block:: bash
airshipctl phase render workers-target -k BareMetalHost 2> /dev/null | \
yq .metadata.name | sed 's/"//g'
Configuring Airshipctl
~~~~~~~~~~~~~~~~~~~~~~
Airship requires a configuration file set that defines the intentions for the
site that needs to be created. These configurations include such items as
manifest repositories, ephemeral and target cluster context and bootstrap
information. The operator seeds an initial configuration using the
configuration initialization function.
The default location of the configuration files is ``$HOME/.airship/config``
and ``$HOME/.airship/kubeconfig``.
When you run the init_site script in the :ref:`init_site` section, the
``.airship/config`` file has been already created for you.
.. warning::
If the Redfish api uses self-signed certificate, the user must run:
.. code-block:: bash
airshipctl config set-management-config default --insecure
This will inject the ``insecure`` flag to the Airship configuration file as
follows:
.. code-block:: yaml
managementConfiguration:
default:
insecure: true
systemActionRetries: 30
systemRebootDelay: 30
type: redfish
Now let's create the ``.airship/kubeconfig``. If you plan to use an existing
external kubeconfig file, run:
.. code-block:: bash
airshipctl config import <KUBE_CONFIG>
Otherwise, create an empty kubeconfig that will be populated later by
airshipctl:
.. code-block:: bash
touch ~/.airship/kubeconfig
More advanced users can use the Airshipctl config commands to generate or
update the configuration files.
To generate an Airshipctl config file from scratch,
.. code-block:: bash
airshipctl config init [flags]
To specify the location of the manifest repository,
.. code-block:: bash
airshipctl config set-manifest <MANIFEST_NAME> [flags]
To create or modify a context in the airshipctl config files,
.. code-block:: bash
airshipctl config set-context <CONTEXT_NAME> --manifest <MANIFEST_NAME> [flags]
Full details on the ``config`` command can be found here_.
.. _here: https://docs.airshipit.org/airshipctl/cli/config/airshipctl_config.html
.. _gen_secrets:
Generating and Encrypting Secrets
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Airship site manifests contain different types of secrets, such as passwords,
keys and certificates in the variable catalogues. Externally provided secrets,
such as BMC credentials, are used by Airship and Kubernetes and can also be
used by other systems. Secrets can also be internally generated by Airshipctl,
e.g., Openstack Keystone password, that no external systems will provide or
need.
To have Airshipctl generate and encrypt the secrets, run the following script
from the treasuremap directory:
.. code-block:: bash
./tools/deployment/23_generate_secrets.sh
The generated secrets will be updated in:
* ``${PROJECT}/manifests/site/${SITE}/target/generator/results/generated/secrets.yaml``
* ``${HOME}/.airship/kubeconfig.yaml``
It is recommended that you save the generated results, for example, commit them
to a git repository along with the rest of site manifests.
To update the secrets for an already deployed site, you can re-run this script
and apply the new secret manifests by re-deploying the whole site.
For more details and trouble shooting, please refer to
`Secrets generation and encryption how-to-guide <https://github.com/airshipit/airshipctl/blob/master/docs/source/secrets-guidelines.md>`_.
Validating Documents
~~~~~~~~~~~~~~~~~~~~
After constituent YAML configurations are finalized, use the document
validation tool to lint and check the new site manifests. Resolve any
issues that result from the validation before proceeding.
.. code-block:: bash
./tools/validate_docs
.. caution::
The validate_docs tool will run validation against all sites found in the
``manifests/site`` folder. You may want to (temporarily) remove other sites
that are not to be deployed to speed up the validation.
To validate a single site's manifest,
.. code-block:: bash
export MANIFEST_ROOT=./${PROJECT}/manifests
export SITE_ROOT=./${PROJECT}/manifests/site
cd airshipctl && ./tools/document/validate_site_docs.sh
Estimated runtime: **5 minutes**
Building Ephemeral ISO Image
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The goal for this step is to generate a custom targeted image for bootstrapping
an ephemeral host with a Kubernetes cluster installed. This image may then
be published to a repository to which the ephemeral host will have remote access.
Alternatively, an appropriate media delivery mechanism (e.g. USB) can be used to
bootstrap the ephemeral host manually.
.. note:: The generate ISO image content includes:
- Host OS Image
- Runtime engine: Docker/containerd
- Kubelet
- Kubeadm
- YAML file for KubeadmConfig
First, create an output directory for ephemeral ISO image and run the
``bootstrap-iso`` phase:
.. code-block:: bash
sudo mkdir /srv/images
airshipctl phase run bootstrap-iso
Or, run the provided script from the treasuremap directory:
.. code-block:: bash
./tools/deployment/24_build_images.sh
Then, copy the generated ephemeral ISO image to the Web hosting server that
will serve the ephemeral ISO image. The URL for the image should match what is
defined in
``manifests/site/{SITE}/ephemeral/bootstrap/remote_direct_configuration.yaml``.
For example, if you have installed the Apache Web server on the jump host as
described in the earlier step, you can simply execute the following:
.. code-block:: bash
sudo cp /srv/images/ephemeral.iso /var/www/html/
Estimated runtime: **5 minutes**
Deploying Ephemeral Node
~~~~~~~~~~~~~~~~~~~~~~~~
In this step, we will create an ephemeral Kubernetes instance that ``airshipctl``
can communicate with for subsequent steps. This ephemeral host provides a
foothold in the target environment so the standard ``cluster-api`` bootstrap
flow can be executed.
First, let's deploy the ephemeral node via Redfish with the ephemeral ISO image
generated in previous step:
.. code-block:: bash
./tools/deployment/25_deploy_ephemeral_node.sh
Estimated runtime: **10 minutes**
.. note:: If desired or if Redfish is not available, the ISO image can be
mounted through other means, e.g. out-of-band management or a USB drive.
Now the ephemeral node is established, we can deploy ``Calico``, ``metal3.io`` and
``cluster-api`` components onto the ephemeral node:
.. code-block:: bash
./tools/deployment/26_deploy_capi_ephemeral_node.sh
Estimated runtime: **10 minutes**
To use ssh to access the ephemeral node, you will need the OAM IP from the
networking catalogue, and the user name and password from the airshipctl phase
render command output.
.. code-block:: bash
airshipctl phase render iso-cloud-init-data
Deploying Target Cluster
~~~~~~~~~~~~~~~~~~~~~~~~
Now you are ready to use the ephemeral Kubernetes to provision the first target
cluster node using the cluster-api bootstrap flow.
Create the target Kubernetes cluster resources:
.. code-block:: bash
./tools/deployment/30_deploy_controlplane.sh
Estimated runtime: **25 minutes**
Deploy infrastructure components including Calico and meta3.io:
.. code-block:: bash
./tools/deployment/31_deploy_initinfra_target_node.sh
Estimated runtime: **10 minutes**
Deploy ``cluster-api`` components to the target cluster:
.. code-block:: bash
./tools/deployment/32_cluster_init_target_node.sh
Estimated runtime: **1-2 minutes**
Then, stop the ephemeral host and move Cluster objects to target cluster:
.. code-block:: bash
./tools/deployment/33_cluster_move_target_node.sh
Estimated runtime: **1-2 minutes**
Lastly, complete the target cluster by provisioning the rest of the controller
nodes:
.. code-block:: bash
./tools/deployment/34_deploy_controlplane_target.sh
Estimated runtime: **30 minutes** (Depends on the number of controller nodes).
.. note::
When the second controller node joins the cluster, the script may fail with
the error message ``"etcdserver: request timed out"``. This is a known issue.
You can just wait until all the other controller nodes join the cluster
before executing the next phase. To check the list of nodes in the cluster,
run:
.. code-block:: bash
kubectl --kubeconfig ${HOME}/.airship/kubeconfig --context target-cluster get nodes
Provisioning Worker Nodes
~~~~~~~~~~~~~~~~~~~~~~~~~
This step uses the target control plane Kubernetes host to provision the
target cluster worker nodes and apply the necessary phases to deploy software
on the worker nodes.
To deploy, classify and provision the worker nodes, run:
.. code-block:: bash
./tools/deployment/35_deploy_worker_node.sh
Estimated runtime: **20 minutes**
Now the target cluster is fully operational and ready for workload deployment.
Deploying Workloads
~~~~~~~~~~~~~~~~~~~
The Treasuremap type ``airship-core`` deploys the ingress as a workload. The
user can add other workload functions to the target workload phase in the
``airship-core`` type, or create their own workload phase from scratch.
Adding a workload function involves two tasks. First, the user will create the
function manifest(s) in the ``$PROJECT/manifest/function`` directory. A good
example can be found in the `ingress`_ function from Treasuremap. Second, the
user overrides the `kustomization`_ of the target workload phase to include
the new workload function in the
``$PROJECT/manifests/site/$SITE/target/workload/kustomization.yaml``.
For more detailed reference, please go to `Kustomize`_ and airshipctl `phases`_
documentation.
.. _ingress: https://github.com/airshipit/treasuremap/tree/v2.0/manifests/function/ingress
.. _kustomization: https://github.com/airshipit/treasuremap/blob/v2.0/manifests/type/airship-core/target/workload/kustomization.yaml
.. _Kustomize: https://kustomize.io
.. _phases: https://docs.airshipit.org/airshipctl/phases.html
To deploy the workloads, run:
.. code-block:: bash
./tools/deployment/36_deploy_workload.sh
Estimated runtime: Varies by the workload content.
Accessing Nodes
~~~~~~~~~~~~~~~
Operators can use ssh to access the controller and worker nodes via the OAM IP
address. The ssh key can be retrieved using the airshipctl phase render command:
.. code-block:: bash
airshipctl phase render controlplane-ephemeral
Tearing Down Site
~~~~~~~~~~~~~~~~~
To tear down a deployed bare metal site, the user can simply power off all
the nodes and clean up the deployment artifacts on the build node as follows:
.. code-block:: bash
airshipctl baremetal poweroff --name <server-name> # alternatively, use iDrac or iLO
rm -rf ~/.airship/ /srv/images/*
docker rm -f -v $(sudo docker ps --all -q | xargs -I{} sudo bash -c 'if docker inspect {} | grep -q airship; then echo {} ; fi')
docker rmi -f $(sudo docker images --all -q | xargs -I{} sudo bash -c 'if docker image inspect {} | grep -q airship; then echo {} ; fi')