K8S-mysql单机安装.md

前言

这里并不建议将生产 mysql 部署到K8s上,配置较为繁琐。这里只为了统一管理。
这里,先将mysql 单独放到一个命名空间

准备工作

被挂载的那台机子准备挂载目录[因为单机,直接用HostPath了]

# 创建数据目录
sudo mkdir -p /mnt/data/mysql

# 设定权限(mysql:8.0 的容器内 mysql 默认 uid=999)
sudo chown -R 999:999 /mnt/data/mysql

配置yaml

# mysql-single.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: mysql
---
apiVersion: v1
kind: Secret
metadata:
  name: mysql-secret
  namespace: mysql
type: Opaque
stringData:
  root-password: "admin@123"   # <-- 请替换为你的密码
---
# ConfigMap 用于管理 MySQL 默认配置
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-conf
  namespace: mysql
data:
  # 这里写一些 MySQL 默认配置示例
  mysqld.cnf: |
    [mysqld]
    sql_mode=STRICT_TRANS_TABLES
    max_connections=200
    innodb_buffer_pool_size=128M
    character-set-server=utf8mb4
    collation-server=utf8mb4_general_ci
---
apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: mysql
spec:
  clusterIP: None
  selector:
    app: mysql-single
  ports:
    - name: mysql
      port: 3306
      targetPort: 3306
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-nodeport
  namespace: mysql
spec:
  type: NodePort
  selector:
    app: mysql-single
  ports:
    - name: mysql
      port: 3306
      targetPort: 3306
      nodePort: 30306   # 外部访问端口
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql-single
  namespace: mysql
spec:
  serviceName: "mysql"
  replicas: 1
  selector:
    matchLabels:
      app: mysql-single
  podManagementPolicy: Parallel
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: mysql-single
    spec:
      # 这里指定调度
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:   # 硬策略
            nodeSelectorTerms:
              - matchExpressions:
                  - key: kubernetes.io/hostname
                    operator: In
                    values:
                      - work4
      containers:
      - name: mysql
        image: mysql:8.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 3306
          name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: root-password
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
        - name: mysql-conf
          mountPath: /etc/mysql/conf.d   # <-- 改为挂载 ConfigMap
        readinessProbe:
          exec:
            command:
              - /bin/sh
              - -c
              - "mysqladmin ping -uroot -p$MYSQL_ROOT_PASSWORD --silent"
          initialDelaySeconds: 15
          periodSeconds: 10
          timeoutSeconds: 5
        # 存活探针,这个可能会破坏事故现场
        # livenessProbe:
        #   exec:
        #     command:
        #       - /bin/sh
        #       - -c
        #       - "mysqladmin ping -uroot -p$MYSQL_ROOT_PASSWORD --silent"
        #   initialDelaySeconds: 30
        #   periodSeconds: 20
        resources:
          requests:
            cpu: "100m"
            memory: "256Mi"
          limits:
            cpu: "500m"
            memory: "1Gi"
      volumes:
      - name: mysql-data
        hostPath:
          path: /mnt/data/mysql       # <-- 本机数据目录(请先创建并 chown 999:999)
          type: Directory
      - name: mysql-conf
        configMap:
          name: mysql-conf

应用:

kubectl apply -f ./mysql-single.yaml
kubectl -n mysql get pods,svc,sts -o wide
posted @ 2025-12-02 18:13  beamsoflight  阅读(3)  评论(0)    收藏  举报