web-dev-qa-db-ja.com

Kubernetes config map symlinks(.. data /):それらを回避する方法はありますか?

いくつかのテキストファイルを含む構成マップを作成してマウントすると、コンテナーはそれらのファイルを../data/myfile.txtへのシンボリックリンクとして表示することに気付きました。

たとえば、構成マップの名前がtc-configsで、stripe1.xmlとstripe2.xmlという名前の2つのxmlファイルが含まれている場合、この構成マップをコンテナーの/ configsにマウントすると、コンテナーに次のようになります。

bash-4.4# ls -al /configs/
total 12
drwxrwxrwx    3 root     root          4096 Jun  4 14:47 .
drwxr-xr-x    1 root     root          4096 Jun  4 14:47 ..
drwxr-xr-x    2 root     root          4096 Jun  4 14:47 ..2018_06_04_14_47_03.291041453
lrwxrwxrwx    1 root     root            31 Jun  4 14:47 ..data -> ..2018_06_04_14_47_03.291041453
lrwxrwxrwx    1 root     root            18 Jun  4 14:47 stripe1.xml -> ..data/stripe1.xml
lrwxrwxrwx    1 root     root            18 Jun  4 14:47 stripe2.xml -> ..data/stripe2.xml

Kubernetesにはこれらのシンボリックリンクと../dataおよび..timestamp /フォルダーが必要だと思いますが、予期しないファイルやフォルダーが表示された場合に起動に失敗する可能性のあるアプリケーションをいくつか知っています。

これらすべてのシンボリックリンクを生成せず、ファイルを直接マウントしないようにKubernetesに指示する方法はありますか?

11
Anthony Dahanne

この解決策で十分だと思います。mountPathで正確なファイルパスを指定すると、..data and ..2018_06_04_19_31_41.860238952へのシンボリックリンクが削除されます。

したがって、そのようなマニフェストを適用すると:

apiVersion: v1
kind: Pod
metadata:
  name: my-lamp-site
spec:
    containers:
    - name: php
      image: php:7.0-Apache
      volumeMounts:
      - mountPath: /var/www/html/users.xml
        name: site-data
        subPath: users.xml
    volumes:
    - name: site-data
      configMap:
        name: users

---

apiVersion: v1
kind: ConfigMap
metadata:
  name: users
data:
  users.xml: |
      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <users>
      </users>

どうやら、私は subpath を明示的に使用しており、それらはConfigMapsの「自動更新マジック」の一部ではないため、これ以上シンボリックリンクは表示されません。

$ kubectl exec  my-lamp-site -c php -- ls -al /var/www/html
total 12
drwxr-xr-x 1 www-data www-data 4096 Jun  4 19:18 .
drwxr-xr-x 1 root     root     4096 Jun  4 17:58 ..
-rw-r--r-- 1 root     root       73 Jun  4 19:18 users.xml

subPathを忘れないように注意してください。そうしないと、users.xmlがディレクトリになります。

私の最初のマニフェストに戻る:

spec:
    containers:
    - name: php
      image: php:7.0-Apache
      volumeMounts:
      - mountPath: /var/www/html
        name: site-data
    volumes:
    - name: site-data
      configMap:
        name: users

私はそれらのシンボリックリンクが戻ってくるのを見るでしょう:

$ kubectl exec  my-lamp-site -c php -- ls -al /var/www/html
total 12
drwxrwxrwx 3 root root 4096 Jun  4 19:31 .
drwxr-xr-x 3 root root 4096 Jun  4 17:58 ..
drwxr-xr-x 2 root root 4096 Jun  4 19:31 ..2018_06_04_19_31_41.860238952
lrwxrwxrwx 1 root root   31 Jun  4 19:31 ..data -> ..2018_06_04_19_31_41.860238952
lrwxrwxrwx 1 root root   16 Jun  4 19:31 users.xml -> ..data/users.xml

psycotica on K8s Canada slack で私を正しい軌道に乗せてくれてありがとう subpath (彼らは configmapドキュメントですぐに言及

8
Anthony Dahanne

ネイティブの動作だと思いますが、Kubernetesにこれらのシンボリックリンクを生成しないように指示できるかどうかはわかりません。

これらのファイルとリンクがあることが問題である場合、私が考えることができる回避策は、コンテナーを初期化するときに、構成マップを1つのフォルダーにマウントし、ファイルを別のフォルダーにコピーすることです。

  initContainers:
    - name: copy-config
      image: busybox
      command: ['sh', '-c', 'cp /configmap/* /configs']
      volumeMounts:
        - name: configmap
          mountPath: /configmap
        - name: config
          mountPath: /configs

ただし、2つのボリュームを宣言する必要があります。1つはconfigMap(configmap)用で、もう1つは最終ディレクトリ(config)用です。

  volumes:
    - name: config
      emptyDir: {}
    - name: configmap
      configMap:
        name: myconfigmap

必要に応じて、構成ボリュームのボリュームのタイプを変更してください。

0
iomv