wordpress安装

WordPress安装

静态页面博客, jekyII, hexo, hugo等比较多.

动态博客比较出名的, 就属wordpress了吧. 这次试下wordpress.

wordpress官方(公司), 也提供托管/pro版本. 这里使用helm chart安装开源版本.

helm安装wordpress

参考: https://artifacthub.io/packages/helm/bitnami/wordpress

新建命名空间

kubectl create ns wordpress

设为当前操作的默认命名空间

kubectl config set-context --current --namespace wordpress

下载对应的helm chart

helm pull oci://registry-1.docker.io/bitnamicharts/wordpress
helm pull oci://registry-1.docker.io/bitnamicharts/wordpress --untar

复制出values.yaml, 重命名为my-override-values.yaml, 仅保留修改了的内容

# cat my-override-values.yaml 
## @section WordPress Configuration parameters
## WordPress settings based on environment variables
## ref: https://github.com/bitnami/containers/tree/main/bitnami/wordpress#environment-variables
##

## @param wordpressUsername WordPress username
##
wordpressUsername: admin
## @param wordpressPassword WordPress user password
## Defaults to a random 10-character alphanumeric string if not set
##
wordpressPassword: "w784319947"
## @param existingSecret Name of existing secret containing WordPress credentials
## NOTE: Must contain key `wordpress-password`
## NOTE: When it's set, the `wordpressPassword` parameter is ignored
##
existingSecret: ""
## @param wordpressEmail WordPress user email
##
wordpressEmail: 784319947@qq.com
## @param wordpressFirstName WordPress user first name
##
wordpressFirstName: Jingmin
## @param wordpressLastName WordPress user last name
##
wordpressLastName: Wang
## @param wordpressBlogName Blog name
##
wordpressBlogName: Jingmin's Blog!
## @param wordpressTablePrefix Prefix to use for WordPress database tables
##
wordpressTablePrefix: wp_
## @param wordpressScheme Scheme to use to generate WordPress URLs
##
wordpressScheme: http

## Configure the ingress resource that allows you to access the WordPress installation
## ref: https://kubernetes.io/docs/concepts/services-networking/ingress/
##
ingress:
  ## @param ingress.enabled Enable ingress record generation for WordPress
  ##
  enabled: true
  ## @param ingress.hostname Default host for the ingress record. The hostname is templated and thus can contain other variable references.
  ##
  hostname: wordpress.ole12138.cn
  ## @param ingress.path Default path for the ingress record
  ## NOTE: You may need to set this to '/*' in order to use this with ALB ingress controllers
  ##
  path: /
  ## @param ingress.annotations Additional annotations for the Ingress resource. To enable certificate autogeneration, place here your cert-manager annotations.
  ## For a full list of possible ingress annotations, please see
  ## ref: https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/nginx-configuration/annotations.md
  ## Use this parameter to set the required annotations for cert-manager, see
  ## ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations
  ##
  ## e.g:
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/issuer: letsencrypt-prod
  
  annotations: {}
  ## @param ingress.tls Enable TLS configuration for the host defined at `ingress.hostname` parameter
  ## TLS certificates will be retrieved from a TLS secret with name: `{{- printf "%s-tls" .Values.ingress.hostname }}`
  ## You can:
  ##   - Use the `ingress.secrets` parameter to create this TLS secret
  ##   - Rely on cert-manager to create it by setting the corresponding annotations
  ##   - Rely on Helm to create self-signed certificates by setting `ingress.selfSigned=true`
  ##
  tls: true
  ## @param ingress.tlsWwwPrefix Adds www subdomain to default cert
  ## Creates tls host with ingress.hostname: {{ print "www.%s" .Values.ingress.hostname }}
  ## Is enabled if "nginx.ingress.kubernetes.io/from-to-www-redirect" is "true"
  tlsWwwPrefix: false
  ## @param ingress.selfSigned Create a TLS secret for this ingress record using self-signed certificates generated by Helm
  ##
  selfSigned: false
  ## @param ingress.secrets Custom TLS certificates as secrets
  ## NOTE: 'key' and 'certificate' are expected in PEM format
  ## NOTE: 'name' should line up with a 'secretName' set further up
  ## If it is not set and you're using cert-manager, this is unneeded, as it will create a secret for you with valid certificates
  ## If it is not set and you're NOT using cert-manager either, self-signed certificates will be created valid for 365 days
  ## It is also possible to create and manage the certificates outside of this helm chart
  ## Please see README.md for more information
  ## e.g:
  ## secrets:
  ##   - name: wordpress.local-tls
  ##     key: |-
  ##       -----BEGIN RSA PRIVATE KEY-----
  ##       ...
  ##       -----END RSA PRIVATE KEY-----
  ##     certificate: |-
  ##       -----BEGIN CERTIFICATE-----
  ##       ...
  ##       -----END CERTIFICATE-----
  ## 
  #secrets: []



## MariaDB chart configuration
## ref: https://github.com/bitnami/charts/blob/main/bitnami/mariadb/values.yaml
##
mariadb:
  ## @param mariadb.enabled Deploy a MariaDB server to satisfy the applications database requirements
  ## To use an external database set this to false and configure the `externalDatabase.*` parameters
  ##
  enabled: true
  ## @param mariadb.architecture MariaDB architecture. Allowed values: `standalone` or `replication`
  ##
  architecture: standalone
  ## MariaDB Authentication parameters
  ## @param mariadb.auth.rootPassword MariaDB root password
  ## @param mariadb.auth.database MariaDB custom database
  ## @param mariadb.auth.username MariaDB custom user name
  ## @param mariadb.auth.password MariaDB custom user password
  ## ref: https://github.com/bitnami/containers/tree/main/bitnami/mariadb#setting-the-root-password-on-first-run
  ##      https://github.com/bitnami/containers/blob/main/bitnami/mariadb/README.md#creating-a-database-on-first-run
  ##      https://github.com/bitnami/containers/blob/main/bitnami/mariadb/README.md#creating-a-database-user-on-first-run
  ##
  auth:
    rootPassword: "w784319947"
    database: bitnami_wordpress
    username: bn_wordpress
    password: "w784319947"

部署

helm install wordpress -f ./my-override-values.yaml oci://registry-1.docker.io/bitnamicharts/wordpress

部署结果

root@wangjm-B550M-K-1:~/k8s/helm/wordpress# helm install wordpress -f ./my-override-values.yaml oci://registry-1.docker.io/bitnamicharts/wordpress
Pulled: registry-1.docker.io/bitnamicharts/wordpress:22.2.6
Digest: sha256:bf89a8ce5eb270cc1c2907236aa2a46935285b323ecd8e86c5d5295d5bcf5fbd
NAME: wordpress
LAST DEPLOYED: Sat May 11 00:18:01 2024
NAMESPACE: wordpress
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: wordpress
CHART VERSION: 22.2.6
APP VERSION: 6.5.3

** Please be patient while the chart is being deployed **

Your WordPress site can be accessed through the following DNS name from within your cluster:

    wordpress.wordpress.svc.cluster.local (port 80)

To access your WordPress site from outside the cluster follow the steps below:

1. Get the WordPress URL and associate WordPress hostname to your cluster external IP:

   export CLUSTER_IP=$(minikube ip) # On Minikube. Use: `kubectl cluster-info` on others K8s clusters
   echo "WordPress URL: https://wordpress.ole12138.cn/"
   echo "$CLUSTER_IP  wordpress.ole12138.cn" | sudo tee -a /etc/hosts

2. Open a browser and access WordPress using the obtained URL.

3. Login with the following credentials below to see your blog:

  echo Username: admin
  echo Password: $(kubectl get secret --namespace wordpress wordpress -o jsonpath="{.data.wordpress-password}" | base64 -d)

WARNING: There are "resources" sections in the chart not set. Using "resourcesPreset" is not recommended for production. For production installations, please set the following values according to your workload needs:
  - resources
+info https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/

后来发现有问题,重新部署了一下.(前面的my-override-values.yaml已经是修复过后的版本.)

root@wangjm-B550M-K-1:~/k8s/helm/wordpress# helm upgrade wordpress -f ./my-override-values.yaml oci://registry-1.docker.io/bitnamicharts/wordpress
Pulled: registry-1.docker.io/bitnamicharts/wordpress:22.2.6
Digest: sha256:bf89a8ce5eb270cc1c2907236aa2a46935285b323ecd8e86c5d5295d5bcf5fbd
Release "wordpress" has been upgraded. Happy Helming!
NAME: wordpress
LAST DEPLOYED: Sat May 11 00:55:42 2024
NAMESPACE: wordpress
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
CHART NAME: wordpress
CHART VERSION: 22.2.6
APP VERSION: 6.5.3

** Please be patient while the chart is being deployed **

Your WordPress site can be accessed through the following DNS name from within your cluster:

    wordpress.wordpress.svc.cluster.local (port 80)

To access your WordPress site from outside the cluster follow the steps below:

1. Get the WordPress URL and associate WordPress hostname to your cluster external IP:

   export CLUSTER_IP=$(minikube ip) # On Minikube. Use: `kubectl cluster-info` on others K8s clusters
   echo "WordPress URL: https://wordpress.ole12138.cn/"
   echo "$CLUSTER_IP  wordpress.ole12138.cn" | sudo tee -a /etc/hosts

2. Open a browser and access WordPress using the obtained URL.

3. Login with the following credentials below to see your blog:

  echo Username: admin
  echo Password: $(kubectl get secret --namespace wordpress wordpress -o jsonpath="{.data.wordpress-password}" | base64 -d)

WARNING: There are "resources" sections in the chart not set. Using "resourcesPreset" is not recommended for production. For production installations, please set the following values according to your workload needs:
  - resources
+info https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/

首页和登陆地址

http://wordpress.ole12138.cn/
http://wordpress.ole12138.cn/admin

帐号密码,前面my-override-values.yaml中设置过.

admin
w784319947

配置域名解析,跳板机转发

需要去域名服务商那里, 配置wordpress.ole12138.cn的解析, 解析到公网的跳板机上.

然后利用nginx, 多次转发, 最终转发到内网k8s 192.168.1.100的ingress地址上.

部署cert-manager的issuer

cert-manager的证书没自动部署成功, 这是因为当前命名空间下没有放issuer

# cat staging-issuer.yaml 
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: letsencrypt-staging
spec:
  acme:
    # The ACME server URL
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    # Email address used for ACME registration
    email: 784319947@qq.com
    # Name of a secret used to store the ACME account private key
    privateKeySecretRef:
      name: letsencrypt-staging
    # Enable the HTTP-01 challenge provider
    solvers:
      - http01:
          ingress:
            ingressClassName: nginx
# cat production-issuer.yaml 
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    # The ACME server URL
    server: https://acme-v02.api.letsencrypt.org/directory
    # Email address used for ACME registration
    email: 784319947@qq.com
    # Name of a secret used to store the ACME account private key
    privateKeySecretRef:
      name: letsencrypt-prod
    # Enable the HTTP-01 challenge provider
    solvers:
      - http01:
          ingress:
            ingressClassName: nginx

在当前命名空间下应用

root@wangjm-B550M-K-1:~/k8s/helm/nextcloud/cert# kubectl apply -f ./staging-issuer.yaml 
issuer.cert-manager.io/letsencrypt-staging created
root@wangjm-B550M-K-1:~/k8s/helm/nextcloud/cert# kubectl apply -f production-issuer.yaml 
issuer.cert-manager.io/letsencrypt-prod created

发现没有certificaterequest资源, 还需要修改下ingress, 加下annotation和tls配置:

# kubectl edit ingress wordpress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/issuer: letsencrypt-prod
    meta.helm.sh/release-name: wordpress
    meta.helm.sh/release-namespace: wordpress
  creationTimestamp: "2024-05-10T16:18:01Z"
  generation: 4
  labels:
    app.kubernetes.io/instance: wordpress
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: wordpress
    app.kubernetes.io/version: 6.5.3
    helm.sh/chart: wordpress-22.2.6
  name: wordpress
  namespace: wordpress
  resourceVersion: "730180"
  uid: adf0bd00-3904-4506-8382-1bcc33bc58ab
spec:
  ingressClassName: nginx
  rules:
  - host: wordpress.ole12138.cn
    http:
      paths:
      - backend:
          service:
            name: wordpress
            port:
              name: http
        path: /
        pathType: ImplementationSpecific
  tls:
  - hosts:
    - wordpress.ole12138.cn
    secretName: wordpress.ole12138.cn-tls
status:
  loadBalancer:
    ingress:
    - ip: 192.168.1.100

注意这里annotations里的cert-manager.io/issuer: letsencrypt-prod, 以及 tls块的配置.

再看一下

root@wangjm-B550M-K-1:~/k8s/helm/nextcloud# kubectl get issuer,challenge,certificate,cr
NAME                                         READY   AGE
issuer.cert-manager.io/letsencrypt-prod      True    18m
issuer.cert-manager.io/letsencrypt-staging   True    19m

NAME                                        READY   SECRET          AGE
certificate.cert-manager.io/nextcloud-tls   False   nextcloud-tls   16m

NAME                                                 APPROVED   DENIED   READY   ISSUER             REQUESTOR                                         AGE
certificaterequest.cert-manager.io/nextcloud-tls-1   True                False   letsencrypt-prod   system:serviceaccount:cert-manager:cert-manager   16m

注: 前面的my-override-values.yaml 已经是改正过后的版本.

尝试重新部署

root@wangjm-B550M-K-1:~/k8s/helm/nextcloud# helm upgrade nextcloud -f ./my-override-values.yaml nextcloud/nextcloud
Release "nextcloud" has been upgraded. Happy Helming!
NAME: nextcloud
LAST DEPLOYED: Fri May 10 00:56:29 2024
NAMESPACE: nextcloud
STATUS: deployed
REVISION: 3
TEST SUITE: None
NOTES:
1. Get the nextcloud URL by running:

  export POD_NAME=$(kubectl get pods --namespace nextcloud -l "app.kubernetes.io/name=nextcloud" -o jsonpath="{.items[0].metadata.name}")
  echo http://127.0.0.1:8080/
  kubectl port-forward --namespace nextcloud $POD_NAME 8080:80

2. Get your nextcloud login credentials by running:

  echo User:     admin
  echo Password: $(kubectl get secret --namespace nextcloud nextcloud -o jsonpath="{.data.nextcloud-password}" | base64 --decode)

再看下

root@wangjm-B550M-K-1:~/k8s/helm/wordpress# kubectl get all,ingress,cr,cm,secret,challenge,certificate,issuer,certificaterequest
NAME                             READY   STATUS              RESTARTS   AGE
pod/cm-acme-http-solver-2jqc9    0/1     ContainerCreating   0          96s
pod/wordpress-559687cb9d-xlfqh   1/1     Running             0          81m
pod/wordpress-mariadb-0          1/1     Running             0          81m

NAME                                TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                      AGE
service/cm-acme-http-solver-887nt   NodePort       172.31.15.226   <none>          8089:31561/TCP               13m
service/wordpress                   LoadBalancer   172.31.3.107    192.168.1.101   80:30681/TCP,443:32243/TCP   81m
service/wordpress-mariadb           ClusterIP      172.31.5.128    <none>          3306/TCP                     81m

NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/wordpress   1/1     1            1           81m

NAME                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/wordpress-559687cb9d   1         1         1       81m

NAME                                 READY   AGE
statefulset.apps/wordpress-mariadb   1/1     81m

NAME                                                  CLASS   HOSTS                   ADDRESS         PORTS     AGE
ingress.networking.k8s.io/cm-acme-http-solver-rrkfn   nginx   wordpress.ole12138.cn   192.168.1.100   80        13m
ingress.networking.k8s.io/wordpress                   nginx   wordpress.ole12138.cn   192.168.1.100   80, 443   81m

NAME                                                             APPROVED   DENIED   READY   ISSUER             REQUESTOR                                         AGE
certificaterequest.cert-manager.io/wordpress.ole12138.cn-tls-1   True                False   letsencrypt-prod   system:serviceaccount:cert-manager:cert-manager   13m

NAME                          DATA   AGE
configmap/kube-root-ca.crt    1      128m
configmap/wordpress-mariadb   1      81m

NAME                                     TYPE                 DATA   AGE
secret/letsencrypt-prod                  Opaque               1      59m
secret/letsencrypt-staging               Opaque               1      59m
secret/sh.helm.release.v1.wordpress.v1   helm.sh/release.v1   1      81m
secret/sh.helm.release.v1.wordpress.v2   helm.sh/release.v1   1      44m
secret/sh.helm.release.v1.wordpress.v3   helm.sh/release.v1   1      28m
secret/sh.helm.release.v1.wordpress.v4   helm.sh/release.v1   1      22m
secret/wordpress                         Opaque               1      81m
secret/wordpress-mariadb                 Opaque               2      81m
secret/wordpress.ole12138.cn-tls-xgl7f   Opaque               1      13m

NAME                                                                               STATE     DOMAIN                  AGE
challenge.acme.cert-manager.io/wordpress.ole12138.cn-tls-1-2730308579-2862522432   pending   wordpress.ole12138.cn   13m

NAME                                                    READY   SECRET                      AGE
certificate.cert-manager.io/wordpress.ole12138.cn-tls   False   wordpress.ole12138.cn-tls   13m

NAME                                         READY   AGE
issuer.cert-manager.io/letsencrypt-prod      True    59m
issuer.cert-manager.io/letsencrypt-staging   True    59m

//todo 有个cm-acme-http-solver-2jqc9 的pod 没过

root@wangjm-B550M-K-1:~/k8s/helm/wordpress# kubectl describe pod cm-acme-http-solver-2jqc9
Name:             cm-acme-http-solver-2jqc9
Namespace:        wordpress
Priority:         0
Service Account:  default
Node:             jingmin-kube-master1/183.158.71.4
Start Time:       Sat, 11 May 2024 01:38:22 +0800
Labels:           acme.cert-manager.io/http-domain=1492715350
                  acme.cert-manager.io/http-token=1058148027
                  acme.cert-manager.io/http01-solver=true
Annotations:      cluster-autoscaler.kubernetes.io/safe-to-evict: true
                  sidecar.istio.io/inject: false
Status:           Pending
SeccompProfile:   RuntimeDefault
IP:               
IPs:              <none>
Controlled By:    Challenge/wordpress.ole12138.cn-tls-1-2730308579-2862522432
Containers:
  acmesolver:
    Container ID:  
    Image:         quay.io/jetstack/cert-manager-acmesolver:v1.14.5
    Image ID:      
    Port:          8089/TCP
    Host Port:     0/TCP
    Args:
      --listen-port=8089
      --domain=wordpress.ole12138.cn
      --token=_m92ZhJS0umf0l3aq3Sd5wIJbwnpVWWAnnpTR2fBZkU
      --key=_m92ZhJS0umf0l3aq3Sd5wIJbwnpVWWAnnpTR2fBZkU.wi23THd2axA7IaQG6s8A78249YuPCxT3Q7mrI4Wv46c
    State:          Waiting
      Reason:       ContainerCreating
    Ready:          False
    Restart Count:  0
    Limits:
      cpu:     100m
      memory:  64Mi
    Requests:
      cpu:        10m
      memory:     64Mi
    Environment:  <none>
    Mounts:       <none>
Conditions:
  Type                        Status
  PodReadyToStartContainers   False 
  Initialized                 True 
  Ready                       False 
  ContainersReady             False 
  PodScheduled                True 
Volumes:                      <none>
QoS Class:                    Burstable
Node-Selectors:               kubernetes.io/os=linux
Tolerations:                  node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                              node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type     Reason                  Age   From               Message
  ----     ------                  ----  ----               -------
  Normal   Scheduled               46s   default-scheduler  Successfully assigned wordpress/cm-acme-http-solver-2jqc9 to jingmin-kube-master1
  Warning  FailedCreatePodSandBox  46s   kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "ffce77fc3981e88221c69ff93ea7c2d9f904f03e3eeab878b3016ca2b8c42a81": plugin type="flannel" failed (add): failed to delegate add: failed to set bridge addr: "cni0" already has an IP address different from 172.30.3.1/24
  Warning  FailedCreatePodSandBox  35s   kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "03f67e90de854d68cc744b11a5f88a20a76cdb9e5e1f25391f55a40265ddc8f0": plugin type="flannel" failed (add): failed to delegate add: failed to set bridge addr: "cni0" already has an IP address different from 172.30.3.1/24
  Warning  FailedCreatePodSandBox  21s   kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "78ef118b7e76542148cf5649c4287e319e080e2573c8039f0bacb5bf521d4b1e": plugin type="flannel" failed (add): failed to delegate add: failed to set bridge addr: "cni0" already has an IP address different from 172.30.3.1/24
  Warning  FailedCreatePodSandBox  6s    kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "bfb975e899449c9dcbf5e902af402729e4dbfa651cfcb751603446ad8dd6d1c5": plugin type="flannel" failed (add): failed to delegate add: failed to set bridge addr: "cni0" already has an IP address different from 172.30.3.1/24

web登陆 nextcloud.ole12138.cn

有个初始化过程, 使用前面my-override-values.yaml中配置的应用帐号密码.

admin
w784319947

创建管理员帐号

wangjm
w784319947

数据库主机默认

nextcloud-mariadb

选择mysql/maridb ,也是因为在my-override-values.yaml中启用了mariadb.

查一下mariadb在k8s中部署的服务名也也行(应该是一致的)

root@wangjm-B550M-K-1:~/k8s/helm/nextcloud# kubectl get svc
NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
cm-acme-http-solver-m9cw7   NodePort    172.31.1.127    <none>        8089:30528/TCP   14m
nextcloud                   ClusterIP   172.31.14.96    <none>        8080/TCP         81m
nextcloud-mariadb           ClusterIP   172.31.2.169    <none>        3306/TCP         81m
nextcloud-metrics           ClusterIP   172.31.9.59     <none>        9205/TCP         81m
nextcloud-redis-headless    ClusterIP   None            <none>        6379/TCP         81m
nextcloud-redis-master      ClusterIP   172.31.8.72     <none>        6379/TCP         81m
nextcloud-redis-replicas    ClusterIP   172.31.12.248   <none>        6379/TCP         81m

使用rest api

参考: https://developer.wordpress.org/rest-api/

(实际上,也可以考虑使用 xml-rpc的api , 参考: https://developer.wordpress.org/apis/xml-rpc/)

给用户添加用户程序密码

需要进入管理界面, https://wordpress.ole12138.cn/wp-admin/, 然后用户->wangjm->用户程序密码

问题处理: /wp-json/wp/v2/ redirects to homepage

参考: https://github.com/WP-API/WP-API/issues/2623

需要进入管理界面, https://wordpress.ole12138.cn/wp-admin/, 然后 设置->固定链接, 改用其他格式(不要把post_id等内容放到请求参数里)

调rest api添加文章

curl --user wangjm:SIXvYDQyeNBkSIA9CN2mhnwK https://wordpress.ole12138.cn/wp-json/wp/v2/posts -X POST \
 --data-urlencode 'date=2024-06-02 00:12:13' \
 --data-urlencode 'status=publish' \
 --data-urlencode 'title=test123' \
 --data-urlencode 'content=asdfsdf safsa asdf' 
 --data-urlencode 'meta={"uuid": "259c0834-5f5b-41f9-b9fe-5b33d3128016"}'
 
curl https://wordpress.ole12138.cn/wp-json/wp/v2/posts \
--user wangjm:SIXvYDQyeNBkSIA9CN2mhnwK \
-X POST \
-H 'Content-Type: application/json' \
-d \
'{
  "date": "2024-06-02 00:56:12",
  "status": "publish",
  "title": "testabc",
  "content": "testxxxxxx",
  "meta": {
    "md-uuid": "c0e2cd4a-887e-41eb-8b3e-0113a69b7d1d"
  }
}'

正常返回json, 并给出了post的id等信息

然后GET方式查看文章(在浏览器里访问posts的文章接口即可)

https://wordpress.ole12138.cn/wp-json/wp/v2/posts
https://wordpress.ole12138.cn/wp-json/wp/v2/posts/21

但是发现 meta信息, 没有添加成功。

参考: How to Update Post Meta with WordPress REST API: https://rudrastyh.com/wordpress/add-meta-fields-with-rest-api.html

网络搜索发现, 需要调php接口(add_action) , 注册以下 custom field 字段, 才能添加对应的meta/custom filed 信息。

add action? register custom fields? use ACF plugin?

参考: https://www.nomar.dev/exposing-a-wordpress-function-via-rest-api/

参考: https://developer.wordpress.org/reference/functions/

wordpress hooks 参考: https://developer.wordpress.org/plugins/hooks/

How to Update Post Meta with WordPress REST API: https://rudrastyh.com/wordpress/add-meta-fields-with-rest-api.html

参考: https://www.advancedcustomfields.com/resources/

对于文章管理, 还需要添加一个文章的唯一id, 一般通过添加 meta信息, 或者 custom fields的方式实现。 但是我这里没找到。

所以找了个插件ACF (advanced custom fields)

需要进入管理界面, https://wordpress.ole12138.cn/wp-admin/, 然后 插件->安装新插件, 搜索ACF, 安装,启用。

image-20240602120406856

然后新建字段组

image-20240602120535126

给字段组起名, 添加字段。

我这里添加了common-blog-fields字段组, 向其中添加了个md-uuid字段。 注意,这里设置-》群组设置-》在REST API中显示 ,启用一下

image-20240602153912321

随便编辑一篇文章, 添加 md_uuid的值

image-20240602154056663

然后在浏览器里访问posts的文章接口

https://wordpress.ole12138.cn/wp-json/wp/v2/posts
https://wordpress.ole12138.cn/wp-json/wp/v2/posts/1

会看到有个acf字段, 下面有md-uuid字段

image-20240602154157832

注意到, md-uuid信息没有放到meta下,而是放到了acf字段下。

重新调rest api添加文章,试下

curl https://wordpress.ole12138.cn/wp-json/wp/v2/posts \
--user wangjm:SIXvYDQyeNBkSIA9CN2mhnwK \
-X POST \
-H 'Content-Type: application/json' \
-d \
'{
  "date": "2024-06-02 15:56:12",
  "status": "publish",
  "title": "testabc456",
  "content": "testxxxxxx",
  "acf": {
    "md-uuid": "38f85c60-e8bc-4d9e-ba2c-adb1d82deb56"
  }
}'

结果

[wangjm@jingminarchpc ~]$ curl https://wordpress.ole12138.cn/wp-json/wp/v2/posts \
--user wangjm:SIXvYDQyeNBkSIA9CN2mhnwK \
-X POST \
-H 'Content-Type: application/json' \
-d \
'{
  "date": "2024-06-02 15:06:12",
  "status": "publish",
  "title": "testabc456",
  "content": "testxxxxxx",
  "acf": {
    "md_uuid": "3f6a6222-6c6b-4472-9327-0b4267ab32ee"
  }
}'

{"id":49,"date":"2024-06-02T15:06:12","date_gmt":"2024-06-02T07:06:12","guid":{"rendered":"https:\/\/wordpress.ole12138.cn\/archives\/49","raw":"https:\/\/wordpress.ole12138.cn\/archives\/49"},"modified":"2024-06-02T15:06:12","modified_gmt":"2024-06-02T07:06:12","password":"","slug":"testabc456-2","status":"publish","type":"post","link":"https:\/\/wordpress.ole12138.cn\/archives\/49","title":{"raw":"testabc456","rendered":"testabc456"},"content":{"raw":"testxxxxxx","rendered":"<p>testxxxxxx<\/p>\n","protected":false,"block_version":0},"excerpt":{"raw":"","rendered":"<p>testxxxxxx<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"permalink_template":"https:\/\/wordpress.ole12138.cn\/archives\/49","generated_slug":"testabc456-2","acf":{"md_uuid":"3f6a6222-6c6b-4472-9327-0b4267ab32ee"},"_links":{"self":[{"href":"https:\/\/wordpress.ole12138.cn\/wp-json\/wp\/v2\/posts\/49"}],"collection":[{"href":"https:\/\/wordpress.ole12138.cn\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.ole12138.cn\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.ole12138.cn\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.ole12138.cn\/wp-json\/wp\/v2\/comments?post=49"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.ole12138.cn\/wp-json\/wp\/v2\/posts\/49\/revisions"}],"wp:attachment":[{"href":"https:\/\/wordpress.ole12138.cn\/wp-json\/wp\/v2\/media?parent=49"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.ole12138.cn\/wp-json\/wp\/v2\/categories?post=49"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.ole12138.cn\/wp-json\/wp\/v2\/tags?post=49"}],"wp:action-publish":[{"href":"https:\/\/wordpress.ole12138.cn\/wp-json\/wp\/v2\/posts\/49"}],"wp:action-unfiltered-html":[{"href":"https:\/\/wordpress.ole12138.cn\/wp-json\/wp\/v2\/posts\/49"}],"wp:action-sticky":[{"href":"https:\/\/wordpress.ole12138.cn\/wp-json\/wp\/v2\/posts\/49"}],"wp:action-assign-author":[{"href":"https:\/\/wordpress.ole12138.cn\/wp-json\/wp\/v2\/posts\/49"}],"wp:action-create-categories":[{"href":"https:\/\/wordpress.ole12138.cn\/wp-json\/wp\/v2\/posts\/49"}],"wp:action-assign-categories":[{"href":"https:\/\/wordpress.ole12138.cn\/wp-json\/wp\/v2\/posts\/49"}],"wp:action-create-tags":[{"href":"https:\/\/wordpress.ole12138.cn\/wp-json\/wp\/v2\/posts\/49"}],"wp:action-assign-tags":[{"href":"https:\/\/wordpress.ole12138.cn\/wp-json\/wp\/v2\/posts\/49"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}

生成了一条id为31的post, 细看一下 md-uuid信息也有。

GET 查看一下(浏览器里直接打开即可)

https://wordpress.ole12138.cn/wp-json/wp/v2/posts/49
image-20240602155818717

之后,我们就可以根据这个字段, 来过滤查询/更新对应的文章了。不必担心文章重新发布,文章重复的问题了。

给wordpress增加内存和cpu

上传了400+博客之后, 修改主页的时候, wordpress总是异常503.

k8s看了下pod状态, pod有重启过几次。继续检查pod详情, lastStatus中有说OOMKilled了。

root@wangjm-B550M-K-1:~/k8s/helm/wordpress# kubectl get pods wordpress-559687cb9d-z2hjf -o yaml
apiVersion: v1
kind: Pod
metadata:
#...
spec:
#...
status:
  conditions:
  #...
  containerStatuses:
  - containerID: cri-o://07b0029cc4668c0087e65ce1beddf13c18fb0bb3bdc011fc7033be8c84f131af
    image: docker.io/bitnami/wordpress:6.5.3-debian-12-r0
    imageID: docker.io/bitnami/wordpress@sha256:1b0ccae3b48e7b53940cac71ce610a2a6917e7e363a68f666a35f774c7482486
    lastState:
      terminated:
        containerID: cri-o://06d2e5136d884896e0aad3406d7e4dc9855688f858ad50def95387931356fbf8
        exitCode: 137
        finishedAt: "2024-06-05T10:03:12Z"
        reason: OOMKilled
        startedAt: "2024-06-05T09:51:52Z"
    name: wordpress
    ready: true
    restartCount: 11
    started: true
    state:
      running:
        startedAt: "2024-06-05T10:03:13Z"
#...

那就给wordpress加cpu和内存吧(limits了里面调高一点)。

在前面helm自定义配置my-override-values.yaml的基础上, 增加 resources下requests/limits的内容。

root@wangjm-B550M-K-1:~/k8s/helm/wordpress# helm upgrade wordpress -f ./my-override-values.yaml oci://registry-1.docker.io/bitnamicharts/wordpress
Pulled: registry-1.docker.io/bitnamicharts/wordpress:22.4.2
Digest: sha256:92311318caed8e9b0915ac9923d86814c7d46736d925dc2d4e8f0402a904d2ed
Release "wordpress" has been upgraded. Happy Helming!
NAME: wordpress
LAST DEPLOYED: Wed Jun  5 20:47:30 2024
NAMESPACE: wordpress
STATUS: deployed
REVISION: 7
TEST SUITE: None
NOTES:
CHART NAME: wordpress
CHART VERSION: 22.4.2
APP VERSION: 6.5.3

** Please be patient while the chart is being deployed **

Your WordPress site can be accessed through the following DNS name from within your cluster:

    wordpress.wordpress.svc.cluster.local (port 80)

To access your WordPress site from outside the cluster follow the steps below:

1. Get the WordPress URL and associate WordPress hostname to your cluster external IP:

   export CLUSTER_IP=$(minikube ip) # On Minikube. Use: `kubectl cluster-info` on others K8s clusters
   echo "WordPress URL: https://ole12138.cn/"
   echo "$CLUSTER_IP  ole12138.cn" | sudo tee -a /etc/hosts

2. Open a browser and access WordPress using the obtained URL.

3. Login with the following credentials below to see your blog:

  echo Username: admin
  echo Password: $(kubectl get secret --namespace wordpress wordpress -o jsonpath="{.data.wordpress-password}" | base64 -d)

除了调整resources限制外, 这里我还顺便调整了下域名, 由原来的二级域名wordpress.ole12138.cn

改成了顶级域名ole12138.cn

(注意, 需要删一下ingress, 否则ingress中tls域名/cert-manager自动获取证书会有问题。

然后更新helm部署

helm upgrade wordpress -f ./my-override-values.yaml oci://registry-1.docker.io/bitnamicharts/wordpress

输出

root@wangjm-B550M-K-1:~/k8s/helm/wordpress# helm upgrade wordpress -f ./my-override-values.yaml oci://registry-1.docker.io/bitnamicharts/wordpress
Pulled: registry-1.docker.io/bitnamicharts/wordpress:22.4.2
Digest: sha256:92311318caed8e9b0915ac9923d86814c7d46736d925dc2d4e8f0402a904d2ed
Release "wordpress" has been upgraded. Happy Helming!
NAME: wordpress
LAST DEPLOYED: Wed Jun  5 20:35:02 2024
NAMESPACE: wordpress
STATUS: deployed
REVISION: 6
TEST SUITE: None
NOTES:
CHART NAME: wordpress
CHART VERSION: 22.4.2
APP VERSION: 6.5.3

** Please be patient while the chart is being deployed **

Your WordPress site can be accessed through the following DNS name from within your cluster:

    wordpress.wordpress.svc.cluster.local (port 80)

To access your WordPress site from outside the cluster follow the steps below:

1. Get the WordPress URL and associate WordPress hostname to your cluster external IP:

   export CLUSTER_IP=$(minikube ip) # On Minikube. Use: `kubectl cluster-info` on others K8s clusters
   echo "WordPress URL: https://ole12138.cn/"
   echo "$CLUSTER_IP  ole12138.cn" | sudo tee -a /etc/hosts

2. Open a browser and access WordPress using the obtained URL.

3. Login with the following credentials below to see your blog:

  echo Username: admin
  echo Password: $(kubectl get secret --namespace wordpress wordpress -o jsonpath="{.data.wordpress-password}" | base64 -d)

增加插件

自动给文章添加目录插件 : Table of Contents Plus


评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注