Image

Kubernetes 部署Elasticsearch为WordPress提供文章搜索

释放双眼,带上耳机,听听看~!
在K8s上部署单节点Elasticsearch及Kibana的全流程。同时ES集成 IK 中文分词器,配合 ElasticPress 插件,实现WordPress网站搜索性能的极致优化

Elasticsearch 架构说明

Elasticsearch 是一个开源的分布式搜索和分析引擎,专为速度、扩展和 AI 应用而打造。作为一个检索平台,它可以实时存储结构化、非结构化和向量数据,提供快速的混合和向量搜索

为什么我的WordPress采用elasticsearch采用单机?

  • 默认情况下单机ES单副本足够支撑WordPress稳定运行,除非WordPress 站点文章数量超过100万篇,或者索引体积超过 30GB,否则搞 ES集群做分片Sharding纯属“负优化”
  • 对于 99% 的 WordPress 站点(包括大型资源站 B2 主题),单节点Single Node或者是单节点 + 副本Replication才是性能最高的选择。

Elastic 官方建议单个分片的大小在 10GB - 50GB 之间

k8s 部署ES

  • Kubernetes版本 v1.29.9
  • Elasticsearch版本 v7.17.13
  • 命名空间为wordpress
  • 推荐使用i4t.com/dockerproxy镜像加速

创建部署yaml

root@k8s-master-01:~/es/es-i4t# vim wordpress-es.yaml

部署单机ES以及Kibana

  • dsm7-nfs-client 这里我已经创建了storageclass
Image
Image

Kubernetes 1.29使用群辉dsm7 NFS存储创建StorageClass持久化

 

root@k8s-master-01:~/es/es-i4t# cat wordpress-es.yaml
---
# ===========================
# 1. Elasticsearch StatefulSet
# ===========================
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: elasticsearch
  namespace: wordpress
spec:
  serviceName: elasticsearch
  replicas: 1
  selector:
    matchLabels:
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      initContainers:
      - name: install-plugins
        image: dockerproxy.frps.fun/library/elasticsearch:7.17.13
        command:
        - sh
        - -c
        - |
          # 检查是否已安装 ik,没安装则下载
          if [ ! -d "plugins/analysis-ik" ]; then
            echo "Installing IK Analyzer..."
            # 必须加 --batch 自动确认权限
            ./bin/elasticsearch-plugin install --batch https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-7.17.13.zip
          fi

          # [关键修复] 同时修正 plugins 和 config 目录的权限
          # 这一步至关重要,否则主容器读不到字典
          chown -R elasticsearch:elasticsearch plugins
          chown -R elasticsearch:elasticsearch config
        volumeMounts:
        - name: plugins
          mountPath: /usr/share/elasticsearch/plugins
        # [新增] 挂载配置目录,保存字典文件
        - name: ik-config
          mountPath: /usr/share/elasticsearch/config/analysis-ik

      - name: fix-permissions
        image: busybox
        command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data

      containers:
      - name: elasticsearch
        image: dockerproxy.frps.fun/library/elasticsearch:7.17.13
        resources:
          limits:
            memory: 8Gi
          requests:
            memory: 4Gi
        env:
        - name: discovery.type
          value: single-node
        - name: ES_JAVA_OPTS
          value: "-Xms2g -Xmx4g"
        - name: xpack.security.enabled
          value: "true"
        - name: xpack.security.transport.ssl.enabled
          value: "true"
        ports:
        - containerPort: 9200
          name: http
        - containerPort: 9300
          name: transport
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
        - name: plugins
          mountPath: /usr/share/elasticsearch/plugins
        - name: ik-config
          mountPath: /usr/share/elasticsearch/config/analysis-ik

      volumes:
      - name: plugins
        emptyDir: {}
      - name: ik-config
        emptyDir: {}

  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "dsm7-nfs-client"
      resources:
        requests:
          storage: 50Gi
---
# ===========================
# 2. Elasticsearch Service
# ===========================
apiVersion: v1
kind: Service
metadata:
  name: elasticsearch
  namespace: wordpress
spec:
  type: NodePort
  selector:
    app: elasticsearch
  ports:
  - name: http
    port: 9200
    targetPort: 9200
    # nodePort: 30200 # 如果需要固定端口可以取消注释
---
# ===========================
# 3. Kibana Deployment
# ===========================
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kibana
  namespace: wordpress
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kibana
  template:
    metadata:
      labels:
        app: kibana
    spec:
      containers:
      - name: kibana
        image: dockerproxy.frps.fun/library/kibana:7.17.13
        resources:
          limits:
            memory: 4Gi
        env:
        - name: ELASTICSEARCH_HOSTS
          value: "http://elasticsearch:9200"
        - name: I18N_LOCALE
          value: "zh-CN"
        - name: ELASTICSEARCH_USERNAME
          value: "kibana_system"
        - name: ELASTICSEARCH_PASSWORD
          value: "***填写密码"
---
# ===========================
# 4. Kibana Service (NodePort)
# ===========================
apiVersion: v1
kind: Service
metadata:
  name: kibana-nodeport
  namespace: wordpress
spec:
  type: NodePort
  selector:
    app: kibana
  ports:
  - name: http
    port: 5601
    targetPort: 5601

Kubernetes 部署Elasticsearch为WordPress提供文章搜索

生成ES密码

# 1. 进入 ES 容器
kubectl exec -it elasticsearch-0 -n wordpress -- /bin/bash

# 2. 运行自动生成密码命令
./bin/elasticsearch-setup-passwords auto

# 3.记录以下2个账户密码
elastic: 超级管理员账号(你登录网页用这个)。
kibana_system: Kibana 系统内部连接 ES 用的账号(我们需要用这个修复报错)。

添加Kibana用户认证信息

      containers:
      - name: kibana
        #image: kibana:7.17.13  官方镜像
        image: dockerproxy.frps.fun/library/kibana:7.17.13
        resources:
          limits:
            memory: 4Gi
        env:
                         #### 以下为新增配置#####
        - name: ELASTICSEARCH_USERNAME
          value: "kibana_system"  # 固定用户名,不要改
        - name: ELASTICSEARCH_PASSWORD
          value: "这里填刚才生成的kibana_system的密码"

更新Kibana Pod

root@k8s-master-01:~/es/es-i4t# kubectl apply -f wordpress-es.yaml
statefulset.apps/elasticsearch configured
service/elasticsearch unchanged
deployment.apps/kibana configured
service/kibana-nodeport unchanged

使用kibana确认下服务状态

root@k8s-master-01:~/es/es-i4t# kubectl get svc -n wordpress|grep kibana
kibana-nodeport   NodePort    10.96.1.129   <none>        5601:30557/TCP   8m28s

访问k8s_node_ip:30557
Kubernetes 部署Elasticsearch为WordPress提供文章搜索

密码为刚刚生成的

  • elastic: 超级管理员账号(你登录网页用这个)。

Kubernetes 部署Elasticsearch为WordPress提供文章搜索

测试ik分词器

POST /_analyze?pretty
{
  "analyzer": "ik_max_word",
  "text": "WordPress性能优化"
}

Kubernetes 部署Elasticsearch为WordPress提供文章搜索

配置WP索引优化
我们通过配置模板只要是名字以wp_ 开头的索引,都强制用1分片0副本

PUT _index_template/wordpress_optimization
{
  "index_patterns": ["wp_*"], 
  "template": {
    "settings": {
      "number_of_shards": 1,
      "number_of_replicas": 0,
      "analysis": {
        "analyzer": {
          "default": {
            "type": "ik_max_word" 
          },
          "default_search": {
            "type": "ik_smart"
          }
        }
      }
    }
  },
  "priority": 1
}

Kubernetes 部署Elasticsearch为WordPress提供文章搜索

WordPress安装插件

配置插件参数,编辑配置文件wp-config.php

<?php

/** ElasticPress 连接配置 */
// [关键修改] 将账号:密码拼接到 URL 里,格式 http://user:pass@ip:port
// 这样可以绕过 HTTP Header 丢失的问题
define( 'EP_HOST', 'http://elastic:密码部分@192.168.1.1:port' );

define( 'EP_INDEX_PREFIX', 'wp_b2_prod_' );
define( 'EP_IS_NETWORK', false );

安装插件: 在 WP 后台 -> 插件 -> 安装插件 -> 搜索 "ElasticPress" -> 安装并启用。

Kubernetes 部署Elasticsearch为WordPress提供文章搜索

  • 如果连接异常可以重启PHP、清理Redis缓存

开启同步
Kubernetes 部署Elasticsearch为WordPress提供文章搜索

给TA打赏
共{{data.count}}人
人已打赏
Dell R730GrafanaKubernetesprometheus群晖

Kubernetes使用Prometheus监控爱快路由器iKuai_Exporter

2025-12-23 11:07:52

GrafanaKubernetesVictoriaMetrics

初试VictoriaLogs集群采集Kubernetes Pod日志

2026-1-18 11:35:58

0 条回复 A文章作者 M管理员
Image
Image
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索
NEW
特斯拉V100 智能助理×
本机器助手只回答博客已有内容!