k8s 是容器编排系统,使用 K8s 可以做到 自动扩缩故障转移,等等优秀的特性,被常常在企业中使用。

搭建一个简易的 k8s 可以使用 k3s

  • 轻量级(0.5G 就可以使用)
  • 拥有大部分的 k8s 功能
  • 支持多节点

具体搭建过程及更多信息可以参考官网。

image-20240203200458558

部署思路

wordpress 部分

搭建 wordpress ,需要了解搭建一个完整的 wordpress 服务并且对外开放,所需要的服务。

  1. wordpress 服务端(提供 wordpress 后端服务、配置、插件等等)
  2. Mysql (提供存储数据的能力,比如:文章、评论等等)

根据以上信息,wordpress 服务端和 Mysql 需要存储一些信息,故需要对数据进行持久化。

k8s 中卷常见的类型:

  • hostpath 。无法被多个节点中 pods 读写
  • 网络卷(比如: NFS)。可以被多个节点内的 pods 读写。推荐

由于本地是单机部署,采用 local 类型。

在 k8s 中,一个 pod 可以包含多个 container ,那么对于 wordpress 与 mysql 也可以吗?

可以,但是不推荐。

  • 耦合性强
  • 博客网站多为多读少写,瓶颈在 IO ,故可能只需要动态地对 mysql 进行扩缩,而不需要对 wordperss 进行扩散。

最后需要对外暴露服务,故需要 service 对 pod 指定一个访问接口。

mysql 部分:

  • 对于 mysql 需要密码等敏感信息,故可以使用 k8s 中的 secret 去保存密码,但是 secret 中是使用 base64 进行保存的,并不是特别安全,可以使用其他更安全的方式进行存储。

  • 需要使用持久卷去存储数据。

  • 使用 service 暴露端口,提供给内部 pod (wordpress) 访问,通过 k8s 的 DNS 服务访问 myslq 。

编写 wordpress 部署 yaml

service : 对集群内部暴露 80 端口给集群内部访问,通过 LoadBalancer 暴露端口给外部访问。

apiVersion: v1
kind: Service
metadata:
	name: wordpress
	namespace: wordpress
	labels:
		app: wordpress
spec:
	ports:
		- port: 80
	selector:
		app: wordpress
		tier: fontend
	type: LoadBalancer

PersistentVolumeClaim : 申请 20G 存储空间

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
	name: wp-pv-claim
	namespace: wordpress
	labels:
		app: wordpress
spec:
	accessModes:
		- ReadWriteOnce
	resources:
		requests:
			storage: 20Gi

Deployment : 部署 wordpress

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
  namespace: wordpress
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: frontend
    spec:
      containers:
      - image: wordpress:laest
        name: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          value: wordpress-mysql
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        - name: WORDPRESS_DB_USER
          value: wordpress
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wp-pv-claim

编写 mysql.yaml

secret :

apiVersion: v1
kind: Secret
metadata:
  name: mysql-pass
  namespace: wordpress
type: Opaque
data:
  password: <your-base64-encoded-password>

service :

apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  namespace: wordpress
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql
  clusterIP: None

PersistentVolumeClaim :

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  namespace: wordpress
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi

Deployment :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-mysql
  namespace: wordpress
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
        - image: mysql:8.0
          name: mysql
          env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-pass
                  key: password
            - name: MYSQL_DATABASE
              value: wordpress
            - name: MYSQL_USER
              value: wordpress
            - name: MYSQL_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-pass
                  key: password
          ports:
            - containerPort: 3306
              name: mysql
          volumeMounts:
            - name: mysql-persistent-storage
              mountPath: /var/lib/mysql
      volumes:
        - name: mysql-persistent-storage
          persistentVolumeClaim:
            claimName: mysql-pv-claim

部署验证

将以上两个配置,分别组合为 wordpress-frontend.yaml / wordpress-mysql.yaml 文件。

kubectl apply -f wordpress-frontend.yaml
kubectl apply -f wordpress-mysql.yaml

k8s 将会开始部署。由于镜像可能有点慢,等待时间可以会有点久。

可以通过以下命令进行验证:

kubectl get secrets -n wordpress

查看为 mysql 创建的 secret 是否存在。

image-20240203212107374

kubectl get pvc -n wordpress

查看为 wordpress 与 mysql 创建的两个 pvc 是否存在。

image-20240203212123308

kubectl get pods -n wordpress

查看 wordpress 与 mysql 两个服务是否在运行。

image-20240203212141855

kubectl get services -n wordpress

查看两个 service 是否操作。

image-20240203212159910

当两个 pod 都在运行时,可以通过 kubectl get services -n wordpress 查看进行服务信息,如上图,名为 wordpress 栏的 PORT(s) 列,其中 30122 为外部地址访问的端口。

我使用云服务器部署该应用,故可以通过 http://<pulic-ip>:30122 访问 wordpress 初始页面。

image-20240203212435359

Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐