首页 > 解决方案 > 无法在 k8s 上创建两个 mysql pod

问题描述

我正在尝试在一个集群中运行两个 mysql pod。第一个 mysql pod 使用 hdd 作为存储。第二个 mysql pod 使用 ssd 作为存储。第一个 pod 工作。但是第二个吊舱陷入“崩溃循环”。

我使用两个 .yaml 文件制作了两个 pod。这些文件在这里。

deployMysqlHdd.yaml(第一个 pod。这行得通。)

---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-hdd-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysqlpersistentvolume
spec:
  capacity:
    storage: 1000Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-hdd-storage
  local:
    path: /k8sLocalStorage/mysql
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: disktype
          operator: In
          values:
          - hdd
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysqlvolumeclaim
spec:
  accessModes:
    - ReadWriteMany
  volumeMode: Filesystem
  resources:
    requests:
      storage: 1000Gi
  storageClassName: local-hdd-storage
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-nodeport
spec:
  type: NodePort
  ports:
    - name: mysql-port
      port: 3306
      targetPort: 3306
      nodePort: 3306
  selector:
    name: mysql
---
apiVersion: v1
kind: Secret
metadata:
  name: mysql-auth
type: Opaque
stringData:
  password: **********
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysqldeployment
spec:
  replicas: 1
  selector:
    matchLabels:
      name: mysql
  template:
    metadata:
      labels:
        name: mysql
    spec:
      containers:
      - name: mysql
        image: mysql
        env:
          - name: MYSQL_ROOT_PASSWORD
            valueFrom:
              secretKeyRef:
                name: mysql-auth
                key: password
        volumeMounts:
          - name: mysqlvolumes
            mountPath: /var/lib/mysql
      volumes:
        - name: mysqlvolumes
          persistentVolumeClaim:
            claimName: mysqlvolumeclaim
---

deployMysqlSSD.yaml(第二个 pod。这不起作用。)

---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: intelnuc-local-mysql-storageclass
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: intelnuc-mysql-persistentvolume
spec:
  capacity:
    storage: 500Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: intelnuc-local-mysql-storageclass
  local:
    path: /k8sNodeData/mysql
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: disktype
          operator: In
          values:
          - ssd
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: intelnuc-mysql-persistentvolumeclaim
spec:
  accessModes:
    - ReadWriteMany
  volumeMode: Filesystem
  resources:
    requests:
      storage: 500Gi
  storageClassName: intelnuc-local-mysql-storageclass
---
apiVersion: v1
kind: Service
metadata:
  name: intelnuc-mysql-nodeport
spec:
  type: NodePort
  ports:
    - name: intelnuc-mysql-port
      port: 3306
      targetPort: 3306
      nodePort: 3307
  selector:
    name: mysql-high-resource
---
apiVersion: v1
kind: Secret
metadata:
  name: intelnuc-mysql-auth
type: Opaque
stringData:
  password: ***********
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: intelnuc-mysql-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      name: intelnuc-mysql
  template:
    metadata:
      labels:
        name: intelnuc-mysql
    spec:
      containers:
      - name: intelnuc-mysql
        image: mysql
        env:
          - name: MYSQL_ROOT_PASSWORD
            valueFrom:
              secretKeyRef:
                name: intelnuc-mysql-auth
                key: password
        volumeMounts:
          - name: intelnuc-mysql-volumes
            mountPath: /var/lib/mysql
      volumes:
        - name: intelnuc-mysql-volumes
          persistentVolumeClaim:
            claimName: intelnuc-mysql-persistentvolumeclaim
---

大约第二个 pod的结果kubectl describe pod就在这里。

Name:         intelnuc-mysql-deployment-9685c849-mvg4p
Namespace:    default
Priority:     0
Node:         intelnuc/192.168.1.10
Start Time:   Sat, 19 Sep 2020 06:37:16 +0000
Labels:       name=intelnuc-mysql
              pod-template-hash=9685c849
Annotations:  <none>
Status:       Running
IP:           10.244.2.23
IPs:
  IP:           10.244.2.23
Controlled By:  ReplicaSet/intelnuc-mysql-deployment-9685c849
Containers:
  intelnuc-mysql:
    Container ID:   docker://8bbe74e6d90cce313be9e8708319470a85a25a98742bc0472bcda193be91d277
    Image:          mysql
    Image ID:       docker-pullable://mysql@sha256:e1bfe11693ed2052cb3b4e5fa356c65381129e87e38551c6cd6ec532ebe0e808
    Port:           <none>
    Host Port:      <none>
    State:          Terminated
      Reason:       Error
      Exit Code:    1
      Started:      Sat, 19 Sep 2020 06:38:13 +0000
      Finished:     Sat, 19 Sep 2020 06:38:13 +0000
    Last State:     Terminated
      Reason:       Error
      Exit Code:    1
      Started:      Sat, 19 Sep 2020 06:37:43 +0000
      Finished:     Sat, 19 Sep 2020 06:37:43 +0000
    Ready:          False
    Restart Count:  3
    Environment:
      MYSQL_ROOT_PASSWORD:  <set to the key 'password' in secret 'intelnuc-mysql-auth'>  Optional: false
    Mounts:
      /var/lib/mysql from intelnuc-mysql-volumes (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-6m588 (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             False 
  ContainersReady   False 
  PodScheduled      True 
Volumes:
  intelnuc-mysql-volumes:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  intelnuc-mysql-persistentvolumeclaim
    ReadOnly:   false
  default-token-6m588:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-6m588
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason     Age                From               Message
  ----     ------     ----               ----               -------
  Normal   Scheduled  <unknown>          default-scheduler  Successfully assigned default/intelnuc-mysql-deployment-9685c849-mvg4p to intelnuc
  Normal   Pulling    10s (x4 over 63s)  kubelet, intelnuc  Pulling image "mysql"
  Normal   Pulled     7s (x4 over 60s)   kubelet, intelnuc  Successfully pulled image "mysql"
  Normal   Created    7s (x4 over 60s)   kubelet, intelnuc  Created container intelnuc-mysql
  Normal   Started    7s (x4 over 60s)   kubelet, intelnuc  Started container intelnuc-mysql
  Warning  BackOff    6s (x5 over 56s)   kubelet, intelnuc  Back-off restarting failed container

我认为第二个 pod 上的 NodePort 服务设置错误,我曾尝试更改设置。但我无法解决这个问题。

我想知道在哪里修复它。


附加信息。

的结果在kubectl logs <podname>这里。

2020-09-20 07:33:20+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.21-1debian10 started.
2020-09-20 07:33:20+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2020-09-20 07:33:20+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.21-1debian10 started.
2020-09-20 07:33:20+00:00 [Note] [Entrypoint]: Initializing database files
2020-09-20T07:33:20.840302Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.21) initializing of server in progress as process 43
2020-09-20T07:33:20.841379Z 0 [ERROR] [MY-010457] [Server] --initialize specified but the data directory has files in it. Aborting.
2020-09-20T07:33:20.841384Z 0 [ERROR] [MY-013236] [Server] The designated data directory /var/lib/mysql/ is unusable. You can remove all files that the server added to it.
2020-09-20T07:33:20.841423Z 0 [ERROR] [MY-010119] [Server] Aborting
2020-09-20T07:33:20.841495Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.21)  MySQL Community Server - GPL.

标签: mysqlkubernetes

解决方案


我认为,问题是因为第二个服务的标签与部署的标签不匹配。能否请您更改并重试。

就像代替服务标签“名称:mysql-high-resource”的选择器一样,尝试使用“名称:intelnuc-mysql”。

apiVersion: v1
kind: Service
metadata:
  name: intelnuc-mysql-nodeport
spec:
  type: NodePort
  ports:
  - name: intelnuc-mysql-port
    port: 3306
    targetPort: 3306
    nodePort: 3307
  selector:
    name: mysql-high-resource

推荐阅读