1. 创建命名空间

$ vim mysql-ns.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: mysql
  labels:
    name: mysql
$ kubectl create -f mysql-ns.yaml
  • 验证
$ kubectl get namespace
NAME                                     STATUS   AGE
mysql                                    Active   2m6s

2. 安装 NFS 文件共享

$ mkdir -p /data/Deployment/mysql/data
$ yum install -y nfs-utils rpcbind
$ vi /etc/exports
/data/Deployment/mysql/data *(rw,sync,no_subtree_check,no_root_squash)
$ systemctl start nfs-server.service
$ systemctl enable nfs-server.service
  • 验证
$ showmount -e 127.0.0.1
Export list for 127.0.0.1:
/data/Deployment/mysql/data *

3. 创建 PV

$ vim mysql-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  # pv是没有namespace属性的,它是一种跨namespace的共享资源
  name: mysql-pv-10gi
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  # 存储类,具有相同存储类名称的pv和pvc才能进行绑定
  storageClassName: nfs
  nfs:
    path: /data/Deployment/mysql/data
    server: 10.201.10.201
$ kubectl create -f mysql-pv.yaml
  • 验证
$ kubectl get pv
NAME            CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
mysql-pv-10gi   10Gi       RWX            Retain           Available           nfs                     8s

4. 创建 PVC

$ vim mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc-10gi
  namespace: mysql
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  # 存储类,具有相同存储类名称的pv和pvc才能进行绑定
  storageClassName: nfs
$ kubectl create -f mysql-pvc.yaml
  • 验证
$ kubectl get pvc -n mysql
NAME             STATUS   VOLUME          CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mysql-pvc-10gi   Bound    mysql-pv-10gi   10Gi       RWX            nfs            34s

5. 创建 Secret 对象用来保存 mysql 的 root 用户密码

$ kubectl create secret generic mysql-root-password --from-literal=password=admin@123456 -n mysql
  • 验证
$  kubectl get secret -n mysql
NAME                  TYPE                                  DATA   AGE
mysql-root-password   Opaque                                1      20s

6. 创建 Deployment

$ vim mysql-deploy.yaml
# 定义mysql的Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: mysql
  name: mysql
  namespace: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:8.0
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          # 指定secret
          valueFrom:
            secretKeyRef:
              name: mysql-root-password
              key: password
          # 也可直接指定mysql密码,使用secret来存储密码更为安全
          #value: "admin@123456"
        ports:
        # 指定容器服务端口
        - containerPort: 3306
        volumeMounts:
        # 指定pvc容器挂载路径
        - name: mysqlvolume
          mountPath: /var/lib/mysql
      volumes:
      - name: mysqlvolume
        persistentVolumeClaim:
        # 指定pvc
          claimName: mysql-pvc-10gi
$ kubectl create -f mysql-deploy.yaml
  • 验证
$ kubectl get deploy -n mysql
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
mysql   1/1     1            1           46s

7. 创建 Service

vim mysql-svc.yaml
#定义mysql的Service对外提供服务
apiVersion: v1
kind: Service
metadata:
  labels:
    app: mysql-svc
  name: mysql-svc
  namespace: mysql
spec:
  selector:
    app: mysql
  type: NodePort
  ports:
  - port: 3306
    protocol: TCP
    targetPort: 3306
    nodePort: 31106
$ kubectl create -f mysql-svc.yaml
  • 验证
$ kubectl get svc -n mysql
NAME        TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
mysql-svc   NodePort   10.102.46.15   <none>        3306:31106/TCP   13s

8. 连接测试

./mysql -h127.0.0.1 -P31106 -uroot -padmin@123456
文章作者: hzbb
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 运维小记
云原生 Kubernetes K8S MySQL
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝