以前给你们介绍过, 我本身用的开发环境都是容器化的,只不过前两年不会用K8,大部分都是用的 Docker 或者 Docker-Compose。随着这一年多对 K8 的学习和工做中的使用,一直有想法用K8 作一套便携式开发环境,之后换电脑就不用再愁数据库、缓存、队列这些基础软件的安装了。正好下个月我就能换新的办公电脑啦,也不能拿『能用就行』的理由再拖延下去了。node
若是问你 “ 平时开发程序依赖最多的基础软件时啥?”,我猜大部分人会回答:“MySQL 和 Redis”,毕竟万物皆是增删改查,成天作CURD的咱们怎么能离开它们呢。mysql
既然是要在本地 Kubernetes 上搭建开发环境,那电脑上得先有 Kubernetes 集群才行。目前能够在本地运行 Kubernetes 集群的工具备:Minikube 、Kind 和 K3d ,咱们的MySQL和Redis都是靠先编写资源定义YAML文件,再经过 kubectl 交给Kubernetes 集群执行的,因此这三种工具用哪一种都行。git
我本身在本地使用的是Minikube,这是 Kubernetes 官方提供的工具,说实话运行起来后电脑有点卡,Minikube的安装步骤能够参考我之前写的文章「Minikube-运行在笔记本电脑上的Kubernetes集群」。另外两种 Kind 和 K3d 则是轻量级集群,支持多节点部署。其中我比较推荐K3d,尤为是使用 M1芯片MacBook的同窗,如今暂时只能使用K3d安装Kubernetes集群。github
K3d 是使用 docker 容器在本地运行 k3s 集群,k3s 是由 Rancher Lab 开源的轻量级 Kubernetes。k3d 完美继承了 k3s 的简单、快速和占用资源少的优点,镜像大小只有 100 多 M,启动速度快,支持多节点集群。虽然 k3s 对 Kubernetes 进行了轻量化的裁剪,可是提供了完整了功能,像 Istio 这样复杂的云原生应用均可以在 k3s 上顺利运行。sql
K3d 除了启动速度快和占用资源少之外,在边缘计算和嵌入式领域也有着不俗的表现。由于 k3s 自己应用场景主要在边缘侧,因此支持的设备和架构不少,如:ARM64 和 ARMv7 处理器。不少老旧 PC 和树莓派这样的设备均可以拿来作成 k3s 集群,为本地研发测试燃尽最后的生命。docker
说完了安装工具的选择,咱们再来讲一下在Kubernetes上从零搭建开发环境须要提早作哪些知识储备,若是你已经对Kubernetes这些基础概念已经有所了解能够直接跳过去看实操环节了,若是还比较生疏的话,我建议你们先看看下面这几篇文章,这些都是咱们搭建开发环境时须要用到的。数据库
深刻理解StatefulSet,用Kubernetes编排有状态应用
在正式开始在Kubernetes上安装MySQL和Redis前我先说明下安装这两个基础软件服务的思路。
首先由于是用做开发环境,咱们就不追求高可用了,尽可能精简。文章后面我会给出安装主从和集群式数据库的一些教程连接,供你们参考。
安装MySQL和Redis的思路是同样的,每一个服务都由下面几个主要的部分构成:
① 一个单副本 Pod 做为运行MySQL或者Redis 的载体。
② 一个调度Pod用的Deployment控制器,由于服务里只包含一个Pod,不须要维持构建的顺序,因此不用使用StatefulSet做为Pod的控制器。
③一个ConfigMap对象,包含了MySQL或者Redis配置文件里须要的配置项,在建立Pod时会做为配置文件挂载到应用所在的容器中。
④一个 Service 对象,将应用 Pod 做为本身的后端端点,以始终保持不变的NodeId:NodePort 方式向外暴露服务。
下面这张图很好的解释了这四部分的协做关系。
解释清楚咱们在Kubernetes上搭建MySQL和Redis开发环境的思路后,下面就能够进入实操环节啦,我为你们准备了能够直接拿来使用的YAML资源定义文件。
咱们先来建立一个名为 mysql-db-config 的ConfigMap,稍后会把这些配置做为 my.cnf 配置文件挂载到MySQL应用Pod的容器里。
### 文件名 mysql-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-db-config
namespace: default
labels:
app: mysql-db-config
data:
my.cnf: | [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4' skip-character-set-client-handshake = true max_connections=2000 secure_file_priv=/var/lib/mysql datadir=/var/lib/mysql bind-address=0.0.0.0 symbolic-links=0 复制代码
假定MySQL相关的YAML定义文件都放在 mysql-singleton 这个目录下,经过 kubectl 把这个ConfigMap 提交给Kubernetes 进行建立便可:
kubectl apply -f mysql-singleton/mysql-configmap.yaml
复制代码
有了MySQL配置相关的 ConfigMap后,咱们就能在建立运行MySQL的容器时,把他做为配置文件挂载到容器中:
### 文件名 deployment-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
type: NodePort
ports:
- port: 3306
nodePort: 30306
targetPort: mysql
selector:
app: mysql
---
apiVersion:
kind: Deployment
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.7
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: root
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
- name: mysql-config
mountPath: /etc/mysql/conf.d/my.cnf
subPath: my.cnf
volumes:
- name: mysql-persistent-storage
emptyDir: {}
- name: mysql-config
configMap:
name: mysql-db-config
items:
- key: my.cnf
path: my.cnf
复制代码
一样的,使用kubectl 把 YAML 提交给Kubernetes后,等资源建立完毕咱们的开发环境MySQL就算搭建好了
kubectl apply -f mysql-singleton/deployment-service.yaml
复制代码
经过
上面的YAML文件中,有三点须要详细说明一下:
在Kubernetes上建立完MySQL后,咱们能够经过任意客户端或者mysql命令行,链接MySQL服务。
mysql -uroot -proot -h {minikube-ip} -P 30306
复制代码
聊清楚了怎么用Kubernetes建立单节点的MySQL后,对于建立单例的Redis相信你们对大体流程也就比较清楚了,惟一少的就是定义Redis服务的这些YAML文件了。我已经帮大家踩好坑了,下面这些YAML都是我在线下调试过一段时间的,而且也能正确完成Redis数据的持久化。
因为声明 Redis 配置的 ConfigMap 篇幅太长,为了避免影响文章的阅读我就把这个安装Redis须要的YAML文件都放在GitHub上了,能够点击阅读原文或者经过连接:github.com/kevinyan815… 访问下载。
在这个仓库里我给出了MySQL和Redis的详细安装步骤,以及各类资源的YAML定义文件,包括以前安装ETCD集群的教程也整合到了这个仓库里。
安装步骤详解,参考 用Kubernetes搭建ETCD集群和WebUI
关于安装过程当中遇到的问题能够在留言里跟我交流,你们还想看其余基础软件在Kubernetes上的安装教程的话也能够告诉我。
这篇文章里整理了在Kubernetes上安装MySQL和Redis这两款咱们经常使用的基础软件的操做步骤,因为目的是在本地开发环境用,因此力求资源定义尽可能简单,能作到数据可持久化就好了,高可用再也不这里讨论。若是你对在Kubernetes上建立MySQL集群有兴趣,能够参考我下面给出的连接。
[MySQL Operator FOR Kubernetnes](: medium.com/oracledevs/…)
今天的文章就到这里啦,若是喜欢个人文章就帮我点个赞吧,我会每周经过技术文章分享个人所学所见和第一手实践经验,感谢你的支持。微信搜索关注公众号「网管叨bi叨」每周教会你一个进阶知识。