k8s怎么部署mysql k8s怎么部署前后端应用

K8S系列第十篇(一键部署MySQL主从复制)

更多精彩文章,猛戳这里:kubernetes系列技术文档

龙泉驿网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、响应式网站设计等网站项目制作,到程序开发,运营维护。创新互联从2013年创立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联

更多精彩文章,猛戳这里:kubernetes系列技术文档

更多精彩文章,猛戳这里:kubernetes系列技术文档

更多精彩文章,猛戳这里:kubernetes系列技术文档

更多精彩文章,猛戳这里:kubernetes系列技术文档

更多精彩文章,猛戳这里:kubernetes系列技术文档

容器化 | 在 KubeSphere 中部署 MySQL 集群

本文将演示如何在 KubeSphere[1] 上部署 RadonDB MySQL on Kubernetes 2.1.2 ,快速实现高可用的 MySQL on K8s。

若已在 KubeSphere 部署过历史版本 Operator,可以选择如下方式更新到最新版本。

可任选一个 RadonDB MySQL 配置示例[5] 部署,或自定义配置部署。

以 mysql_v1alpha1_mysqlcluster.yaml 模版为例,创建一个 RadonDB MySQL 集群。

注意

未指定项目时,集群将被默认安装在 kubesphere-controls-system 项目中。若需指定项目,安装命令需添加 --namespace=project_name 。

预期结果

预期结果

在 demo-project 项目中,查看 RadonDB MySQL 集群状态。

至此,完成在 KubeSphere 中部署 RadonDB MySQL 集群。

[1]:KubeSphere:

[2]:OpenPitrix:

[3]:创建操作:

[4]:项目网关:

[5]:配置示例:

k8s安装部署

K8s集群搭建

1 centos版本信息查看

[root@localhost ~]# uname -a

Linux localhost.localdomain 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

k8s集群机器关闭防火墙

[root@localhost ~]# systemctl stop firewalld

[root@localhost ~]# systemctl disable firewalld

Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.

Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

2 安装必要的包

k8s集群安装以下安装包

[root@k8s-node ~]# yum -y install net-tools wget vim ntpd

[root@k8s-node ~]# systemctl enable ntpd

[root@k8s-node ~]# systemctl start ntpd

3配置hosts

[root@k8s-node ~]# cat /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.248.141 k8s-master

192.168.248.142 k8s-node

4 部署master节点

4.1 Master节点安装必要的安装包

[root@k8s-master ~]# yum -y install etcd

4.2更改/etc/etcd/etcd.conf配置文件

[root@k8s-master etcd]# cat /etc/etcd/etcd.conf | grep -v "^#"

ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

ETCD_LISTEN_CLIENT_URLS=""

ETCD_NAME="master"

ETCD_ADVERTISE_CLIENT_URLS=

4.3设置开机启动并验证状态

[root@k8s-master ~]#systemctl enable etcd

[root@k8s-master ~]#systemctl start etcd

etcd检查

[root@k8s_master ~]# etcdctl -C cluster-health

member 8e9e05c52164694d is healthy: got healthy result from cluster is healthy

[root@k8s_master ~]# etcdctl -C cluster-health

member 8e9e05c52164694d is healthy: got healthy result from cluster is healthy

5 安装部署docker环境(略)

6 安装kubernetes

[root@k8s_master ~]# yum install kubernetes

安装过程中报错如下

Error: docker-ce conflicts with 2:docker-1.13.1-75.git8633870.el7.centos.x86_64

可以执行如下命令解决

1、查看安装过的docker:yum list installed | grep docker

2、卸载docker:yum remove -y docker-ce.x86_64 0:18.03.0.ce-1.el7.centos

3、删除容器镜像:rm -rf /var/lib/docker

再次安装kubernetes,安装成功,而且会自动安装docker

6.1修改apiserver服务的配置文件

[root@k8s-master kubernetes]# cat /etc/kubernetes/apiserver | grep -v "^#"

KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"

KUBE_API_PORT="--port=8080"

KUBE_ETCD_SERVERS="--etcd-servers="

KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"

KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"

KUBE_API_ARGS=""

6.2修改config配置文件:

[root@k8s-master kubernetes]# cat /etc/kubernetes/config | grep -v "^#"

KUBE_LOGTOSTDERR="--logtostderr=true"

KUBE_LOG_LEVEL="--v=0"

KUBE_ALLOW_PRIV="--allow-privileged=false"

KUBE_MASTER="--master="

设置开机启动,开启服务

[root@k8s-master ~]#systemctl enable kube-apiserver kube-controller-manager kube-scheduler docker

[root@k8s-master ~]#systemctl start kube-apiserver kube-controller-manager kube-scheduler docker

6.3查看服务端口:

[root@k8s-master ~]# netstat –tnlp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name   

tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1273/master        

tcp        0      0 127.0.0.1:2380          0.0.0.0:*               LISTEN      2126/etcd          

tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      571/rpcbind        

tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1362/dnsmasq       

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      998/sshd           

tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      996/cupsd          

tcp6       0      0 ::1:25                  :::*                    LISTEN      1273/master        

tcp6       0      0 :::4001                 :::*                    LISTEN      2126/etcd          

tcp6       0      0 :::6443                 :::*                    LISTEN      3216/kube-apiserver

tcp6       0      0 :::10251                :::*                    LISTEN      3222/kube-scheduler

tcp6       0      0 :::2379                 :::*                    LISTEN      2126/etcd          

tcp6       0      0 :::10252                :::*                    LISTEN      3221/kube-controlle

tcp6       0      0 :::111                  :::*                    LISTEN      571/rpcbind        

tcp6       0      0 :::8080                 :::*                    LISTEN      3216/kube-apiserver

tcp6       0      0 :::22                   :::*                    LISTEN      998/sshd           

tcp6       0      0 ::1:631                 :::*                    LISTEN      996/cupsd 

7部署node节点

7.1安装docker(略)安装k8s(略)

7.2 Node节点主机做以下配置:

修改config配置文件

[root@k8s-node kubernetes]# cat /etc/kubernetes/config | grep -v "^#"

KUBE_LOGTOSTDERR="--logtostderr=true"

KUBE_LOG_LEVEL="--v=0"

KUBE_ALLOW_PRIV="--allow-privileged=false"

KUBE_MASTER="--master="

修改kubelet配置文件

[root@k8s-node kubernetes]# cat /etc/kubernetes/kubelet | grep -v "^#"

KUBELET_ADDRESS="--address=0.0.0.0"

KUBELET_HOSTNAME="--hostname-override=192.168.248.142"

KUBELET_API_SERVER="--api-servers="

KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

KUBELET_ARGS=""

设置开机启动、开启服务

[root@k8s_client1 ~]# systemctl enable kubelet kube-proxy

[root@k8s_client1 ~]# systemctl start kubelet kube-proxy

查看端口:

[root@k8s_client1 ~]# netstat –ntlp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name   

tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1277/master        

tcp        0      0 127.0.0.1:10248         0.0.0.0:*               LISTEN      3246/kubelet       

tcp        0      0 127.0.0.1:10249         0.0.0.0:*               LISTEN      3133/kube-proxy    

tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      575/rpcbind        

tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1332/dnsmasq       

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1000/sshd          

tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      998/cupsd          

tcp6       0      0 ::1:25                  :::*                    LISTEN      1277/master        

tcp6       0      0 :::4194                 :::*                    LISTEN      3246/kubelet       

tcp6       0      0 :::10250                :::*                    LISTEN      3246/kubelet       

tcp6       0      0 :::10255                :::*                    LISTEN      3246/kubelet       

tcp6       0      0 :::111                  :::*                    LISTEN      575/rpcbind        

tcp6       0      0 :::22                   :::*                    LISTEN      1000/sshd          

tcp6       0      0 ::1:631                 :::*                    LISTEN      998/cupsd      

Master上查看集群中的节点及节点状态

[root@k8s-master kubernetes]# kubectl get node

NAME              STATUS    AGE

192.168.248.142   Ready     2m

[root@k8s-master kubernetes]# kubectl -s get node

NAME              STATUS    AGE

192.168.248.142   Ready     2m

kubernetes集群搭建完成。

在k8s集群中创建pod,如果出现如下错误

其中最主要的问题是:details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)

解决方案:

查看/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt (该链接就是上图中的说明) 是一个软链接,但是链接过去后并没有真实的/etc/rhsm,所以需要使用yum安装:

yum install *rhsm*

安装完成后,执行一下docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest

如果依然报错,可参考下面的方案:

wget

rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem

注释:rpm2cpio命令用于将rpm软件包转换为cpio格式的文件

cpio命令主要是用来建立或者还原备份档的工具程序,cpio命令可以复制文件到归档包中,或者从归档包中复文件。          

       -i   还原备份档  

       -v  详细显示指令的执行过程

这两个命令会生成/etc/rhsm/ca/redhat-uep.pem文件.

[root@k8s-node ~]# docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest

在master节点新建pod并查看起状态为正常

flannel是CoreOS提供用于解决Dokcer集群跨主机通讯的覆盖网络工具。它的主要思路是:预先留出一个网段,每个主机使用其中一部分,然后每个容器被分配不同的ip;让所有的容器认为大家在同一个直连的网络,底层通过UDP/VxLAN等进行报文的封装和转发。

k8s本地构建后台开发环境

近期陆续遇到几个问题,涉及到zk和kafka相关。为了学习zk和kafka等中间件,同时也更方便的程序,萌生了在本地部署mysql,zk,kafka集群的想法。毕竟集群维度的扩容,启停等操作没有办法在测试环境中执行。

在云原生的背景下,使用k8s来部署这些中间件无疑是最方便的选择之一,也可以顺便学习一下k8s,于是有了这篇文章。使用k8s还有一个好处,只需写好yaml文件,其他同学也可以快速复制这个环境。

本文不会可以介绍k8s相关的概念,这是一篇tutorial,重点在于可以快速的复刻。

虽然不刻意介绍k8s相关的概念,但是有些概念还是不得不提。k8s中服务分为有状态的服务(stateful)和无状态的服务(stateless),mysql、zk、kafka等都属于有状态的服务。我们要部署多节点的集群,而不是像使用docker似的直接拉起一个单节点服务。对这些细节感兴趣的同学,请阅读k8s的官方文档进行学习。

k8s关于stateful的介绍和示例:

最后提一点,学无止境,也要适可而止,重点还是放在测试业务上,比如测试集群节点down机后业务软件的高可用设计等。

ok, let's go

部署mysql集群仅需按照 官方文档 步骤操作即可,有如下点改动:

mysql-services.yaml

mysql-statefulset.yaml

执行如下命令即可创建mysql集群

查看services列表,可看到有读写两个services,其中可写的集群外部可通过30001访问。请注意cluster ip列都是k8s内部访问的IP,本地访问IP地址使用127.0.0.1

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

kubernetes ClusterIP 10.96.0.1 none 443/TCP 25h

mysql NodePort 10.110.247.59 none 3306:30001/TCP 13m

mysql-read ClusterIP 10.108.247.87 none 3306/TCP 13m

在外部访问方式:mysql -h127.0.0.1 -P30001 -uroot

参考这篇文档:

kafka的这个镜像给的配置较低,存在服务启动慢和健康检查执行时间长的问题,需要设置readinessProbe下的initialDelaySeconds和timeoutSeconds参数,检查间隔也调整为20s。

如何访问k8s集群内部署的mysql服务

虽然 kubernetes 社区一直在努力使得有状态应用成为一等公民,也推出了 statefulset 控制器支持 pod 的顺序部署,稳定的域名访问和存储访问。但鉴于 MySQL 部署运维的多样性和复杂性,在 kubernetes 上部署 MySQL 仍然要面临众多挑战。

1、业务流量入口的配置方式

传统虚拟机环境下,我们通过虚IP的方式,让业务应用都配置事先定义的一个虚IP为链接数据库的地址,然后由高可用服务保证虚IP始终能被路由到master数据库。在kubernetes中,出现了一层网络插件屏蔽了底层网络拓扑,高可用服务管理虚IP的方式需要随之适应调整,比如通过service结合标签完成虚IP的漂移,但service本身是kubernetes提供的一项功能,其可靠性和性能都取决于kubernetes服务的稳定。以性能来说,service是kubeproxy组件通过配置iptables实现的,当iptables规则较多时不可避免的会产生时延,需要我们针对性的解决。

2、容器隔离带来的监控视野问题

在 kubernetes 中,如果将 MySQL 制作为 container 运行在一个 pod 中,container 会将 MySQL 进程和运行环境隔离在一个单独的 namespace 中。监控组件在获取 MySQL 的一些 metirc 时,可能不得不进入与 MySQL 同一个 namespace 中,在部署和设计监控组件时需要考虑到这些限制。

3、存储在 kubernetes 中,支持配置各种不同的存储。

如果使用本地存储 local persistent volume,则需要绑定 MySQL 在一个固定的节点,这就完全浪费了 kubernetes 灵活调度的天然优势;而如果使用远程共享存储,确实是将 MySQL 进程与其存储完全解耦,使得 MySQL 进程可以在任意节点调度,然而考虑到高 I/O 吞吐量的情况,就不是那么美好了。设计时需要考量远程存储是否能够满足 MySQL 的带宽要求。

4、高可用/备份恢复

kubernetes 提供的 statefulset 控制器只能提供最基本的部署,删除功能,无法实现完善的 MySQL 集群高可用/备份恢复操作。对于有状态应用的部署,仍需要定制开发,所以多数公司提供了定制的 operator 来完成应用容器的管理。比如 etcd operator,MySQL operator,后文将为大家详述我测试使用 MySQL operator 的一些记录。

k8s中的Mysql数据库持久化存储

一、配置:

环境:

CentOS7 

VMware

笔者配置了四台虚拟机:

K8S-Master节点: 3GB内存   2核CPU   20GB硬盘空间

K8S-node1节点:  2GB内存   2核CPU   30GB硬盘空间

K8S-node2节点:  2GB内存   2核CPU   30GB硬盘空间

镜像仓库节点:      2GB内存   2核CPU   50GB硬盘空间

二、节点规划:

使用三台虚拟机搭建K8S集群,使用一台虚拟机搭建镜像仓库。

每台虚拟机配置两块网卡,其中一块为“NAT模式”,用于拉取镜像等功能。

另外一块网卡为“仅主机模式”,用于集群节点间的通信。归划如下:

K8s-master节点:

仅主机模式:10.10.10.200

NAT模式:  192.168.200.130

K8S-node1节点:

仅主机模式:10.10.10.201

NAT模式:  192.168.200.131

K8S-node2节点:

仅主机模式:10.10.10.202

NAT模式:  192.168.200.132

镜像仓库节点:

仅主机模式:10.10.10.101

NAT模式:  192.168.200.150

三、版本信息

Linux内核版本:

Linux version 3.10.0-862.el7.x86_64 (builder@kbuilder.dev.centos.org)

(gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) )

#1 SMP Fri Apr 20 16:44:24 UTC 2018

K8s集群版本为1.15.0版本:

四、基于StatefulSet与PV/PVC的MySql持久化存储实验

1. 在每个节点安装nfs服务

在“镜像仓库”节点,执行以下命令:

yum install -y nfs-common nfs-utils rpcbind

在k8s集群,执行以下命令:

yum install -y nfs-utils rpcbind

2. 在“镜像仓库”节点下,配置nfs服务器

mkdir /nfs_mysql

Chmod 777 /nfs_mysql/

(在测试环境中,为了不考虑用户属性,暂时赋予777权限,但在生产环境不推荐这样做)

Chown nfsnobody /nfs_mysql/

echo “/nfs_mysql *(rw,no_root_squash,no_all_squash,sync)”  /etc/exports

cat /etc/exports

/nfs_mysql *(rw,no_root_squash,no_all_squash,sync)

systemctl start rpcbind

systemctl start nfs

3. 测试nfs服务是否可用

mkdir /test

showmount -e 10.10.10.101

可见/nfs_mysql *已暴露于共享目录,接下来测试挂载是否可用:

在master节点下执行:

mount -t nfs 10.10.10.101:/nfs_mysql /test/

echo "hello-world"/test/1.txt

在镜像仓库节点下查看1.txt是否存在,若存在则挂载成功:

可见nfs服务可以正常使用,接下来删除test目录和1.txt

在镜像仓库下:

[root@hub nfs_mysql]# rm -f 1.txt

在Master节点下:

[root@k8s-master ~]# umount /test/

[root@k8s-master ~]# rm -rf /test/

同理,依照以上步骤同时创建:(提供多个mysql副本进行挂载)

nfs_mysql1

nfs_mysql2

完成后需要重启nfs服务

systemctl restart rpcbind

systemctl restart nfs

最终效果:

4. 将nfs封装成pv

创建mysql_test文件夹,将yaml文件统一保存在此目录下

mkdir mysql_test

cd mysql_test

vim mysql-pv.yml

mysql-pv.yml配置如下:

apiVersion: v1

kind: PersistentVolume

metadata:

name: mysql-pv

spec:

capacity:

storage: 5Gi

accessModes:

-  ReadWriteOnce

persistentVolumeReclaimPolicy: Retain

storageClassName: nfs

nfs:

path: /nfs_mysql

server: 10.10.10.101

---

apiVersion: v1

kind: PersistentVolume

metadata:

name: mysql-pv1

spec:

capacity:

storage: 5Gi

accessModes:

-  ReadWriteOnce

persistentVolumeReclaimPolicy: Retain

storageClassName: nfs

nfs:

path: /nfs_mysql1

server: 10.10.10.101

---

apiVersion: v1

kind: PersistentVolume

metadata:

name: mysql-pv2

spec:

capacity:

storage: 5Gi

accessModes:

-  ReadWriteOnce

persistentVolumeReclaimPolicy: Retain

storageClassName: nfs

nfs:

path: /nfs_mysql2

server: 10.10.10.101

注意:

在k8s集群15版本中recycle回收策略已被删除,只能用retain策略或者Delete策略。这里我们使用 persistentVolumeReclaimPolicy: Retain

执行命令:

kubectl create -f mysql-pv.yml

kubectl get pv

如图所示,即为Pv创建成功。

5. 部署MySQL,在mysql_test目录下编写mysql.yml,配置文件如下

apiVersion: v1

kind: Service

metadata:

name: mysql

labels:

app: mysql

spec:

ports:

- port: 3306

name: mysql

clusterIP: None

selector:

app: mysql

---

apiVersion: apps/v1

kind: StatefulSet

metadata:

name: mysql

spec:

selector:

matchLabels:

app: mysql

serviceName: "mysql"

replicas: 3

template:

metadata:

labels:

app: mysql

spec:

containers:

- name: mysql

image: mysql:5.6

env:

- name: MYSQL_ROOT_PASSWORD

value: password

ports:

- containerPort: 3306

name: mysql

volumeMounts:

- name: mysql-persistent-storage

mountPath: /var/lib/mysql

volumeClaimTemplates:

- metadata:

name: mysql-persistent-storage

spec:

accessModes: ["ReadWriteOnce"]

storageClassName: "nfs"

resources:

requests:

storage: 1Gi  

执行以下命令,部署mysql服务:

kubectl create -f mysql.yml

如图可知,mysql按StatefulSet依次创建了mysql-0 mysql-1 mysql-2

查看各个Pod部在哪个节点:

6. 通过创建临时容器,使用MySQL客户端发送测试请求给MySQL master节点

注意:

主机名为mysql-0.mysql;跨命名空间的话,主机名请使用mysql-0.mysql. [NAMESPACE_NAME].如果没有指定命名空间,默认为default,即 mysql-0.mysql. default。

这里笔者打算关闭node2节点来模拟node2宕机,来测试是否实现数据的持久化存储,

所以我们向node2上的mysql1写入数据。

执行以下命令,访问mysql1:

kubectl run mysql-client --image=mysql:5.6 -it --rm --restart=Never -- mysql -h mysql-1.mysql.default -p password

创建数据库demo,并向messages表中写入hello-world

CREATE DATABASE demo; 

CREATE TABLE demo.messages (message VARCHAR(250)); 

INSERT INTO demo.messages VALUES ('hello-world');

如图所示

接下来我们来关闭k8s-node2虚拟机,模拟宕机

查看nodes的运行状态,可知node2的状态已转变为NotReady

一段时间后,k8s将Pod MySql -1迁移到节点k8s-node1

由于时间过长,笔者把三个Pod都删除重启后,验证数据:

MySQL服务恢复,数据完好无损!


网页标题:k8s怎么部署mysql k8s怎么部署前后端应用
文章位置:http://azwzsj.com/article/hhjsid.html