2023年1月7日土曜日

「minikube」を使ってKubernetes検証環境を構築する手順

コンテナのオーケストレーションツールのデファクトスタンダードとなっているKubernetesは、仕組みが複雑であり、マニュアルや書籍を見るだけでは、なかなか理解を深めるのが難しい。

インフラ技術を理解するためには、実際に構築して操作することが一番早いと考えており、自宅検証環境にKubernetes環境を構築することにした。

今回は、Linux OS上に容易にKubernetes検証環境を構築できる「minikube」をインストールする手順を記載する。また、minikube起動後に、簡単なコンテナを作成し外部からアクセスするまでの流れを確認してみよう。

環境

以下に今回構築する各種ソフトウェアのバージョンを記載する。

  • ホストOS : AlmaLinux 8.6 (GUI環境を含めインストールする)
  • ホストDocker : 20.10.21
  • minikube : 1.28.0

minikubeを動作させるためのリソース要件は以下の通り。今回は、CPU 4コア、メモリ 4GB、ディスク 20GBで構成した。また、インターネット接続はプロキシ(私の環境の場合はhttp://192.168.33.23:8080)経由での接続が必要となるため、必要なプロキシ設定も手順に記載している。プロキシ設定が不要な場合は、手順を飛ばしてもらえれば問題ない。

  • 2 CPUs or more
  • 2GB of free memory
  • 20GB of free disk space
  • Internet connection

minikubeはホストOSのDockerやVirtualBoxを用いて、Kubernetesのノードを構成することで、Kubernetes環境を即座にスクラップ&ビルドしながら検証をすることができる。

以下にminikubeの環境の構成概要図を記載する。

minikubeインストール手順

1. プロキシ設定 (必要な場合のみ)

私の環境ではプロキシ経由でなければインターネット接続ができないため、以下の通り環境変数を設定する。プロキシの環境変数について小文字と大文字の両方を設定している理由は、dnfコマンドでは小文字の環境変数の設定が必要であり、minikubeの場合は大文字の環境変数の設定が必要となるためである(とてもややこしい)。

# export http_proxy=http://192.168.33.23:8080
# export https_proxy=http://192.168.33.23:8080
# export no_proxy=192.168.0.0/16
# export HTTP_PROXY=http://192.168.33.23:8080
# export HTTPS_PROXY=http://192.168.33.23:8080
# export NO_PROXY=192.168.0.0/16

2. Dockerインストール前の競合パッケージの削除

minikubeはノードをDockerコンテナやVirtualBoxの仮想マシンとして構築する。今回はDockerをドライバーとして利用することとし、まずは、Dockerをインストールする。

ただし、GUI環境をインストールしたAlmaLinuxの場合、以下の通りpodmanとcontainers-commonのパッケージが競合する旨のエラーでインストールに失敗する。

# dnf install docker-ce docker-ce-cli containerd.io -y
メタデータの期限切れの最終確認: 0:05:01 時間前の 2022年11月26日 12時46分04秒 に 実施しました。
エラー:
 問題 1: インストール済パッケージの問題 podman-2:4.0.2-6.module_el8.6.0+2878+e681bc44.x86_64
  - パッケージ podman-2:4.0.2-6.module_el8.6.0+2878+e681bc44.x86_64 には runc >= 1.0.0-57 が必要ですが、どのプロバイダーからもインストールできません
  - パッケージ podman-3:4.2.0-4.module_el8.7.0+3344+484dae7b.x86_64 には runc >= 1.0.0-57 が必要ですが、どのプロバイダーからもインストールできません

~(中略)~

 問題 2: インストール済パッケージの問題 containers-common-2:1-27.module_el8.6.0+2878+e681bc44.x86_64
  - パッケージ containers-common-2:1-27.module_el8.6.0+2878+e681bc44.x86_64 には runc が必要ですが、どのプロバイダーからもインストールできません
  - パッケージ containers-common-2:1-43.module_el8.7.0+3344+484dae7b.x86_64 には runc が必要ですが、どのプロバイダーからもインストールできません

~(中略)~

このような場合は、一度podmanとcontainers-commonのパッケージを削除したうえで、Dockerをインストールしよう。

# dnf remove podman containers-common

3. Dockerをインストール

Dockerのインストールは以下の通りコマンドを実行すればよい。

# dnf install yum-utils -y
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# dnf install docker-ce docker-ce-cli containerd.io -y

プロキシ環境の場合は、外部からコンテナのダウンロードができるよう、systemctlの起動設定に環境変数の設定をしておくこと。

# sed -ie '/\[Service\]/a Environment="http_proxy=http://192.168.33.23:8080" "https_proxy=http://192.168.33.23:8080" "no_proxy=192.168.0.0/16"' /usr/lib/systemd/system/docker.service

インストール完了後、Dockerのサービスを起動しておく。

# systemctl start docker
# systemctl enable docker

4. minikubeインストール

minikubeのインストールは、rpmをダウンロードしインストールするだけで完了する。

# curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-latest.x86_64.rpm
# rpm -Uvh minikube-latest.x86_64.rpm

5. minikube操作用ユーザの作成

minikubeのDockerドライバーはroot権限で操作できないため、操作用ユーザを作成する。参考情報として、もしroot権限でminikubeを起動すると、以下のようなメッセージが表示され、起動に失敗する。

X DRV_AS_ROOT が原因で終了します: 「docker」ドライバーは root 権限で使用すべきではありません。

今回はkubeuserというユーザを作成した。また、sudoが必要なコマンドがあるためwheelグループへの所属と、Dockerドライバーを操作するためにdockerグループへ所属させておく。

# useradd kubeuser
# usermod -aG wheel,docker kubeuser
# id kubeuser
uid=1000(kubeuser) gid=1000(kubeuser) groups=1000(kubeuser),10(wheel),974(docker)

6. minikubeを起動

以上で準備が整ったため、kubeuserにスイッチし、minikube startコマンドでminikubeを起動する。初回は、800MBほどのコンテナイメージのダウンロードが行われるため、時間を要するので気長に待とう。

# su - kubeuser

$ minikube start
* Almalinux 8.6 上の minikube v1.28.0
* docker ドライバーが自動的に選択されました
* root 権限を持つ Docker ドライバーを使用
* minikube クラスター中のコントロールプレーンの minikube ノードを起動しています
* ベースイメージを取得しています...
* ロード済み Kubernetes v1.25.3 をダウンロードしています...
    > preloaded-images-k8s-v18-v1...:  385.44 MiB / 385.44 MiB  100.00% 77.08 M
    > gcr.io/k8s-minikube/kicbase:  386.27 MiB / 386.27 MiB  100.00% 13.86 MiB
    > gcr.io/k8s-minikube/kicbase:  0 B [________________________] ?% ? p/s 24s
* docker container (CPUs=2, Memory=2200MB) を作成しています...
* ネットワークオプションが見つかりました:
  - HTTP_PROXY=http://192.168.33.23:8080
  - HTTPS_PROXY=http://192.168.33.23:8080
  - NO_PROXY=192.168.0.0/16
* Docker 20.10.20 で Kubernetes v1.25.3 を準備しています...
  - env HTTP_PROXY=http://192.168.33.23:8080
  - env HTTPS_PROXY=http://192.168.33.23:8080
  - env NO_PROXY=192.168.0.0/16
  - 証明書と鍵を作成しています...
  - コントロールプレーンを起動しています...
  - RBAC のルールを設定中です...
* Kubernetes コンポーネントを検証しています...
  - gcr.io/k8s-minikube/storage-provisioner:v5 イメージを使用しています
* 有効なアドオン: default-storageclass, storage-provisioner
* kubectl が見つかりません。kubectl が必要な場合、'minikube kubectl -- get pods -A' を試してください
* 終了しました!kubectl がデフォルトで「minikube」クラスターと「default」ネーム スペースを使用するよう設定されました

7. kubectlコマンドのエイリアスを設定

Kubernetes環境を操作するためのkubectlコマンドはminikubeには用意されておらず、minikube kubectl -- [コマンド]といったコマンドを実行する必要がある。

コマンドの簡略化と本来のKubernetes環境の操作に近づけることを目的として、エイリアスを設定しておく。

$ echo 'alias kubectl="minikube kubectl --"' >> ~/.bashrc
$ source ~/.bashrc

8. 起動状態の確認

minikube起動後のノードとPodの状態を確認しておこう。

ノードは通常1台のみ起動しているはずだ。詳細は省くが、minikubeをマルチノード構成としたい場合は、minikube start --nodes=3といった形でノード数を指定することで、複数ノードで起動させることができる。

$ kubectl get node -o=wide
NAME       STATUS   ROLES           AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION              CONTAINER-RUNTIME
minikube   Ready    control-plane   10m   v1.25.3   192.168.49.2   <none>        Ubuntu 20.04.5 LTS   4.18.0-372.9.1.el8.x86_64   docker://20.10.20

PodとしてはKubernetes環境管理に必要となる各種Podが起動する。ステータスがRunningになっていれば問題ない。

$ kubectl get pod -A
NAMESPACE     NAME                               READY   STATUS    RESTARTS       AGE
kube-system   coredns-565d847f94-t7f4s           1/1     Running   0              2m22s
kube-system   etcd-minikube                      1/1     Running   0              2m35s
kube-system   kube-apiserver-minikube            1/1     Running   0              2m35s
kube-system   kube-controller-manager-minikube   1/1     Running   0              2m35s
kube-system   kube-proxy-2jzrw                   1/1     Running   0              2m22s
kube-system   kube-scheduler-minikube            1/1     Running   0              2m35s
kube-system   storage-provisioner                1/1     Running   1 (112s ago)   2m34s

動作確認

Kubernetesの動作確認としてにテスト用のコンテナを用いてPodを作成し、サービスとして公開してみよう。

再掲となるが、動作確認時におけるminikubeの内部構成は以下の図のようになる。

1. Podとサービスの起動確認

以下コマンドでPodを作成する。

$ kubectl create deployment hello-minikube --image=kicbase/echo-server:1.0
deployment.apps/hello-minikube created

$ kubectl get pod -o=wide
NAME                              READY   STATUS    RESTARTS   AGE   IP           NODE       NOMINATED NODE   READINESS GATES
hello-minikube-7ddcbc9b8b-5g79b   1/1     Running   0          12s   172.17.0.3   minikube   <none>           <none>

作成したPodはそのままでは外部からアクセスすることができないため、Podと紐づけるサービスを作成する。なお、--type=NodePortを指定することで、ノードの持つIPアドレス(192.168.49.2)にてサービスを公開することができる。

$ kubectl expose deployment hello-minikube --type=NodePort --port=8080
service/hello-minikube exposed

$ kubectl get service -o=wide
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE    SELECTOR
hello-minikube   NodePort    10.107.255.240   <none>        8080:31931/TCP   7s     app=hello-minikube
kubernetes       ClusterIP   10.96.0.1        <none>        443/TCP          102s   <none>

公開したサービスにアクセスしてみよう。ホストOSのブラウザを開いて、直接URLを入力してもよいが、minikubeコマンドを使用することで、サービスのURLを入力した状態でデフォルトのブラウザを起動させることができる。

$ minikube service hello-minikube
|-----------|----------------|-------------|---------------------------|
| NAMESPACE |      NAME      | TARGET PORT |            URL            |
|-----------|----------------|-------------|---------------------------|
| default   | hello-minikube |          80 | http://192.168.49.2:31931 |
|-----------|----------------|-------------|---------------------------| * デフォルトブラウザーで default/hello-minikube サービスを開いています... http://192.168.49.2:31931

2. 外部からサービスにアクセスさせるためのポートフォワード設定

minikubeのサービスに対しては、通常ホストOSでなければアクセスすることができないが、もし外部からアクセスさせたい場合は、以下の通りポートフォワードすることで実現できる。

なお、ポートフォワードはフォアグラウンドで実行されるため、終了する際はCtrl + Cで終了させること。

$ kubectl port-forward service/hello-minikube --address 0.0.0.0 8080:8080
Forwarding from 0.0.0.0:8080 -> 8080
Handling connection for 8080
Handling connection for 8080
^C ←★Ctrl + Cでプロセス終了

この状態の場合は、以下の通り外部からホストOSのIPアドレス(今回は192.168.11.52)でサービスにアクセスすることができる。

ポートフォワードをバックグラウンド実行させる場合は、以下の通り実行する。

$ kubectl port-forward service/hello-minikube --address 0.0.0.0 7080:80 > /dev/null 2>&1 &
[1] 33173

$ fg
minikube kubectl -- port-forward service/hello-minikube --address 0.0.0.0 7080:80 > /dev/null 2>&1
^C ←★Ctrl + Cでプロセス終了

以上で、Linux OS上に「minikube」をインストールする手順は完了となる。

minikube環境をリセットする

最後にminikube環境をリセットする方法を紹介しておこう。環境の削除は、minikube deleteコマンドを実行するだけで完了する。

$ minikube delete
  docker の「minikube」を削除しています...
  コンテナー「minikube」を削除しています...
  /home/kubeuser/.minikube/machines/minikube を削除しています...
  クラスター「minikube」の全てのトレースを削除しました。

削除後に再度minikube startすることで、再度きれいな状態でminikubeのKubernetes環境を利用することができる。

参考

0 件のコメント:

コメントを投稿

人気の投稿