elasticsearch-keystore 未被 kubernetes InitContainer 填充

elasticsearch-keystore 未被 kubernetes InitContainer 填充

我尝试使用 Azure 存储库插件将快照存储库添加到通过 helm 部署的在 Azure 上运行的 elasticsearch 实例(带有 K8s),该实例使用来自 helm.elastic.com 的图表。该图表已修补为使用myprivaterepo:elasticsearch-azure:7.9.2包含 Azure 存储库插件的自建映像,现在我只能将 Azure 凭据添加到 elasticsearch-keystore。

我向 elasticsearch statefulset 添加了包含 azure 凭据的机密和第二个 init 容器,以从机密中填充密钥库:

  - command:
    - sh
    - -c
    - |
      whoami
      echo $AZURE_ACCOUNT | bin/elasticsearch-keystore add --stdin --force azure.client.default.account
      echo $AZURE_SAS_TOKEN | bin/elasticsearch-keystore add --stdin --force azure.client.default.sas_token
      ls -l config
      bin/elasticsearch-keystore list
    env:
    - name: AZURE_ACCOUNT
      valueFrom:
        secretKeyRef:
          key: account
          name: snapshot-secret
    - name: AZURE_SAS_TOKEN
      valueFrom:
        secretKeyRef:
          key: sas
          name: snapshot-secret
    image: myprivateregistry/elasticsearch-azure-7.9.2
    imagePullPolicy: IfNotPresent
    name: update-keystore
    resources: {}
    securityContext:
      runAsGroup: 1000
      runAsNonRoot: true
      runAsUser: 1000
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File

稍微command扩展一下以检查权限问题。Init Container 成功运行,并产生以下输出。

$ kubectl logs elasticsearch-master-2 -c update-keystore

elasticsearch
total 32
-rw-rw---- 1 elasticsearch elasticsearch  428 Mar 24 09:01 elasticsearch.keystore
-rw-rw---- 1 elasticsearch root            53 Sep 23 00:49 elasticsearch.yml
-rw-rw---- 1 elasticsearch root          2301 Sep 23 00:43 jvm.options
drwxrwxr-x 2 elasticsearch root          4096 Sep 23 00:47 jvm.options.d
-rw-rw---- 1 elasticsearch root          7734 Sep 23 00:49 log4j2.properties
-rw-rw---- 1 elasticsearch root           473 Sep 23 00:47 role_mapping.yml
-rw-rw---- 1 elasticsearch root           197 Sep 23 00:47 roles.yml
-rw-rw---- 1 elasticsearch root             0 Sep 23 00:47 users
-rw-rw---- 1 elasticsearch root             0 Sep 23 00:47 users_roles
azure.client.default.account
azure.client.default.sas_token
keystore.seed

第一行是运行命令的用户,列表显示/usr/share/elasticsearch/config后面的输出,bin/elasticsearch-keystore list其中正确显示了添加的键。

我的问题是在正在运行的 elasticsearch 容器中,密钥库是空的

$ kubectl exec -ti elasticsearch-master-2 -- bin/elasticsearch-keystore list
keystore.seed

-master-0和 也是一样-master-1

我查看了几个博客和指南,它们都以同样的方式进行操作,但我找不到错误。有些博客使用 elasticsearch 控制器,但目前没有这个选项,因此不应该成为这里的障碍。

Elasticsearch 快照指南 elasticsearch 用户无法访问由 initContainer 创建的密钥库文件 #3332

我也将图表部署到运行 elasticsearch 7.11.2 的私有 K8s 集群中,结果相同。

答案1

解决了。​​我忽略了 InitContainer 和真实容器需要挂载一个卷来共享生成的机密。

通过添加卷并像这样正确地将其安装到容器中,密钥库在容器内具有预期的值。

spec:
  template:
    spec:
      volumes:
      - name: keystore
        emptyDir: {}

      containers:
        volumeMount:
        - name: keystore
          mountPath: /usr/share/elasticsearch/config/elasticsearch.keystore
          subPath: elasticsearch.keystore

      initContainer:
      - command:
        [... as above ...]
        cp -a /usr/share/elastichsearch/config/elasticsearch.keystore /tmp/keystore

        volumeMounts:
        - name: keystore
          mountPath: /tmp/keystore

相关内容