安裝簡單的k8s大約有三種思路:minikube,microk8s,kubeadm。minikube 雖然是官方出品,但主要仍是基於虛擬機作的設計。在 Linux 生產環境下,microk8s 多是一個更合適的選擇,它的主要組件是基於二進制包啓動。javascript
microk8s 基於 snap 進行安裝,ubuntu 16.04 及以後的版本都已經預裝了 snap,若是是其餘發行版的 Linux 須要先安裝 snap。css
Snap是Canonical推出的一種新的軟件打包格式,完全解決linux依賴性的問題,Snap 軟件包擁有更加穩定和安全的特性。html
官網URL:https://docs.snapcraft.io/installing-snap-on-centosjava
# 安裝EPELnode sudo yum install epel-releasejquery # 安裝snapdlinux sudo yum install snapdgit # 添加snap,啓動通訊socketgithub sudo systemctl enable --now snapd.socketweb # 建立軟鏈 sudo ln -s /var/lib/snapd/snap /snap |
# 列出已經安裝的snap包 sudo snap list # 搜索要安裝的snap包 sudo snap find <text to search> # 搜索要安裝的snap包 sudo snap install <snap name> # 刪除一個snap包 sudo snap remove <snap name> |
經過 microk8s 能夠很是快速的搭建起一個 Kubernetes 單機環境,安裝極其很是方便,經過 snap 命令一鍵安裝,可用測試,快速原型及CI/CD。
官方URL:https://microk8s.io/
# 安裝1.14穩定版microk8s sudo snap install microk8s --classic --channel=1.14/stable # 啓用microk8s的DNS,存儲和麪板功能 sudo microk8s.enable dns dashboard storage # 啓動microk8s sudo microk8s.start # 查看microk8s狀態 sudo microk8s.status # 中止microk8s服務 sudo smicrok8s.stop # 查看集羣信息 sudo microk8s.kubectl cluster-info # 查看集羣節點 sudo microk8s.kubectl get nodes # 命令別名 sudo snap alias microk8s.kubectl kubectl |
因爲本次安裝microk8s主要是爲了和kubeflow進行集成使用,因此使用更爲方便的腳本安裝。
Kubeflow推薦的腳本:https://github.com/canonical-labs/kubernetes-tools
安裝腳本:
sudo kubernetes-tools/setup-microk8s.sh |
安裝過程以下圖示:
***注意,因爲此腳本安裝dashborad時,使用了token,登錄時會增長操做步驟。爲更方便測試,須要對腳本內容進行裁剪,禁用microm8s的dashboard功能(腳本里去除dashaboard或是microk8s命令禁用)。
dashboard的deployment及service使用了我本身提供的以下方案。
apiVersion: v1 kind: ServiceAccount metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: kubernetes-dashboard roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: kubernetes-dashboard namespace: kube-system --- kind: Deployment apiVersion: apps/v1beta2 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kube-system spec: replicas: 1 revisionHistoryLimit: 3 selector: matchLabels: k8s-app: kubernetes-dashboard template: metadata: labels: k8s-app: kubernetes-dashboard spec: containers: - name: kubernetes-dashboard image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1 ports: - containerPort: 9090 protocol: TCP livenessProbe: httpGet: path: / port: 9090 initialDelaySeconds: 25 timeoutSeconds: 30 serviceAccountName: kubernetes-dashboard --- kind: Service apiVersion: v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kube-system spec: type: NodePort ports: - port: 80 targetPort: 9090 nodePort: 32766 selector: k8s-app: kubernetes-dashboard |
Kubeflow是目前基於Kubernetes的主流機器學習解決方案,它抽象了和機器學習相關的PS-Worker模型,實現了一套pipeline的工做流,支持超參數訓練和Jupyter notebooks集成等能力。
官網URL:https://www.kubeflow.org/
本次安裝參考url: https://www.kubeflow.org/docs/started/getting-started-multipass/
Kubeflow推薦的腳本:https://github.com/canonical-labs/kubeflow-tools
安裝腳本:
sudo kubeflow-tools/install-kubeflow.sh |
安裝過程以下所示
上圖中,有些kubeflow的pod已開始running,但有些pod一直處於ImagePullBackOff狀態,這是由於這批鏡像都是放在gcr.io域名倉庫中,須要特別上網才能訪問。
在這種狀況下,根據網上的資料,咱們以dockerhub爲中繼,將須要的docker鏡像展轉拉取,直至全部鏡像成功啓動。
當一切就緒之,若是咱們訪問kubeflow的notebook服務時,發現仍是沒法正常使用jupyterhub功能。分析瀏覽器錯誤,才發現是一個網頁內的jquery庫,引用的是googleapis的地址,因而,還須要從新將涉及的layout.html更改以後生成新的鏡像。
Dockerfile內容:
FROM gcr.io/kubeflow-images-public/jupyter-web-app:v0.5.0 COPY layout.html /app/kubeflow_jupyter/default/templates/ COPY layout.html /app/kubeflow_jupyter/rok/templates/ |
Layout.html更新後的內容:
<!DOCTYPE html> <html> <head> <!-- Required meta tags --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Material Design Lite --> <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons"> <link rel="stylesheet" href="https://code.getmdl.io/1.3.0/material.blue-pink.min.css"> <script src="https://code.getmdl.io/1.3.0/material.min.js"></script>
<!-- UI Specific --> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.3.1/css/all.css"> <link rel="shortcut icon" href="{{ prefix + url_for('static', filename='kubeflow.png') }}"> <link rel="stylesheet" href="{{ prefix + url_for('static', filename='css/main.css') }}">
<!-- Dialogs --> <link rel="stylesheet" href="{{ prefix + url_for('static', filename='css/dialog.css') }}""> <script src="{{ prefix + url_for('static', filename='js/dialog.js') }}"></script>
{% if title %} <title>Kubeflow Jupyter - {{ title }}</title> {% else %} <title>Kubeflow Jupyter</title> {% endif %}
{% block javascript %} <script type="text/javascript"> var prefix = "{{ prefix }}"; </script> {% endblock %} </head> <body> <div class='parent errors'> <div class="spacer"></div> <div id="error-msgs"></div> <div class="spacer"></div> </div> <div class="page-content"> {% block content %}{% endblock %} </div> </body> </html> |
最終,便可正常使用這一功能了。