我尝试使用 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