实战演练——wordpress-k8s集群版 - 详解

关键要点包括:​

  1. 应用封装与管理:WordPress 和 MySQL 被封装成 Pod,运行所需环境变量保存在 ConfigMap 中,采用“声明式”管理,便于阅读和版本化管理。​
  2. MySQL YAML 定义:需定义 MySQL configmap(mysql - cm.yaml),包含 4 个环境变量;还需定义 MySQL Pod(mysql - pod.yaml),并从 configmap 引用环境变量。​
  3. WordPress YAML 定义:定义 WordPress Configmap(wp - cm.yaml),包含数据库相关信息;定义 WordPress Pod(wp - pod.yaml),同样从 configmap 引用环境变量。​
  4. 部署操作:使用 kubectl apply - f 部署 MySQL 和 WordPress。​
  5. 访问 WordPress:通过 kubectl get pods - o wide 查看 Pod IP 地址,使用 kubectl port - forward --address [0.0.0.0](0.0.0.0) wp - pod 8080:80 从外部访问 Pod。​
  6. Configmap 引用优化:可使用 envFrom 从 configmap 批量引用环境变量,并对 configmap 的数据结构进行调整。

一、WordPress 网站搭建

1.定义MySQL YAML

[root@localhost 07-wordpress-deploy]# cat mysql-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
  labels:
    app: wordpress
    role: database
spec:
  containers:
  - name: wp-mysql
    image: registry.cn-beijing.aliyuncs.com/xxhf/mysql:8.0
    ports:
    - containerPort: 3306
    env:
    - name: MYSQL_DATABASE
      value: "db_wordpress"
    - name: MYSQL_USER
      value: "wordpress"
    - name: MYSQL_PASSWORD
      value: "123456"
    - name: MYSQL_ROOT_PASSWORD
      value: "123456"
[root@localhost 07-wordpress-deploy]# kubectl apply -f mysql-pod.yaml
pod/mysql-pod created
[root@localhost 07-wordpress-deploy]# kubectl get pod -o wide
NAME        READY   STATUS    RESTARTS   AGE     IP              NODE     NOMINATED NODE   READINESS GATES
mysql-pod   1/1     Running   0          3m34s   172.17.219.83   master              

注:mysql容器的ip地址172.17.219.83是要同步给wordpress项目的

2.定义 WordPress YAML

[root@localhost 07-wordpress-deploy]# cat wp-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: wp-pod
  labels:
    app: wordpress
    role: website
spec:
  containers:
  - name: wp-pod
    image: registry.cn-beijing.aliyuncs.com/xxhf/wordpress:php7.4
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
    env:
      - name: WORDPRESS_DB_HOST
        value: "172.17.219.83"
      - name: WORDPRESS_DB_USER
        value: "wordpress"
      - name: WORDPRESS_DB_PASSWORD
        value: "123456"
      - name: WORDPRESS_DB_NAME
        value: "db_wordpress"
[root@localhost 07-wordpress-deploy]# kubectl apply -f wp-pod.yaml
pod/wp-pod created

3.访问 WordPress

从外部访问,需要临时开放一个映射端口:

[root@localhost 07-wordpress-deploy]# kubectl port-forward --address 0.0.0.0  wp-pod 8080:80

二、ConfigMap 存储数据

1.定义MySQL configmap

[root@localhost 07-wordpress-deploy]# cat 01-mysql-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-cm
data:
  MYSQL_DATABASE: 'db_wordpress'
  MYSQL_USER: 'wordpress'
  MYSQL_PASSWORD: '123456'
  MYSQL_ROOT_PASSWORD: '123456'

挂载到mysql-pod容器当中:

[root@localhost 07-wordpress-deploy]# cat 01-mysql-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
  labels:
    app: wordpress
    role: database
spec:
  containers:
  - name: wp-mysql
    image: registry.cn-beijing.aliyuncs.com/xxhf/mysql:8.0
      #image: mysql:8.0
      #imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 3306
    env:
      - name: MYSQL_DATABASE
        valueFrom:
          configMapKeyRef:
            name: mysql-cm
            key: MYSQL_DATABASE
      - name: MYSQL_USER
        valueFrom:
          configMapKeyRef:
            name: mysql-cm
            key: MYSQL_USER
      - name: MYSQL_PASSWORD
        valueFrom:
          configMapKeyRef:
            name: mysql-cm
            key: MYSQL_PASSWORD
      - name: MYSQL_ROOT_PASSWORD
        valueFrom:
          configMapKeyRef:
            name: mysql-cm
            key: MYSQL_ROOT_PASSWORD

启动容器服务:

[root@localhost 07-wordpress-deploy]# kubectl apply -f 01-mysql-cm.yaml
configmap/mysql-cm unchanged
[root@localhost 07-wordpress-deploy]# kubectl apply -f 01-mysql-pod.yaml
pod/mysql-pod created
[root@localhost 07-wordpress-deploy]# kubectl get pod -o wide
NAME        READY   STATUS    RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
mysql-pod   1/1     Running   0          8s    172.17.219.85   master              

2.定义 WordPress Configmap

[root@localhost 07-wordpress-deploy]# cat 01-wp-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: wp-cm
data:
  WORDPRESS_DB_HOST: '172.17.219.85'
  WORDPRESS_DB_USER: 'wordpress'
  WORDPRESS_DB_PASSWORD: '123456'
  WORDPRESS_DB_NAME: 'db_wordpress'

挂载到wp-pod容器当中:

[root@localhost 07-wordpress-deploy]# cat 01-wp-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: wp-pod
  labels:
    app: wordpress
    role: website
spec:
  containers:
  - name: wp-pod
    image: registry.cn-beijing.aliyuncs.com/xxhf/wordpress:php7.4
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
    env:
      - name: WORDPRESS_DB_HOST
        valueFrom:
          configMapKeyRef:
            name: wp-cm
            key: WORDPRESS_DB_HOST
      - name: WORDPRESS_DB_USER
        valueFrom:
          configMapKeyRef:
            name: wp-cm
            key: WORDPRESS_DB_USER
      - name: WORDPRESS_DB_PASSWORD
        valueFrom:
          configMapKeyRef:
            name: wp-cm
            key: WORDPRESS_DB_PASSWORD
      - name: WORDPRESS_DB_NAME
        valueFrom:
          configMapKeyRef:
            name: wp-cm
            key: WORDPRESS_DB_NAME

启动容器服务:

[root@localhost 07-wordpress-deploy]# kubectl apply -f 01-wp-cm.yaml
configmap/wp-cm configured
[root@localhost 07-wordpress-deploy]# kubectl apply -f 01-wp-pod.yaml
pod/wp-pod created
[root@localhost 07-wordpress-deploy]# kubectl get pod -o wide
NAME        READY   STATUS    RESTARTS   AGE     IP              NODE     NOMINATED NODE   READINESS GATES
mysql-pod   1/1     Running   0          4m42s   172.17.219.85   master              
wp-pod      1/1     Running   0          51s     172.17.219.86   master              

3.访问 WordPress

[root@localhost 07-wordpress-deploy]# kubectl port-forward --address 0.0.0.0  wp-pod 8080:80

4.优化 configmap 引用

针对mysql-cm的优化:

[root@localhost 07-wordpress-deploy]# cat 02-mysql-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-cm
data:
  DATABASE: 'db_wordpress'
  USER: 'wordpress'
  PASSWORD: '123456'
  ROOT_PASSWORD: '123456'
[root@localhost 07-wordpress-deploy]# cat 02-mysql-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-cm
data:
  DATABASE: 'db_wordpress'
  USER: 'wordpress'
  PASSWORD: '123456'
  ROOT_PASSWORD: '123456'
[root@localhost 07-wordpress-deploy]# cat 02-mysql-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
  labels:
    app: wordpress
    role: database
spec:
  containers:
  - name: wp-mysql
    image: registry.cn-beijing.aliyuncs.com/xxhf/mysql:8.0
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 3306
    envFrom:
    - prefix: 'MYSQL_'  # 前缀
      configMapRef:
        name: mysql-cm

针对wp-cm的优化:

[root@localhost 07-wordpress-deploy]# cat 02-wp-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: wp-cm
data:
  HOST: '10.244.171.6'
  USER: 'wordpress'
  PASSWORD: '123456'
  NAME: 'db_wordpress'
[root@localhost 07-wordpress-deploy]# cat 02-wp-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: wp-pod
  labels:
    app: wordpress
    role: website
spec:
  containers:
  - name: wp-pod
    image: registry.cn-beijing.aliyuncs.com/xxhf/wordpress:php7.4
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
    envFrom:
    - prefix: 'WORDPRESS_DB_'
      configMapRef:
        name: wp-cm

三、部署k8s集群服务

  1. 部署 MySQL:先用 ConfigMap 定义数据库环境变量,再将 MySQL 以 Deployment 方式部署,replicas 设为 1,最后创建 Service 对象映射端口 3306,可将这三个对象写在一个 YAML 文件中一次性创建。​
  2. 部署 WordPress:ConfigMap 配置中“HOST”用 MySQL 的 Service 名字,Deployment 的 replicas 设为 2,创建 NodePort 类型的 Service 并指定端口 30080,可在集群各节点访问服务。​
  3. 部署 Ingress Controller:部署 Nginx Ingress Controller,使用课上部署的 nginx ingress controller,为 WordPress 创建 Ingress 对象,给 ingress - nginx - controller deployment 添加 hostNetwork: true 属性让 Pod 使用宿主机网络。

1.部署MySQL

YAML配置文件集合:

# 先要用 ConfigMap 定义数据库的环境变量,有 DATABASE、USER、PASSWORD、ROOT_PASSWORD
[root@localhost 11-wordpress-deploy]# cat 01-mysql-dep.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-cm
data:
  DATABASE: 'db_wordpress'
  USER: 'wordpress'
  PASSWORD: '123456'
  ROOT_PASSWORD: '123456'
---
# 把 MySQL 由 Pod 改成 Deployment 的方式,replicas 设置成 1 个,template 里面的 Pod 部分没有任何变化,还是要用 envFrom把配置信息以环境变量的形式注入 Pod
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wp-mysql
  labels:
    app: wordpress
    role: database
spec:
  replicas: 1
  minReadySeconds: 0
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  selector:
    matchLabels:
      app: wp-mysql
  template:
    metadata:
      labels:
        app: wp-mysql
    spec:
      containers:
      - name: wp-mysql
        image: registry.cn-beijing.aliyuncs.com/xxhf/mysql:8.0
        imagePullPolicy: IfNotPresent
        resources:
          limits:
            cpu: 1
            memory: 2048Mi
          requests:
            cpu: 500m
            memory: 500Mi
        startupProbe:
          periodSeconds: 15
          tcpSocket:
            port: 3306
        livenessProbe:
          periodSeconds: 10
          tcpSocket:
            port: 3306
        readinessProbe:
          periodSeconds: 15
          tcpSocket:
            port: 3306
        ports:
        - containerPort: 3306
        envFrom:
        - prefix: 'MYSQL_'
          configMapRef:
            name: mysql-cm
---
# 为 MySQL 定义一个 Service 对象,映射端口 3306,让其他应用不再关心 IP 地址,直接用 Service 对象的名字来访问数据库服务
apiVersion: v1
kind: Service
metadata:
  name: wp-mysql-svc
  labels:
spec:
  selector:
    app: wp-mysql
  ports:
  - port: 3306
    targetPort: 3306
    protocol: TCP
    name: mysql-svc

创建mysql服务:

[root@localhost 11-wordpress-deploy]# kubectl apply -f 01-mysql-dep.yaml
configmap/mysql-cm configured
deployment.apps/wp-mysql created
service/wp-mysql-svc created
[root@localhost 11-wordpress-deploy]# kubectl get cm
NAME               DATA   AGE
mysql-cm           4      4d14h
[root@localhost 11-wordpress-deploy]# kubectl get svc
NAME                 TYPE           CLUSTER-IP        EXTERNAL-IP   PORT(S)                      AGE
wp-mysql-svc         ClusterIP      192.168.111.220           3306/TCP                     28s
[root@localhost 11-wordpress-deploy]# kubectl get deployments.apps
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
wp-mysql   1/1     1            1           46s
[root@localhost 11-wordpress-deploy]# kubectl get pod -o wide
NAME                        READY   STATUS                  RESTARTS       AGE   IP               NODE      NOMINATED NODE   READINESS GATES
wp-mysql-7566f55d5f-kkjgw   1/1     Running                 0              58s   172.17.171.109   worker               

2.部署 WordPress

YAML配置文件集合:

[root@localhost 11-wordpress-deploy]# cat 02-wp-dep.yaml
# 因为刚才创建了 MySQL 的 Service,所以在写 ConfigMap 配置的时候“HOST”就不应该是 IP 地址了,而应该是 DNS 域名,也就是 Service 的名字 wp-mysql-svc
apiVersion: v1
kind: ConfigMap
metadata:
  name: wp-cm
data:
  HOST: 'wp-mysql-svc.default.svc.cluster.local'
  USER: 'wordpress'
  PASSWORD: '123456'
  NAME: 'db_wordpress'
---
# Pod 套一个 Deployment 的“外壳”,replicas 设置成 2 个,用字段“envFrom”配置环境变量
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wp-dep
  labels:
    app: wp-dep
spec:
  replicas: 2
  minReadySeconds: 30
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  selector:
    matchLabels:
      app: wp-dep
  template:
    metadata:
      labels:
        app: wp-dep
    spec:
      containers:
      - name: wordpress
        image: registry.cn-beijing.aliyuncs.com/xxhf/wordpress:php7.4
        imagePullPolicy: IfNotPresent
        resources:
          limits:
            cpu: 1
            memory: 1024Mi
          requests:
            cpu: 200m
            memory: 500Mi
        startupProbe:
          periodSeconds: 5
          tcpSocket:
            port: 80
        livenessProbe:
          periodSeconds: 10
          tcpSocket:
            port: 80
        readinessProbe:
          periodSeconds: 15
          tcpSocket:
            port: 80
        ports:
        - containerPort: 80
        envFrom:
        - prefix: 'WORDPRESS_DB_'
          configMapRef:
            name: wp-cm
---
# 为 WordPress 创建 Service 对象
apiVersion: v1
kind: Service
metadata:
  name: wp-dep-svc
  labels:
spec:
  selector:
    app: wp-dep
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
    name: http

创建wordpress服务:

[root@localhost 11-wordpress-deploy]# kubectl apply -f 02-wp-dep.yaml
configmap/wp-cm configured
deployment.apps/wp-dep created
service/wp-dep-svc created
[root@localhost 11-wordpress-deploy]# kubectl get cm
NAME               DATA   AGE
mysql-cm           4      4d14h
wp-cm              4      4d14h
[root@localhost 11-wordpress-deploy]# kubectl get svc
NAME                 TYPE           CLUSTER-IP        EXTERNAL-IP   PORT(S)                      AGE
wp-dep-svc           ClusterIP      192.168.111.111           80/TCP                       13s
wp-mysql-svc         ClusterIP      192.168.111.220           3306/TCP                     8m37s
[root@localhost 11-wordpress-deploy]# kubectl get deployments.apps
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
wp-dep     0/1     1            0           18s
wp-mysql   1/1     1            1           8m42s

3.部署 Ingress Controller

注:这里的控制器可以选择之前部署的ingress-nginx-controller,通过这个控制器处理我们接下来要配置的ingress规则

[root@localhost 11-wordpress-deploy]# kubectl -n ingress-nginx get deployments.apps
NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
ingress-nginx-controller   1/1     1            1           153m

配置ingress规则:

[root@localhost 11-wordpress-deploy]# cat 03-wp-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: wp-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: wp.xxhf.cc
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: wp-dep-svc
            port:
              number: 80
[root@localhost 11-wordpress-deploy]# kubectl apply -f 03-wp-ingress.yaml
ingress.networking.k8s.io/wp-ingress created

在本机hosts配置文件中写入:

192.168.5.120 wp.xxhf.cc

访问浏览器:

posted @ 2026-02-02 10:00  gccbuaa  阅读(0)  评论(0)    收藏  举报