MicroK8s是目前最小、最快與Kubernetes全面兼容的集羣系統,主要用於工作站和小型團隊,但是目前鏡像並沒有與snap打包在一起,還在gcr.io上,國內下載上還是有問題。MicroK8s適合離線開發、原型開發和測試,尤其是運行VM作爲小、便宜、可靠的k8s用於CI/CD。支持arm架構,也適合開發 IoT 應用,通過 MicroK8s 部署應用到小型Linux設備上。
1、安裝MicroK8s
通過snap進行安裝:
sudo snap install microk8s --classic
試一下:
microk8s status
#輸出如下
microk8s is running
high-availability: no
datastore master nodes: 127.0.0.1:19001
datastore standby nodes: none
addons:
enabled:
dashboard # The Kubernetes dashboard
dns # CoreDNS
ha-cluster # Configure high availability on the current node
ingress # Ingress controller for external access
metallb # Loadbalancer for your Kubernetes cluster
metrics-server # K8s Metrics Server for API access to service metrics
storage # Storage class; allocates storage from host directory
disabled:
ambassador # Ambassador API Gateway and Ingress
cilium # SDN, fast with full network policy
fluentd # Elasticsearch-Fluentd-Kibana logging and monitoring
gpu # Automatic enablement of Nvidia CUDA
helm # Helm 2 - the package manager for Kubernetes
helm3 # Helm 3 - Kubernetes package manager
host-access # Allow Pods connecting to Host services smoothly
istio # Core Istio service mesh services
jaeger # Kubernetes Jaeger operator with its simple config
keda # Kubernetes-based Event Driven Autoscaling
knative # The Knative framework on Kubernetes.
kubeflow # Kubeflow for easy ML deployments
linkerd # Linkerd is a service mesh for Kubernetes and other frameworks
multus # Multus CNI enables attaching multiple network interfaces to pods
portainer # Portainer UI for your Kubernetes cluster
prometheus # Prometheus operator for monitoring and logging
rbac # Role-Based Access Control for authorisation
registry # Private image registry exposed on localhost:32000
traefik # traefik Ingress controller for external access
準備Microk8s需要的鏡像:
MicroK8s的Kubernetes基礎服務是通過systemd的多個服務來提供的(參考/etc/systemd/system目錄下的服務名稱)。但是目前(1.20.2)的pause服務(3.0)還是在gcr.io上,因此需要單獨抓取下來離線部署,否則就會出現各種服務運行正常,但是kubelet服務運行時出錯的情況。
#針對Microk8s 1.20.2
MY_REGISTRY=registry.cn-hangzhou.aliyuncs.com/google_containers
microk8s ctr images pull ${MY_REGISTRY}/pause:3.1
microk8s ctr images tag ${MY_REGISTRY}/pause:3.1 k8s.gcr.io/pause:3.1
microk8s ctr images pull docker.io/pollyduan/ingress-nginx-controller:v0.35.0
microk8s ctr images tag docker.io/pollyduan/ingress-nginx-controller:v0.35.0 k8s.gcr.io/ingress-nginx/controller:v0.35.0
microk8s ctr images pull docker.io/faizanofc/metrics-server-amd64:v0.3.6
microk8s ctr images tag docker.io/faizanofc/metrics-server-amd64:v0.3.6 k8s.gcr.io/metrics-server-amd64:v0.3.6
2、安裝基礎服務
安裝dns和本地存儲服務:
microk8s dns storage
安裝gpu支持:
microk8s enable gpu
3、安裝metallb服務
metallb提供一個本地的LoadBalancer服務,可以自動分配IP給服務,從而讓外部可以訪問。
microk8s enable metallb
3.1 配置
接下來我們要生成一個 Configmap 文件,爲 Metallb 設置網址範圍以及協議相關的選擇和配置,這裏以一個簡單的二層配置爲例:
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: my-ip-space
protocol: layer2
addresses:
- 10.211.55.240/28
注意:這裏的 IP 地址範圍需要跟集羣實際情況相對應。
使用 kubectl apply
命令應用之後,使用 microk8s.kubectl logs -f [metallb-controller-pod]
會看到配置更新過程。
3.2 使用測試
創建一個 Nginx 的服務,服務類型爲 LoadBalancer
:
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1
ports:
- name: http
containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: LoadBalancer
4、安裝Dashboard
4.1 安裝
microk8s enable dashboard
4.2 配置服務
配置dashboard服務可以外部訪問,可以是proxy、NodePort、LoadBalancer。我還是喜歡用NodePort,把ClusterType改爲NodePort,然後port部分增加一個30000-32768之間的端口號。如下:
microk8s.kubectl edit svc/dashboard -n kube-system
如果編輯有問題,先安裝vim。
sudo apt install vim
再執行上面的kubectl edit命令,按 i 進入編輯模式,esc 退出,按 : 進入命令行,按 wq寫入後退出,強制退出按q!。
- 關於暴露服務到外部訪問,有多種方法:
- Nodeport、Loadbalancer和Ingress,https://my.oschina.net/u/2306127/blog/1647202
4.3 獲取服務端口
microk8s.kubectl get svc -n kube-system
根據上面顯示的dashboard的外部端口,輸入瀏覽器。
4.4 獲取token
通過下面的方法獲取登錄的token:
token=$(microk8s kubectl -n kube-system get secret | grep default-token | cut -d " " -f1)
microk8s kubectl -n kube-system describe secret $token
然後,在dashboard中選擇使用token登錄,並把上面的token複製到輸入框中,出現dashboard界面。
5、安裝KubeFlow
執行:
microk8s enable kubeflow
最後失敗,安裝回滾。
- 安裝KubeFlow時出現問題,跟蹤該issue:
- 在安裝過程中,我使用Jupyter創建了服務和notebook,發現microk8s命令不能在notebook中執行。確認是路徑的問題,如下即可:
%%bash
export PATH=$PATH:/snap/bin/
microk8s status
或者將/snap/bin加入到啓動時的profile之中。