コンテナのオーケストレーションツールのデファクトスタンダードとなっている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 件のコメント:
コメントを投稿