用 MicroK8s 在本地开发和测试应用

花了一个多周时间把 app 改造到了 k8s 上,这篇权作记录之用吧,随时订正
关于本地的 k8s 编排环境,官网用的是无惊无喜的 minikube, Canonical (Ubuntu)推出了 MiniK8s ,试一下吧!
MicroK8s 可在 Ubuntu 和任意支持 snap 的 OS 上运行全部原生的 K8s 服务。这对于开发应用,创建简单的 K8s 集群和本地微服务开发非常有帮助,所有的开发工作最终都还是需要部署的。
MicroK8s 提供另一个级别的可靠性因为它提供了与当前 Kubernetes(以下简称 Kubernetes 为 K8s)版本一致的开发环境。 在最新的上游 K8s 发布后的一周内,在 Ubuntu 上即可使用。
首先在 Mac 上配置 multipass,此工具被设计为方便用户在 Mac、Windows、Linux 上开启 Ubuntu VM(虚拟)环境。
- 首先看下 multipass 在 mac 下用的什么虚拟机:
sudo multipass get local.driver
, 我的是hyperkit
hyperkit- multipass 在 mac 下目前还只能从网上 load 新的 image,除了 linux 版本,其他的版本暂时无法从本地或者自定义 url load image: https://discourse.ubuntu.com/t/new-way-to-launch-images-other-than-cloud-images-from-simplestreams/6282
- [wip] 在本地搭建一个「假服务器」来加速其他 mac 机器安装
-
分别在每台机器上配置完成后就可以做集群了。 0. enable: sudo microk8s.enable dns dashboard registry
- 在 master 上执行命令查看如何把其他机器添加过来:
microk8s.add-node Join node with: microk8s.join 192.168.1.193:25000/miVQVXvUTyLMqFqFTVDcFRSzlwAyeDPg If the node you are adding is not reachable through the default interface you can use one of the following: microk8s.join 192.168.1.193:25000/miVQVXvUTyLMqFqFTVDcFRSzlwAyeDPg microk8s.join 10.0.85.1:25000/miVQVXvUTyLMqFqFTVDcFRSzlwAyeDPg microk8s.join 172.17.0.1:25000/miVQVXvUTyLMqFqFTVDcFRSzlwAyeDPg microk8s.join 172.18.0.1:25000/miVQVXvUTyLMqFqFTVDcFRSzlwAyeDPg microk8s.join 172.19.0.1:25000/miVQVXvUTyLMqFqFTVDcFRSzlwAyeDPg microk8s.join 10.1.93.0:25000/miVQVXvUTyLMqFqFTVDcFRSzlwAyeDPg microk8s.join 172.20.0.1:25000/miVQVXvUTyLMqFqFTVDcFRSzlwAyeDPg microk8s.join 172.21.0.1:25000/miVQVXvUTyLMqFqFTVDcFRSzlwAyeDPg
- 在 node 节点上执行上面的指令添加进集群,正常的话几秒钟结束:
ubuntu@microk8s-vm:~$ microk8s.join 192.168.1.193:25000/miVQVXvUTyLMqFqFTVDcFRSzlwAyeDPg
- 在 master 上查看节点信息:
-
下面来看具体的使用例子:
首先把本地的一个 docker image 导出来比如 nginx:alpine
,准备导入 k8s 环境: docker save nginx:alpine > nginx_alpine.tar
把 nginx_alpine image 导入: sudo microk8s.ctr image import ./nginx_alpine.tar unpacking docker.io/library/mongo:latest (sha256:b1d9f85efeee9a9cce6593d39c0785d324ac27a03e6bd9ee4fdb34bd755328af)..done
查看下导入的 image: ben@gpu:/data$ sudo microk8s.ctr images ls
类似 docker-compose,我们写一个配置文件: apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:alpine imagePullPolicy: Never ports: - containerPort: 80
应用这个配置: sudo microk8s.kubectl apply -f nginx_alpine.yml
查看下运行情况: sudo microk8s.kubectl get pods NAME READY STATUS RESTARTS AGE kubernetes-bootcamp-69fbc6f4cf-bjh7t 0/1 ContainerCreating 0 59m nginx-deployment-bd7b55bfb-587pw 0/1 ContainerCreating 0 4m7s
很多时候我们会碰到类似这样的错误failed pulling image k8s.gcr.io/pause:3.1。这个问题我们可以通过手动下载镜像来解决。做法如下:
microk8s.docker pull mirrorgooglecontainers/pause-amd64:3.1 # 首先去hub.docker.com上面找到相同的镜像并pull下来
microk8s.docker tag mirrorgooglecontainers/pause-amd64:3.1 k8s.gcr.io/pause:3.1 # 重新打tag, 错误提示找不到那个镜像, tag就打成什么名字
将 Docker Compose 文件转换为 Kubernetes 资源
microk8s 用的不是 dockerd 而是 Containerd 所以在 docker 里面导入了翻墙回来的 image 还需要重新导入到 Containerd 里面一下...
首先用 azk8spull 从国内镜像把对应的 image 拉回来: azk8spull k8s.gcr.io/heapster-amd64:v1.5.2
在本地转换一下,重新导入 containerd: docker save xxx:yyy > xxx.tar microk8s.kubectr image import xxx.tar
重启下 microk8s,是上面的 image 生效,可能有别的更优雅的方式暂时没找到 : microk8s.stop microk8s.start
- microk8s.enable helm
- 什么是 helm:
管理软件包,只不过helm这儿管理的是在k8s上安装的各种容器。
在用 kompose 转换 docker-compose 文件时,需要加上 --volume 参数指定 hostPath: kompose convert -f docker-compose_k8s.yml --volumes hostPath
-
error: unable to recognize "mongo-deployment.yaml": no matches for kind "Deployment" in version "extensions/v1beta1" 改成: apps/v1
-
error: error validating "mongo-deployment.yaml": error validating data: ValidationError(Deployment.spec): missing required field "selector" in io.k8s.api.apps.v1.DeploymentSpec; if you choose to ignore these errors, turn validation off with --validate=false 加上如下: spec: selector: matchLabels: io.kompose.service: mongo
matchLabels 中的内容需要跟 labels 中的内容吻合
-
Normal Pulling 87s kubelet, 192.168.1.129 Pulling image "mongo:latest" image: mongo:latest imagePullPolicy: Never
-
删除一个 k8s 节点: microk8s.remove-node 192.168.1.144
在子节点上执行以下命令之后会让该节点工作在 single 模式下: ubuntu@microk8s-vm:~$ microk8s.leave
如果该节点是在 multipass 上运行,执行以下命令关掉虚拟机: multipass stop microk8s-vm
-
microk8s.enable dashboard
选在登录时,认证 token 如下方式生成: If RBAC is not enabled access the dashboard using the default token retrieved with: token=$(microk8s.kubectl -n kube-system get secret | grep default-token | cut -d " " -f1) microk8s.kubectl -n kube-system describe secret $token In an RBAC enabled setup (microk8s.enable RBAC) you need to create a user with restricted permissions as shown in: https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md token=$(microk8s.kubectl -n kube-system get secret | grep default-token | cut -d " " -f1)
-
开启 GPU 支持: $ microk8s.enable gpu Enabling NVIDIA GPU NVIDIA kernel module detected Enabling DNS Applying manifest serviceaccount/coredns unchanged configmap/coredns unchanged deployment.apps/coredns unchanged service/kube-dns unchanged clusterrole.rbac.authorization.k8s.io/coredns unchanged clusterrolebinding.rbac.authorization.k8s.io/coredns unchanged Restarting kubelet Adding argument --cluster-domain to nodes. Adding argument --cluster-dns to nodes. Restarting nodes. DNS is enabled Applying manifest daemonset.apps/nvidia-device-plugin-daemonset created NVIDIA is enabled
-
我的理解 microk8s 的主要目标是提供给开发人员一个可以快速在本机验证结果的环境,所以在把本地环境折腾坏了之后快速的重置是一个非常有意义的功能: microk8s.reset --destroy-storage 加上 --destroy-storage 之后会把通过 storage 插件创建的内容也一并删除!
-
如何修改运行中的 pods 配置: kubectl -n kubernetes-dashboard edit service kubernetes-dashboard
-
一个部署服务到集群的思路:
- kompose 转化 docker-compose 文件,该步骤会生成一个包含各种 yaml 的文件夹
kompose convert -f docker-compose_k8s.yml --volumes hostPath
- 用 helm install 该文件夹中生成的配置文件到 k8s 集群:
microk8s.helm3 install --namespace aa --name bb cc/
-