コンテンツにスキップ

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を再作成する必要がある。

1
2
$ minikube kubectl -- delete configmap nginx-html
$ minikube kubectl -- create configmap nginx-html --from-file=/home/owner/kubernetes/html/

YAMLにリソースを埋め込む

ボリュームのマウントを行わず、YAMLに直接リソースを埋め込むこともできる。画像などのバイナリデータはBase64エンコードされる。

1
2
3
4
5
6
7
8
9
$ 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を削除してやり直す。

1
2
3
4
5
$ 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