毎日ブログを書くことでなんとなくアウトプットをしているような気がするこの頃です。なんか、とりあえずモチベーションアップのためにブログ作成続けています!
今回はKubernetes (minikube)でvolume Mount とreplica set 試してみました!
環境
- vagrant
- Alma Linux 8
- minikube
です!
検証してみよう!の前に
まず、検証する前に少し説明だけ加えておきます。今回やる内容は、volume Mount を試すのとReplica set を試すことです。gemini に聞いてみます!
Volume Mount とは??
Volume Mountとは、Pod内のコンテナがVolumeにアクセスするための設定です。Podの定義の中で、どのVolumeをコンテナ内のどのパスにマウントするかを指定します。
generated by gemini
???ですね。まあ、コンテナの中の特定のディレクトリとホスト側の特定のディレクトリを共有することができるように設定するみたいなことですね。ホスト側にsample.txt を置いたら、コンテナの中でも同じものが閲覧することができます。
じゃあ、replica set も聞いてみます。
Replica Set ???とは?
Replica Set は、指定された数の Pod のレプリカ(複製)を常に実行し続けることを保証するための Kubernetes のコントローラーです。もし何らかの原因で Pod がダウンしたり削除されたりした場合、Replica Set は自動的に新しい Pod を作成し、常に指定された数の Pod が稼働している状態を維持します。
generated by gemini
これは直観的になんとなくわかりますね。まあ、auto scaling みたいな感じです。3 台ずっと起動しといてほしいなーーって定義したら、ずっとその台数にしてくれるみたいな感じです。削除されても、3 台に自動的に戻ります。
なんとなく、内容も分かったところで、やっていきましょう!!!
まずは、Volume Mount です。
Volume Mount の検証
manifest ファイルを記載すると、こんな感じになります!
apiVersion: v1
kind: Pod
metadata:
name: test
spec:
containers:
- name: nginx
image: nginx:1.17.2-alpine
volumeMounts:
- name: storage
mountPath: /home/nginx
volumes:
- name: storage
hostPath:
path: /data/storage
type: DirectoryOrCreate
spec の中に volumeMounts と hostPath っていうのがそれぞれ項目としてあります。名前が結構わかりやすいので、どっちがどっちか直ぐにわかるかもですが、
- hostPath = host 側のdisk
- volumeMounts = コンテナの中のdisk
です。これでapply してみて、問題なく起動していれば大丈夫です!!なんかのエラーが発生して、mount ができないとかがあれば、pod が起動しないことがありますので、kubectl logs やdescribe で詳細なエラーを見てみてください!
Replica set の検証
まずは、manifest ファイルです。
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replicatest
labels:
app: replicatest
spec:
replicas: 3
selector:
matchLabels:
app: replicatest
template:
metadata:
labels:
app: replicatest
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
ReplicaSet は少しばかり複雑です。
まずは、apiVersion などが違います。
apiVersion: apps/v1
kind: ReplicaSet
apiVersion は、単なるv1 ではなくて、apps/v1 とする必要があります。これは定義方法なので、カテゴリーみたいな感じだと理解するといいかもです。kind にはReplicaSet と定義する必要があります。pod とは書かないように注意です。
次に、ここですね!
spec:
replicas: 3
selector:
matchLabels:
app: replicatest
replicas は、何台が持続的に起動状態になるようにしますか?というのを定義する箇所です。そして、selector というのが、下に書くtemplate と連動していて、matchLabels と一緒のものが、pod として起動するようになっています。matchLabels の値と、template のLabel の値が一致しなかったら、pod は起動しないです。
そして、最後にここですね。
template:
metadata:
labels:
app: replicatest
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
template は、上で少し述べましたが、pod の中身を定義したものですね。どんなpod がReplica として起動してくるかを決める記述になります。今回の場合は、nginx の1.14.2 がのimage が起動するようになっています。
なので、起動して、3台起動していたら、成功です!!!replicas の数字を変えてみて、applyすると台数も変わるので、試してみると面白いかもしれません。
kubectl get pods
NAME READY STATUS RESTARTS AGE
replicatest-75bx9 1/1 Running 0 8s
replicatest-dz4m6 1/1 Running 0 8s
replicatest-qssr9 1/1 Running 0 8s
起動方法はいつもと一緒です。
# start
kubectl apply -f <manifest_name>.yml
# delete
kubectl delete -f <manifest_name>.yml
掃除するのは忘れずにしてください。まあ、vagrant の場合は無料ですが。
まとめ
Docker でよく使うようなVolume mount と、あまり使わない auto scaling みたいな、ReplicaSet の立て方を紹介しました。このブログが足掛かりになると嬉しいです!!
troubleshooting 編
Volume で結構詰まりました。
apiVersion: v1
kind: Pod
metadata:
name: test
spec:
containers:
- name: nginx
image: nginx:1.17.2-alpine
volumeMounts:
- name: storage
mountPath: /home/nginx
volumes:
- name: storage
hostPath:
path: ./data/storage
type: DirectoryOrCreate
manifest ファイルは上で書いていたのですが、このエラーが発生してずっと小一時間悩みました。。どうも、対応してるhostPath っていうのがあるらしくて、それが原因だったようでした。なんだ、何でもいいわけでもないみたいなので、設計する時は注意ですね。。
NAME READY STATUS RESTARTS AGE
test 0/1 ContainerCreating 0 118s
Normal Scheduled 12s default-scheduler Successfully assigned default/test to minikube
Warning FailedMount 4s (x5 over 12s) kubelet MountVolume.SetUp failed for volume "storage" : hostPath type check failed: /data/storage is not a directory
参照サイトです!
コメント