02. MinikubeでNginxを動かす
K3sはホストマシン上でコンテナを動かすが、MinikubeはデフォルトではVM上でコンテナを動かす。
そのためMinikubeにおいてボリュームはMinikubeのVMにマウントする必要がある。
VMにマウントする
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | $ kompose convert --file docker-compose.yml -o ./nginx-manifests/ --volumes hostPath --with-kompose-annotation=false
$ minikube start
# Podを作成する前に、別ターミナルを開いて
# ホストのディレクトリをVMのディレクトリへマウントする
$ minikube mount /home/owner/kubernetes/html:/home/owner/kubernetes/html
# Clusterを宣言する
$ kubectl apply -f ./nginx-manifests/
# ポートフォワーディングする
$ kubectl port-forward service/nginx 8080:8080
$ minikube service nginx
$ kubectl delete -f ./nginx-manifests/
# 再開可能な状態で止める
$ minikube stop
# 完全消去する
$ minikube delete
|
ConfigMapにボリュームを保存する
ConfigMapを作成することでボリュームをクラスタ内に保存することもできる。
ConfigMapはminikube stopでも維持されるがminikube deleteで消える。
| nginx-manifests/nginx-deployment.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
28
29
30
31
32
33 | apiVersion: apps/v1
kind: Deployment
metadata:
labels:
io.kompose.service: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
io.kompose.service: nginx
strategy:
type: Recreate
template:
metadata:
labels:
io.kompose.service: nginx
spec:
containers:
- image: nginx:latest
name: nginx
ports:
- containerPort: 80
protocol: TCP
volumeMounts:
- mountPath: /usr/share/nginx/html
name: nginx-hostpath0
readOnly: true
restartPolicy: Always
volumes:
- configMap:
name: nginx-html
name: nginx-hostpath0
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | # クラスタ内にConfigMapを作成する
$ minikube kubectl -- create configmap nginx-html --from-file=/home/owner/kubernetes/html/
# Clusterを宣言する
$ kubectl apply -f ./nginx-manifests/
# ポートフォワーディングする
$ kubectl port-forward service/nginx 8080:8080
$ minikube service nginx
$ kubectl delete -f ./nginx-manifests/
# 再開可能な状態で止める
$ minikube stop
# 完全消去する
$ minikube delete
|
ホストのファイルとConfigMapのファイルは自動で同期されない。動悸するには以下のコマンドでConfigMapを再作成する必要がある。
| $ minikube kubectl -- delete configmap nginx-html
$ minikube kubectl -- create configmap nginx-html --from-file=/home/owner/kubernetes/html/
|
YAMLにリソースを埋め込む
ボリュームのマウントを行わず、YAMLに直接リソースを埋め込むこともできる。画像などのバイナリデータはBase64エンコードされる。
| $ kompose convert --file docker-compose.yml -o ./nginx-manifests/ --with-kompose-annotation=false
$ minikube start
$ kubectl apply -f ./nginx-manifests/
$ kubectl port-forward service/nginx 8080:8080
$ minikube delete
|
トラブルシューティング
kubectl applyを実行したときにDeploymentでエラーが出るときDeploymentを削除してやり直す。
| $ kubectl apply -f ./nginx-manifests/
service/nginx unchanged
The Deployment "nginx" is invalid: spec.selector: Invalid value: {"matchLabels":{"io.kompose.service":"nginx"}}: field is immutable
$ kubectl delete deployment nginx
|