好的,我会为你整理两份完整的 Markdown 文档。第一份是 **K8s 上部署 Elasticsearch 集群**(ECK + iSCSI 静态 PVC)的文档,第二份是 **从旧 Docker ES 迁移数据到新集群**(使用 elasticdump)的文档。 --- # 文档一:在 Kubernetes 上使用 ECK 部署 Elasticsearch 集群(含 iSCSI 持久化存储) ## 1. 环境 - Kubernetes 集群 - TrueNAS,已创建三个 iSCSI LUN 并映射到 K8s 节点 - 自定义 Elasticsearch 镜像(包含所需插件IK),推送到私有仓库 ## 2. 存储准备(iSCSI 静态 PV) ### 2.1 在 TrueNAS 上配置 iSCSI 创建三个 Zvol,每个对应一个 ES 节点: - `es-node-1` - `es-node-2` - `es-node-3` 为每个 Zvol 创建 iSCSI Target,并获取 IQN(例如 `iqn.2005-10.org.freenas.ctl:es-node-1`) ### 2.2 在所有 K8s 节点上安装 iSCSI initiator ```bash # CentOS9 sudo dnf install -y iscsi-initiator-utils sudo systemctl enable --now iscsid ``` ### 2.3 创建 PV 和 PVC **PV 示例**(`pv-es-node-1.yaml`): ```yaml apiVersion: v1 kind: PersistentVolume metadata: name: es-node-1-pv spec: capacity: storage: 150Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain iscsi: targetPortal: 192.168.1.14:3260 iqn: iqn.2005-10.org.freenas.ctl:es-node-1 lun: 0 fsType: ext4 readOnly: false ``` 同样创建 `es-node-2-pv` 和 `es-node-3-pv`。 **PVC 示例**(`eck-pvcs.yaml`): ```yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: elasticsearch-data-es-k8s-es-default-0 namespace: es spec: accessModes: [ "ReadWriteOnce" ] volumeName: es-node-1-pv resources: requests: storage: 150Gi --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: elasticsearch-data-es-k8s-es-default-1 namespace: es spec: accessModes: [ "ReadWriteOnce" ] volumeName: es-node-2-pv resources: requests: storage: 150Gi --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: elasticsearch-data-es-k8s-es-default-2 namespace: es spec: accessModes: [ "ReadWriteOnce" ] volumeName: es-node-3-pv resources: requests: storage: 150Gi ``` 应用: ```bash kubectl create namespace es kubectl apply -f pv-es-node-1.yaml -f pv-es-node-2.yaml -f pv-es-node-3.yaml kubectl apply -f eck-pvcs.yaml ``` ## 3. 安装 ECK Operator ```bash kubectl create -f https://download.elastic.co/downloads/eck/2.13.0/crds.yaml kubectl apply -f https://download.elastic.co/downloads/eck/2.13.0/operator.yaml kubectl get pods -n elastic-system ``` ## 4. 部署 Elasticsearch 集群 创建 `elasticsearch.yaml`: ```yaml apiVersion: elasticsearch.k8s.elastic.co/v1 kind: Elasticsearch metadata: name: es-k8s namespace: es spec: version: 8.16.6 image: harbor.boyiqd.cn/elastic/elasticsearch-ik:8.16.6 http: tls: selfSignedCertificate: disabled: false service: spec: type: NodePort ports: - name: https port: 9200 targetPort: 9200 nodePort: 30200 nodeSets: - name: default count: 3 config: node.store.allow_mmap: false # 仅当需要 Reindex 跨集群时配置白名单,此处可不配 podTemplate: spec: securityContext: runAsUser: 1000 runAsGroup: 0 fsGroup: 0 runAsNonRoot: true volumes: - name: host-time hostPath: path: /etc/localtime type: '' containers: - name: elasticsearch securityContext: runAsUser: 1000 runAsNonRoot: true env: - name: ES_JAVA_OPTS value: "-Xms8g -Xmx8g" - name: ELASTIC_PASSWORD valueFrom: secretKeyRef: name: es-elastic-user key: elastic resources: requests: memory: "8Gi" cpu: "4" limits: memory: "14Gi" cpu: "4" volumeMounts: - name: host-time mountPath: /etc/localtime readOnly: true volumeClaimTemplates: - metadata: name: elasticsearch-data spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 150Gi ``` **说明**: - `image` 指向自己构建的包含 IK 插件的镜像。 - `runAsUser: 1000` 确保 ES 进程用户权限。 - 挂载宿主机时区文件 `/etc/localtime` 使容器内使用正确时区。 - `volumeClaimTemplates` 名称必须为 `elasticsearch-data`,ECK 会自动创建 PVC `elasticsearch-data-es-k8s-es-default-0` 等。我们已预先创建同名 PVC 并绑定到 iSCSI PV,ECK 会直接使用它们。 ## 5. 创建访问密码 Secret(可选) ECK 会自动生成一个名为 `es-k8s-es-elastic-user` 的 Secret,密码随机。如果你想固定密码,可预先创建: ```bash kubectl create secret generic es-elastic-user -n es --from-literal=elastic=your_password ``` ## 6. 部署集群 ```bash kubectl apply -f elasticsearch.yaml kubectl get pods -n es -w ``` 等待所有 Pod 状态为 `Running`,`READY 1/1`。 ## 7. 验证集群 ```bash # 获取密码(如果使用自动生成的) PASSWORD=$(kubectl get secret es-k8s-es-elastic-user -n es -o go-template='{{.data.elastic | base64decode}}') # 端口转发测试 kubectl port-forward -n es service/es-k8s-es-http 9200:9200 & curl -k -u elastic:$PASSWORD "https://localhost:9200/_cluster/health?pretty" ``` 预期输出 `"status" : "green"`。 ---