快速上手k8s——minikube最小实现
前言
最近在研究k8s,就来写一个关于k8s快速上手,并记录采坑的点。
需要的前置知识点:docker、k8s的一些基本概念,下面这个可能对你有帮助。
https://juejin.im/post/5d1b2a656fb9a07edc0b7058
什么是k8s
我们知道,我们可以将项目制作成docker镜像,然后利用docker去部署我们的项目,这样可以解决很多服务器环境所带来的问题;
但是容器多了,容器与容器之间就需要访问,之间就需要网络配置等等,从而就有了docker-compose;
但是当我们的服务进行升级,或者服务需要进行调度,扩容等等,这个时候就需要一个大管家来管所有的东西;
这个大管家就是 - Kubernetes
初学会遇到的问题
因为k8s的东西太多了,所以学习成本现在越来越高,好在k8s已经很多教程。我说一下现在学的时候肯定会遇到的大问题:
- 国内的问题(国内环境很多镜像拉不到)
- 本地搭建环境(原来搭建k8s需要一些服务器)
- 电脑环境的问题(windows和mac都有坑点)
最小实现
现在我们就来在本机实现一个最小的k8s的实现,给出一个hello-world
k8s提供了minikube,这个东西可以让你本机一台机器就可以搭建起这个环境。拥有和线上一样的命令行操作和模式,但是不需要你再去创建很多虚拟机来搞事情了。超级方便也。
https://minikube.sigs.k8s.io/
我们就利用这个来实现,下面来说说步骤:
我的本机环境:
- macOS
- minikube version: v1.5.2
- Docker version 18.03.1-ce
安装环境
大致步骤:https://minikube.sigs.k8s.io/docs/start/macos/
brew install minikube
brew install docker-machine-driver-vmware
minikube start --vm-driver=vmware --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers
成功之后:
-
minikube status
查看minikube的状态 -
minikube ip
查看minikube的ip -
minikube dashboard
打开dashboard展示k8s的状态
安装坑点
- HyperKit最新版本可能存在问题,所以我使用VMware Fusion实现虚拟化的依赖
- 国内
k8s.gcr.io
的相关镜像国内拉取不到,使用mirrorgooglecontainers也无法拉取到,所以使用阿里云的仓库 https://github.com/kubernetes/minikube/issues/3860 - 如果之前已经使用过
minikube start
命令,建议先minikube delete
,并删除rm -rf ~/.minikube/
,然后重新start
进行部署
首先描述一下部署要做的事情:linkinstar/mini-go:v1.0 是我已经上传到 docker-hub 里面的一个已经做好的最简单的项目,会暴露一个8080端口的web服务;
最终的目标,在k8s创建一个pod,pod中运行一个我们的容器,最终我们在外部可以访问到这个服务
首先创建两个文件
# deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mini-go
labels:
app: mini-go
spec:
replicas: 1
selector:
matchLabels:
app: mini-go
template:
metadata:
labels:
app: mini-go
spec:
containers:
- name: mini-go
image: linkinstar/mini-go:v1.0
ports:
- containerPort: 8080
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: mini-go-service
spec:
selector:
app: mini-go
type: NodePort
ports:
- protocol: TCP
port: 80
targetPort: 8080
nodePort: 30008
执行
- kubectl create -f service.yaml
- kubectl create -f deploy.yaml
查看
执行成功可以再dashboard中查看执行状态
image
image
最终访问地址查看到服务是否正常:http://192.168.231.146:30008/
其中的ip是通过 minikube ip
命令查看的
服务操作
水平伸缩
在现实的业务环境中,当用户的访问增多,我们需要扩展我们的应用,也就是水平的去多部署几个容器,有了k8s之后这件事就变得非常的容易了。
- 修改 deploy.yaml 文件中的 replicas: 2 改成2个
- 使用命令:
kubectl apply -f deploy.yaml
使配置生效
然后我们就可以看到,原来的一个pod变成了两个,而k8s会将我们的请求负载均衡到每个pod中。整个过程可以说是非常的优雅了。
image同样的,当我们需要减少服务的数量时也是相同的道理
版本升级
对于应用的版本升级也是同样的道理
- 修改 deploy.yaml 文件中的 image: linkinstar/mini-go:v2.0 改成2.0
- 使用命令:
kubectl apply -f deploy.yaml
使配置生效
版本回退
当我们发现发布的服务问题,想要进行版本回退的时候,就可以使用
kubectl rollout undo deployments/mini-go
进行版本回退,下面是版本回退过程中
让minikube的dashboard能外网访问
当我们使用minikube搭建一个k8s的环境时,如何使用的时候服务器并不是使用本机进行搭建,那么会遇到dashboard页面没有办法被外部访问的问题。解决方式如下:
启动
首先使用minikube dashboard命令启动
# minikube dashboard
🤔 Verifying dashboard health ...
🚀 Launching proxy ...
🤔 Verifying proxy health ...
http://127.0.0.1:42968/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
然后记住最下面的访问地址:http://127.0.0.1:42968/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
设置代理
再打开一个sh窗口
使用 kubectl proxy --port=[需要暴露的端口号] --address='[服务器IP]' --accept-hosts='^[外部访问服务器的IP]$'
添加k8s集群对外的访问代理。
# kubectl proxy --port=8887 --address='172.31.251.45' --accept-hosts='^.*'
这里的port是你后面通过外网访问的端口,如果使用云服务器记得设置防火墙规则,其中的address为服务器ip地址可以使用minikube ip命令获得,我这里允许的是任意机器
浏览器访问
- 其中的ip为服务器的ip
- 端口为代理设置的端口
- 剩下的地址为dashboard启动时显示的地址
如果上述测试没有问题使用 nohup 后台启动就可以了
总结
- 使用minikube可以快速让新手感受到k8s到底是如何使用的
- 环境配置过程中会有很多问题,需要你耐心解决
- k8s在服务编排上面除了以上提到的用法以外还有很多牛逼的功能等着你去发现
- 学习过程中需要保持一个原则,先用着看看 -> 搞清楚架构 -> 尝试各种功能 -> 学习各个模块的实现 -> 最终实践