一、背景
为啥要在本地搭建 Kubernetes 集群?因为开发者可以在本地快速验证自己实现的功能,接口。众所周知,由于 Kubernetes 部署较为复杂,使得广大开发者和运维人员学习和试用 Kubernetes 的门槛很高,光是部署一套 Kubernetes 集群,就需要部署大量的组件,花费精力较大。为了降低用户体验 Kubernetes 的门槛,Minikube 项目应运而生,它是 Github 上的一个开源项目,提供了一键安装的 Kubernetes 本地集群,支持 MacOS,Linux,Windows。
谁需要 Minikube?
- 本地开发 Kubernetes应用
- 离线开发 Kubernetes 应用
- 体验最新版 Kubernetes
如果你有以上需求,可以使用 Minikube。 Minikube 大大简化了的开发者部署自己的服务到 Kubernetes,因为这个本地集群可以部署在自己的笔记本,亲测 8C16G笔记本跑起来很轻松,随时可以启停,不依赖网络连接。开发者可以在自己的笔记本里,运行Kubernetes 的 Pods,快速验证自己的服务功能是否生效。
被纳入到了 Kubernetes 官方项目里-https://github.com/kubernetes/minikube。
二、搭建趟坑之旅
- Mac 环境安装:
使用官方地址进行一键安装:
- 坑点 :二进制包下载需翻墙
官方文档给的下载地址需要访问谷歌的服务器storage.googleapis.com,有时候下载容易失败,可以切换到阿里云的下载地址:
该地址亲测可用。
- 启动 Minikube:
使用官网文档启动:Minikube Start,集群可以正常启动。
- 坑点 :镜像源指向了io
启动Minikube 之后,运行 pod 一般都会失败,因为 Minikube 默认将它的镜像中心默认指向了 gcr.io,从这里下载过镜像的人都被它深深伤害过,可以在启动参数里指定镜像源和私有镜像库。
- 配置私有镜像仓库:
根据官方文档,在启动时加入参数:” –insecure-registry”
minikube start –insecure-registry “docker-release-local.demo.jfrog.com” –registry-mirror=https://registry.docker-cn.com
这里–insecure-registry配置的是JFrog 的本地私有 Artifactory Docker 镜像仓库,一般企业内部都有私有镜像库。
- 坑点 :指定私有镜像库不生效
笔者使用的Minikube v1.2.0 Mac 版本在启动时–insecure-registry并不生效,可以找到主机上 minikube 配置文件目录下的文件进行修改。打开文件:~/.minikube/machines/minikube/config.json,增加记录” docker-release-local.demo.jfrog.com”
配置完之后镜像拉取默认会从私有镜像仓库寻找镜像。
- 从私有镜像仓库拉取镜像
启动 Minikube 后,在 Kubernetes 集群里创建镜像中心的密钥“regcred”:
kubectl create secret docker-registry regcred –docker-server=docker-release-local.demo.jfrog.com –docker-username=admin –docker-password=*** –docker-email=wq@jfrogchina.com
在微服务的 Deployment yaml 文件里使用这个密钥即可让 Pod 通过密钥登录私有镜像仓库,拉取镜像。
配置好私有镜像仓库之后,你的Pod 镜像拉取速度是秒级的。
- 启动应用-Jenkins
写一个 Jenkins 的部署 yaml 文件,让它运行在 Kubernetes 集群里。
Jenkins 可以正常运行。
- 坑点:Pod 重启时候,Jenkins 数据没了?
很多应用的配置文件是需要放到 Pod 之外进行管理的,比如 Jenkins。这就需要 Minikube 支持挂载目录。Minikube 官方提供了对挂载目录的支持,默认/data 目录是在重启 Minikube 之后,文件也会保留的目录,可以在/data 目录下创建Jenkins_home目录,然后在Kubernetes 里声明 PV,类型为 hostPath,挂载这个目录。
声明好这个持久化卷之后,就可以在 Jenkins 的部署 yaml 文件里通过 PVC 来使用这个目录。
上图可以看到我们把 Jenkins pod 里的/var/Jenkins_home 目录映射到了 Pod 外部,也就是 Minikube 主机上的/data/Jenkins-home,这样即使 Pod 重启,Minikube 重启也不会丢失数据。
- 坑点:挂载目录写失败
当挂创建好/data/Jenkins-home目录之后,默认只有 root 用户有写权限,Jenkins Pod 启动起来之后,会因为无法写入配置文件而启动失败,此时需要将/data/Jenkins-home的权限赋予 docker 用户,再次启动 pod 即可正常运行。
- 访问服务
当 Jenkins Pod 运行起来之后,可以通过 Jenkins service 的 nodePort 暴露的 31081进行访问,这里注意 ip 是 Minikube 的 ip 地址:
三、小结
通过 Minikube 能够实现开发者微服务的本地快速部署,对自己开发的功能,接口进行本地的快速验证,大大提升开发者的交付质量和效率。
四、附录
文中用到的代码仓库在这里,欢迎想动手实践的同学进行 clone:https://github.com/alexwang66/sample-microservices-k8s