APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

KubeCon EU 2023: Cluster API Providers: Intro, Deep Dive!

ACS事業部の谷合です。 ちょうどCluster APIを勉強したいと思っていた矢先に、セッションがありましたのでご紹介します。 あくまでも、Cluster APIとは何ぞやといった記事となります。
最後にはAzureのProviderもご紹介しますので、是非最後までお付き合いください。

Cluster APIとは

Cluster APIとはKubernetes styleのAPIで、自動でクラスタのライフサイクルを管理します。
仮想マシン、LoadBalancer、Network構成、Kubernetesのブートストラップを構成します。
これらをテンプレート化し、宣言的に管理することができます。 cluster-api.sigs.k8s.io

Concepts

以下Cluster APIで宣言的にクラスタを作成した場合、全体のアーキテクチャです。
Providerは、次から解説していきます。
cluster-api.sigs.k8s.io

Lifecycle Hook Runtime Extensions

ライフサイクル中の各フェーズにPluginを実装することができる機能のようです。
しかし、誤った実装をすると起動しないなど、深刻な影響を与えるので、上級者向けとされているとのことでした。 cluster-api.sigs.k8s.io

Cluster API Provider

Provider Type

Infrastracture

クラスタノードの実行に必要な前提条件をすべて提供します。
例えば、VM、ネットワーク、ロードバランサー、ファイアウォールルールなどです。
主要なクラウドサービス向けのプロバイダーが公開されています。
https://cluster-api.sigs.k8s.io/reference/providers.html#infrastructure

Bootstrap

ノードのブートストラップに使用されるブートストラップデータを生成します。
kubeadmなどを使ったBootstrap手段が提供されます。
https://cluster-api.sigs.k8s.io/reference/providers.html#bootstrap

Control plane

Control planeを作成します。 以下のリソースをインスタンス化して作成するとのことです。

  • etcd
  • Kubernetes APIサーバー
  • Kubernetes コントローラーマネージャー
  • Kubernetes スケジューラ
  • クラウドコントローラーマネージャー
  • クラスタDNS(CoreDNSなど)
  • サービスプロキシ(例:kube-proxy)

https://cluster-api.sigs.k8s.io/reference/providers.html#control-plane

Cluster API Provider Azure

AzureにもCluster API Providerが提供されています。
capz.sigs.k8s.io 以下のようにCRを定義し、適用することでControl Planeが作成されます。

apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: AzureCluster
metadata:
  name: my-private-cluster
  namespace: default
spec:
  location: eastus
  networkSpec:
    apiServerLB:
      type: Internal
    controlPlaneOutboundLB:
      frontendIPsCount: 1

クラスタに必要な定義を記載すると以下のようになります。
これでAKSができるそうです。

apiVersion: cluster.x-k8s.io/v1beta1
kind: Cluster
metadata:
  name: my-cluster
spec:
  clusterNetwork:
    services:
      cidrBlocks:
      - 192.168.0.0/16
  controlPlaneRef:
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: AzureManagedControlPlane
    name: my-cluster-control-plane
  infrastructureRef:
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: AzureManagedCluster
    name: my-cluster
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: AzureManagedControlPlane
metadata:
  name: my-cluster-control-plane
spec:
  location: southcentralus
  resourceGroupName: foo-bar
  sshPublicKey: ${AZURE_SSH_PUBLIC_KEY_B64:=""}
  subscriptionID: 00000000-0000-0000-0000-000000000000 # fake uuid
  version: v1.21.2
  networkPolicy: azure # or calico
  networkPlugin: azure # or kubenet
  sku:
    tier: Free # or Paid
  addonProfiles:
  - name: azureKeyvaultSecretsProvider
    enabled: true
  - name: azurepolicy
    enabled: true
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: AzureManagedCluster
metadata:
  name: my-cluster
---
apiVersion: cluster.x-k8s.io/v1beta1
kind: MachinePool
metadata:
  name: agentpool0
spec:
  clusterName: my-cluster
  replicas: 2
  template:
    spec:
      clusterName: my-cluster
      infrastructureRef:
        apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
        kind: AzureManagedMachinePool
        name: agentpool0
        namespace: default
      version: v1.21.2
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: AzureManagedMachinePool
metadata:
  name: agentpool0
spec:
  mode: System
  osDiskSizeGB: 30
  sku: Standard_D2s_v3
---
apiVersion: cluster.x-k8s.io/v1beta1
kind: MachinePool
metadata:
  name: agentpool1
spec:
  clusterName: my-cluster
  replicas: 2
  template:
    spec:
      clusterName: my-cluster
      infrastructureRef:
        apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
        kind: AzureManagedMachinePool
        name: agentpool1
        namespace: default
      version: v1.21.2
---
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: AzureManagedMachinePool
metadata:
  name: agentpool1
spec:
  mode: User
  osDiskSizeGB: 40
  sku: Standard_D2s_v4

Providerの実装

Providerの実体は、Operatorです。
ハードルは高いですが、kubebuilderを用いてOperatorを実装するだけで、Providerができちゃいます。
cluster-api.sigs.k8s.io

いやー、yaml適用で、Clusterが作成できちゃうのは面白いですよね。
Providerの組み合わせによっては様々な構成のクラスタが作れそうで、非常に楽しいセッションでした。
Providerの実装方法も分かったので、今度試してみよう。

ACS事業部のご紹介

私達ACS事業部はAzure・AKSなどのクラウドネイティブ技術を活用した内製化のご支援をしております。
www.ap-com.co.jp また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。 www.ap-com.co.jp

本記事の投稿者: 谷合純也
AKS/ACAをメインにインフラ系のご支援を担当しています。
junya0530さんの記事一覧 | Zenn