赞
踩
导航:
- 一、前提
- 1.版本信息-2.查看方法-3.查看k8s集群节点状态-4.配置docker仓库下载加速
- 二、安装部署helm
- 1.下载软件包-2.安装helm-3.初始化
- 三、使用helm安装mysql
- 1.搜索mysql的helm包-2.准备后端存储-3.准备docker image-4.配置集群内的kube-dns-5.安装mysql的helm包-6.查看mysql的有状态应用、pod、svc、pvc等k8s资源-7.客户端验证
- 四、故障排除
- 五、参考资料
使用helm安装有状态应用mysql主备集群,首先确保你已经搭建好一个3节点的k8s集群(如何搭建k8s集群、k8s集群网络配置flannel请参考百度)。
- k8s: v1.5.2
- docker: 1.13.1
- flannel:0.7.1
- helm: v3.0.0
- kubectl version
- docker version
- flanneld --version
- helm version
- [root@master ~]# kubectl get node
- NAME STATUS AGE
- master Ready 4d
- node2 Ready 18h
- node3 Ready 4m
- [root@master ~]#
使用163的国内docker仓库,提高docker image的下载速度。
- [root@master ~]# cat /etc/docker/daemon.json
- {"registry-mirrors": ["http://hub-mirror.c.163.com"]}
- [root@master ~]# systemctl restart docker #重启docker服务生效
- [root@master ~]#
使用helm的v3版本,v3版本不用配置服务端组件 Tiller。
下载helm的二进制包。
下载地址:
https://space.dingtalk.com/s/gwHOAF91cwLOABfU0gPaACBkNjc5YmMwMDUzZmQ0YWQwYjg2MmNhZWRiMGU3YmU1ZA 密码: 5kEK
使用xshell或者winscp将安装包传输到linux中。
- [root@master ~]# tar -tvf helm-v3.0.0-alpha.1-linux-amd64.tar.gz #查看压缩包中的内容
- drwxr-xr-x circleci/circleci 0 2019-05-16 05:44 linux-amd64/
- -rwxr-xr-x circleci/circleci 39771936 2019-05-16 05:42 linux-amd64/helm
- -rw-r--r-- circleci/circleci 11373 2019-05-16 05:44 linux-amd64/LICENSE
- -rw-r--r-- circleci/circleci 3159 2019-05-16 05:44 linux-amd64/README.md
- [root@master ~]#
将二进制文件复制到$PATH路径下即可使用。
- [root@master ~]# which helm #查看helm二进制文件所在的路径,将helm复制到$PATH中即可直接使用,例如将helm放在/usr/bin/helm的路径
- /usr/bin/helm
- [root@master ~]# helm --help
- The Kubernetes package manager
-
- To begin working with Helm, run the 'helm init' command:
-
- $ helm init
-
- This will set up any necessary local configuration.
-
- Common actions from this point include:
-
- - helm search: search for charts
- - helm fetch: download a chart to your local directory to view
- - helm install: upload the chart to Kubernetes
- - helm list: list releases of charts
-
- Environment:
- $HELM_HOME set an alternative location for Helm files. By default, these are stored in ~/.helm
- $HELM_DRIVER set the backend storage driver. Values are: configmap, secret, memory
- $HELM_NO_PLUGINS disable plugins. Set HELM_NO_PLUGINS=1 to disable plugins.
- $KUBECONFIG set an alternative Kubernetes configuration file (default "~/.kube/config")
-
- Usage:
- helm [command]
-
- Available Commands:
- chart push, pull, tag, or remove Helm charts
- completion Generate autocompletions script for the specified shell (bash or zsh)
- create create a new chart with the given name
- dependency manage a chart's dependencies
- get download a named release
- help Help about any command
- history fetch release history
- home displays the location of HELM_HOME
- init initialize Helm client
- install install a chart
- lint examines a chart for possible issues
- list list releases
- package package a chart directory into a chart archive
- plugin add, list, or remove Helm plugins
- pull download a chart from a repository and (optionally) unpack it in local directory
- registry login to or logout from a registry
- repo add, list, remove, update, and index chart repositories
- rollback roll back a release to a previous revision
- search search for a keyword in charts
- show inspect a chart
- status displays the status of the named release
- template locally render templates
- test test a release or cleanup test artifacts
- uninstall uninstall a release
- upgrade upgrade a release
- verify verify that a chart at the given path has been signed and is valid
- version print the client version information
- Flags:
- --debug enable verbose output
- -h, --help help for helm
- --home string location of your Helm config. Overrides $HELM_HOME (default "/root/.helm")
- --kube-context string name of the kubeconfig context to use
- --kubeconfig string path to the kubeconfig file
- -n, --namespace string namespace scope for this request
- Use "helm [command] --help" for more information about a command.
- [root@master ~]#
使用helm前,需要初始化。
- [root@docker repository]# helm init --stable-repo-url=https://apphub.aliyuncs.com #配置helm使用的仓库为国内阿里云地址,国外的访问不了,而且比较慢
- Creating /root/.helm/repository/repositories.yaml
- Adding stable repo with URL: https://apphub.aliyuncs.com
- $HELM_HOME has been configured at /root/.helm.
- Happy Helming!
- [root@docker repository]# ls
- cache local repositories.yaml
- [root@docker repository]# cat repositories.yaml #helm初始化完后会有一个配置文件生成,下面是repositories.yaml的内容
- apiVersion: v1
- generated: "2019-08-25T07:08:38.917953914+08:00"
- repositories:
- - caFile: ""
- cache: /root/.helm/repository/cache/stable-index.yaml
- certFile: ""
- keyFile: ""
- name: stable
- password: ""
- url: https://apphub.aliyuncs.com
- username: ""
使用helm安装有状态应用mysql,使用到的docker镜像有:
- docker.io/mysql:latest
- docker.io/ist0ne/xtrabackup:latest
构建mysql的1主2从,主备集群,使用xtrabackup工具进行数据同步。
- [root@docker ~]# helm search mysql #搜索mysql的helm包
- NAME CHART VERSION APP VERSION DESCRIPTION
- apphub/mysql 6.3.1 8.0.17 Chart to create a Highly available MySQL cluster
- apphub/mysqldump 2.6.0 2.4.1 A Helm chart to help backup MySQL databases usi...
- apphub/mysqlha 1.0.0 5.7.13 MySQL cluster with a single master and zero or ...
- apphub/prometheus-mysql-exporter 0.5.1 v0.11.0 A Helm chart for prometheus mysql exporter with...
- stable/mysql 6.3.1 8.0.17 Chart to create a Highly available MySQL cluster
- stable/mysqldump 2.6.0 2.4.1 A Helm chart to help backup MySQL databases usi...
- stable/mysqlha 1.0.0 5.7.13 MySQL cluster with a single master and zero or ...
- stable/prometheus-mysql-exporter 0.5.1 v0.11.0 A Helm chart for prometheus mysql exporter with...
- apphub/percona 1.1.0 5.7.17 free, fully compatible, enhanced, open source d...
- apphub/percona-xtradb-cluster 1.0.1 5.7.19 free, fully compatible, enhanced, open source d...
- apphub/phpmyadmin 3.0.1 4.9.0-1 phpMyAdmin is an mysql administration frontend
- stable/percona 1.1.0 5.7.17 free, fully compatible, enhanced, open source d...
- stable/percona-xtradb-cluster 1.0.1 5.7.19 free, fully compatible, enhanced, open source d...
- stable/phpmyadmin 3.0.1 4.9.0-1 phpMyAdmin is an mysql administration frontend
- apphub/mariadb 6.8.1 10.3.17 Fast, reliable, scalable, and easy to use open-...
- apphub/mariadb-galera 0.2.1 10.3.17 MariaDB Galera is a multi-master database clust...
- stable/mariadb 6.8.1 10.3.17 Fast, reliable, scalable, and easy to use open-...
- stable/mariadb-galera 0.2.1 10.3.17 MariaDB Galera is a multi-master database clust...
由于mysql的helm包需要使用pv,而开源的k8s集群默认没有配置pv后端存储,因此需要手动添加nfs服务器(如何搭建nfs服务器请参考百度)为后端存储。
nfs配置:
- [root@master ~]# cat /etc/exports
- /nfsdata/pv001 *(rw,no_root_squash) #添加no_root_squash不压缩root权限,因为容器里会使用root权限写入数据,否则后面会有权限不足的报错
- /nfsdata/pv002 *(rw,no_root_squash)
- /nfsdata/pv003 *(rw,no_root_squash)
- [root@master ~]# ls -ld /nfsdata/ #配置目录的权限为nfsnobody
- drwxr-xr-x 5 nfsnobody nfsnobody 45 Aug 26 01:18 /nfsdata/
- [root@master ~]# ls -ll /nfsdata/
- total 0
- drwxr-xr-x 2 nfsnobody nfsnobody 6 Aug 26 01:18 pv001
- drwxr-xr-x 2 nfsnobody nfsnobody 6 Aug 26 01:18 pv002
- drwxr-xr-x 2 nfsnobody nfsnobody 6 Aug 26 01:18 pv003
- [root@master ~]#
创建pv的yaml文件:
- [root@master hrr]# cat pv.yml
- apiVersion: v1
- kind: PersistentVolume
- metadata:
- name: pv003
- spec:
- capacity:
- storage: 10Gi
- accessModes:
- - ReadWriteOnce #accessModes需要和pvc的模式一样
- nfs:
- path: /nfsdata/pv003
- server: 192.168.222.129
- [root@master hrr]#
创建pv:
- [root@docker hrr]# kubectl create -f pv.yml
- persistentvolume "pv003" created
- [root@docker hrr]#
查看pv:
- [root@master hrr]# kubectl get pv #Available表示没有被PVC使用
- NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE
- pv001 10Gi RWO Retain Available 26s
- pv002 10Gi RWO Retain Available 14s
- pv003 10Gi RWO Retain Available 3s
- [root@master hrr]#
- [root@master hrr]# kubectl get pv #Bound表示被PVC使用
- NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE
- pv001 10Gi RWO Retain Bound default/data-mysql-mysqlha-0 32s
- pv002 10Gi RWO Retain Bound default/data-mysql-mysqlha-1 17s
- pv003 10Gi RWO Retain Bound default/data-mysql-mysqlha-2 4s
- [root@master hrr]#
在安装mysql的helm包时需要mysql与xtrabackup的docker镜像。
- [root@docker docker]# docker pull docker.io/ist0ne/xtrabackup #下载xtrabackup镜像
- Using default tag: latest
- Trying to pull repository docker.io/ist0ne/xtrabackup ...
- latest: Pulling from docker.io/ist0ne/xtrabackup
- 386a066cd84a: Pull complete
- 40f175e652e1: Pull complete
- 5eb6b5905d55: Pull complete
- Digest: sha256:e5e5519b874363f1bf35541cef2caed5803645937e29834817be51b30aabc479
- Status: Downloaded newer image for docker.io/ist0ne/xtrabackup:latest
- [root@docker docker]#
- [root@docker docker]# docker pull docker.io/mysql #下载mysql镜像
查看本地的镜像:
- [root@master hrr]# docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- 192.168.222.129:5000/nginx latest 5a3221f0137b 9 days ago 126 MB
- docker.io/nginx latest 5a3221f0137b 9 days ago 126 MB
- docker.io/mysql latest 62a9f311b99c 11 days ago 445 MB
- mysql 5.7.13 62a9f311b99c 11 days ago 445 MB
- docker.io/ist0ne/xtrabackup latest c415dbd7af07 2 years ago 265 MB
- registry.cn-hangzhou.aliyuncs.com/kubeapps/gcr-xtrabackup 1.0 c415dbd7af07 2 years ago 265 MB
- 192.168.222.129:5000/pod-infrastructure latest f9d5de079539 5 years ago 240 kB
- docker.io/kubernetes/pause latest f9d5de079539 5 years ago 240 kB
- [root@master hrr]#
将镜像打tag,用于后面创建mysql的helm包:
- [root@docker hrr]# docker tag docker.io/mysql:latest mysql:5.7.13
- [root@docker docker]# docker tag docker.io/ist0ne/xtrabackup:latest registry.cn-hangzhou.aliyuncs.com/kubeapps/gcr-xtrabackup:1.0
将docker镜像导出,用于导入到其它k8s节点中:
- [root@master ~]# docker save mysql:5.7.13 -o mysql5713.tgz #将docker镜像导出,名为mysql5713.tgz
- [root@master ~]# docker save registry.cn-hangzhou.aliyuncs.com/kubeapps/gcr-xtrabackup:1.0 -o xtrabackup10.tgz
- [root@master ~]# scp mysql5713.tgz xtrabackup10.tgz root@192.168.222.130:
- root@192.168.222.130's password:
- mysql5713.tgz 100% 429MB 35.7MB/s 00:12
- xtrabackup10.tgz 100% 260MB 43.4MB/s 00:06
- [root@master ~]#
在其它k8s节点中导入docker镜像:
- [root@node2 ~]# docker load -i mysql5713.tgz #将导出的docker镜像mysql5713.tgz导入
- 8fa655db5360: Loading layer [==================================================>] 58.48 MB/58.48 MB
- f5741d086b76: Loading layer [==================================================>] 338.4 kB/338.4 kB
- 9f77b78f01a7: Loading layer [==================================================>] 10.44 MB/10.44 MB
- 7f33ce1066af: Loading layer [==================================================>] 4.472 MB/4.472 MB
- 1dd5f3e365cf: Loading layer [==================================================>] 1.536 kB/1.536 kB
- 65430c57aee2: Loading layer [==================================================>] 46.15 MB/46.15 MB
- bb1ef34119b2: Loading layer [==================================================>] 32.77 kB/32.77 kB
- 995fa4bb8afe: Loading layer [==================================================>] 3.584 kB/3.584 kB
- bdebd19e878f: Loading layer [==================================================>] 329.8 MB/329.8 MB
- 79a46f1eb9d0: Loading layer [==================================================>] 5.632 kB/5.632 kB
- 5b96d5043191: Loading layer [==================================================>] 9.728 kB/9.728 kB
- 647229410363: Loading layer [==================================================>] 1.536 kB/1.536 kB
- Loaded image: mysql:5.7.13
- [root@node2 ~]# docker load -i xtrabackup10.tgz
- fe4c16cbf7a4: Loading layer [==================================================>] 128.9 MB/128.9 MB
- 82d548d175dd: Loading layer [==================================================>] 9.216 kB/9.216 kB
- f85c58969eb0: Loading layer [==================================================>] 144 MB/144 MB
- Loaded image: registry.cn-hangzhou.aliyuncs.com/kubeapps/gcr-xtrabackup:1.0
- [root@node2 ~]#
node3做同样的操作。
- [root@master ~]# helm install mysql apphub/mysqlha
- NAME: mysql
- LAST DEPLOYED: 2019-08-25 09:43:33.16471802 +0800 CST m=+0.898633546
- NAMESPACE: default
- STATUS: deployed
-
- NOTES:
- The MySQL cluster is comprised of 3 MySQL pods: 1 master and 2 slaves. Each instance is accessible within the cluster through:
-
- <pod-name>.mysql-mysqlha
-
- `mysql-mysqlha-0.mysql-mysqlha` is designated as the master and where all writes should be executed against. Read queries can be executed against the `mysql-mysqlha-readonly` service which distributes connections across all MySQL pods.
-
- To connect to your database:
-
- 1. Obtain the root password:
-
- kubectl get secret --namespace default mysql-mysqlha -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo
-
- 2. Run a pod to use as a client:
-
- kubectl run mysql-client --image=mysql:5.7.13 -it --rm --restart='Never' --namespace default -- /bin/sh
-
- 3. To connect to Master service (read/write):
-
- mysql -h mysql-mysqlha-0.mysql-mysqlha -u root -p
-
- 4. To connect to slave service (read-only):
-
- mysql -h mysql-mysqlha-readonly -u root -p
- [root@master ~]#
安装完后,在本地会有mysql的helm包:
- [root@master archive]# pwd
- /root/.helm/cache/archive
- [root@master archive]# ls
- guestbook-0.2.0.tgz mysqlha-1.0.0.tgz
- [root@master archive]#
- [root@master archive]# tar -tvf mysqlha-1.0.0.tgz
- -rwxr-xr-x 0/0 378 2019-08-22 13:20 mysqlha/Chart.yaml
- -rwxr-xr-x 0/0 2561 2019-08-22 13:20 mysqlha/values.yaml
- -rwxr-xr-x 0/0 1216 2019-08-22 13:20 mysqlha/templates/NOTES.txt
- -rwxr-xr-x 0/0 961 2019-08-22 13:20 mysqlha/templates/_helpers.tpl
- -rwxr-xr-x 0/0 756 2019-08-22 13:20 mysqlha/templates/configmap.yaml
- -rwxr-xr-x 0/0 967 2019-08-22 13:20 mysqlha/templates/secret.yaml
- -rwxr-xr-x 0/0 10905 2019-08-22 13:20 mysqlha/templates/statefulset.yaml
- -rwxr-xr-x 0/0 1203 2019-08-22 13:20 mysqlha/templates/svc.yaml
- -rwxr-xr-x 0/0 56 2019-08-22 13:20 mysqlha/OWNERS
- -rwxr-xr-x 0/0 6724 2019-08-22 13:20 mysqlha/README.md
- [root@master archive]#
将mysqlha-1.0.0.tgz解压,查看文件内容:
- [root@master mysqlha]# ls
- Chart.yaml OWNERS README.md templates values.yaml
- [root@master mysqlha]# cat README.md
- # MySQL - Single Master, Multiple Slaves
-
- [MySQL](https://MySQL.org) is one of the most popular database servers in the world. Notable users include Wikipedia, Facebook and Google.
-
- ## Introduction
-
- This chart bootstraps a single master and multiple slave MySQL deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager. Largely inspired by this [tutorial](https://kubernetes.io/docs/tutorials/stateful-application/run-replicated-stateful-application/), further work was made to 'production-ize' the example.
-
- ## Prerequisites
-
- - Kubernetes 1.6+
- - PV provisioner support in the underlying infrastructure
-
- ## Installing the Chart
-
- To install the chart with the release name `my-release`:
-
- $ helm install --name my-release <helm-repo>/mysqlha
-
- The command deploys MySQL cluster on the Kubernetes cluster in the default configuration. The [configuration](#configuration) section lists the parameters that can be configured during installation.
-
- ### Uninstall
-
- To uninstall/delete the `my-release` deployment:
-
- $ helm delete my-release
-
- ## Configuration
-
- The following table lists the configurable parameters of the MySQL chart and their default values.
-
- | Parameter | Description | Default |
- | ----------------------------------------- | ------------------------------------------------- | -------------------------------------- |
- | `mysqlImage` | `mysql` image and tag. | `mysql:5.7.13` |
- | `xtraBackupImage` | `xtrabackup` image and tag. | `gcr.io/google-samples/xtrabackup:1.0` |
- | `imagePullPolicy` | Image pull policy. | `IfNotPresent` |
- | `nameOverride` | `String to partially override mysqlha.fullname template with a string (will prepend the release name)` | `nil` |
- | `fullnameOverride` | `String to fully override mysqlha.fullname template with a string` | `nil` |
- | `replicaCount` | Number of MySQL replicas | 3 |
- | `mysqlRootPassword` | Password for the `root` user. | Randomly generated |
- | `mysqlUser` | Username of new user to create. | `nil` |
- | `mysqlPassword` | Password for the new user. | Randomly generated |
- | `mysqlReplicationUser` | Username for replication user | `repl` |
- | `mysqlReplicationPassword` | Password for replication user. | Randomly generated |
- | `mysqlDatabase` | Name of the new Database to create | `nil` |
- | `configFiles.master.cnf` | Master configuration file | See `values.yaml` |
- | `configFiles.slave.cnf` | Slave configuration file | See `values.yaml` |
- | `podAnnotations` | Pod annotations | `nil` |
- | `schedulerName` | Name of the k8s scheduler (other than default) | `nil` |
- | `persistence.enabled` | Create a volume to store data | true |
- | `persistence.size` | Size of persistent volume claim | 10Gi |
- | `persistence.storageClass` | Type of persistent volume claim | `nil` |
- | `persistence.accessModes` | Persistent volume access modes | `[ReadWriteOnce]` |
- | `persistence.annotations` | Persistent volume annotations | `{}` |
- | `resources` | CPU/Memory resource requests/limits | Memory: `128Mi`, CPU: `100m` |
- | `metrics.enabled` | Start a side-car prometheus exporter | false |
- | `metrics.image` | Exporter image | `prom/mysqld-exporter` |
- | `metrics.imageTag` | Exporter image | `v0.10.0` |
- | `metrics.imagePullPolicy` | Exporter image pull policy | `IfNotPresent` |
- | `metrics.resources` | Exporter resource requests/limit | See `values.yaml` |
- | `metrics.livenessProbe.initialDelaySeconds` | Delay before metrics liveness probe is initiated | 15 |
- | `metrics.livenessProbe.timeoutSeconds` | When the probe times out | 5 |
- | `metrics.readinessProbe.initialDelaySeconds` | Delay before metrics readiness probe is initiated | 5 |
- | `metrics.readinessProbe.timeoutSeconds` | When the probe times out | 1 |
-
- Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example,
-
- ## Persistence
-
- The [MySQL](https://hub.docker.com/_/mysql/) image stores the MySQL data and configurations at the `/var/lib/mysql` path of the container.
-
- By default persistence is enabled, and a PersistentVolumeClaim is created and mounted in that directory. As a result, a persistent volume will need to be defined:
-
- # https://kubernetes.io/docs/user-guide/persistent-volumes/#azure-disk
- kind: StorageClass
- apiVersion: storage.k8s.io/v1
- metadata:
- name: fast
- provisioner: kubernetes.io/azure-disk
- parameters:
- skuName: Premium_LRS
- location: westus
-
- In order to disable this functionality you can change the values.yaml to disable persistence and use an emptyDir instead.
查看values.yaml文件:
- [root@master mysqlha]# cat values.yaml
- ## mysql image version
- ## ref: https://hub.docker.com/r/library/mysql/tags/
- ##
- mysqlImage: mysql:5.7.13 #前面下载的mysql镜像
- xtraBackupImage: registry.cn-hangzhou.aliyuncs.com/kubeapps/gcr-xtrabackup:1.0 #前面下载的xtrabackup镜像
-
- ## Specify an imagePullPolicy (Required)
- ## It's recommended to change this to 'Always' if the image tag is 'latest'
- ## ref: http://kubernetes.io/docs/user-guide/images/#updating-images
- ##
- imagePullPolicy: IfNotPresent
-
- ## String to partially override orangehrm.fullname template (will maintain the release name)
- ##
- # nameOverride: ""
- ## String to fully override orangehrm.fullname template
- ##
- # fullnameOverride: ""
-
- mysqlha:
- replicaCount: 3
-
- ## Password for MySQL root user
- ##
- # mysqlRootPassword: ## Default: random 10 character string
-
- ## Username/password for MySQL replication user
- ##
- mysqlReplicationUser: repl
- # mysqlReplicationPassword:
-
- ## Create a database user
- ##
- # mysqlUser:
- # mysqlPassword: ## Default: random 10 character string
-
- ## Allow unauthenticated access, uncomment to enable
- ##
- # mysqlAllowEmptyPassword: true
-
- ## Create database with name and grant all permissions to user on startup, if needed
- # mysqlDatabase:
-
- ## Configuration files for the master and slaves
- ##
- configFiles:
- master.cnf: |
- # Apply this config only on the master.
- [mysqld]
- log-bin
- skip_name_resolve
- slave.cnf: |
- # Apply this config only on slaves.
- [mysqld]
- super-read-only
- skip_name_resolve
-
- podAnnotations: {}
-
- ## Use an alternate scheduler, e.g. "stork".
- ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
- ##
- # schedulerName:
-
- ## Enable persistence using Persistent Volume Claims
- ## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
- ##
- persistence:
- enabled: true
- ## If defined, storageClassName: <storageClass>
- ## If set to "-", storageClassName: "", which disables dynamic provisioning
- ## If undefined (the default) or set to null, no storageClassName spec is
- ## set, choosing the default provisioner. (gp2 on AWS, azure-disk on
- ## Azure, standard on GKE, AWS & OpenStack)
- ##
- # storageClass: "-"
- accessModes:
- - ReadWriteOnce
- size: 10Gi
- annotations: {}
-
- resources:
- requests:
- cpu: 100m
- memory: 128Mi
-
- metrics:
- enabled: false
- image: prom/mysqld-exporter
- imageTag: v0.10.0
- annotations: {}
-
- livenessProbe:
- initialDelaySeconds: 15
- timeoutSeconds: 5
- readinessProbe:
- initialDelaySeconds: 5
- timeoutSeconds: 1
- resources:
- requests:
- cpu: 100m
- memory: 100Mi
- [root@master mysqlha]#
- [root@master hrr]# kubectl get statefulset
- NAME DESIRED CURRENT AGE
- mysql-mysqlha 3 1 18s
- [root@master hrr]# kubectl get svc
- NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- kubernetes 10.254.0.1 <none> 443/TCP 4d
- mysql-mysqlha None <none> 3306/TCP 27s
- mysql-mysqlha-readonly 10.254.54.188 <none> 3306/TCP 27s
- [root@master hrr]# kubectl get pod
- NAME READY STATUS RESTARTS AGE
- mysql-mysqlha-0 2/2 Running 0 45s
- mysql-mysqlha-1 2/2 Running 0 24s
- mysql-mysqlha-2 1/2 Running 0 4s
- [root@master hrr]# kubectl get pv
- NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE
- pv001 10Gi RWO Retain Bound default/data-mysql-mysqlha-0 2m
- pv002 10Gi RWO Retain Bound default/data-mysql-mysqlha-2 2m
- pv003 10Gi RWO Retain Bound default/data-mysql-mysqlha-1 1m
- [root@master hrr]# kubectl get pvc
- NAME STATUS VOLUME CAPACITY ACCESSMODES AGE
- data-mysql-mysqlha-0 Bound pv001 10Gi RWO 51s
- data-mysql-mysqlha-1 Bound pv003 10Gi RWO 51s
- data-mysql-mysqlha-2 Bound pv002 10Gi RWO 51s
- [root@master hrr]# kubectl get configmap
- NAME DATA AGE
- mysql-mysqlha 4 54s
- [root@master hrr]# kubectl get secret
- NAME TYPE DATA AGE
- mysql-mysqlha Opaque 2 51m
- mysql.v1 helm.sh/release 1 51m
- [root@master hrr]#
- [root@master hrr]# kubectl get pod -owide
- NAME READY STATUS RESTARTS AGE IP NODE
- mysql-mysqlha-0 2/2 Running 0 1m 172.17.93.2 node3
- mysql-mysqlha-1 2/2 Running 0 41s 172.17.78.2 node2
- mysql-mysqlha-2 2/2 Running 0 21s 172.17.86.2 master
查看第一个节点的docker容器
- [root@master hrr]# docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 41ec983706b8 registry.cn-hangzhou.aliyuncs.com/kubeapps/gcr-xtrabackup:1.0 "/bin/bash -c 'set..." 25 seconds ago Up 24 seconds k8s_xtrabackup.516a4a61_mysql-mysqlha-2_default_387e4cdb-c772-11e9-83c0-000c296be0a4_72aba107
- 691066dcf870 mysql:5.7.13 "docker-entrypoint..." 25 seconds ago Up 24 seconds k8s_mysql.b9eef278_mysql-mysqlha-2_default_387e4cdb-c772-11e9-83c0-000c296be0a4_894896de
- d83f031101ef 192.168.222.129:5000/pod-infrastructure:latest "/pause" 26 seconds ago Up 25 seconds k8s_POD.62b22cd9_mysql-mysqlha-2_default_387e4cdb-c772-11e9-83c0-000c296be0a4_c46314b7
查看第二个节点的docker容器
- [root@node2 ~]# docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 211a5deed23f registry.cn-hangzhou.aliyuncs.com/kubeapps/gcr-xtrabackup:1.0 "/bin/bash -c 'set..." 52 seconds ago Up 51 seconds k8s_xtrabackup.516a4a61_mysql-mysqlha-1_default_2c7419c8-c772-11e9-83c0-000c296be0a4_982995a3
- 51d9e7cd3d1d mysql:5.7.13 "docker-entrypoint..." 52 seconds ago Up 51 seconds k8s_mysql.b9eef278_mysql-mysqlha-1_default_2c7419c8-c772-11e9-83c0-000c296be0a4_3acd8bf2
- 71bb21654249 192.168.222.129:5000/pod-infrastructure:latest "/pause" 52 seconds ago Up 51 seconds k8s_POD.62b22cd9_mysql-mysqlha-1_default_2c7419c8-c772-11e9-83c0-000c296be0a4_cce640c3
- [root@node2 ~]#
查看第三个节点的docker容器
- [root@node3 ~]# docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- d159b422bcdf registry.cn-hangzhou.aliyuncs.com/kubeapps/gcr-xtrabackup:1.0 "/bin/bash -c 'set..." About a minute ago Up About a minute k8s_xtrabackup.516a4a61_mysql-mysqlha-0_default_1fbcfe77-c772-11e9-83c0-000c296be0a4_63f2a879
- 6aae997c995d mysql:5.7.13 "docker-entrypoint..." About a minute ago Up About a minute k8s_mysql.b9eef278_mysql-mysqlha-0_default_1fbcfe77-c772-11e9-83c0-000c296be0a4_7dee904b
- 40695f86aaf7 192.168.222.129:5000/pod-infrastructure:latest "/pause" About a minute ago Up About a minute k8s_POD.62b22cd9_mysql-mysqlha-0_default_1fbcfe77-c772-11e9-83c0-000c296be0a4_58c67c1e
- [root@node3 ~]#
查看pvc里的数据
- [root@master hrr]# ll /nfsdata/pv001
- total 4
- drwxr-xr-x 6 polkitd input 4096 Aug 26 03:54 mysql
- [root@master hrr]# ll /nfsdata/pv001/mysql/
- total 177164
- -rw-r----- 1 polkitd input 56 Aug 26 03:54 auto.cnf
- -rw-r----- 1 polkitd input 3091158 Aug 26 03:54 binlog.000001
- -rw-r----- 1 polkitd input 155 Aug 26 03:54 binlog.000002
- -rw-r----- 1 polkitd input 32 Aug 26 03:54 binlog.index
- -rw------- 1 polkitd input 1676 Aug 26 03:54 ca-key.pem
- -rw-r--r-- 1 polkitd input 1112 Aug 26 03:54 ca.pem
- -rw-r--r-- 1 polkitd input 1112 Aug 26 03:54 client-cert.pem
- -rw------- 1 polkitd input 1680 Aug 26 03:54 client-key.pem
- -rw-r----- 1 polkitd input 5419 Aug 26 03:54 ib_buffer_pool
- -rw-r----- 1 polkitd input 12582912 Aug 26 03:54 ibdata1
- -rw-r----- 1 polkitd input 50331648 Aug 26 03:54 ib_logfile0
- -rw-r----- 1 polkitd input 50331648 Aug 26 03:54 ib_logfile1
- -rw-r----- 1 polkitd input 12582912 Aug 26 03:55 ibtmp1
- drwxr-x--- 2 polkitd input 187 Aug 26 03:54 #innodb_temp
- drwxr-x--- 2 polkitd input 143 Aug 26 03:54 mysql
- -rw-r----- 1 polkitd input 29360128 Aug 26 03:54 mysql.ibd
- drwxr-x--- 2 polkitd input 8192 Aug 26 03:54 performance_schema
- -rw------- 1 polkitd input 1680 Aug 26 03:54 private_key.pem
- -rw-r--r-- 1 polkitd input 452 Aug 26 03:54 public_key.pem
- -rw-r--r-- 1 polkitd input 1112 Aug 26 03:54 server-cert.pem
- -rw------- 1 polkitd input 1680 Aug 26 03:54 server-key.pem
- drwxr-x--- 2 polkitd input 28 Aug 26 03:54 sys
- -rw-r----- 1 polkitd input 12582912 Aug 26 03:54 undo_001
- -rw-r----- 1 polkitd input 10485760 Aug 26 03:54 undo_002
查看svc
- [root@master hrr]# kubectl describe svc mysql-mysqlha
- Name: mysql-mysqlha
- Namespace: default
- Labels: app=mysql-mysqlha
- chart=mysqlha-1.0.0
- heritage=Helm
- release=mysql
- Selector: app=mysql-mysqlha
- Type: ClusterIP
- IP: None
- Port: mysql-mysqlha 3306/TCP
- Endpoints: 172.17.78.2:3306,172.17.86.2:3306,172.17.93.2:3306
- Session Affinity: None
- No events.
- [root@master hrr]# kubectl describe svc mysql-mysqlha-readonly
- Name: mysql-mysqlha-readonly
- Namespace: default
- Labels: app=mysql-mysqlha
- chart=mysqlha-1.0.0
- heritage=Helm
- release=mysql
- Selector: app=mysql-mysqlha
- Type: ClusterIP
- IP: 10.254.54.188
- Port: mysql-mysqlha 3306/TCP
- Endpoints: 172.17.78.2:3306,172.17.86.2:3306,172.17.93.2:3306
- Session Affinity: None
- No events.
- [root@master hrr]#
查看有状态应用stateful
- [root@master hrr]# kubectl get statefulset -oyaml
- apiVersion: v1
- items:
- - apiVersion: apps/v1beta1
- kind: StatefulSet
- metadata:
- creationTimestamp: 2019-08-25T19:54:18Z
- generation: 1
- labels:
- app: mysql-mysqlha
- chart: mysqlha-1.0.0
- heritage: Helm
- release: mysql
- name: mysql-mysqlha
- namespace: default
- resourceVersion: "94760"
- selfLink: /apis/apps/v1beta1/namespaces/default/statefulsets/mysql-mysqlha
- uid: 1fa6f230-c772-11e9-83c0-000c296be0a4
- spec:
- replicas: 3
- selector:
- matchLabels:
- app: mysql-mysqlha
- serviceName: mysql-mysqlha
- template:
- metadata:
- creationTimestamp: null
- labels:
- app: mysql-mysqlha
- spec:
- containers:
- - env:
- - name: MYSQL_DATABASE
- - name: MYSQL_ROOT_PASSWORD
- valueFrom:
- secretKeyRef:
- key: mysql-root-password
- name: mysql-mysqlha
- - name: MYSQL_REPLICATION_USER
- value: repl
- - name: MYSQL_REPLICATION_PASSWORD
- valueFrom:
- secretKeyRef:
- key: mysql-replication-password
- name: mysql-mysqlha
- image: mysql:5.7.13
- imagePullPolicy: IfNotPresent
- livenessProbe:
- exec:
- command:
- - /bin/sh
- - -c
- - mysqladmin ping -h 127.0.0.1 -u root -p${MYSQL_ROOT_PASSWORD}
- failureThreshold: 3
- initialDelaySeconds: 30
- periodSeconds: 10
- successThreshold: 1
- timeoutSeconds: 5
- name: mysql
- ports:
- - containerPort: 3306
- name: mysql
- protocol: TCP
- readinessProbe:
- exec:
- command:
- - /bin/sh
- - -c
- - MYSQL_PWD="${MYSQL_ROOT_PASSWORD}"
- - mysql -h 127.0.0.1 -u root -e "SELECT 1"
- failureThreshold: 3
- initialDelaySeconds: 10
- periodSeconds: 10
- successThreshold: 1
- timeoutSeconds: 1
- resources:
- requests:
- cpu: 100m
- memory: 128Mi
- terminationMessagePath: /dev/termination-log
- volumeMounts:
- - mountPath: /var/lib/mysql
- name: data
- subPath: mysql
- - mountPath: /etc/mysql/conf.d
- name: conf
- - args:
- - -c
- - |
- set -ex
-
- echo "Waiting for mysqld to be ready (accepting connections)"
- until mysql -h 127.0.0.1 -e "SELECT 1"; do sleep 5; done
-
- # Create replication user
- cd /mnt/scripts
- # file exists and is not empty with -s
- if [[ -s create-replication-user.sh ]]; then
- ls -la
- ./create-replication-user.sh
- fi
-
- cd /var/lib/mysql
- # Determine binlog position of cloned data, if any.
- if [[ -f xtrabackup_slave_info ]]; then
- # XtraBackup already generated a partial "CHANGE MASTER TO" query
- # because we're cloning from an existing slave.
- cp xtrabackup_slave_info change_master_to.sql.in
- elif [[ -f xtrabackup_binlog_info ]]; then
- # We're cloning directly from master. Parse binlog position.
- [[ $(cat xtrabackup_binlog_info) =~ ^(.*?)[[:space:]]+(.*?)$ ]] || exit 1
- 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
-
- # In case of container restart, attempt this at-most-once.
- cp change_master_to.sql.in change_master_to.sql.orig
- mysql -h 127.0.0.1 --verbose<<EOF
- STOP SLAVE IO_THREAD;
- $(<change_master_to.sql.orig),
- MASTER_HOST='mysql-mysqlha-0.mysql-mysqlha',
- MASTER_USER='${MYSQL_REPLICATION_USER}',
- MASTER_PASSWORD='${MYSQL_REPLICATION_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 --backup --slave-info --stream=xbstream --host=127.0.0.1 --user=${MYSQL_REPLICATION_USER} --password=${MYSQL_REPLICATION_PASSWORD}"
- command:
- - /bin/bash
- env:
- - name: MYSQL_PWD
- valueFrom:
- secretKeyRef:
- key: mysql-root-password
- name: mysql-mysqlha
- - name: MYSQL_REPLICATION_USER
- value: repl
- - name: MYSQL_REPLICATION_PASSWORD
- valueFrom:
- secretKeyRef:
- key: mysql-replication-password
- name: mysql-mysqlha
- image: registry.cn-hangzhou.aliyuncs.com/kubeapps/gcr-xtrabackup:1.0
- imagePullPolicy: IfNotPresent
- name: xtrabackup
- ports:
- - containerPort: 3307
- name: xtrabackup
- protocol: TCP
- resources:
- requests:
- cpu: 100m
- memory: 100Mi
- terminationMessagePath: /dev/termination-log
- volumeMounts:
- - mountPath: /var/lib/mysql
- name: data
- subPath: mysql
- - mountPath: /etc/mysql/conf.d
- name: conf
- - mountPath: /mnt/scripts
- name: scripts
- dnsPolicy: ClusterFirst
- restartPolicy: Always
- securityContext: {}
- terminationGracePeriodSeconds: 30
- volumes:
- - emptyDir: {}
- name: conf
- - configMap:
- defaultMode: 420
- name: mysql-mysqlha
- name: config-map
- - emptyDir: {}
- name: scripts
- volumeClaimTemplates:
- - metadata:
- creationTimestamp: null
- name: data
- spec:
- accessModes:
- - ReadWriteOnce
- resources:
- requests:
- storage: 10Gi
- status:
- phase: Pending
- status:
- replicas: 3
- kind: List
- metadata: {}
- resourceVersion: ""
- selfLink: ""
- [root@master hrr]#
创建mysql-client容器,参考前面“ helm install mysql apphub/mysqlha”中的
- [root@master hrr]# kubectl run mysql-client --image=mysql:5.7.13 -it --rm --restart='Never' --namespace default -- /bin/sh
- Waiting for pod default/mysql-client to be running, status is Pending, pod ready: false If you don't see a command prompt, try pressing enter.
- Error attaching, falling back to logs: error dialing backend: dial tcp: lookup node3 on 192.168.222.2:53: no such host
- Error from server: Get https://node3:10250/containerLogs/default/mysql-client/mysql-client: dial tcp: lookup node3 on 192.168.222.2:53: no such host
- [root@master hrr]#
- [root@master hrr]# kubectl get pod -owide
- NAME READY STATUS RESTARTS AGE IP NODE
- mysql-client 1/1 Running 0 48s 172.17.93.3 node3
- mysql-mysqlha-0 2/2 Running 0 54m 172.17.93.2 node3
- mysql-mysqlha-1 2/2 Running 0 53m 172.17.78.2 node2
- mysql-mysqlha-2 2/2 Running 0 53m 172.17.86.2 master
- [root@master hrr]#
在node3上查看
- [root@node3 ~]# docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 8261abe363b0 mysql:5.7.13 "docker-entrypoint..." 56 seconds ago Up 55 seconds k8s_mysql-client.d32e2e5_mysql-client_default_90905092-c779-11e9-83c0-000c296be0a4_0d4f202f
- 1fac37badaa8 192.168.222.129:5000/pod-infrastructure:latest "/pause" 56 seconds ago Up 56 seconds k8s_POD.cace165_mysql-client_default_90905092-c779-11e9-83c0-000c296be0a4_a0f9ab22
- d159b422bcdf registry.cn-hangzhou.aliyuncs.com/kubeapps/gcr-xtrabackup:1.0 "/bin/bash -c 'set..." 54 minutes ago Up 54 minutes k8s_xtrabackup.516a4a61_mysql-mysqlha-0_default_1fbcfe77-c772-11e9-83c0-000c296be0a4_63f2a879
- 6aae997c995d mysql:5.7.13 "docker-entrypoint..." 54 minutes ago Up 54 minutes k8s_mysql.b9eef278_mysql-mysqlha-0_default_1fbcfe77-c772-11e9-83c0-000c296be0a4_7dee904b
- 40695f86aaf7 192.168.222.129:5000/pod-infrastructure:latest "/pause" 54 minutes ago Up 54 minutes k8s_POD.62b22cd9_mysql-mysqlha-0_default_1fbcfe77-c772-11e9-83c0-000c296be0a4_58c67c1e
- [root@node3 ~]#
写入数据
- [root@node3 ~]# docker exec -ti 8261abe363b0 sh
- # mysql -h172.17.93.2 -uroot
- ERROR 1045 (28000): Access denied for user 'root'@'172.17.93.3' (using password: NO)
- # mysql -h172.17.93.2 -uroot -pghScMZT1bTJN
- mysql: [Warning] Using a password on the command line interface can be insecure.
- Welcome to the MySQL monitor. Commands end with ; or \g.
- Your MySQL connection id is 1018
- Server version: 8.0.17 MySQL Community Server - GPL
-
- Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
-
- Oracle is a registered trademark of Oracle Corporation and/or its
- affiliates. Other names may be trademarks of their respective
- owners.
-
- Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
-
- mysql> show databases;
- +--------------------+
- | Database |
- +--------------------+
- | information_schema |
- | mysql |
- | performance_schema |
- | sys |
- +--------------------+
- 4 rows in set (0.01 sec)
-
- mysql> CREATE DATABASE test;
- Query OK, 1 row affected (0.02 sec)
-
- mysql> CREATE TABLE test.messages (message VARCHAR(250));
- Query OK, 0 rows affected (0.03 sec)
-
- mysql> INSERT INTO test.messages VALUES ('hello');
- Query OK, 1 row affected (0.03 sec)
-
- mysql> show databases;
- +--------------------+
- | Database |
- +--------------------+
- | information_schema |
- | mysql |
- | performance_schema |
- | sys |
- | test |
- +--------------------+
- 5 rows in set (0.00 sec)
-
- mysql> use test;
- Reading table information for completion of table and column names
- You can turn off this feature to get a quicker startup with -A
-
- Database changed
- mysql> select * from messages;
- +---------+
- | message |
- +---------+
- | hello |
- +---------+
- 1 row in set (0.01 sec)
-
- mysql> exit
- Bye
- #
连接svc查看,这个是read-only的,可以看到是轮询的,查询了2次才到有test中的库去
- # mysql -h10.254.54.188 -uroot -pghScMZT1bTJN
- mysql: [Warning] Using a password on the command line interface can be insecure.
- Welcome to the MySQL monitor. Commands end with ; or \g.
- Your MySQL connection id is 1058
- Server version: 8.0.17 MySQL Community Server - GPL
-
- Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
-
- Oracle is a registered trademark of Oracle Corporation and/or its
- affiliates. Other names may be trademarks of their respective
- owners.
-
- Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
-
- mysql> show databases;
- +--------------------+
- | Database |
- +--------------------+
- | information_schema |
- | mysql |
- | performance_schema |
- | sys |
- +--------------------+
- 4 rows in set (0.00 sec)
-
- mysql> exit
- Bye
- # mysql -h10.254.54.188 -uroot -pghScMZT1bTJN
- mysql: [Warning] Using a password on the command line interface can be insecure.
- Welcome to the MySQL monitor. Commands end with ; or \g.
- Your MySQL connection id is 1054
- Server version: 8.0.17 MySQL Community Server - GPL
-
- Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
-
- Oracle is a registered trademark of Oracle Corporation and/or its
- affiliates. Other names may be trademarks of their respective
- owners.
-
- Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
-
- mysql> show databases;
- +--------------------+
- | Database |
- +--------------------+
- | information_schema |
- | mysql |
- | performance_schema |
- | sys |
- +--------------------+
- 4 rows in set (0.01 sec)
-
- mysql> exit
- Bye
- # mysql -h10.254.54.188 -uroot -pghScMZT1bTJN
- mysql: [Warning] Using a password on the command line interface can be insecure.
- Welcome to the MySQL monitor. Commands end with ; or \g.
- Your MySQL connection id is 1072
- Server version: 8.0.17 MySQL Community Server - GPL
-
- Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
-
- Oracle is a registered trademark of Oracle Corporation and/or its
- affiliates. Other names may be trademarks of their respective
- owners.
-
- Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
-
- mysql> show databases;
- +--------------------+
- | Database |
- +--------------------+
- | information_schema |
- | mysql |
- | performance_schema |
- | sys |
- | test |
- +--------------------+
- 5 rows in set (0.00 sec)
-
- mysql> exit
- Bye
- #
故障现象:
- [root@docker ~]# helm init
- Creating /root/.helm/repository/repositories.yaml
- Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com
- Error: https://kubernetes-charts.storage.googleapis.com is not a valid chart repository or cannot be reached: Get https://kubernetes-charts.storage.googleapis.com/index.yaml: net/http: TLS handshake timeout
- [root@docker ~]#
可能原因:
可能国内访问不了https://kubernetes-charts.storage.googleapis.com/index.yaml
,并且网速慢。
解决方法:
在初始化时,使用--stable-repo-url参数,将仓库地址改为阿里云的helm仓库地址。helm init --stable-repo-url=https://apphub.aliyuncs.com
故障现象:
- [root@docker ~]# kubectl get pod
- NAME READY STATUS RESTARTS AGE
- mysql-mysqlha-0 0/2 Pending 0 35s
- nginx 1/1 Running 0 2m
- [root@docker ~]#
- [root@docker ~]# kubectl describe pod mysql-mysqlha-0
- ……
- Events:
- FirstSeen LastSeen Count From SubObjectPath Type Reason Message
- --------- -------- ----- ---- ------------- -------- ------ -------
- 1m 4s 8 {default-scheduler } Warning FailedScheduling SchedulerPredicates failed due to PersistentVolumeClaim is not bound: "data-mysql-mysqlha-0", which is unexpected.
可能原因:
第一次使用helm安装mysql时,没有提前创建pv,导致报pvc没有bound的错。
解决方法:
查看pvc的模式,创建pv,创建过程请参考前面。
故障现象:
- [root@docker hrr]# kubectl get pod
- NAME READY STATUS RESTARTS AGE
- mysql-mysqlha-0 0/2 RunContainerError 0 19s
- nginx 1/1 Running 1 1h
- [root@docker hrr]#
- [root@docker ~]# kubectl describe pod mysql-mysqlha-0
- ……
- Events:
- FirstSeen LastSeen Count From SubObjectPath Type Reason Message
- --------- -------- ----- ---- ------------- -------- ------ -------
- 18m 5m 49 {default-scheduler } Warning FailedScheduling SchedulerPredicates failed due to PersistentVolumeClaim is not bound: "data-mysql-mysqlha-0", which is unexpected.
- 4m 4m 1 {default-scheduler } Normal Scheduled Successfully assigned mysql-mysqlha-0 to master
- 4m 4m 1 {kubelet master} Warning MissingClusterDNS kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to DNSDefault policy.
- 4m 4m 1 {kubelet master} spec.containers{mysql} Normal Pulling pulling image "mysql:5.7.13"
- 10s 10s 1 {kubelet master} spec.containers{mysql} Warning Failed Failed to pull image "mysql:5.7.13": Get https://registry-1.docker.io/v2/library/mysql/manifests/5.7.13: Get https://auth.docker.io/token?scope=repository%3Alibrary%2Fmysql%3Apull&service=registry.docker.io: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
- 10s 10s 1 {kubelet master} spec.containers{xtrabackup} Normal Pulling pulling image "registry.cn-hangzhou.aliyuncs.com/kubeapps/gcr-xtrabackup:1.0"
- 9s 9s 1 {kubelet master} spec.containers{xtrabackup} Warning Failed Failed to pull image "registry.cn-hangzhou.aliyuncs.com/kubeapps/gcr-xtrabackup:1.0": image pull failed for registry.cn-hangzhou.aliyuncs.com/kubeapps/gcr-xtrabackup:1.0, this may be because there are no credentials on this request. details: (repository registry.cn-hangzhou.aliyuncs.com/kubeapps/gcr-xtrabackup not found: does not exist or no pull access)
- 9s 9s 1 {kubelet master} Warning FailedSync Error syncing pod, skipping: [failed to "StartContainer" for "mysql" with ErrImagePull: "Get https://registry-1.docker.io/v2/library/mysql/manifests/5.7.13: Get https://auth.docker.io/token?scope=repository%3Alibrary%2Fmysql%3Apull&service=registry.docker.io: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)"
- , failed to "StartContainer" for "xtrabackup" with ErrImagePull: "image pull failed for registry.cn-hangzhou.aliyuncs.com/kubeapps/gcr-xtrabackup:1.0, this may be because there are no credentials on this request. details: (repository registry.cn-hangzhou.aliyuncs.com/kubeapps/gcr-xtrabackup not found: does not exist or no pull access)"
- ]
- 8s 8s 1 {kubelet master} spec.containers{mysql} Normal BackOff Back-off pulling image "mysql:5.7.13"
- 8s 8s 1 {kubelet master} spec.containers{xtrabackup} Normal BackOff Back-off pulling image "registry.cn-hangzhou.aliyuncs.com/kubeapps/gcr-xtrabackup:1.0"
- 8s 8s 1 {kubelet master} Warning FailedSync Error syncing pod, skipping: [failed to "StartContainer" for "mysql" with ImagePullBackOff: "Back-off pulling image \"mysql:5.7.13\""
- , failed to "StartContainer" for "xtrabackup" with ImagePullBackOff: "Back-off pulling image \"registry.cn-hangzhou.aliyuncs.com/kubeapps/gcr-xtrabackup:1.0\""
- ]
- [root@docker hrr]#
可能原因:
下载不到docker image,本地没有mysql镜像。
解决方法:
手动下载mysql镜像,将镜像docker tag为配置中的名字,如何手动下载,请参考上面。
故障现象:
- [root@docker docker]# kubectl get pod
- NAME READY STATUS RESTARTS AGE
- mysql-mysqlha-0 0/2 RunContainerError 0 9s
- nginx 1/1 Running 2 1h
- [root@docker docker]#
- [root@docker docker]# kubectl describe pod mysql-mysqlha-0
- ……
- Events:
- FirstSeen LastSeen Count From SubObjectPath Type Reason Message
- --------- -------- ----- ---- ------------- -------- ------ -------
- 15s 15s 1 {default-scheduler } Normal Scheduled Successfully assigned mysql-mysqlha-0 to master
- 14s 14s 1 {kubelet master} Warning MissingClusterDNS kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to DNSDefault policy.
- 14s 3s 3 {kubelet master} spec.containers{mysql} Normal Pulled Container image "mysql:5.7.13" already present on machine
- 14s 3s 3 {kubelet master} spec.containers{xtrabackup} Normal Pulled Container image "registry.cn-hangzhou.aliyuncs.com/kubeapps/gcr-xtrabackup:1.0" already present on machine
- 14s 3s 3 {kubelet master} Warning FailedSync Error syncing pod, skipping: [failed to "StartContainer" for "mysql" with RunContainerError: "GenerateRunContainerOptions: mkdir /var/lib/kubelet/pods/18f319d5-c6d2-11e9-baf7-000c296be0a4/volumes/kubernetes.io~nfs/pv001/mysql: permission denied"
- , failed to "StartContainer" for "xtrabackup" with RunContainerError: "GenerateRunContainerOptions: mkdir /var/lib/kubelet/pods/18f319d5-c6d2-11e9-baf7-000c296be0a4/volumes/kubernetes.io~nfs/pv001/mysql: permission denied"
- ]
- [root@docker docker]#
- [root@docker docker]# kubectl get pod
- NAME READY STATUS RESTARTS AGE
- mysql-mysqlha-0 1/2 CrashLoopBackOff 2 5m
- nginx 1/1 Running 2 1h
- [root@docker docker]#
- Events:
- FirstSeen LastSeen Count From SubObjectPath Type Reason Message
- --------- -------- ----- ---- ------------- -------- ------ -------
- 5m 5m 1 {default-scheduler } Normal Scheduled Successfully assigned mysql-mysqlha-0 to master
- 1m 1m 1 {kubelet master} Warning FailedSync Error syncing pod, skipping: [failed to "StartContainer" for "xtrabackup" with RunContainerError: "GenerateRunContainerOptions: mkdir /var/lib/kubelet/pods/18f319d5-c6d2-11e9-baf7-000c296be0a4/volumes/kubernetes.io~nfs/pv001/mysql: permission denied"
- , failed to "StartContainer" for "mysql" with RunContainerError: "GenerateRunContainerOptions: mkdir /var/lib/kubelet/pods/18f319d5-c6d2-11e9-baf7-000c296be0a4/volumes/kubernetes.io~nfs/pv001/mysql: permission denied"
- ]
- 5m 44s 23 {kubelet master} Warning FailedSync Error syncing pod, skipping: [failed to "StartContainer" for "mysql" with RunContainerError: "GenerateRunContainerOptions: mkdir /var/lib/kubelet/pods/18f319d5-c6d2-11e9-baf7-000c296be0a4/volumes/kubernetes.io~nfs/pv001/mysql: permission denied"
- , failed to "StartContainer" for "xtrabackup" with RunContainerError: "GenerateRunContainerOptions: mkdir /var/lib/kubelet/pods/18f319d5-c6d2-11e9-baf7-000c296be0a4/volumes/kubernetes.io~nfs/pv001/mysql: permission denied"
- ]
- 32s 32s 1 {kubelet master} spec.containers{mysql} Normal Started Started container with docker id d2f5e2c645b8
- 32s 32s 1 {kubelet master} spec.containers{xtrabackup} Normal Started Started container with docker id 6f2fb901a587
- 5m 32s 25 {kubelet master} spec.containers{xtrabackup} Normal Pulled Container image "registry.cn-hangzhou.aliyuncs.com/kubeapps/gcr-xtrabackup:1.0" already present on machine
- 32s 32s 1 {kubelet master} spec.containers{mysql} Normal Created Created container with docker id d2f5e2c645b8; Security:[seccomp=unconfined]
- 32s 32s 1 {kubelet master} spec.containers{xtrabackup} Normal Created Created container with docker id 6f2fb901a587; Security:[seccomp=unconfined]
- 30s 30s 1 {kubelet master} spec.containers{mysql} Normal Created Created container with docker id 104f64db6e8c; Security:[seccomp=unconfined]
- 30s 30s 1 {kubelet master} spec.containers{mysql} Normal Started Started container with docker id 104f64db6e8c
- 28s 26s 3 {kubelet master} Warning FailedSync Error syncing pod, skipping: failed to "StartContainer" for "mysql" with CrashLoopBackOff: "Back-off 10s restarting failed container=mysql pod=mysql-mysqlha-0_default(18f319d5-c6d2-11e9-baf7-000c296be0a4)"
-
- 5m 11s 27 {kubelet master} spec.containers{mysql} Normal Pulled Container image "mysql:5.7.13" already present on machine
- 5m 11s 5 {kubelet master} Warning MissingClusterDNS kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to DNSDefault policy.
- 11s 11s 1 {kubelet master} spec.containers{mysql} Normal Created Created container with docker id ec8f0827294b; Security:[seccomp=unconfined]
- 11s 11s 1 {kubelet master} spec.containers{mysql} Normal Started Started container with docker id ec8f0827294b
- 28s 7s 5 {kubelet master} spec.containers{mysql} Warning BackOff Back-off restarting failed docker container
- 10s 7s 2 {kubelet master} Warning FailedSync Error syncing pod, skipping: failed to "StartContainer" for "mysql" with CrashLoopBackOff: "Back-off 20s restarting failed container=mysql pod=mysql-mysqlha-0_default(18f319d5-c6d2-11e9-baf7-000c296be0a4)"
- [root@docker docker]#
- [root@docker docker]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 24a5e40cfbe6 mysql:5.7.13 "docker-entrypoint..." About a minute ago Exited (1) About a minute ago k8s_mysql.b9eef278_mysql-mysqlha-0_default_18f319d5-c6d2-11e9-baf7-000c296be0a4_f37f9154
- 6f2fb901a587 registry.cn-hangzhou.aliyuncs.com/kubeapps/gcr-xtrabackup:1.0 "/bin/bash -c 'set..." 5 minutes ago Up 5 minutes k8s_xtrabackup.516a4a61_mysql-mysqlha-0_default_18f319d5-c6d2-11e9-baf7-000c296be0a4_4c633d64
- 61a82b9ad65a 192.168.222.129:5000/pod-infrastructure:latest "/pause" 10 minutes ago Up 10 minutes k8s_POD.62b22cd9_mysql-mysqlha-0_default_18f319d5-c6d2-11e9-baf7-000c296be0a4_9f7337a5
- dc6071e8f613 192.168.222.129:5000/nginx "nginx -g 'daemon ..." 26 minutes ago Up 26 minutes k8s_nginx.3556dff8_nginx_default_30a915ea-c6c5-11e9-bbd7-000c296be0a4_9d257b60
- 15929311253f 192.168.222.129:5000/pod-infrastructure:latest "/pause" 26 minutes ago Up 26 minutes k8s_POD.cace165_nginx_default_30a915ea-c6c5-11e9-bbd7-000c296be0a4_d9ad1e0f
- 48f464ad9c9b 192.168.222.129:5000/pod-infrastructure:latest "/pause" 37 minutes ago Exited (2) 26 minutes ago k8s_POD.cace165_nginx_default_30a915ea-c6c5-11e9-bbd7-000c296be0a4_eb3bebdb
- c01c41763b06 192.168.222.129:5000/nginx "nginx -g 'daemon ..." About an hour ago Exited (0) 37 minutes ago k8s_nginx.3556dff8_nginx_default_30a915ea-c6c5-11e9-bbd7-000c296be0a4_0848bc8b
- [root@docker docker]# docker logs 24a5e40cfbe6
- chown: changing ownership of '/var/lib/mysql/': Operation not permitted
- [root@docker docker]#
可能原因:
docker对pvc没有权限,由于这里使用的是nfs作后端存储,所以可能是nfs目录的权限没放开。
解决方法:
将nfs目录权限设置为chown nfsnobody:nfsnobody -R /nfsdata,并且/etc/exportfs中设置no_root_squash,不压缩root权限,即在docker可以使用任何用户写入数据,具体操作步骤请参考上面。
故障现象:
- [root@master ~]# kubectl describe pod mysql-mysqlha-0
- ……
- Events:
- FirstSeen LastSeen Count From SubObjectPath Type Reason Message
- --------- -------- ----- ---- ------------- -------- ------ -------
- 56m 56m 1 {default-scheduler } Normal Scheduled Successfully assigned mysql-mysqlha-0 to master
- 56m 56m 3 {kubelet master} Warning MissingClusterDNS kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to DNSDefault policy.
- 56m 56m 1 {kubelet master} spec.containers{mysql} Normal Pulled Container image "mysql:5.7.13" already present on machine
- 56m 56m 1 {kubelet master} spec.containers{mysql} Normal Created Created container with docker id 31013a7822ae; Security:[seccomp=unconfined]
- 56m 56m 1 {kubelet master} spec.containers{mysql} Normal Started Started container with docker id 31013a7822ae
- 56m 56m 1 {kubelet master} spec.containers{xtrabackup} Normal Pulled Container image "registry.cn-hangzhou.aliyuncs.com/kubeapps/gcr-xtrabackup:1.0" already present on machine
- 56m 56m 1 {kubelet master} spec.containers{xtrabackup} Normal Created Created container with docker id a5f2f49c1eef; Security:[seccomp=unconfined]
- 56m 56m 1 {kubelet master} spec.containers{xtrabackup} Normal Started Started container with docker id a5f2f49c1eef
可能原因:
没有配置kube-dns。
解决方法:
请参考上面配置kube-dns。
故障现象:
可能原因:
解决方法:
K8s Helm Charts 一键安装云原生应用指南:
https://mp.weixin.qq.com/s/qeLA2F4vNGUDYVdQSHIWtQ
mysql有状态服务部署:
https://segmentfault.com/a/1190000012244714
记k8s的一次pv&pvc创建过程:
https://staight.github.io/2018/08/18/%E8%AE%B0k8s%E7%9A%84%E4%B8%80%E6%AC%A1pv&pvc%E5%88%9B%E5%BB%BA%E8%BF%87%E7%A8%8B/
nfs挂载Permission denied问题解决:
https://blog.csdn.net/weixin_42256397/article/details/97283989
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。