公司给配的工作机器是Win10
电脑,闲来无事想体验一下K8S
的魔力,到处搜了攻略文章最终成功,记录一下过程和中间遇到的问题。
目标
- 在
Win10
上使用minikube
搭建K8S单机环境。 - 使用
K8S
部署镜像,这里使用docker hub
上现成的demo镜像。
前置条件
-
Win10
系统需要支持Hyper-V
虚拟机功能 ,Win10
专业版、企业版可以直接开启。https://docs.microsoft.com/zh-cn/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v - 安装
Win10
版Docker
,官网下载或者找个国内地址。https://hub.docker.com/editions/community/docker-ce-desktop-windows
本地安装K8S集群
- 官方提供了
minikube
工具来给我们在本地单机方式体验K8S集群,本次体验就是基于minikube
实现。
安装minikube
- 官网下载,安装,之前开启好
hyper-v
就没啥特别的问题。https://kubernetes.io/docs/tasks/tools/install-minikube/ - 安装完后打开
powershell
命令窗口,执行minikube
,成功的话会打印出命令提示信息:
image.png -
minikube
和其他常用命令一样,可以通过--help查看具体指令的帮助说明,没事可以多看看。 - 常用命令:
-
minikube start
:创建并启动K8S集群,第一次启动需要从网上拉取各种镜像文件。 -
minikube stop
:停止K8S集群。 -
minikube delete
:删除之前创建好的集群。
-
Win10创建虚拟交换机
- 在开始菜单中搜索并打开
Hyper-V
管理器,创建一个外部虚拟交换机:
image.png
image.png
image.png - 名称我们写成
minikubeSwitch
,后续会用到。
启动minikube
- 上面的准备好了,我们可以尝试启动K8S集群了。
- 用管理员权限打开
powershell
命令行,否则会无法创建虚拟器。 - 在C盘下(否则会找不到某些文件)执行
minikube
命令和参数:
minikube.exe start --vm-driver="hyperv" --memory=4096 --hyperv-virtual-switch="minikubeSwitch" --image-mirror-country="cn"
- 参数含义:
- vm-driver="hyperv":指定虚拟技术为
hyper-v
,还可以使用virtual-box
。如果是linux
系统可以不指定此参数。 - memory=4096:看名字就知道,分配4G内存给
K8S
集群。 - hyperv-virtual-switch="minikubeSwitch":指定前面创建的虚拟交换机。
- image-mirror-country="cn":众所周知的原因,中国大陆无法访问某些网站,导致必要的镜像无法下载,例如网上常见的
k8s.gcr.io
镜像无法下载问题。K8S
官方深知我国国情,通过这个参数minikube
会自动换成aliyun
的docker hub
,真是很体贴。
- vm-driver="hyperv":指定虚拟技术为
- 等待运行完成,看到机器内存使用飙高,执行
minikube status
查看集群是否运行成功。
image.png
配置minikube,设置docker仓库为本地
- 正常使用
K8S
时,镜像是要从远程仓库上拉取到的。minikube
可以通过docker-env
命令让K8S
使用本地机器的docker
仓库,方便我们测试。 - 在
powershell
命令行中执行:
& minikube docker-env | Invoke-Expression
安装K8S控制工具
-
K8S
集群启动好了,我们需要安装kubectl
这个命令来操作它,执行minikube kubectl
便会自动安装到powershell
命令环境中。 - 运行
minikube dashboard
,会自动安装并运行K8S
的dashboard
界面,方便管理操作集群。
image.png
发布镜像
-
K8S
准备好了,下一步可以开始部署程序镜像了。
准备镜像
- 这里我不自己创建新镜像,用网上现成的demo镜像拉取到本地,假装是我自己打包的
docker
。 -
https://hub.docker.com/r/kennship/http-echo这是一个简单的
nodejs
代码,它接收一个请求,返回请求信息。 - 从
docker hub
拉取echo镜像至本地:
docker pull kennship/http-echo
编写Deploy文件
-
K8S
中每个镜像运行的环境名称为POD,我们需要编写一个deploy.yaml
文件描述POD,包含依赖的API版本,名称,部署镜像等元数据信息:
# deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo-deployment
labels:
app: echo
spec:
replicas: 1
selector:
matchLabels:
app: echo
template:
metadata:
labels:
app: echo
spec:
containers:
- name: koly-echo
image: kennship/http-echo
ports:
- containerPort: 3000
- spec.template.spec.containers.image:指定POD部署哪个镜像,目标的
minikube
会从宿主机docker
获取镜像文件。 - spec.template.spec.containers.ports:containerPort:指定POD使用哪个端运行程序。
用K8S部署POD
- 使用
kubectl apply -f .\deploy.yaml
部署POD:
image.png - 使用
kubectl get pods
查看POD运行情况:
image.png - Running表示镜像已经正常运行。
启动Service访问已部署的POD资源
- POD运行在K8S虚拟化集群中,需要利用Service来访问它。同样的,需要编写一个
service.yaml
来描述如何访问POD资源:
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: echo-service
spec:
selector:
app: echo
type: NodePort
ports:
- protocol: TCP
port: 80
targetPort: 3000
nodePort: 30080
- spec.ports.targetPort:与deploy的containerPort一致。
- spec.ports.nodePort:表示将
minikube
创建的机器的端口跟service的port映射了起来,而service的port又跟pod的port映射了起来。 - 有了service.yaml,使用
kubectl apply -f service.yaml
运行service:
image.png
获得运行程序的访问地址
- 使用
minikube service echo-service --url
命令获得程序访问地址:
image.png - 打开命令行中返回的URL,就能正常访问到用
K8S
部署的镜像程序了:
image.png