| # Copyright © 2017 Amdocs, Bell Canada |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| #{{ if not .Values.disableSdncSdncDbhost }} |
| apiVersion: apps/v1beta1 |
| kind: StatefulSet |
| metadata: |
| name: sdnc-dbhost |
| namespace: "{{ .Values.nsPrefix }}" |
| spec: |
| serviceName: "dbhost" |
| replicas: {{ .Values.numberOfDbReplicas }} |
| selector: |
| matchLabels: |
| app: sdnc-dbhost |
| template: |
| metadata: |
| labels: |
| app: sdnc-dbhost |
| name: sdnc-dbhost |
| spec: |
| initContainers: |
| - name: init-mysql |
| image: {{ .Values.image.mysql }} |
| imagePullPolicy: {{ .Values.pullPolicy }} |
| command: |
| - bash |
| - "-c" |
| - | |
| set -ex |
| # Generate mysql server-id from pod ordinal index. |
| [[ `hostname` =~ -([0-9]+)$ ]] || exit 1 |
| ordinal=${BASH_REMATCH[1]} |
| echo BASH_REMATCH=${BASH_REMATCH} |
| echo [mysqld] > /mnt/conf.d/server-id.cnf |
| # Add an offset to avoid reserved server-id=0 value. |
| echo server-id=$((100 + $ordinal)) >> /mnt/conf.d/server-id.cnf |
| # Copy appropriate conf.d files from config-map to emptyDir. |
| if [[ $ordinal -eq 0 ]]; then |
| cp /mnt/config-map/master.cnf /mnt/conf.d/ |
| else |
| cp /mnt/config-map/slave.cnf /mnt/conf.d/ |
| fi |
| volumeMounts: |
| - name: conf |
| mountPath: /mnt/conf.d |
| - name: config-map |
| mountPath: /mnt/config-map |
| - name: clone-mysql |
| image: {{ .Values.image.xtrabackup }} |
| env: |
| - name: MYSQL_ROOT_PASSWORD |
| value: openECOMP1.0 |
| command: |
| - bash |
| - "-c" |
| - | |
| set -ex |
| # Skip the clone if data already exists. |
| [[ -d /var/lib/mysql/mysql ]] && exit 0 |
| # Skip the clone on master (ordinal index 0). |
| [[ `hostname` =~ -([0-9]+)$ ]] || exit 1 |
| ordinal=${BASH_REMATCH[1]} |
| echo ${BASH_REMATCH} |
| [[ $ordinal -eq 0 ]] && exit 0 |
| # Clone data from previous peer. |
| ncat --recv-only sdnc-dbhost-$(($ordinal-1)).dbhost.{{ .Values.nsPrefix }} 3307 | xbstream -x -C /var/lib/mysql |
| # Prepare the backup. |
| xtrabackup --user=root --password=$MYSQL_ROOT_PASSWORD --prepare --target-dir=/var/lib/mysql |
| ls -l /var/lib/mysql |
| volumeMounts: |
| - name: sdnc-data |
| mountPath: /var/lib/mysql |
| #{{ if not .Values.disableNfsProvisioner }} |
| subPath: mysql |
| #{{ end }} |
| - name: conf |
| mountPath: /etc/mysql/conf.d |
| containers: |
| - env: |
| - name: MYSQL_ROOT_PASSWORD |
| value: openECOMP1.0 |
| - name: MYSQL_ROOT_HOST |
| value: '%' |
| - name: MYSQL_ALLOW_EMPTY_PASSWORD |
| value: "0" |
| image: {{ .Values.image.mysql }} |
| imagePullPolicy: {{ .Values.pullPolicy }} |
| name: sdnc-db-container |
| volumeMounts: |
| - mountPath: /var/lib/mysql |
| name: sdnc-data |
| #{{ if not .Values.disableNfsProvisioner }} |
| subPath: mysql |
| #{{ end }} |
| - name: conf |
| mountPath: /etc/mysql/conf.d |
| ports: |
| - containerPort: 3306 |
| resources: |
| requests: |
| cpu: 500m |
| memory: 1Gi |
| livenessProbe: |
| exec: |
| command: ["mysqladmin", "ping"] |
| initialDelaySeconds: 30 |
| periodSeconds: 10 |
| timeoutSeconds: 5 |
| readinessProbe: |
| tcpSocket: |
| port: 3306 |
| initialDelaySeconds: 5 |
| periodSeconds: 10 |
| - name: xtrabackup |
| image: {{ .Values.image.xtrabackup }} |
| env: |
| - name: MYSQL_ROOT_PASSWORD |
| value: openECOMP1.0 |
| ports: |
| - name: xtrabackup |
| containerPort: 3307 |
| command: |
| - bash |
| - "-c" |
| - | |
| set -ex |
| cd /var/lib/mysql |
| ls -l |
| # Determine binlog position of cloned data, if any. |
| if [[ -f xtrabackup_slave_info ]]; then |
| echo "Inside xtrabackup_slave_info" |
| # XtraBackup already generated a partial "CHANGE MASTER TO" query |
| # because we're cloning from an existing slave. |
| mv xtrabackup_slave_info change_master_to.sql.in |
| # Ignore xtrabackup_binlog_info in this case (it's useless). |
| rm -f xtrabackup_binlog_info |
| elif [[ -f xtrabackup_binlog_info ]]; then |
| echo "Inside xtrabackup_binlog_info" |
| # We're cloning directly from master. Parse binlog position. |
| [[ `cat xtrabackup_binlog_info` =~ ^(.*?)[[:space:]]+(.*?)$ ]] || exit 1 |
| rm xtrabackup_binlog_info |
| echo "CHANGE MASTER TO MASTER_LOG_FILE='${BASH_REMATCH[1]}',\ |
| MASTER_LOG_POS=${BASH_REMATCH[2]}" > change_master_to.sql.in |
| fi |
| |
| # Check if we need to complete a clone by starting replication. |
| if [[ -f change_master_to.sql.in ]]; then |
| echo "Waiting for mysqld to be ready (accepting connections)" |
| [[ `hostname` =~ -([0-9]+)$ ]] || exit 1 |
| ordinal=${BASH_REMATCH[1]} |
| echo $ordinal |
| until mysql --user=root --password=$MYSQL_ROOT_PASSWORD -h 127.0.0.1 -e "SELECT 1"; do sleep 1; done |
| |
| echo "Initializing replication from clone position" |
| # In case of container restart, attempt this at-most-once. |
| mv change_master_to.sql.in change_master_to.sql.orig |
| mysql --user=root --password=$MYSQL_ROOT_PASSWORD -h 127.0.0.1 <<EOF |
| $(<change_master_to.sql.orig), |
| MASTER_HOST="sdnc-dbhost-0.dbhost.{{ .Values.nsPrefix }}", |
| MASTER_USER="root", |
| MASTER_PASSWORD="$MYSQL_ROOT_PASSWORD", |
| MASTER_CONNECT_RETRY=10; |
| START SLAVE; |
| EOF |
| fi |
| |
| # Start a server to send backups when requested by peers. |
| exec ncat --listen --keep-open --send-only --max-conns=1 3307 -c \ |
| "xtrabackup --user=root --password=$MYSQL_ROOT_PASSWORD --backup --slave-info --stream=xbstream --host=127.0.0.1" |
| volumeMounts: |
| - name: sdnc-data |
| mountPath: /var/lib/mysql |
| #{{ if not .Values.disableNfsProvisioner }} |
| subPath: mysql |
| #{{ end }} |
| - name: conf |
| mountPath: /etc/mysql/conf.d |
| resources: |
| requests: |
| cpu: 100m |
| memory: 100Mi |
| volumes: |
| - name: conf |
| emptyDir: {} |
| - name: config-map |
| configMap: |
| name: sdnc-mysql |
| - name: localtime |
| hostPath: |
| path: /etc/localtime |
| #{{ if .Values.disableNfsProvisioner }} |
| - name: sdnc-data |
| hostPath: |
| path: {{ .Values.dataRootDir }}/{{ .Values.nsPrefix }}/sdnc/data/mysql |
| #{{ else }} |
| volumeClaimTemplates: |
| - metadata: |
| name: sdnc-data |
| annotations: |
| volume.beta.kubernetes.io/storage-class: "{{ .Values.nsPrefix }}-sdnc-data" |
| spec: |
| accessModes: ["ReadWriteMany"] |
| resources: |
| requests: |
| storage: 1Gi |
| #{{ end }} |
| #{{ end }} |
| |