登录
首页 >  数据库 >  MySQL

Deploy MySQL using Helm in Kubernetes with Persistent Volume

来源:SegmentFault

时间:2023-02-20 20:38:53 263浏览 收藏

小伙伴们对数据库编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《Deploy MySQL using Helm in Kubernetes with Persistent Volume》,就很适合你,本篇文章讲解的知识点主要包括MySQL、docker、yaml、kubernetes。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

How to deploy MySQL-Server Docker using Helm Chart in Kubernetes with Persistent Volume!

  1. Pull MySQL Server docker image from Docker repository, tag it as
    appreciate, then push to private repository.

    image:
      pullPolicy: IfNotPresent
      repository: qio01:5000/mysql-server
      tag: latest
    persistence:
      accessMode: ReadWriteOnce
      enabled: true
      size: 40Gi
      storageClass: standard
    resources:
      requests:
        memory: 512Mi
        cpu: 500m
    serviceType: ClusterIP
    mysqldbPassword: password
  2. Create secret.yaml. If you have defined the mysqlRootPassword, the password will be configured. You could define a different password for root in the values.yaml by setting mysqlRootPassword.

    apiVersion: v1
    kind: Secret
    metadata:
      name: {{ template "fullname" . }}
      labels:
        app: {{ template "fullname" . }}
        chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
        release: "{{ .Release.Name }}"
        heritage: "{{ .Release.Service }}"
    type: Opaque
    data:
      mysqldb-root-password: {{ default "" .Values.mysqlRootPassword | b64enc | quote }}
      mysqldb-password: {{ default "" .Values.mysqldbPassword | b64enc | quote }}
    {{- if .Values.mysqlRootPassword }}
      data-source-name: {{ printf "root%s@(localhost:3306)/" .Values.mysqlRootPassword | b64enc | quote}}
    {{- else }}
      data-source-name: {{ printf "root@(localhost:3306)/" | b64enc | quote}}
    {{- end }}
  3. Edit deployment.yaml. A few things you might be interested to look at. The env configurations. MySQL user password, root password, default database, and allow for empty password all can be found here. The most important configuration is the mountPath of volumeMounts. This is for persistent storage, you need to set the mountPath correctly, different MySQL distribution will use different path.

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: {{ template "fullname" . }}
      labels:
        app: {{ template "fullname" . }}
        chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
        release: "{{ .Release.Name }}"
        heritage: "{{ .Release.Service }}"
    spec:
      template:
        metadata:
          labels:
            app: {{ template "fullname" . }}
            release: {{ .Release.Name }}
            component: "{{.Release.Name}}"
            nautilian.snapshot.enabled: "true"
        spec:
          containers:
          - name: {{ template "fullname" . }}
            image: {{ .Values.image.repository}}:{{ .Values.image.tag}}
            imagePullPolicy: {{ .Values.image.pullPolicy }}
            env:
            - name: MYSQLDB_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: {{ template "fullname" . }}
                  key: mysqldb-root-password
            - name: MYSQLDB_USER
              value: {{ default "" .Values.mysqldbUser | quote }}
            - name: MYSQLDB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: {{ template "fullname" . }}
                  key: mysqldb-password
            - name: MYSQLDB_DATABASE
              value: {{ default "" .Values.mysqldbDatabase | quote }}
            - name: ALLOW_EMPTY_PASSWORD
              value: "yes"
            ports:
            - name: mysql
              containerPort: 3306
            livenessProbe:
              exec:
                command:
                - mysqladmin
                - ping
              initialDelaySeconds: 30
              timeoutSeconds: 5
            readinessProbe:
              exec:
                command:
                - mysqladmin
                - ping
              initialDelaySeconds: 5
              timeoutSeconds: 1
            resources:
    {{ toYaml .Values.resources | indent 10 }}
            volumeMounts:
            - name: data
              mountPath: /var/lib/mysql
          volumes:
          - name: config
            configMap:
              name: {{ template "fullname" . }}
          - name: data
          {{- if .Values.persistence.enabled }}
            persistentVolumeClaim:
              claimName: {{ .Values.persistence.existingClaim | default (include "fullname" .) }}
          {{- else }}
            emptyDir: {}
          {{- end -}}
  4. Create svc.yaml to create a service in kubernetes.

    apiVersion: v1
    kind: Service
    metadata:
      name: {{ template "fullname" . }}
      labels:
        app: {{ template "fullname" . }}
        chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
        release: "{{ .Release.Name }}"
        heritage: "{{ .Release.Service }}"
    spec:
      type: {{ .Values.serviceType }}
      ports:
      - name: mysql
        port: 3306
        targetPort: 3306
      selector:
        app: {{ template "fullname" . }}
  5. Create pvc.yaml for the persistent volume.

    {{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) }}
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: {{ template "fullname" . }}
      labels:
        app: {{ template "fullname" . }}
        chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
        release: "{{ .Release.Name }}"
        heritage: "{{ .Release.Service }}"
      annotations:
      {{- if .Values.persistence.storageClass }}
        volume.beta.kubernetes.io/storage-class: {{ .Values.persistence.storageClass | quote }}
      {{- else }}
        volume.alpha.kubernetes.io/storage-class: default
      {{- end }}
    spec:
      accessModes:
        - {{ .Values.persistence.accessMode | quote }}
      resources:
        requests:
          storage: {{ .Values.persistence.size | quote }}
    {{- end }}
  6. Deploy using helm install.

    $ helm install  --name  --namespace  name
  7. Login to the shell of the Pod to do MySQL configurations. Grant all privileges on that database and (in the future) tables. WITH GRANT OPTION creates a MySQL user that can edit the permissions of other users.

    ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password';
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
    FLUSH PRIVILEGES;

今天关于《Deploy MySQL using Helm in Kubernetes with Persistent Volume》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>