🎼
[Kubernetes] ConfigMap を使ってファイルを Pod へマウントする
色々と制約のある環境にて、「kubectl を叩く端末に置いてあるファイルを Pod へ配置したい」という要件があり。
PV を用意するのも微妙、hostPath も避けたいなぁと思って調べていたところ、ConfigMap で読ませれば良さそうということで、試してみました。
環境・準備
- Azure Kubernetes Service (v1.24.9)
- Windows 10
やってみた
ファイルの準備
下記のファイルを用意しておきます。
テキストファイル
example.txt
test1
test2
バイナリファイル
上記のテキストファイルを zip 圧縮したものを用意しました。
ConfigMap の作成
テキストファイル
カレントディレクトリにファイルを用意し、下記のコマンドを実行します。
kubectl create configmap configmap-text --from-file=example.txt --dry-run=client -oyaml > configmap-text.yaml
yaml ファイルが作成されるので、これをデプロイします。
kubectl apply -f configmap-text.yaml
下記のように、Kubernetes 側に ConfigMap として登録されていれば OK です。
$ kubectl describe configmap configmap-text
Name: configmap-text
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
example.txt:
----
test1\r
test2
BinaryData
====
Events: <none>
バイナリファイル
バイナリファイルも同様に、カレントディレクトリにファイルを用意し、下記のコマンドを実行します。
kubectl create configmap configmap-binary --from-file=example.zip --dry-run=client -oyaml > configmap-binary.yaml
yaml ファイルが作成されるので、これをデプロイします。
kubectl apply -f configmap-binary.yaml
下記のように、Kubernetes 側に ConfigMap として登録されていれば OK です。
$ kubectl describe configmap configmap-binary
Name: configmap-binary
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
BinaryData
====
example.zip: 167 bytes
Events: <none>
Deployment (yaml) の作成
作成した ConfigMap をマウントする yaml を作成します。Pod でも良いのですが、とりあえず Deployment で。
deployment-configmap-test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: configmap-test
spec:
replicas: 1
selector:
matchLabels:
app: configmap-test
template:
metadata:
labels:
app: configmap-test
spec:
containers:
- image: ubuntu
command:
- "sleep"
- "604800"
imagePullPolicy: IfNotPresent
name: configmap-test
volumeMounts:
- name: volume-configmap-text
mountPath: /tmp/example-text
- name: volume-configmap-binary
mountPath: /tmp/example-binary
volumes:
- name: volume-configmap-text
configMap:
name: configmap-text
- name: volume-configmap-binary
configMap:
name: configmap-binary
動作確認
Deployment の yaml ファイルをデプロイし…
kubectl apply -f .\deployment-configmap-test.yaml
Pod が無事起動したので…
> kubectl get pods
NAME READY STATUS RESTARTS AGE
configmap-test-c9465459d-45sxj 1/1 Running 0 4
Pod の中に入ってみます。
$ kubectl exec -it configmap-test-c9465459d-45sxj -- bash
# ls -al /tmp
total 16
drwxrwxrwt 1 root root 4096 Jul 28 15:01 .
drwxr-xr-x 1 root root 4096 Jul 28 15:01 ..
drwxrwxrwx 3 root root 4096 Jul 28 15:01 example-text
drwxrwxrwx 3 root root 4096 Jul 28 15:01 example-binary
無事、マウントできていることが確認できます。
中身のチェックも大丈夫そう。
# cat /tmp/example-text/example.txt
test1
test2
# apt-get update; apt-get install unzip
# unzip -l /tmp/example-binary/example.zip
Archive: /tmp/example-binary/example.zip
Length Date Time Name
--------- ---------- ----- ----
12 2023-07-28 23:31 example.txt
--------- -------
12 1 file
# unzip -d /tmp /tmp/example-binary/example.zip
Archive: /tmp/example-binary/example.zip
inflating: /tmp/example.txt
# cat /tmpexample.txt
test1
test2
まとめ
ということで、無事ホスト側へのファイル転送等は行わずに Pod へファイルを見せることができました。
基本的に AKS などはホスト側での作業せずに済ませたいので、こういう Tips はきちんと把握しておかないとですね…!
Discussion