当前位置: 首页 > 工具软件 > MicroK8s > 使用案例 >

Java微服务开发指南-番外篇:使用MicroK8s

吴伟志
2023-12-01

    在单节点的Kubernetes搭建过程中,一般会采用MiniKube,可是MiniKube会要求宿主机安装虚拟机,在其上完成部署,这个过程会比较麻烦,有没有一种方式,能够提供一种不依赖虚拟机,但是能和宿主机相对隔离的方案来搭建单节点的Kubernetes呢?答案是有的,Canonical 提供了MicroK8s,可以用它来完成不依赖虚拟机的搭建,同时它提供了非常好的安装体验。

    MicroK8s的描述是 “Zero-ops Kubernetes for workstations and edge / IoT
A single package of k8s for 42 flavours of Linux. Made for developers, and great for edge, IoT and appliances.”
,可以看到这是一个目标在单节点的Kubernetes部署方案,同时它也通过了Kubernetes认证。

MicroK8s也可以通过add node组成多节点模式,但是它主要是用来完成单节点原型搭建,而非生产环境的构建。

网上也有一些安装教程,但大部分都是摘抄,很多都跑不通。

工具安装

    工具安装的环境是Ubuntu 18.04 LTS,接下来开始安装MicorK8s

    先安装MicroK8s本体。

// 安装`MicroK8s`
sudo snap install microk8s --classic

// 查看一下版本,当前1.18已经发布,目前笔者使用的是1.17.3
snap info microk8s

// 用户组
sudo usermod -a -G microk8s $USER

// 防火墙设置
sudo ufw allow in on cni0 && sudo ufw allow out on cni0
sudo ufw default allow routed

// 启动相关的add-on
microk8s.enable dashboard dns

    运行完这些命令,如果在国内,不出意外,是无法启动的,如果运行成功是如下输出:

$  microk8s.status
microk8s is running
addons:
cilium: disabled
dashboard: enabled
dns: enabled
fluentd: disabled
gpu: disabled
helm3: disabled
helm: disabled
ingress: disabled
istio: disabled
jaeger: disabled
juju: disabled
knative: disabled
kubeflow: disabled
linkerd: disabled
metallb: disabled
metrics-server: disabled
prometheus: disabled
rbac: disabled
registry: disabled
storage: disabled

    原因还是gcr镜像无法下载,这里需要先调整一下docker的配置。

sudo vi /etc/docker/daemon.json

前提是安装了Docker

    对应的配置下,增加insecure-registries

{
  "registry-mirrors": ["https://heli2ujx.mirror.aliyuncs.com"],
  "insecure-registries" : ["localhost:32000"]
}

    无法启动的原因是一些关键的镜像无法下载,在墙那边,所以需要下载后,方可启动。但是其中的POD无法正常启动的原因需要能够查清楚,MicroK8s提供的命令可以帮助查看对应的POD处于的状态。

其实也就是describe命令。

可以使用microk8s.kubectl get all --all-namespaces来查看所有的PODSERVICE等资源运行情况。

    使用如下命令,可以查看对应的POD相关情况。

microk8s.kubectl describe pod ${pod name}  -n kube-system

    例如:microk8s.kubectl describe pod monitoring-influxdb-grafana-v4-6d599df6bf-28m97 -n kube-system,如果这个POD运行存在问题,会将问题显示出来,可以跟进排查。

镜像下载

    对于 1.17.3 版本的MicroK8s,可以使用如下脚本将镜像从aliyun搬到本地,然后打上对应的tag,这样镜像就在本地存在了。

$ more fetch-image.sh 
#!/bin/bash
images=(
k8s.gcr.io/pause:3.1=gcr.azk8s.cn/google-containers/pause:3.1
gcr.io/google_containers/defaultbackend-amd64:1.4=gcr.azk8s.cn/google-containers/defaultbackend-amd64:1.4
k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1=registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:v1.10.1
k8s.gcr.io/heapster-influxdb-amd64:v1.3.3=registry.cn-hangzhou.aliyuncs.com/google_containers/heapster-influxdb-amd64:v1.3.3
k8s.gcr.io/heapster-amd64:v1.5.2=registry.cn-hangzhou.aliyuncs.com/google_containers/heapster-amd64:v1.5.2
k8s.gcr.io/heapster-grafana-amd64:v4.4.3=registry.cn-hangzhou.aliyuncs.com/google_containers/heapster-grafana-amd64:v4.4.3
)

OIFS=$IFS; # 保存旧值

for image in ${images[@]};do
    IFS='='
    set $image
    docker pull $2
    docker tag  $2 $1
    docker rmi  $2
    docker save $1 > 1.tar && microk8s.ctr --namespace k8s.io image import 1.tar && rm 1.tar
    IFS=$OIFS; # 还原旧值
done

    sudo ./fetch-image.sh执行后,这些镜像被下载到本地。然后运行microk8s.stop && microk8s.start,等待成功。

运行服务

    运行命令创建一个echoserver服务,运行如下命令:

microk8s.kubectl run hello-minikube --image=registry.cn-hangzhou.aliyuncs.com/google-containers/echoserver:1.4 --port=8080
microk8s.kubectl expose deployment hello-minikube

    下载完镜像,启动了服务,可以看一下当前的部署情况:

$ microk8s.kubectl get all --all-namespaces
NAMESPACE     NAME                                                  READY   STATUS    RESTARTS   AGE
default       pod/hello-minikube-7dfbb66787-j54tw                   1/1     Running   0          4m59s
kube-system   pod/coredns-7b67f9f8c-4bm8b                           1/1     Running   2          6d4h
kube-system   pod/dashboard-metrics-scraper-687667bb6c-lvf85        1/1     Running   2          6d4h
kube-system   pod/heapster-v1.5.2-5c58f64f8b-wzm6g                  4/4     Running   8          6d4h
kube-system   pod/kubernetes-dashboard-5c848cc544-kq8c7             1/1     Running   2          6d4h
kube-system   pod/monitoring-influxdb-grafana-v4-6d599df6bf-28m97   2/2     Running   4          6d4h

NAMESPACE     NAME                                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
default       service/hello-minikube              ClusterIP   10.152.183.119   <none>        8080/TCP                 4m8s
default       service/kubernetes                  ClusterIP   10.152.183.1     <none>        443/TCP                  6d5h
kube-system   service/dashboard-metrics-scraper   ClusterIP   10.152.183.120   <none>        8000/TCP                 6d4h
kube-system   service/heapster                    ClusterIP   10.152.183.135   <none>        80/TCP                   6d4h
kube-system   service/kube-dns                    ClusterIP   10.152.183.10    <none>        53/UDP,53/TCP,9153/TCP   6d4h
kube-system   service/kubernetes-dashboard        NodePort    10.152.183.251   <none>        443:32100/TCP            6d4h
kube-system   service/monitoring-grafana          ClusterIP   10.152.183.84    <none>        80/TCP                   6d4h
kube-system   service/monitoring-influxdb         ClusterIP   10.152.183.183   <none>        8083/TCP,8086/TCP        6d4h

NAMESPACE     NAME                                             READY   UP-TO-DATE   AVAILABLE   AGE
default       deployment.apps/hello-minikube                   1/1     1            1           4m59s
kube-system   deployment.apps/coredns                          1/1     1            1           6d4h
kube-system   deployment.apps/dashboard-metrics-scraper        1/1     1            1           6d4h
kube-system   deployment.apps/heapster-v1.5.2                  1/1     1            1           6d4h
kube-system   deployment.apps/kubernetes-dashboard             1/1     1            1           6d4h
kube-system   deployment.apps/monitoring-influxdb-grafana-v4   1/1     1            1           6d4h

NAMESPACE     NAME                                                        DESIRED   CURRENT   READY   AGE
default       replicaset.apps/hello-minikube-7dfbb66787                   1         1         1       4m59s
kube-system   replicaset.apps/coredns-7b67f9f8c                           1         1         1       6d4h
kube-system   replicaset.apps/dashboard-metrics-scraper-687667bb6c        1         1         1       6d4h
kube-system   replicaset.apps/heapster-v1.5.2-5c58f64f8b                  1         1         1       6d4h
kube-system   replicaset.apps/kubernetes-dashboard-5c848cc544             1         1         1       6d4h
kube-system   replicaset.apps/monitoring-influxdb-grafana-v4-6d599df6bf   1         1         1       6d4h

    接下来请求本地,然后看一下输出:

$ curl http://10.152.183.119:8080/123
CLIENT VALUES:
client_address=10.1.17.1
command=GET
real path=/123
query=nil
request_version=1.1
request_uri=http://10.152.183.119:8080/123

SERVER VALUES:
server_version=nginx: 1.10.0 - lua: 10001

HEADERS RECEIVED:
accept=*/*
host=10.152.183.119:8080
user-agent=curl/7.58.0
BODY:
-no body in request-
 类似资料: