RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

Knative on minikubeでServing & EventingのHelloworldを動かすまで(構築編)

こんにちは、弊社サービスのインフラを運用している id:keijiu (ijikeman)です。

今回は、「Knative on minikubeでServing & Eventing Helloworldを動かすまで(構築編)」を記載します。

[対象読者]

  • Knative Eventing環境を自分で作ってみたい人
  • Knative EventingでサンプルコードHelloworldを動かしたい人
  • Knative Eventingの構成を理解したい人

[記事を読んでわかること]

  • knative Cli[kn]を使ってminikube上でKnative Eventingを構築

[構築環境情報]

CPU4
Memory4GB
OSAlma Linux 8.5
minikube version1.23.4
minikube Driverdocker
Knativev1.4.0

目次

1. docker-ceのセットアップ

minikubeを動作させる為にはいくつかのDriverをあらかじめセットアップしておく必要があります。

参考: Drivers | minikube

から今回はdocker-ceを選択します。

Docker-CEのセットアップは以下の情報を元にセットアップを行います。 Docker CE の入手(CentOS 向け) — Docker-docs-ja 20.10 ドキュメント

docker-ceリポジトリのセットアップ
# sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2

# sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
docker-ceのインストールと起動
# sudo yum install -y docker-ce

# sudo systemctl enable docker
# sudo systemctl start docker

docker-ceの起動を確認

# sudo systemctl status docker
---
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2022-05-25 23:56:00 EDT; 2s ago
     Docs: https://docs.docker.com
 Main PID: 26493 (dockerd)
    Tasks: 9
   Memory: 35.2M
   CGroup: /system.slice/docker.service
           └─26493 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
---

2. minikube CLIのセットアップ

参考: minikube start | minikube

今回はRPMを使ってセットアップします。 ※ご自身の環境に合わせて選択肢を変更してください。

minikube CLIコマンドのセットアップ
# sudo curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-latest.x86_64.rpm
# sudo rpm -Uvh minikube-latest.x86_64.rpm
minikubeの動作確認

以下の様にroot権限のアカウントではminikubeは起動できませんので専用アカウントを用意します。
確認の為にminikube Driverにdockerを指定してminikube clusterを構築します。

# sudo minikube start --driver=docexitker
---
* Rocky 8.5 (amd64) 上の minikube v1.25.2
* ユーザーの設定に基づいて docker ドライバーを使用します
* 「docker」ドライバーは root 権限で使用すべきではありません。
* If you are running minikube within a VM, consider using --driver=none:
*   https://minikube.sigs.k8s.io/docs/reference/drivers/none/

X DRV_AS_ROOT が原因で終了します: 「docker」ドライバーは root 権限で使用すべきではありません。
---
minikube用アカウントを用意する

minikube構築用にk8sグループとユーザを作成し、dockerグループに付属させます。

# groupadd k8s
# useradd k8s -g k8s -s /bin/bash -d /home/k8s
# sudo usermod -aG docker k8s && newgrp docker

dockerグループに付属していることを確認

# egrep docker /etc/group
---
docker:x:987:k8s
---
k8sユーザに変更し、minikubeクラスタを構築する
# su - k8s -c 'minikube start --driver=docker'
---
* Rocky 8.5 (amd64) 上の minikube v1.25.2
* 既存のプロファイルを元に、docker ドライバーを使用します
* minikube クラスター中のコントロールプレーンの minikube ノードを起動しています
* ベースイメージを取得しています...
* docker 「 minikube 」 container がありません。再生成します。
* docker container (CPUs=2, Memory=2200MB) を作成しています...
* Docker 20.10.12 で Kubernetes v1.23.3 を準備しています...
  - kubelet.housekeeping-interval=5m
  - 証明書と鍵を作成しています...
  - コントロールプレーンを起動しています...
  - RBAC のルールを設定中です...
* Kubernetes コンポーネントを検証しています...
  - gcr.io/k8s-minikube/storage-provisioner:v5 イメージを使用しています
* 有効なアドオン: storage-provisioner, default-storageclass
* kubectl が見つかりません。kubectl が必要な場合、'minikube kubectl -- get pods -A' を試してください
* 完了しました! kubectl が「"minikube"」クラスタと「"default"」ネームスペースを使用するよう構成されました
---

minikube clusterの作成が可能であることが確認できましたので、作成したminikube clusterを削除しておきます

# su - k8s -c 'minikube delete'
---
* docker の「minikube」を削除しています...
* コンテナー「minikube」を削除しています...
* /home/k8s/.minikube/machines/minikube を削除しています...
* クラスター「minikube」の全てのトレースを削除しました。
---

3. Knativeのセットアップ

ここまでこればKnative環境を構築するのは簡単です。

Knative環境の構築方法は以下2種類あります。

  • knative Cli(kn) + Knative quickstart plugin
    • こちらはKnative ServingとKnative Eventingの両方をセットアップしてくれます。
    • 動作が保証された状態でセットアップできることから、環境構築に手間をかけたくない。とりあえずKnative触ってみたいといった人に向いています。
  • kubectl + YAML
    • こちらはKnativeのInstallページに沿ってKnativeのBrokerやTriggerなど各コンポーネントをセットアップしていきます。
    • Knative Serving環境だけ作りたい人や、BrokerやTrigger等のコンポーネントにおいて複数種のソリューションの選択が可能ですので、上記基本セットアップ以外の環境で動かしたい人に向いています。
kubectlコマンドの設置

どちらの構築方法を選択してもkubectlコマンドの設置が必要となりますので、実施します。

# sudo curl -L -o /usr/local/bin/kubectl "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
# sudo chmod +x /usr/local/bin/kubectl
knative Cli(kn) + Knative quickstart pluginによる構築

公式サイトに書かれている方法構築していきます。

Install Knative using quickstart - Knative

knativeのバージョン指定

Knativeのバージョンを指定します。

KNATIVE_VERSION='1.4.0'
kn(Knative cli)の設置

上記指定したバージョンにてknコマンドを設置します。

# sudo curl -LO https://github.com/knative/client/releases/download/knative-v${KNATIVE_VERSION}/kn-linux-amd64
# sudo mv kn-linux-amd64 /usr/local/bin/kn
# sudo chmod +x /usr/local/bin/kn
Knative Quickstart Pluginの設置

次にquickstart plugin用コマンドを設置します。

# sudo curl -LO https://github.com/knative-sandbox/kn-plugin-quickstart/releases/download/knative-v${KNATIVE_VERSION}/kn-quickstart-linux-amd64
# sudo mv kn-quickstart-linux-amd64 /usr/local/bin/kn-quickstart
# sudo chmod +x /usr/local/bin/kn-quickstart
Knative(Serving + Eventing)のセットアップ

一旦k8sユーザに切り替えます。

# su - k8s

いよいよKnativeのセットアップを行います。

下記ログより

  1. minikube clusterの構築
  2. kubectlコマンドの参照先をknativeクラスタを参照させる
  3. Knative Servingのセットアップ
  4. Kourier Netowrk Layerのセットアップ
  5. Knative Eventingのセットアップ

をそれぞれ実施しています。

k8s$ kn quickstart minikube
---
Running Knative Quickstart using Minikube
Minikube version is: v1.25.2

☸ Creating Minikube cluster...

Using the standard minikube driver for your system
If you wish to use a different driver, please configure minikube using
    minikube config set driver <your-driver>

* Rocky 8.5 (amd64) 上の [knative] minikube v1.25.2
! Specified Kubernetes version 1.23.4 is newer than the newest supported version: v1.23.4-rc.0
* docker ドライバーが自動的に選択されました
! あなたの cgroup ではメモリーの設定ができません。
  - 追加情報: https://docs.docker.com/engine/install/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities

X 要求された 3072MiB のメモリー割当は、システムのオーバーヘッド (合計システムメモリー: 3684MiB) に十分な空きを残しません。安定性の問題に直面するかも知れません。
* 提案: Start minikube with less memory allocated: 'minikube start --memory=3072mb'

* knative クラスター中のコントロールプレーンの knative ノードを起動しています
* ベースイメージを取得しています...
* Kubernetes v1.23.4 のダウンロードの準備をしています
    > preloaded-images-k8s-v17-v1...: 505.67 MiB / 505.67 MiB  100.00% 35.55 Mi
* docker container (CPUs=3, Memory=3072MB) を作成しています...
* Docker 20.10.12 で Kubernetes v1.23.4 を準備しています...
  - kubelet.housekeeping-interval=5m
  - 証明書と鍵を作成しています...
  - コントロールプレーンを起動しています...
  - RBAC のルールを設定中です...
* Kubernetes コンポーネントを検証しています...
  - gcr.io/k8s-minikube/storage-provisioner:v5 イメージを使用しています
* 有効なアドオン: default-storageclass, storage-provisioner
* 完了しました! kubectl が「"knative"」クラスタと「"default"」ネームスペースを使用するよう構成されました

🍿 Installing Knative Serving v1.4.0 ...
    CRDs installed...
    Core installed...
    Finished installing Knative Serving
🕸️ Installing Kourier networking layer v1.4.0 ...
    Kourier installed...
    Ingress patched...
    Finished installing Kourier Networking layer
🕸 Configuring Kourier for Minikube...
    Domain DNS set up...
    Minikube tunnel...
    Finished configuring Kourier
🔥 Installing Knative Eventing v1.4.0 ...
    CRDs installed...
    Core installed...
    In-memory channel installed...
    Mt-channel broker installed...
    Example broker installed...
    Finished installing Knative Eventing
🚀 Knative install took: 3m25s
🎉 Now have some fun with Serverless and Event Driven Apps!
---
Knative環境の動作状況を確認する

まずは、namespace情報を確認します knative-eventing, knative-serving, kourier-systemができていることが確認できます。

※kube-node-lease, kube-public, kube-systemはminikubeのnamespaceです。

k8s$ kubectl get namespaces
NAME               STATUS   AGE
default            Active   9m26s
knative-eventing   Active   7m27s
knative-serving    Active   8m26s
kourier-system     Active   8m1s
kube-node-lease    Active   9m28s
kube-public        Active   9m28s
kube-system        Active   9m28s

次に各deploymentの状況を確認します。全てREADY 1/1となっているか確認します。

※pingsourceは0/0で問題ありません。

knative-eventingのコンポーネントです。

ChannelはIn Memory Channel(imc-*)が選択されています。

BrokerはMT-Channel-based(mt-broker-*)が選択されています。

$ kubectl get deployment --namespace knative-eventing
---
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
eventing-controller     1/1     1            1           13m
eventing-webhook        1/1     1            1           13m
imc-controller          1/1     1            1           12m
imc-dispatcher          1/1     1            1           12m
mt-broker-controller    1/1     1            1           12m
mt-broker-filter        1/1     1            1           12m
mt-broker-ingress       1/1     1            1           12m
pingsource-mt-adapter   0/0     0            0           13m
---

knative-servingのコンポーネントです。

networkにkourier network layerが選択されています。

$ kubectl get deployment --namespace knative-serving
---
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
activator                1/1     1            1           16m
autoscaler               1/1     1            1           16m
controller               1/1     1            1           16m
domain-mapping           1/1     1            1           16m
domainmapping-webhook    1/1     1            1           16m
net-kourier-controller   1/1     1            1           16m
webhook                  1/1     1            1           16m
---

$ kubectl get deployment --namespace kourier-system
---
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
3scale-kourier-gateway   1/1     1            1           16m
---

環境構築は以上で終了です。

続はいよいよ 構築したKnative on minikubeでServing & Eventing Helloworldを動かすまで(実行編) にて

  • Knative ServingのHelloworldの動作確認
  • Knative Eventing Helloworldの動作確認
  • Knative Serving + Eventingを組み合わせたHelloworld

を行います。お楽しみに!!


◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.