在Win10上使用minikube体验K8S

公司给配的工作机器是Win10电脑,闲来无事想体验一下K8S的魔力,到处搜了攻略文章最终成功,记录一下过程和中间遇到的问题。

目标

  • Win10上使用minikube搭建K8S单机环境。
  • 使用K8S部署镜像,这里使用docker hub上现成的demo镜像。

前置条件

本地安装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会自动换成aliyundocker hub,真是很体贴。
  • 等待运行完成,看到机器内存使用飙高,执行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,会自动安装并运行K8Sdashboard界面,方便管理操作集群。
    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

参考资料

推荐阅读更多精彩内容