WordPress 网站
WordPress 网站基本架构
这个系统可以说是比较典型的网站了。MariaDB 作为后面的关系型数据库,端口号是 3306;WordPress 是中间的应用服务器,使用 MariaDB 来存储数据,它的端口是 80;
Ingress Controller是前面的反向代理,它对外暴露 80 端口,然后把请求转发给 WordPress。
WordPress 网站部署 MariaDB
1、数据库变量ConfigMap
先要用 ConfigMap 定义数据库的环境变量,有 DATABASE、USER、PASSWORD、ROOT_PASSWORD:
apiVersion: v1
kind: ConfigMap
metadata:
name: maria-cm
data:
DATABASE: 'db'
USER: 'wp'
PASSWORD: '123'
ROOT_PASSWORD: '123'
执行命令
# 新增编辑marial configMap文件,把上面内容copy进去
vim marial-cm.yml
# 应用该配置
kubectl apply -f marial-cm.yml
#查看cm资源
kubectl get cm
2、部署MariaDB Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: maria-dep
name: maria-dep
spec:
replicas: 1
selector:
matchLabels:
app: maria-dep
template:
metadata:
labels:
app: maria-dep
spec:
containers:
- image: mariadb:10
name: mariadb
ports:
- containerPort: 3306
envFrom:
- prefix: 'MARIADB_'
configMapRef:
name: maria-cm
执行命令
vim marial-deployment.yml
kubectl apply -f marial-deployment.yml
#等待一会就好了
kubectl get deployments.apps
3、部署MariaDB Service
MariaDB 定义一个 Service 对象,映射端口 3306,让其他应用不再关心 IP 地址,直接用 Service 对象的名字来访问数据库服务:
apiVersion: v1
kind: Service
metadata:
labels:
app: maria-dep
name: maria-svc
spec:
ports:
- port: 3306
protocol: TCP
targetPort: 3306
selector:
app: maria-dep
创建一个名为 maria-svc 的 Service
- spec.ports 部分指定了服务监听的端口和转发到后端 Pod 的目标端口。在这里,服务监听的端口是 3306,并将请求转发到后端 Pod 的端口也是 3306。
- selector 部分指定了服务将代理到哪些后端 Pod。在这里,服务将代理到标签为 app: maria-dep 的 Pod。
这意味着通过 maria-svc 服务访问端口 3306,请求将被转发到具有标签 app: maria-dep 的 Pod 上的端口 3306。
执行命令
vim marial-service.yml
kubectl apply -f marial-service.yml
kubectl get svc
WordPress 网站部署 WordPress
1、WordPress ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: wp-cm
data:
HOST: 'maria-svc'
USER: 'wp'
PASSWORD: '123'
NAME: 'db'
和上面一样的操作
执行命令
vim wp-cm.yml
kubectl apply -f wp-cm.yml
#查看cm资源
kubectl get cm
2、部署WordPress Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: wp-dep
name: wp-dep
spec:
replicas: 2
selector:
matchLabels:
app: wp-dep
template:
metadata:
labels:
app: wp-dep
spec:
containers:
- image: wordpress:5
name: wordpress
ports:
- containerPort: 80
envFrom:
- prefix: 'WORDPRESS_DB_'
configMapRef:
name: wp-cm
执行命令
vim wp-deploy.yml
kubectl apply -f wp-deploy.yml
kubectl get pod
3、部署WordPress Service
apiVersion: v1
kind: Service
metadata:
labels:
app: wp-dep
name: wp-svc
spec:
ports:
- name: http80
port: 80
protocol: TCP
targetPort: 80
nodePort: 30088
selector:
app: wp-dep
type: NodePort
执行命令
vim wp-svc.yml
kubectl apply -f wp-svc.yml
kubectl get svc
因为 WordPress 的 Service 对象是 NodePort 类型的,我们可以在集群的每个节点上访问 WordPress 服务。
注意 Kubernetes 中的默认网络策略允许同一命名空间内的所有 Pod 彼此通信,也就是说,WordPress Pod 可以通过 maria-svc 服务名称直接访问 MariaDB 数据库,假设它们在同一个命名空间中。
比如一个节点的 IP 地址是“自己机器ip”,那么你就在浏览器的地址栏里输入“http://自己机器ip:30088”,其中的“30088”就是在 Service 里指定的节点端口号,然后就能够看到 WordPress 的安装界面了:
WordPress 网站部署 Nginx Ingress Controller
1、部署Ingress Class
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: wp-ink
spec:
controller: nginx.org/ingress-controller
执行命令
vim wp-ingress-class.yml
kubectl apply -f wp-ingress-class.yml
2、部署Ingress
用 kubectl create 命令生成 Ingress 的样板文件,指定域名是“wp.test”,后端 Service 是“wp-svc:80”,Ingress Class 就是刚定义的“wp-ink”:
kubectl create ing wp-ing --rule="wp.test/=wp-svc:80" --class=wp-ink $out
Ingress YAML 就是这样,注意路径类型我还是用的前缀匹配“Prefix”:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: wp-ing
spec:
ingressClassName: wp-ink
rules:
- host: wp.test
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: wp-svc
port:
number: 80
执行命令
vim wp-ingress.yml
kubectl apply -f wp-ingress.yml
3、部署Ingress Controller
Ingress Controller 不使用 Service
给它的 Pod 加上一个特殊字段 hostNetwork,让 Pod 能够使用宿主机的网络,相当于另一种形式的 NodePort:
wp-kic.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: wp-kic-dep
namespace: nginx-ingress
spec:
selector:
matchLabels:
app: wp-kic-dep
template:
metadata:
labels:
app: wp-kic-dep
app.kubernetes.io/name: nginx-ingress
spec:
serviceAccountName: nginx-ingress
hostNetwork: true
automountServiceAccountToken: true
securityContext:
seccompProfile:
type: RuntimeDefault
containers:
- image: nginx/nginx-ingress:2.2-alpine
imagePullPolicy: IfNotPresent
name: nginx-ingress
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
- name: readiness-port
containerPort: 8081
- name: prometheus
containerPort: 9113
readinessProbe:
httpGet:
path: /nginx-ready
port: readiness-port
periodSeconds: 1
resources:
requests:
cpu: "100m"
memory: "128Mi"
#limits:
# cpu: "1"
# memory: "1Gi"
securityContext:
allowPrivilegeEscalation: true
# readOnlyRootFilesystem: true
runAsUser: 101 #nginx
runAsNonRoot: true
capabilities:
drop:
- ALL
add:
- NET_BIND_SERVICE
env:
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
args:
- -nginx-configmaps=$(POD_NAMESPACE)/nginx-config
- -ingress-class=wp-ink
执行命令
vim wp-kic.yml
kubectl apply -f wp-kic.yml
4、访问测试
Ingress 使用的是 HTTP 路由规则,用 IP 地址访问是无效的,所以在集群外的主机上必须能够识别我们的“wp.test”域名,也就是说要把域名“wp.test”解析到 Ingress Controller 所在的节点上。
Mac,那就修改 /etc/hosts; Windows,就修改 C:\Windows\System32\Drivers\etc\hosts,添加一条解析规则就行:
自己服务器ip wp.test
直接用域名“wp.test”访问