Kubernetes:ローカルフォルダをPod側のドキュメントルートにマッピングする事にハマったの巻
2021年11月19日Linux Tips, テクニカル, トピックス, ノウハウ
普段クラウド側の外部共有ディスクを使ってpodへマウントするためあまり問題になることもなかったが、Linux上でminikubeを使った簡単なプラクティスを作ろうとやってみたら思いっきりはまってしまった。3時間くらいどうしてだろう??? エラー出ていないのにマウントされずブラウザー上にForbbidenがでてしまう。
やろうとした事
2つのkubernetes用のマニフェストファイルを用意して、Rocky Linux上でPHP7.4のコンテンツを表示させるサーバを作ろうとしていた。1つのマニフェストファイルはpodの生成&Deployを生成するファイル。もう一つはサービスを生成するファイルを準備した。特にエラーが出ていないがなぜかマウント出来ていないからコンテンツが表示されずForbbidenの表示。
POD&DEPLOY生成(kube-pod-deploy.yaml)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
apiVersion: apps/v1 kind: Deployment metadata: name: rocky-linux spec: selector: matchLabels: app: rocky-linux replicas: 3 template: metadata: labels: app: rocky-linux spec: volumes: - name: hdocs hostPath: path: /data/www type: DirectoryOrCreate containers: - name: rocky-linux image: mhaluska/rockylinux-php ports: - containerPort: 80 volumeMounts: - name: hdocs mountPath: /var/www/html |
Service生成(kube-serv.yaml)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
apiVersion: v1 kind: Service metadata: name: rocky-linux spec: type: NodePort ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 30080 selector: app: rocky-linux |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ kubectl apply -f kube-pod-deploy.yaml $ kubectl get pods NAME READY STATUS RESTARTS AGE rocky-linux-69f9b6db9d-d5z97 1/1 Running 0 58m rocky-linux-69f9b6db9d-jn7b5 1/1 Running 0 58m rocky-linux-69f9b6db9d-r55vq 1/1 Running 0 58m $ kubectl apply -f kube-serv.yaml $ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 18h rocky-linux NodePort 10.102.104.239 <none> 80:30080/TCP 22m $ minikube service rocky-linux #ブラウザにproxyして表示できるようにするminikubeの機能 |
原因を調べて気がついた事
ここを読んで気がついた。そうかなるほど。
minikube 永続ボリュームハンドブック第一の気付きはホスト側のフォルダーは下記のフォルダー配下に作らないといけない。これはminikubeだけではなくkubernetesでも同様らしいね。
- /data
- /var/lib/minikube
- /var/lib/docker
- /var/lib/containerd
- /var/lib/buildkit
- /var/lib/containers
- /tmp/hostpath_pv
- /tmp/hostpath-provisioner
minikube is configured to persist files stored under the following directories, which are made in the Minikube VM (or on your localhost if running on bare metal). You may lose data from other directories on reboots.
落とし穴はここだった。「which are made in the Minikube VM」なるほど!minikubeの仮想マシン上がローカルホストってことだ。自分が今使っているベアメタル上のLinuxOSのことを指しているわけではない。
対応しました。
原因がわかってしまえば大した事はない。minikube仮想マシンへログインすればよいだけの事。ログインした先(minikube)がローカルホストなのでそこでホスト側のフォルダーとコンテンツを作ればOKだ。
1 2 3 4 5 6 7 8 9 |
$ minikube ssh docker@minikube:~$ sudo mkdir -p /data/www #すでに自動でできているかも! 不要の可能性あり docker@minikube:~$ sudo vi /data/www/index.php <?php echo "hello in the world."; 保存後にminikubeから抜ける docker@minikube:~$ exit $ kubectl service rocky-linux |
ブラウザーも問題なく表示できました
よく考えればkubernetesを使うってことは仮想空間のNODE上にクラスター作ってpodを配置するのでローカルがそもそもkubernetesそのものなんだよね。ずっ普段使っているLinuxホストだと思いこんでいた。3時間もかかりましたがいい気づきだった。
タグ: deployment, Docker, Kubernetes, minikube, pod, service, YAML, コンテナとディスクの共有