🏡

Azure の仮想マシンに minikube を使って Kubernetes 構築

2022/10/07に公開

この文書は何か

手軽に自前の Kubernetes クラスタを構築したいけど、ローカル環境だとスペックの問題で辛い...

そこで、Azure の無料クレジット枠を使い仮想マシン(Ubuntu20)を立てて、その中に minikube でクラスタ構築を行ったのでその方法を紹介します。

実施手順

Azure で VM(Ubuntu)作成

  • まずは Azure にアカウントを作ります
  • リソースの作成 > 仮想マシンの作成
    • 基本設定
      • サブスクリプション: 無料枠を選択(例:Azure subscription 1)
      • インスタンスの詳細 ※ 一例です
        • 仮想マシン名: azure-kubernetes-zenn
        • 地域: (Asia Pacific)Japan East
        • 可用性オプション: インフラストラクチャ冗長は必要ありません
        • イメージ: Ubuntu Server 20.04 LTS - Gen2(利用可能な無料サービス)
      • サイズ: Standard_D2s_v3 - 2 vcpu 数、8 GiB のメモリ 現状これで足りてます
      • 管理者アカウント
        • 認証の種類: SSH 公開キー
        • ユーザー名: azureuser-zenn
        • キーの組名: azure-kubernetes-key.pem
      • 受信ポートを選択: HTTP(80), HTTPS(443), SSH(22)
    • ディスク: デフォルト設定にしました
    • ネットワーク:
      • VM が削除されたときにパブリック IP と NIC を削除する: チェックしました
    • 管理 / Monitoring / 詳細 / タグ : デフォルト設定にしました
  • 上記設定で、仮想マシンの 作成 ボタンを押下 => 仮想マシンがデプロイされます
    • SSH キーペアはローカルにダウンロードしておきます

Ubuntu の環境整備

作成した Ubuntu のパブリック IP に ssh して、CLI 上で minikube 環境を整備していきます。

  • Ubuntu へ SSH
    chmod 400 <秘密キーのパス>ssh -i <秘密キーのパス> <上で作成したユーザー名>@<パブリック IP>
    azureuser-zenn@azure-kubernetes-zenn:~$ # Ubuntu に SSH できました
    
  • Ubuntu に Docker Engine をインストールしていきます
    docker docks: https://docs.docker.com/engine/install/ubuntu/ に従いコマンド実行
    # Update the apt package index and install packages to allow apt to use a repository over HTTPS:sudo apt-get update
    ❯ sudo apt-get install ca-certificates curl gnupg lsb-release
    
    # Add Docker’s official GPG key:sudo mkdir -p /etc/apt/keyrings
    ❯ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    
    # Use the following command to set up the repository:echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    
    # Install Docker Enginesudo apt-get update
    ❯ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin # Y/n で Y を選択
    
    # List the versions available in your repo:apt-cache madison docker-ce
    
    #  Install a specific version using the version string from the second column, for example, 5:20.10.16~3-0~ubuntu-jammysudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
    
    # Verify that Docker Engine is installed correctlysudo service docker start
    
    ❯ docker version # docker が入りました。次に一般 User Group に追加していきます
    Client: Docker Engine - Community
     Version:           20.10.18
     API version:       1.41
     Go version:        go1.18.6
     Git commit:        b40c2f6
     Built:             Thu Sep  8 23:11:45 2022
     OS/Arch:           linux/amd64
     Context:           default
     Experimental:      true
    Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/version": dial unix /var/run/docker.sock: connect: permission denied
    
  • 一般ユーザーに docker を使えるように設定
    sudo groupadd dockersudo usermod -g docker azureuser-zenn
    ❯ sudo /bin/systemctl restart docker.service
    ❯ exit # 再度ログインする
    
    # 確認docker info # permission error が出なければ OK
    
  • minikube のインストールと起動
    curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
    ❯ chmod +x minikube
    ❯ sudo mkdir -p /usr/local/bin/
    ❯ sudo install minikube /usr/local/bin/
    ❯ minikube start
    ❯ minikube status # minikube が起動しました
    minikube
    type: Control Plane
    host: Running
    kubelet: Running
    apiserver: Running
    kubeconfig: Configured
    
  • kubectl インストールと実行
    curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"chmod +x ./kubectl
    ❯ sudo mv ./kubectl /usr/local/bin/kubectl
    
    ❯ kubectl get pod # kubernetes に接続できました
    No resources found in default namespace.
    

ローカルから Ubuntu の Kubernetes にアクセスする

こちら が参考になりました。

  • minikubeapi-server の認証情報を控える @ Ubuntu
    ❯ kubectl config view
    # certificate-authority -> ca-zenn.crt
    # client-certificate -> client-zenn.crt
    # client-key -> client-zenn.key
    # を確認し Local 環境に控える。server: https://192.168.49.2:8443 も使うのでメモ
    
  • minikube クラスタ情報の設定 @ ローカル環境
    ❯ kubectl config set-context \
    azure-kubernetes-zenn \
    --namespace=default \
    --cluster=minikube-zenn \
    --user=minikube-zenn
    
    ❯ kubectl config set-cluster minikube-zenn \
    --server=https://127.0.0.1:8443 \
    --certificate-authority=ca-zenn.crt
    
    ❯ 認証情報の設定
    $ kubectl config set-credentials \
    minikube-zenn \
    --client-certificate=client-zenn.crt \
    --client-key=client-zenn.key 
    
  • context のスイッチ @ ローカル環境
    ❯ kubectl config use-context azure-kubernetes-zenn
    
  • Ubuntu の Public IP を踏み台にして、minikube の kubeapi-server に接続
    ssh -L 8443:192.168.49.2:8443 -i <秘密キーのパス> <上で作成したユーザー名>@<パブリック ID>
    
    # 別端末で kubectl コマンドを実行するとアクセスできます
    ❯ kubectl get po
    No resources found in default namespace.
    

(豆知識)Ubuntu 起動時に minikube を実行する

Azure の VM は使用するときのみ起動した方がコストに優しいので、起動時に minikube を自動実行するように設定しておくと便利です。

# 以下のように記述cat vi /etc/rc.local
#!/bin/sh
sudo -u <ユーザー名> minikube start

# 権限変更sudo chmod u+x /etc/rc.local
❯ sudo chmod 755 /etc/rc.local

# 以下のように記述cat /etc/systemd/system/rc-local.service
[Unit]
Description=/etc/rc.local

[Service]
ExecStart=/etc/rc.local
Restart=no
Type=simple

[Install]
WantedBy=multi-user.target

# 自動起動設定sudo systemctl enable rc-local.service

これで、再起動しても起動後 minikube が自動で実行されます。
あとは、上にも書いた portforward をして、ローカルから Azure インスタンスの Kubernetes を操作することができます。

最後に

自分の Kubernetes クラスタを手軽に作りたいことがよくあると思いますが、その一案として Azure 仮想マシンに minikube で構築する方法 をご紹介しました。
それではみなさん、良い Kubernetes ライフを!

Discussion