m1 搭建minikube和wordpress

   背景

  k8s作为docker进阶,如何让学生了解k8s,并动手实操,又不至于太复杂呢?于是,设计如下实验:

  1. 安装minikube

  2. 安装Dashboard 

  3. 利用minikube搭建Wordpress个人博客系统

 

    一种可行的实验路径

  由于我的电脑是m1芯片,在做实验时遇到各种坑。所以在作出各种尝试(PD+centos7,VM+centos7等等)后,总结了以下在m1电脑(ventura13.3操作系统)上搭建minikube的可行实验路径,即macos ventura + docker desktop + minikube + wordpress。大致操作步骤如下:

  (1)在macos上直接安装 docker desktop;

  (2)然后安装并启动minikube;

  (3)启动Dashboard

      (4)然后通过yaml配置文件安装wordpress和mysql。

 

   具体步骤

  步骤一:安装docker desktop

  参考 https://docs.docker.com/desktop/install/mac-install/  ,选择其中最简单的 Install interactively 安装方法。

  可选步骤:

  替换国内源。在设置里面选择到Docker Engine,在里面添加源,如下图所示。

  步骤二:安装minikube

  步骤2、3参考https://minikube.sigs.k8s.io/docs/start/ 。

  因为采用的是直接在macos(m1芯片)中安装minikube,所以我们安装时选择arm64,而非x86,如图所示。提醒,安装时可采用curl 方式下载二进制文件,并安装。

 

   步骤三:启动minikube

   该步骤非常耗时较长,主要是下载镜像需要花时间。我的电脑可以上外网,所以用的是不指定镜像仓库的命令。有些教程建议加上指定国内镜像,但是我在windows电脑+Vm+

centos7.6实测发现,启动卡住了,各位可以再去摸索一下。启动命令如下:

minikube start --driver=docker

  建议指定docker驱动,即加上 --driver=docker。

  在下载镜像的时候我试了加上国内源和不加两种方式,发现下载镜像的速度都很慢。晚上就放在那儿下载,早上显示“Done”。

    步骤四:启动Dashboard

  作为入门,仪表盘有着不可替代的作用。启动Dashboard用如下简单命令即可。该命令为前台运行,运行时不要关闭终端窗口。当然也可选择后台运行,在此不再赘述。

minikube dashboard

    步骤五: 配置yaml文件

  参考 https://kubernetes.io/zh-cn/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/   和 https://amperecomputing.com/tutorials/deploy-wordpress-and-mysql 。该步骤融合了这两个教程,主要因为第一个教程的yaml文件在运行时出现mysql5.6包找不到,而第二个教程中mysql的密码有些问题导致数据库连接不上。

  5.1 创建 kustomization.yaml

  在当前目录创建 kustomization.yaml 文件,内容如下:

  (注意:请替换其中的YOUR_PASSWORD!!!)


secretGenerator:
- name: mysql-pass
literals:
- password=123456
resources:
- mysql-deployment.yaml
- wordpress-deployment.yaml

  5.2 创建 mysql-deployment.yaml

  该文件和 kustomization.yaml 在同一级,内容如下:

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/tmp/mysql/data"
  persistentVolumeReclaimPolicy: Recycle
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress-mysql
spec:
  ports:
  - port: 3306
  selector:
    app: wordpress-mysql
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress-mysql
spec:
  selector:
    matchLabels:
      app: wordpress-mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress-mysql
    spec:
      containers:
      - image: mysql:oracle
        name: mysql
        env:
        - name: MYSQL_DATABASE
          value: wordpress
        - name: MYSQL_ROOT_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

  5.3 创建 wordpress-deployment.yaml

  和上述文件在同一级,内容如下:

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: wp-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/tmp/wp/data"
  persistentVolumeReclaimPolicy: Recycle
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wp-pv-claim
  labels:
    app: wordpress
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: v1
kind: Service
metadata:
  name: wordpress
  labels:
    app: wordpress
    tier: frontend
spec:
  ports:
    - port: 80
  selector:
    app: wordpress
    tier: frontend
  type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
  labels:
    app: wordpress
    tier: frontend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wordpress
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: frontend
    spec:
      containers:
        - image: wordpress:6.0.1-php7.4
          name: wordpress
          env:
            - name: WORDPRESS_DB_HOST
              value: wordpress-mysql
            - name: WORDPRESS_DB_NAME
              value: wordpress
            - name: WORDPRESS_DB_USER
              value: root
            - name: WORDPRESS_DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-pass
                  key: password
          ports:
            - containerPort: 80
              name: wordpress
          volumeMounts:
            - name: wordpress-persistent-storage
              mountPath: /var/www/html
      volumes:
        - name: wordpress-persistent-storage
          persistentVolumeClaim:
            claimName: wp-pv-claim

   5.4 运行创建命令并验证

  创建命令

kubectl apply -k ./

  验证密码是否生成(1个密钥)

kubectl get secrets

  验证pv是否创建(2个pv)

kubectl get pvc

  验证pod是否正常(2个running)

kubectl get pods

  验证 Service 是否正在运行

kubectl get services wordpress

  响应为(因为Minikube只能通过NodePort公开服务。EXTERNAL-IP始终处于pending状态。

NAME        TYPE            CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
wordpress   LoadBalancer    10.0.0.89    <pending>     80:32406/TCP   4m

  查看服务ip地址(不要关闭该终端窗口)

minikube service wordpress --url

  响应为如下形式则正常,最后通过浏览器访问即可。

http://1.2.3.4:32406

 总结 

  本文通过直接在macos(m1芯片,ventura)上安装docker desktop,从而绕过虚拟机和centos7等烦人的兼容问题。window电脑安装方式也可以参考上述步骤,用VM+centos7的方法去完成实验。但是该方法依然存在镜像下载慢点问题,有时间再去解决。综上,本文介绍了一种避免m1兼容问题,且又能快速上手k8s的实验案例和可行方法。

 

  

 

posted @ 2023-06-05 21:47  hello_oldman  阅读(216)  评论(0编辑  收藏  举报