集群API理论和动手分解
#devops #go #docker #kubernetes

在创建基础架构方面有多种可用的方法。无论您使用Terraform,SDK,SDK,云开发套件(CDK)等基础架构 - 代码工具,诸如Ansible或Console/UI之类的配置管理工具,都不缺乏您的方式可以在本地和云中旋转各种来源。

但是一种更声明的方法呢?您可以使用Kubernetes创建Kubernetes簇的方法。

在这篇博客文章中,您将学习如何与cluster api一起做到这一点。

先决条件

要跟随此博客文章的动手部分,您应该拥有一个Azure帐户,并且能够创建Azure Kubernetes Service(AKS)群集。如果您没有一个Azure帐户,您仍然可以阅读该代码,并查看群集API的实现方式,因为它与其他提供商非常相似。

什么是群集API

当您想创建一个kubernetes群集时,有几种不同的常见方法。

  1. 像Terraform这样的基础架构 - AS代码工具
  2. UI
  3. SDK

和其他一些方法。

事实是,这些方法都不是声明性的,例如创建和运行kubernetes表现出来或更接近您每天与Kubernetes合作的方法。

cluster api开始发挥作用。

群集API是一种声明的方法,用于从另一个Kubernetes群集创建Kubernetes簇。它的工作方式是,您的管理集群几乎像控制平面一样。管理集群根据您使用的提供商安装了​​集群API(您将在下面的小节中了解提供商)。一旦存在于管理集群上的群集API,您就可以使用它来生成kubernetes表现出来,并且可以使用这些Kubernetes清单来通过API调用来创建新群集。

当您在现有的kubernetes上运行kubectl apply -f以创建吊舱,服务或其他kubernetes资源时,您会重新调用API调用。群集API使用相同的方法。

群集API提供了使用Kubernetes创建,更新,修改和删除Kubernetes群集的声明性API。它本质上是使用kubernetes来管理kubernetes。

什么是提供商?

与群集API一起工作时,您将从kubernetes群集中创建簇。 Kubernetes群集将在云上或本地运行,无论是Azure,AWS,另一个云还是数据中心。

要与特定的云提供商或本地数据中心工作,您需要一种与之交互的方法。该方法与提供商有关。提供商是通过API呼叫与云提供商或本地环境进行交互的。这样,您使用的kubernetes群集可以创建其他群集的权限。

您会看到它如何在用Azure 节中构建和配置。

与Azure的群集API

现在您知道了什么是群集API以及为什么要使用它,让我们在行动中看到它。出于本节的目的,您将了解群集API如何与Azure一起使用,但是如先决条件中所述,各个提供商的过程非常相似。

首先,确保安装群集API。下面有两个示例 - 一个用于Linux,一个用于MAC。可以找到其他安装方法here.

## Linux
curl -L https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.4.4/clusterctl-linux-amd64 -o clusterctl

sudo install -o root -g root -m 0755 clusterctl /usr/local/bin/clusterctl

## Mac
brew install clusterctl

安装后,您应该能够在终端上运行clustectl并查看输出。

Image description

现在安装了clusterctl,您需要设置一些环境变量和Kubernetes秘密才能与云提供商进行交互。在下面的示例中,环境变量被设置为对Azure进行身份验证。

CLUSTER_TOLOGY环境变量设置了特征门,用于实验特征。您可以找到更多信息here

export CLUSTER_TOPOLOGY=true

export AZURE_SUBSCRIPTION_ID=""

# Create an Azure Service Principal and paste the output here
export AZURE_TENANT_ID=""
export AZURE_CLIENT_ID=""
export AZURE_CLIENT_SECRET=""

# Base64 encode the variables
export AZURE_SUBSCRIPTION_ID_B64="$(echo -n "$AZURE_SUBSCRIPTION_ID" | base64 | tr -d '\n')"
export AZURE_TENANT_ID_B64="$(echo -n "$AZURE_TENANT_ID" | base64 | tr -d '\n')"
export AZURE_CLIENT_ID_B64="$(echo -n "$AZURE_CLIENT_ID" | base64 | tr -d '\n')"
export AZURE_CLIENT_SECRET_B64="$(echo -n "$AZURE_CLIENT_SECRET" | base64 | tr -d '\n')"

# Settings needed for AzureClusterIdentity used by the AzureCluster
export AZURE_CLUSTER_IDENTITY_SECRET_NAME="cluster-identity-secret"
export CLUSTER_IDENTITY_NAME="cluster-identity"
export AZURE_CLUSTER_IDENTITY_SECRET_NAMESPACE="default"

设置了环境变量后,创建一个kubernetes秘密,以从AKS身份验证Azure。

kubectl create secret generic "${AZURE_CLUSTER_IDENTITY_SECRET_NAME}" --from-literal=clientSecret="${AZURE_CLIENT_SECRET}" --namespace "${AZURE_CLUSTER_IDENTITY_SECRET_NAMESPACE}"

初始化管理集群,这表明您在Azure中运行。

clusterctl init --infrastructure azure

初始化管理集群后,您可以生成kubernetes清单以创建一个新的群集。

要创建一个新的群集,请指定一些环境变量,例如群集的大小以及您要运行的位置。该集群将被Kubeadm引导。

export AZURE_LOCATION="eastus"

export AZURE_CONTROL_PLANE_MACHINE_TYPE="Standard_D2s_v3"
export AZURE_NODE_MACHINE_TYPE="Standard_D2s_v3"

export AZURE_RESOURCE_GROUP="devrelasaservice"

通过clusterctl运行generate命令,该命令指定您希望运行的kubernetes版本。

clusterctl generate cluster capi-azure --kubernetes-version v1.27.0 > capi-azurekubeadm.yaml

您现在应该看到一个名为capi-azurekubeadm.yaml的新文件。

通过运行包含声明代码创建新集群的kubernetes清单来创建群集。

kubectl apply -f capi-azurekubeadm.yaml

运行下面的命令,您现在应该看到可用的新群集。

kubectl get clusters

群集运行后,您可以设置云控制器。云控制器是一个kubernetes控制器,通常在云中运行时从您身上抽象出来,但是您必须使用cluster api安装和管理。

helm install --kubeconfig=./capi-azure.kubeconfig --repo https://raw.githubusercontent.com/kubernetes-sigs/cloud-provider-azure/master/helm/repo cloud-provider-azure --generate-name --set infra.clusterName=capi-azure --set cloudControllerManager.clusterCIDR="192.168.0.0/16"

最后一步是在集群中启动并运行一个容器网络接口(CNI)。这样,您就有内部的Kubernetes网络。安装CNI的一个示例在下面使用印花布。

helm repo add projectcalico https://docs.tigera.io/calico/charts --kubeconfig=./capi-azure.kubeconfig && \

helm install calico projectcalico/tigera-operator --kubeconfig=./capi-azure.kubeconfig -f https://raw.githubusercontent.com/kubernetes-sigs/cluster-api-provider-azure/main/templates/addons/calico/values.yaml --namespace tigera-operator --create-namespace

您现在应该能够完全启动并运行群集。

clusterctl get kubeconfig capi-azure > capi-azure.kubeconfig

恭喜!您已经成功部署了使用群集API的Kubernetes群集。