Giter Site home page Giter Site logo

mysql-operator's Introduction

MySQL Operator

MySQL Operator-SDK创建,配置和管理在Kubernetes上运行的MySQL InnoDB集群。它不适用于MySQL NDB群集。

目前发布仅为测试版,且尚未支持PVC,您应对数据和数据库集群的运行负责。在第一个主要版本发布之前,可能会有向后不兼容的更改。

特征

当前版本仅提供以下核心功能(2020-05-01):

  • 轻松创建和删除Kubernetes中的高可用MySQL InnoDB集群

要求

  • Kubernetes 1.8.0 +

入门

1、向目标kubernetes集群注册CRD

[root@master mysql-operator]# kubectl create -f deploy/crds/ops.iflytek.com_mysqloperators_crd.yaml 
customresourcedefinition.apiextensions.k8s.io/mysqloperators.ops.iflytek.com created

请注意:完成此操作后,有两种方法可以运行该operator,我这里只介绍在集群中部署:

  • 作为Kubernetes集群中的部署
  • 集群外的Go程序

2、设置RBAC并部署Mysql-operator

[root@master mysql-operator]# kubectl apply -f deploy
namespace/mysql-operator created
deployment.apps/mysql-operator created
role.rbac.authorization.k8s.io/mysql-operator created
rolebinding.rbac.authorization.k8s.io/mysql-operator created
serviceaccount/mysql-operator created

#您应看到下列四个资源
[root@master mysql-operator]# kubectl get -n mysql-operator all
NAME                                  READY   STATUS    RESTARTS   AGE
pod/mysql-operator-859dcfd55b-spjrl   1/1     Running   0          7m55s

NAME                             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
service/mysql-operator-metrics   ClusterIP   10.100.74.194   <none>        8383/TCP,8686/TCP   6m27s

NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/mysql-operator   1/1     1            1           7m55s

NAME                                        DESIRED   CURRENT   READY   AGE
replicaset.apps/mysql-operator-859dcfd55b   1         1         1       7m55s

我这里是创建了一个名为mysql-operator的名称空间,并将RBAC等全部丢了进去,接下来启动的mysql实例也将在这个名称空间内。

3、创建Mysql实例

root@jwping:/mnt/d/GoPath/src/github.com/jwping/mysql-operator# cat example/innodb-cluster.yaml
apiVersion: ops.iflytek.com/v1alpha1
kind: MysqlOperator
metadata:
  name: mysql-operator
  namespace: mysql-operator
spec:
  mysql:
    size: 3
    image: mysql/mysql-server:8.0.19
    multiMaster: true
    volumeSource:
      hostPath:
        path: /data/mysqldata
    envs:
    - name: MYSQL_ROOT_PASSWORD
      value: R00Tmysql
    ports:
    - port: 3306
      targetPort: 3306

[root@master mysql-operator]# kubectl apply -f example/innodb-cluster.yaml 
mysqloperator.ops.iflytek.com/mysql-operator created
  • 例子中的size指定为3,通过修改该参数可指定mysql实例的数量
  • 请确保使用的的镜像为mysql-server而非mysql
  • 可以使用volumeSource指定每个实例的持久化存储点(容器内挂载点为/var/lib/mysql数据目录,当前版本暂不支持修改),支持nfs、hostPath、awsElasticBlockStore、iscsi等挂载模式,同步官方。
  • 通过multiMaster: true可指定开启多主模式
  • 修改MYSQL_ROOT_PASSWORDvalue可指定Mysql Root用户的密码,默认为R00Tmysql

请勿修改namespace,除非您在进行二次开发,如遇任何问题可提交Issues

4、查看operator日志

[root@master mysql-operator]# kubectl logs -f -n mysql-operator mysql-operator-859dcfd55b-9lvp2

...
{"level":"info","ts":1588232647.5787194,"logger":"controller_mysqloperator","msg":"Reconciling MysqlOperator","Request.Namespace":"mysql-operator","Request.Name":"mysql-operator"}
{"level":"info","ts":1588232647.7192173,"logger":"controller_mysqloperator","msg":"Reconciling MysqlOperator","Request.Namespace":"mysql-operator","Request.Name":"mysql-operator"}
{"level":"info","ts":1588232652.1367311,"logger":"controller_mysqloperator","msg":"Cluster not found, judge cluster not created"}
{"level":"info","ts":1588232667.1739464,"logger":"controller_mysqloperator","msg":"\nA new InnoDB cluster will be created on instance 'mysql-operator-0.mysql-operator.mysql-operator:3306'.\n\n\n\n\n{\"clusterName\": \"mysql_operator\", \"defaultReplicaSet\": {\"name\": \"default\", \"ssl\": \"REQUIRED\", \"status\": \"OK_NO_TOLERANCE\", \"statusText\": \"Cluster is NOT tolerant to any failures.\", \"topology\": {\"mysql-operator-0.mysql-operator:3306\": {\"address\": \"mysql-operator-0.mysql-operator:3306\", \"mode\": \"R/W\", \"readReplicas\": {}, \"replicationLag\": null, \"role\": \"HA\", \"status\": \"ONLINE\", \"version\": \"8.0.19\"}}, \"topologyMode\": \"Multi-Primary\"}, \"groupInformationSourceMember\": \"mysql-operator-0.mysql-operator:3306\"}\n"}
{"level":"info","ts":1588232675.4434505,"logger":"controller_mysqloperator","msg":"\n\n\n\n\n\nNone\n"}
{"level":"info","ts":1588232691.781496,"logger":"controller_mysqloperator","msg":"\n\n\n\n\n\nNone\n"}
{"level":"info","ts":1588232691.7815282,"logger":"controller_mysqloperator","msg":"Cluster created successfully, clean up abnormal nodes"}

如果一切顺利,您应看到如上日志。

二次开发

修改启动参数

默认的启动参数如下(位于GOPATH/src/github.com/jwping/mysql-operator/pkg/controller/operator.go:72):

--server_id=<pod.Name.Id>
--datadir=/var/lib/mysql
--user=mysql
--gtid_mode=ON
--log-bin
--binlog_checksum=NONE
--enforce_gtid_consistency=ON
--log-slave-updates=ON
--binlog-format=ROW
--master-info-repository=TABLE
--relay-log-info-repository=TABLE
--transaction-write-set-extraction=XXHASH64
--relay-log=<pod.Name>-relay-bin
--report-host=<pod.Name>.<app.Name>
--log-error-verbosity=3

该文件下定义了operator的具体实现

修改innodb.go

这里我引用并修改了oracle仓库下的mysql-operator部分代码,所以您在二次开发时需要修改对应的结构体或定制(GOPATH/src/github.com/oracle/mysql-operator/pkg/cluster/innodb/innodb.go:116):

#ClusterStatus结构体增加GroupInformationSourceMember成员

// ClusterStatus represents the status of an InnoDB cluster
type ClusterStatus struct {
	ClusterName                  string     `json:"clusterName"`
	DefaultReplicaSet            ReplicaSet `json:"defaultReplicaSet"`
	GroupInformationSourceMember string     `json:"groupInformationSourceMember"`
}

如果您使用了go mod模块,那么请在GOPATH/pkg/mod/github.com/oracle目录下进行修改!

编译镜像

构建mysql-operator映像并将其推送到镜像仓库。以下示例使用阿里云作为源。

[root@master mysql-operator]# operator-sdk build registry.cn-shanghai.aliyuncs.com/anshan/mysql-operator:v0.0.1
INFO[0002] Building OCI image registry.cn-shanghai.aliyuncs.com/anshan/mysql-operator:v0.0.1 
Sending build context to Docker daemon  86.57MB
Step 1/7 : FROM registry.access.redhat.com/ubi8/ubi:latest
 ---> 8121a9f5303b
Step 2/7 : ENV OPERATOR=/usr/local/bin/mysql-operator     USER_UID=1001     USER_NAME=mysql-operator
 ---> Using cache
 ---> 0bd7a34dbbb4
...
Step 7/7 : USER ${USER_UID}
 ---> Running in 9360f99b7437
Removing intermediate container 9360f99b7437
 ---> b826281dd49c
Successfully built b826281dd49c
Successfully tagged registry.cn-shanghai.aliyuncs.com/anshan/mysql-operator:v0.0.1
INFO[0661] Operator build complete. 

[root@master mysql-operator]# docker push registry.cn-shanghai.aliyuncs.com/anshan/mysql-operator:v0.0.1

接下来替换operator.yaml文件中的字符串REPLACE_IMAGE为您的镜像registry.cn-shanghai.aliyuncs.com/anshan/mysql-operator:v0.0.1,请确认您的operator.yaml文件已成功更新。

[root@master mysql-operator]# sed -i 's|REPLACE_IMAGE|registry.cn-shanghai.aliyuncs.com/anshan/mysql-operator:v0.0.1|g' deploy/operator.yaml

[root@master mysql-operator]# cat deploy/operator.yaml
...
spec:
      serviceAccountName: mysql-operator
      containers:
        - name: mysql-operator
          # Replace this with the built image name
          image: registry.cn-shanghai.aliyuncs.com/anshan/mysql-operator:v0.0.1
          command:
          - mysql-operator
          imagePullPolicy: Always
...

接下来您可以按照入门步骤来进行部署Mysql-operator

**重点提示:**确保您的群集能够拉取推送到仓库的映像。

mysql-operator's People

Contributors

jwping avatar

Watchers

 avatar  avatar

mysql-operator's Issues

"logger":"controller_mysqloperator","msg":"Cluster not found, judge cluster not created

1
{"level":"dpanic","ts":1608454851.5913348,"logger":"controller_mysqloperator","msg":"odd number of arguments passed as key-value pairs for logging","ignored key":"MySQL Cluster Controller","stacktrace":"github.com/go-logr/zapr.handleFields\n\tmysql-operator/vendor/github.com/go-logr/zapr/zapr.go:106\ngithub.com/go-logr/zapr.(*zapLogger).WithValues\n\tmysql-operator/vendor/github.com/go-logr/zapr/zapr.go:145\nsigs.k8s.io/controller-runtime/pkg/log.(*loggerPromise).Fulfill\n\tmysql-operator/vendor/sigs.k8s.io/controller-runtime/pkg/log/deleg.go:72\nsigs.k8s.io/controller-runtime/pkg/log.(*loggerPromise).Fulfill\n\tmysql-operator/vendor/sigs.k8s.io/controller-runtime/pkg/log/deleg.go:79\nsigs.k8s.io/controller-runtime/pkg/log.(*loggerPromise).Fulfill\n\tmysql-operator/vendor/sigs.k8s.io/controller-runtime/pkg/log/deleg.go:79\nsigs.k8s.io/controller-runtime/pkg/log.(*DelegatingLogger).Fulfill\n\tmysql-operator/vendor/sigs.k8s.io/controller-runtime/pkg/log/deleg.go:124\nsigs.k8s.io/controller-runtime/pkg/log.SetLogger\n\tmysql-operator/vendor/sigs.k8s.io/controller-runtime/pkg/log/log.go:42\nmain.main\n\tmysql-operator/cmd/manager/main.go:72\nruntime.main\n\t/usr/local/Cellar/go/1.15.5/libexec/src/runtime/proc.go:204"}
2
{"level":"info","ts":1608454851.5914645,"logger":"cmd","msg":"Operator Version: 0.0.1"}
3
{"level":"info","ts":1608454851.591475,"logger":"cmd","msg":"Go Version: go1.15.5"}
4
{"level":"info","ts":1608454851.591485,"logger":"cmd","msg":"Go OS/Arch: linux/amd64"}
5
{"level":"info","ts":1608454851.5914967,"logger":"cmd","msg":"Version of operator-sdk: v0.17.0"}
6
{"level":"info","ts":1608454851.59173,"logger":"leader","msg":"Trying to become the leader."}
7
{"level":"info","ts":1608454853.25576,"logger":"leader","msg":"No pre-existing lock was found."}
8
{"level":"info","ts":1608454853.2663705,"logger":"leader","msg":"Became the leader."}
9
{"level":"info","ts":1608454854.919407,"logger":"controller-runtime.metrics","msg":"metrics server is starting to listen","addr":"0.0.0.0:8383"}
10
{"level":"info","ts":1608454854.9196131,"logger":"cmd","msg":"Registering Components."}
11
{"level":"info","ts":1608454858.2424543,"logger":"metrics","msg":"Metrics Service object created","Service.Name":"mysql-operator-metrics","Service.Namespace":"mysql-operator"}
12
{"level":"info","ts":1608454859.8936434,"logger":"cmd","msg":"Could not create ServiceMonitor object","error":"no ServiceMonitor registered with the API"}
13
{"level":"info","ts":1608454859.893674,"logger":"cmd","msg":"Install prometheus-operator in your cluster to create ServiceMonitor objects","error":"no ServiceMonitor registered with the API"}
14
{"level":"info","ts":1608454859.8936899,"logger":"cmd","msg":"Starting the MysqlOperator"}
15
{"level":"info","ts":1608454859.8937068,"logger":"cmd","msg":"Starting the Cmd."}
16
{"level":"info","ts":1608454859.893873,"logger":"controller-runtime.manager","msg":"starting metrics server","path":"/metrics"}
17
{"level":"info","ts":1608454859.893933,"logger":"controller-runtime.controller","msg":"Starting EventSource","controller":"mysqloperator-controller","source":"kind source: /, Kind="}
18
{"level":"info","ts":1608454859.9942057,"logger":"controller-runtime.controller","msg":"Starting EventSource","controller":"mysqloperator-controller","source":"kind source: /, Kind="}
19
{"level":"info","ts":1608454860.0945332,"logger":"controller-runtime.controller","msg":"Starting Controller","controller":"mysqloperator-controller"}
20
{"level":"info","ts":1608454860.0945833,"logger":"controller-runtime.controller","msg":"Starting workers","controller":"mysqloperator-controller","worker count":1}
21
{"level":"info","ts":1608454914.29189,"logger":"controller_mysqloperator","msg":"Reconciling MysqlOperator","Request.Namespace":"mysql-operator","Request.Name":"mysql-operator"}
22

23
VolumeSource: {&HostPathVolumeSource{Path:/data/mysqldata,Type:nil,} nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil}
24
{"level":"info","ts":1608454914.431746,"logger":"controller_mysqloperator","msg":"Reconciling MysqlOperator","Request.Namespace":"mysql-operator","Request.Name":"mysql-operator"}
25
{"level":"info","ts":1608454951.7854257,"logger":"controller_mysqloperator","msg":"Cluster not found, judge cluster not created"}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.