Jaybanuan's Blog

どうせまた調べるハメになることをメモしていくブログ

Minikubeを構築して、ローカルのコンテナイメージをデプロイする

はじめに

コンテナの開発環境を構築する際のメモ。 Minikubeを構築して、ローカルのコンテナイメージをデプロイするまでの手順を残しておく。

環境

$ cat /etc/os-release | grep PRETTY_NAME
PRETTY_NAME="Ubuntu 20.04.4 LTS"

$ uname -srvm
Linux 5.13.0-39-generic #44~20.04.1-Ubuntu SMP Thu Mar 24 16:43:35 UTC 2022 x86_64

$ docker version
Client: Docker Engine - Community
 Version:           20.10.14
(略)
Server: Docker Engine - Community
 Engine:
  Version:          20.10.14
(略)

手順

(1) Minikubeのインストール

インストール方法はいくつかあるが、今回はDebian packageを利用する。 以下のコマンドを実行。

$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb
$ sudo dpkg -i minikube_latest_amd64.deb

詳細はこちら。

minikube.sigs.k8s.io

(2) kubectlのインストール

インストール方法はいくつかあるが、今回はsnapを利用する。 以下のコマンドを実行。

$ sudo snap install kubectl --classic

詳細はこちら。

kubernetes.io

(3) Minikubeの起動

以下のコマンドを実行。

$ minikube start
😄  Ubuntu 20.04 上の minikube v1.25.2
✨  docker ドライバーが自動的に選択されました。他の選択肢: kvm2, ssh, none
👍  minikube クラスター中のコントロールプレーンの minikube ノードを起動しています
🚜  ベースイメージを取得しています...
💾  Kubernetes v1.23.3 のダウンロードの準備をしています
    > gcr.io/k8s-minikube/kicbase: 379.06 MiB / 379.06 MiB  100.00% 169.59 KiB 
    > preloaded-images-k8s-v17-v1...: 505.68 MiB / 505.68 MiB  100.00% 220.72 K
🔥  docker container (CPUs=2, Memory=3900MB) を作成しています...
🐳  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 が「"minikube"」クラスタと「"default"」ネームスペースを使用するよう構成されました

(4) ダッシュボードで動作確認

以下のコマンドを実行。

$ minikube dashboard
🔌  ダッシュボードを有効化しています...
    ▪ kubernetesui/metrics-scraper:v1.0.7 イメージを使用しています
    ▪ kubernetesui/dashboard:v2.3.1 イメージを使用しています
🤔  ダッシュボードの状態を検証しています...
🚀  プロキシーを起動しています...
🤔  プロキシーの状態を検証しています...
🎉  デフォルトブラウザーで http://127.0.0.1:35159/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ を開いています...
既存のブラウザ セッションで開いています。

デフォルトのブラウザが自動的に起動されて、以下のようにダッシュボードが表示される。 まだ何もデプロイしていないので「表示するものがありません」とメッセージが出ている。

f:id:redj:20220406115027p:plain

(5) テスト用のWebサーバのイメージを作成

まず、作成するコンテナイメージをMinikubeが認識できるようにしなければならない。 その方法はいくつかあるが、今回は「docker-env command」という方法を採用する。 以下のコマンドを実行する。

$ eval $(minikube docker-env)

詳細はこちら。

minikube.sigs.k8s.io

次に、以下の内容でDockerfileを作成する。 Ningxのドキュメントルートに、hello, world! を表示するだけのHTMLを配置している。

FROM nginx:1.21
RUN echo "<!DOCTYPE html><html><body>hello, world!</body></html>" > /usr/share/nginx/html/index.html

そして、以下のコマンドを実行して、コンテナイメージを作成する。

$ docker build --tag test-web:1.0.0 .

(6) Minikubeにデプロイ

以下の内容でmanifest.ymlを作成する。

---
apiVersion: v1
kind: Service
metadata:
  name: test-web-service
spec:
  type: NodePort
  selector:
    app: test-web
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-web-deployment
  labels:
    app: test-web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test-web
  template:
    metadata:
      labels:
        app: test-web
    spec:
      containers:
      - name: test-web
        image: test-web:1.0.0
        ports:
        - containerPort: 80

このマニフェストファイルをMinikubeに適用する。

$ kubectl apply -f manifest.yml 

(7) 動作確認

以下のコマンドを実行して、アクセス用のURLを取得する。

$ minikube service test-web-service --url
http://192.168.49.2:32219

WebブラウザでこのURLにアクセスすると、以下のようにhello, world!が表示される。

f:id:redj:20220406115152p:plain

ダッシュボードを確認すると、デプロイメント、ポッド、レプリカセットが作成されていることを確認できる。

f:id:redj:20220406115249p:plain