本文主要是利用Kubernetes 集群搭建出一个 WordPress 网站,用了三个镜像:WordPress、MariaDB、Nginx。
下面是其简单的架构图,用于直观的展示这个系统的内部逻辑关系:
简单来说,就是要通过本地地址
http://127.0.0.1
直接访问到WordPress网站。
WordPress 网站搭建步骤
实验环境
- 适用于 Linux 的 Windows 子系统 (WSL)
- docker
- K8s
第一步:编排MariaDB对象
编写
maria-pod.yaml
文件,主要会生成一个ConfigMap对象和一个pod对象。
maria-cm
主要有四个环境变量,比如数据库名、用户名、密码等。在pod对象中,将
maria-cm
中的配置信息注入pod,让MariaDB运行时从环境变量中读取这些信息。
apiVersion: v1
kind: ConfigMap
metadata:
name: maria-cm
data:
DATABASE: 'db'
USER: 'wp'
PASSWORD: '123'
ROOT_PASSWORD: '123'
---
apiVersion: v1
kind: Pod
metadata:
name: maria-pod
labels:
app: wordpress
role: database
spec:
containers:
- image: mariadb:10
name: maria
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
envFrom:
- prefix: 'MARIADB_'
configMapRef:
name: maria-cm
第二步:编排 WordPress 对象
编写
wp-pod.yaml
文件。和第一步中的一样,还是先用 ConfigMap 定义它的环境变量,在这个 ConfigMap 里要注意的是“HOST”字段,它必须是 MariaDB Pod 的 IP 地址,如果不写正确 WordPress 会无法正常连接数据库。然后在pod对象中使用
envFrom
注入变量:
apiVersion: v1
kind: ConfigMap
metadata:
name: wp-cm
data:
HOST: '172.17.0.3'
USER: 'wp'
PASSWORD: '123'
NAME: 'db'
---
apiVersion: v1
kind: Pod
metadata:
name: wp-pod
labels:
app: wordpress
role: website
spec:
containers:
- image: wordpress:5
name: wp-pod
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
envFrom:
- prefix: 'WORDPRESS_DB_'
configMapRef:
name: wp-cm
第三步:运行两个pod以及端口转发
kubectl apply -f maria-pod.yml
kubectl apply -f wp-pod.yml
kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
maria-pod 1/1 Running 0 79m 172.17.0.3 minikube <none> <none>
wp-pod 1/1 Running 0 78m 172.17.0.4 minikube <none> <none>
为了让WordPress Pod对象能够在集群外可见,需要进行端口号映射。
因为 Pod 都是运行在 Kubernetes 内部的私有网段里的,外界无法直接访问,想要对外暴露服务,需要使用一个专门的
kubectl port-forward
命令,它专门负责把本机的端口映射到在目标对象的端口号,有点类似 Docker 的参数 -p,经常用于 Kubernetes 的临时调试和测试。
下面的命令就可以将本地的“8080”映射到WordPress的“80”,kubectl 会把这个端口的所有数据都转发给集群内部的 Pod:
kubectl port-forward wp-pod 8080:80 &
第四步:创建反向代理的 Nginx
这是因为 WordPress 网站使用了 URL 重定向,直接使用“8080”会导致跳转故障,所以为了让网站正常工作,我们还应该在 Kubernetes 之外启动 Nginx 反向代理,保证外界看到的仍然是“80”端口号。
为Nginx准备
proxy.conf
:
server {
listen 80;
default_type text/html;
location / {
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_pass http://host.docker.internal:8080;
}
}
值得注意的是,
nginx
代理的是主机IP上的8080端口,而Nginx自身是在docker里,所以这里是从容器中访问host中的地址,所以proxy如上面所示(不能是127.0.0.1)
docker启动
nginx
容器进行反向代理:
docker run -d --rm -p 80:80 -v `pwd`/proxy.conf:/etc/nginx/conf.d/default.conf nginx
呈现结果
这时候,我们就可以在主机浏览器地址栏输入http://127.0.0.1,访问到WordPress页面了。