[教學] 輕量 Kubernetes-MicroK8s 安裝與使用指南

Kubernetes (K8s) 是目前有名的「容器化應用程式」管理工具,能方便的做到自動部署、擴充和管理的需求,而有時在開發或是一些需求時,會有需要使用到輕量 Kubernetes 的需求,這時會有一些選擇例如 : Minikube、K3s、Desktop Docker… 等,而這篇文章要介紹的是由 ubuntu 維護的 MicroK8s,其特點是輕量、不需要額外安裝虛擬機,所以在開發的時候能夠不佔用多餘的系統資源,並且能夠透過指令快速的重啟與關閉。

Github 原始碼 : https://github.com/ubuntu/microk8s

使用 snap 安裝 MicroK8s

安裝最新版本

使用 snap 安裝最新版本的 MicroK8s

sudo snap install microk8s --classic

安裝指定版本的

首先查看可安裝的 Kubernetes 版本

snap info microk8s

接著輸入指令安裝指定版本的 MicroK8s (下面假設安裝1.14版)

sudo snap install microk8s --classic --channel=1.14/stable

基本指令與設定

  • microk8s.status: 查看 MicroK8s 狀態與啟用的插件
  • microk8s.enable: 啟用指定套件
  • microk8s.disable: 停用指定套件
  • microk8s.kubectl: 等同 k8s 原生的 kubectl,用來與 kubernetes 互動
  • microk8s.config: 查看 kubernetes 的設定檔案
  • microk8s.istioctl: 等於 istioctl 指令,用來與 istio services 互動 (需啟用 istio 套件)
  • microk8s.inspect: 用來檢查 MicroK8s 安裝與運作狀況
  • microk8s.reset: 重置 kubernetes 服務
  • microk8s.stop: 停止 kubernetes 服務
  • microk8s.start: 啟動 kubernetes 服務

使用 alias (別名) 代替指令

因為 MicroK8s 為了避免衝突,所以指令前面都會加上 microk8s.

例如: microk8s.kubectl 實際等同於 kubectl

假如確定不會衝突且想直接使用 kubectl 指令,可以輸入以下指令

snap alias microk8s.kubectl kubectl

設定使用自己家目錄的 .kubeconfig

microk8s.kubectl config view --raw > $HOME/.kube/config

套件 (addons) 啟用與介紹

  • 啟用套件
microk8s.enable addon-name
  • 停用套件
microk8s.disable addon-name

常用套件介紹:

dns: 啟用 DNS,常用於不同服務之間溝通,強烈建議啟用該套件
dashboard: 啟用用來觀看服務運作的儀表板 (含 grafana 與 influxdb)
storage: 建立一個預設的 storage (會指令本機目錄的 hostpath-provisioner
ingress: 建立路口控制器
gpu: 將 GPU 啟用給 MicroK8s 使用 (本機需安裝 NVIDIA 驅動程序)
istio: 啟用 Istio 服務,啟用後可以使用 microk8s.istioctl 指令.
registry: 建立一個 private 的 docker registry (開在 localhost:32000).

啟用 Dashborad (Kubernetes Dashboard、grafana) 並且透過瀏覽器檢視

輸入指令啟用 dashboard 與 dns 套件

microk8s.enable dashboard dns

輸入指令查看 dashboard 所在的 IP

microk8s.kubectl get all --all-namespaces

大概可以看到類似如下的畫面 (不同電腦架設的 ip 也不相同)

NAMESPACE     NAME                                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
default       service/kubernetes                  ClusterIP   10.152.183.1     <none>        443/TCP                  167m
kube-system   service/dashboard-metrics-scraper   ClusterIP   10.152.183.145   <none>        8000/TCP                 79s
kube-system   service/heapster                    ClusterIP   10.152.183.156   <none>        80/TCP                   79s
kube-system   service/kube-dns                    ClusterIP   10.152.183.10    <none>        53/UDP,53/TCP,9153/TCP   77s
kube-system   service/kubernetes-dashboard        ClusterIP   10.152.183.53    <none>        443/TCP                  79s
kube-system   service/monitoring-grafana          ClusterIP   10.152.183.50    <none>        80/TCP                   79s
kube-system   service/monitoring-influxdb         ClusterIP   10.152.183.217   <none>        8083/TCP,8086/TCP        79s

檢視 kubernetes Dashboard

以上面為例可以看到 service/kubernetes-dashboard 所在 ip 是 10.152.183.53,並且在 port 443 (https) 上

這時候用瀏覽器開啟 https://10.152.183.53 (請改成自己看到的 IP) 會看到如下的畫面

而我們要取得 token 來進行登入

token=$(microk8s.kubectl -n kube-system get secret | grep default-token | cut -d " " -f1)
microk8s.kubectl -n kube-system describe secret $token

會看到如下的訊息,而最下面會有一串長長的 token 將他複製下來

Name:         default-token-qjcqr
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: default
              kubernetes.io/service-account.uid: b0e4fe23-b13c-4284-b9f8-4586619e309e

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1103 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IkpuTENkVU9IdnZTTW9KT1BJQm5YY29YT1FaZ0pRd3JyaFYwalNZWEZrSmcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vD2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkZWZhdWx0LXRva2VuLXFqY3FyIiwia3ViZXJAZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImRlZmF1bHQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJiMGU0ZmUyMy1iMTNjLTQyODQtYjlmOC00NTg2NjE5ZTMwOWUiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06ZGVmYXVsdCJ9.uBvl4s9xhhwMNwRmaXPksqIMDvlDg5EPvyBbMr18rjFnqlVuQ06LL7BqqF42PcQqY32xQSR4STIt5PM0PIj7OBEGFE2Vk5tQlybKND0ZLAm_GUm4aP0vWEinwURUawcyZCIEme1AysQnse09NIa4zROmAA5_DSVh_OzDdmviP2AFOAcH4KJyyqi3Tb6V5cPc6R5LgQ7EeWU-5IKb2THbVn3DK8gzb_aypRmZdK7vgYLK-MbsciUu3fqQcoQfZVXCLB7YfxkAusdQv9vvpnjtG48gMmfbzwXBRJQV9jP9aYuyY8OB09L5n4hjePX-7bBF-edwrdFu0MPCJwo-qUbX5g

回到瀏覽器,選擇使用 token 登入,並將複製的 token 貼上去後點 [Sign in]

登入後就能透過網頁檢視 Kubernetes 服務狀態

檢視 Grafana Dashboard

而要查看 Grafana Dashboard 需要透過 API server proxy 來瀏覽

輸入指令檢視服務所在位置

microk8s.kubectl cluster-info

會顯示服務在跑的位置

Kubernetes master is running at https://127.0.0.1:16443
Heapster is running at https://127.0.0.1:16443/api/v1/namespaces/kube-system/services/heapster/proxy
CoreDNS is running at https://127.0.0.1:16443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Grafana is running at https://127.0.0.1:16443/api/v1/namespaces/kube-system/services/monitoring-grafana/proxy
InfluxDB is running at https://127.0.0.1:16443/api/v1/namespaces/kube-system/services/monitoring-influxdb:http/proxy

上面顯示的訊息顯示 Grafana 在 https://127.0.0.1:16443/api/v1/namespaces/kube-system/services/monitoring-grafana/proxy

不過在用瀏覽器開啟前需要取得登入的帳號密碼

輸入指令取得

microk8s.config

會取得如下的訊息

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS1tCk1JSURBVENDQWVtZ0F3SUJBZ0lKQU1yaUdNV2VNMjNQTUEwR0NTcUdTSWIzRFFFQkN3VUFNQmN4RlRBVEJnTlYKQkFNTURERXdMakUxTWk0eE9ETXVNVEFlRncweU1EQTJNRGN3TkRBNE16ZGFGdzB6TURBMk1EVXdOREE0TXpkYQpNQmN4RlRBVEJnTlZCQU1NRERFd0xqRTFNaTR4T0RNdU1UQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQCkFEQ0NBUW9DZ2dFQkFOUUtNS3lwUjJtV3kvd1lsL2U1bGR3QTVrWXNTZDZPUU5CV2t6MndmTHovNFF1RHBkVHIKWlNXKzh3MHJjc25QTEwrWG8waGdueTVLNHdpOHhMWTJ4V253aGpLMUxoUUdhN05RdTJaZStUMXJqYjh0c0MzbwpqM0VlVGIxV3owdUk0NEZsNGlOY09DaE5Ea2FBTzMxOHN5Q0dQKzAvTTM2N0hpemJSWEhQWkRUVEY4RTQzMXYvCkJGbmViYXRuMHFRSitlNTRaRndWTUcySjVaZGRLM0lQOHM2RE1QeUR5Yy8zUGF1VEhVdDlyb0V6TUNZbXVKTlMKeWR5OHRPUnUxUlJtdW1rOHBwbVdJajVOQVFXRElielluMk56QmJTU3o0Znc0aUhiZlYwdTg3d3ZqWmJNTjIzSQpROXBaVE1zNk1Qbm5QNmtaaFVKTDFDTW5nb1p3RXY5V3pBa0NBd0VBQWFOUU1FNHdIUVlEVlIwT1JCWUVGSzB1CkpZUVdLU21GU1EwTHkrVjgyemNqS3hYc01COEdBMVVkSXdRWU1CYUFGSzB1SllRV0tTbUZTUTBMeStWODJ6Y2oKS3hYc01Bd0dBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUxXM21YWlE3SWk3Vi8yWgp1d3BROVFjaGJEZjlPTjlyL24wMTlkaE84NnhWUTRyKzhUSHgwakdiV05MQVhFakRTaFVhMGM5KzZqUjIxZmJkCmdUZ2lBNDBML29MbjdvZVpOQVZtT1ZFWVViQ2xvb1oyT4hKeXlSdEZtVU5xcEFOemRINUY2dG1NQXo3TkF3eVEKSm13S09PdndZVlphbk94S3dTVU0rYWNWOWRET2J1YTRMTy9FUW1KendETE5HNGRoQW1iZGVyd2IwM0dnOEh4cQp2Zm5vZ3I5WndMU2dnMDN4aVM5VUdHWkEweUtqZHVJcXQ4aENqRE9mWEV2ekdBYzhuVE1KKzBJbG8wbmQrN2dvCnFUZTBzdkEvcUVUTFpVOXRWM1FDam9CUWpyM0txRVgvU1d4NnpZTnd0WjRPd3U3ckNueDhmVjk2YU1FZXUwQTgKWHZ3dlRsYz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
    server: https://192.168.50.65:16443
  name: microk8s-cluster
contexts:
- context:
    cluster: microk8s-cluster
    user: admin
  name: microk8s
current-context: microk8s
kind: Config
preferences: {}
users:
- name: admin
  user:
    username: admin
    password: cWJkNCtoTU50MmhaS2llaE9XeGxKNXI3bk9XcGxrVHFJNXJVWU9rQVI0QT1K

最下面兩行就是登入的帳號密碼

接著使用瀏覽器開啟剛剛看到的 Grafana 網址 https://127.0.0.1:16443/api/v1/namespaces/kube-system/services/monitoring-grafana/proxy

就能夠看到 Grafana 的畫面了