🐳

Kubernetesを1から勉強したくてminikubeをインストールしてみた

2024/01/17に公開

こんにちは。
ご機嫌いかがでしょうか。
"No human labor is no human error" が大好きな吉井 亮です。

Kubernetes をそろそろ勉強しようかなという気持ちになりました。
ECS をこよなく愛している・・・わけではないのですが、ECS はお手軽なので AWS 上でコンテナ動かすときは ECS を使っていました。

さて、どうしようかなと調べていたところ、minikube の存在を知りました。これは PC 上で Kubernetes クラスターを構築できる優れたツールです。
これを PC にインストールして、Kubernetes を勉強してみようと思います。

minikube のインストール

インストール前に前提条件を確認しておきます。minikube start から引用です。

  • 2 CPUs or more
  • 2GB of free memory
  • 20GB of free disk space
  • Internet connection
  • Container or virtual machine manager, such as: Docker, QEMU, Hyperkit, Hyper-V, KVM, Parallels, Podman, VirtualBox, or VMware Fusion/Workstation

minikube start に記載の通り進めていけば大丈夫です。難しくないです。私は Mac なので以下です。

$ brew install minikube

引数の start を付けて実行です。正常にスタートしたかどうかは status で確認できます。

$ minikube start

$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

コマンドだけではなく GUI で見たいよという方は minikube dashboard でダッシュボードを表示できます。
以下を実行するとブラウザが立ち上がり、ダッシュボードが表示されます。

$ minikube dashboard

kubectl のインストール

クラスターを管理するために kubectl をインストールします。
Install Tools に記載通りです。

$ brew install kubectl

bash-completion と alias も設定しておきます。

$ brew install bash-completion@2
$ kubectl completion bash >$(brew --prefix)/etc/bash_completion.d/kubectl

~/.bash_profile に以下を追記しシェルをリロードします。

brew_etc="$(brew --prefix)/etc" && [[ -r "${brew_etc}/profile.d/bash_completion.sh" ]] && . "${brew_etc}/profile.d/bash_completion.sh"
source <(kubectl completion bash)
alias k=kubectl
complete -o default -F __start_kubectl k

アプリケーションのデプロイ

クラスターの準備ができました。続いてアプリケーションをデプロイしてみます。
nginx だけをデプロイする簡単な例です。minikube の Get Started にはコマンドでデプロイする方法が記述されていますが、yaml 記法を勉強したかったので yaml で書きます。
nginx-deployment.yamlnginx-service.yaml を作成します。

nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx-container
        image: nginx
        imagePullPolicy: IfNotPresent
nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 80

k create でデプロイです。

$ k create -f . --save-config
deployment.apps/nginx created
service/nginx-service created

無事作成されたようです。k get で確認します。

$ k get pod,deploy
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-58b75f9cbf-592zm   1/1     Running   0          6m55s

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   1/1     1            1           6m55s

アプリケーションアクセス

デプロイした nginx にアクセスしてみます。
Kubernetes には様々な方法がありますが、今回は Ingress を使います。

nginx-ingress.yaml を作成します。

nginx-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
    - http:
        paths:
          - pathType: Prefix
            path: /
            backend:
              service:
                name: nginx-service
                port:
                  number: 8080

k create で Ingress を作成します。

$ k create -f nginx-ingress.yaml 
ingress.networking.k8s.io/example-ingress created

$ k get ingress
NAME              CLASS   HOSTS   ADDRESS   PORTS   AGE
example-ingress   nginx   *                 80      5s

Ingress は問題なさそうです。

minikube でトンネルを張ってあげると nginx にアクセスできるようになります。

$ minikube tunnel
✅  トンネルが無事開始しました

📌  注意: トンネルにアクセスするにはこのプロセスが存続しなければならないため、このターミナルはクローズしないでください ...

❗  example-ingress service/ingress は次の公開用特権ポートを要求します:  [80 443]
🔑  sudo permission will be asked for it.
🏃  example-ingress サービス用のトンネルを起動しています。
Password:  # PCのログインパスワードを入力

パスワード入力後に何もエラーが出なればトンネルが張られています。

別のターミナルをひらいて curl でアクセスすると Welcome nginx が表示されるはずです。

$ curl http://localhost/
〜〜省略〜〜
<h1>Welcome to nginx!</h1>
〜〜省略〜〜

トンネルは ctrl + c で止められます。

Docker イメージの利用

nginx は Docker Hub にあるイメージを利用しましたが、自分で作ったイメージを利用することもできます。
minikube 内で Docker イメージを利用する方法は複数存在します。
Pushing images

今回は Docker を使います。
ビルドするための Dockerfile を作成します。

FROM nginx

COPY index.html /usr/share/nginx/html/index.html

index.html も作成します。

index.html
<head>
<body>Hello host</body>
</head>

ビルドする前に確認しておく設定があります。前述した nginx-deployment.yamlimagePullPolicyIfNotPresent または Never になっていることを確認します。(デフォルトは Always です)

環境変数を minikube へ渡した後にビルドします。
docker-env を渡してあげるのがポイントです。書くまでもないですが、これが有効なのはコマンドを実行したターミナルのみです。また、minikube を再起動した場合は再度コマンドを実行する必要があります。

eval $(minikube docker-env)
docker build -t my-nginx .

ビルドした後は nginx-deployment.yamlimage 行を変更し、k apply でデプロイします。

nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx-container
        image: my-nginx   # ここを変更
        imagePullPolicy: IfNotPresent
$ k diff -f nginx-deployment.yaml
$ k apply -f nginx-deployment.yaml

永続ストレージの利用

永続ストレージが伝いたくなる場面がそのうちあると思い、永続ストレージの使い方も調べてみました。

minikube では hostPath による永続ストレージをサポートしています。
以下の例のように、hostPathpath を指定することで永続ストレージを利用できます。

apiVersion: v1
kind: Pod
metadata:
  name: test-local-path
spec:
  restartPolicy: OnFailure
  containers:
    - name: busybox
      image: busybox:stable
      command: ["sh", "-c", "echo 'local-path-provisioner' > /test/file1"]
      volumeMounts:
      - name: data
        mountPath: /test
  volumes:
    - name: data
      hostPath:
        path: /data/pv0001
        type: DirectoryOrCreate

どこの path を指定しても良いというわけではく、決まった場所に置く必要があります。
Persistent Volumes から引用します。

  • /data*
  • /var/lib/minikube
  • /var/lib/docker
  • /var/lib/containerd
  • /var/lib/buildkit
  • /var/lib/containers
  • /tmp/hostpath_pv*
  • /tmp/hostpath-provisioner*
  • mount point for another directory, stored under /var or on a separate data disk

これらのディレクトリは PC ではなく、minikube のノードにあるディレクトリです。
永続ストレージ内のファイルを読み書きするにはノードに ssh でログインする必要があります。

$ minikube ssh -n minikube  ls /data/pv0001
file1

まとめ

EKS や GKE を使って勉強を始めるのも良いですが、最初の一歩としての minikube はありだと思いました。
Kubernetes の基礎、yaml 記法、API の種類などを理解するには十分です。

参考

minikube
Kubernetes Documentation
kubectlチートシート

Discussion