Contents
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, 安装,启用。

然后新建字段组

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

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

然后在浏览器里访问posts的文章接口
https://wordpress.ole12138.cn/wp-json/wp/v2/posts
https://wordpress.ole12138.cn/wp-json/wp/v2/posts/1
会看到有个acf字段, 下面有md-uuid字段

注意到, 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

之后,我们就可以根据这个字段, 来过滤查询/更新对应的文章了。不必担心文章重新发布,文章重复的问题了。
给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
发表回复