March 2, 2020

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

用 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(虚拟)环境。

分别在每台机器上配置完成后就可以做集群了。 0. enable: sudo microk8s.enable dns dashboard registry

  1. 在 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
  2. 在 node 节点上执行上面的指令添加进集群,正常的话几秒钟结束:ubuntu@microk8s-vm:~$ microk8s.join 192.168.1.193:25000/miVQVXvUTyLMqFqFTVDcFRSzlwAyeDPg
  3. 在 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

一个部署服务到集群的思路:

  1. kompose 转化 docker-compose 文件,该步骤会生成一个包含各种 yaml 的文件夹kompose convert -f docker-compose_k8s.yml --volumes hostPath
  2. 用 helm install 该文件夹中生成的配置文件到 k8s 集群:microk8s.helm3 install --namespace aa --name bb cc/