ASP.NET Core on K8S深入學習(2)部署過程解析與Dashboard
- 2019 年 10 月 3 日
- 筆記
本篇已加入《.NET Core on K8S學習實踐系列文章索引》,可以點擊查看更多容器化技術相關係列文章。
上一篇《K8S集群部署》中搭建好了一個最小化的K8S集群,這一篇我們來部署一個ASP.NET Core WebAPI項目來介紹一下整個部署過程的運行機制,然後部署一下Dashboard,完成可視化管理。本篇已加入了《.NET Core on K8S學習實踐系列文章索引》,更多內容請到索引中查看。
一、部署示例項目
1.1 準備一個ASP.NET Core WebAPI
這裡準備一個空的ASP.NET Core WebAPI項目,使用默認自帶的ValuesController控制器,具體程式碼見這裡。
Dockerfile如下:
FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY . . RUN dotnet restore RUN dotnet build -c Release -o /app FROM build AS publish RUN dotnet publish -c Release -o /app FROM base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "EDC.K8S.Demo.WebApi.dll"]
我們可以事先在自己的Docker環境構建這樣的一個鏡像,看看能否正常使用。
由於後面會使用到這個鏡像,因此可以將此鏡像push到Docker Hub上。
docker push your-image-name:tagname
當然你也可以直接使用我上傳的這個鏡像(edisonsaonian/k8s-demo)。
1.2 部署ASP.NET Core WebAPI到K8S
(1)準備deployment.yaml
Deployment主要負責Pod的編排,我們這裡通過一個YAML來創建一個Deployment。至於為什麼要用YAML來創建,你可以先不管,後面我們會具體講解。
apiVersion: apps/v1 kind: Deployment metadata: name: k8s-demo namespace: aspnetcore labels: name: k8s-demo spec: replicas: 2 selector: matchLabels: name: k8s-demo template: metadata: labels: name: k8s-demo spec: containers: - name: k8s-demo image: edisonsaonian/k8s-demo ports: - containerPort: 80 imagePullPolicy: Always --- kind: Service apiVersion: v1 metadata: name: k8s-demo namespace: aspnetcore spec: type: NodePort ports: - port: 80 targetPort: 80 selector: name: k8s-demo
這裡大概說下這個yaml文件把,這個deployment.yaml(至於叫啥名字,你自己開心就好)就會告訴K8S關於你的API的所有資訊,以及通過什麼樣的方式暴露出來讓外部訪問。
需要注意的是,這裡我們提前為要部署的ASP.NET Core WebAPI項目創建了一個namespace,叫做aspnetcore,因此這裡寫的namespace : aspnetcore。
kubectl create namespace aspnetcore
K8S中通過標籤來區分不同的服務,因此這裡統一name寫成了k8s-demo。
在多實例的配置上,通過replicas : 2這個設置會告訴K8S給我啟動2個實例起來,當然你可以寫更大的一個數量值。
最後,在spec中告訴K8S我要通過NodePort的方式暴露出來公開訪問,因此埠範圍從上一篇可以知道,應該是 30000-32767這個範圍之內。
關於YAML文件各個節點的解釋,可以通過下面這個命令去了解:
kubectl explain deployment.metadata
(2)通過Kubectl部署到K8S
將yaml文件複製到Linux伺服器中之後,就可以在Linux中通過kubectl完成WebAPI的部署,只需要下面這一句命令行即可:
kubectl create -f deployment.yaml
看到提示”service created”,就可以知道已經創建好了,這裡我們再通過下面這個命令來驗證一下:
kubectl get pods,svc -n aspnetcore
可以看到,在命名空間aspnetcore下,就有了一個k8s-demo的服務運行起來了,並通過埠號30409向外部提供訪問。
由上圖可知,由於我們在yaml文件中聲明了2個副本,因此創建了兩個pod實例,他們都正常運行了,並且通過30409埠向外提供服務。這時,我們可以通過瀏覽器來驗證一下是否部署成功了。通過訪問兩個Node節點的30409埠,可以得到如下結果:
由於我們的示例WebAPI項目十分簡單,因此能夠訪問到ValuesController的介面就代表我們已經部署到K8S成功了。
二、K8S部署過程解析
剛剛我們成功部署了一個ASP.NET Core WebAPI項目到K8S集群中,由於在yaml中我們設置了兩個Pod副本,他們分別運行在了k8s-node1和k8s-node2中:
這裡我們來看看整個部署的過程,大體上過一遍流程,能夠有個大概印象就可以,下圖主要參考自CloudMan的《每天5分鐘玩轉Kubernetes》一書。
(1)Kubectl發送部署請求到API Server
(2)API Server通知Controller Manager創建一個deployment資源
(3)Scheduler執行調度任務,將兩個Pod副本分發到k8s-node1與k8s-node2
(4)k8s-node1和k8s-node2上的kubectl在各自的節點上創建並運行Pod(當然,其中包括了拉取鏡像,創建容器等一系列操作)
另外的補充:
(1)所有應用的配置和當前狀態資訊都會保存在etcd中,執行kubectl get pod時API Server會從etcd中讀取這些數據
(2)flannel會為每個pod分配IP,這塊先了解到這裡就好,後面會介紹網路。
三、部署Dashboard
按理說,部署Dashboard就下面一句話:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
But,默認鏡像中國無法訪問,這裡曲線救國:
首先,將這個yaml文件下載下來:
wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
其次,通過vim編輯yaml文件中默認的鏡像源地址:這裡替換為李振良老師的鏡像地址,感謝李振良老師。
containers: - name: kubernetes-dashboard #image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1 image: lizhenliang/kubernetes-dashboard-amd64:v1.10.1
然後,由於默認Dashboard只能集群內部訪問,因此修改Service為NodePort類型,暴露到外部可以訪問:
kind: Service apiVersion: v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kube-system spec: type: NodePort ports: - port: 443 targetPort: 8443 nodePort: 30001 selector: k8s-app: kubernetes-dashboard
最後,我們直接apply本地這個yaml文件來創建Dashboard:
kubectl apply -f kubernetes-dashboard.yaml
看到提示“service/kubernetes-dashboard created”代表Dashboard創建成功了,這時我們通過瀏覽器來訪問一下:
這裡如果你通過Chrome訪問提示證書錯誤無法訪問,可以通過如下步驟解決:
chrome://net-internals/#hsts
找到Delete domain security policies,輸入你的NodeIP地址點擊Delete即可:
接上一步,看到了登錄介面,需要我們配置kubeconfig或輸入token,這裡我們選擇後者,通過以下命令獲取輸出的token:
kubectl create serviceaccount dashboard-admin -n kube-system kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
拿到token在登錄介面的令牌區域輸入,然後點擊登錄:
即可進入下圖所示的主介面了:
在Dashboard中,我們通過kubectl所做的操作大部分都可以可視化操作,比如我們可以對deployment做伸縮:
更多內容,請期待後續分享。
四、小結
本文通過部署一個ASP.NET Core WebAPI到K8S為例,介紹了K8S部署的詳細過程步驟,最後部署Dashboard從而能夠進行可視化的管理。後續會探索各種應用的運行方式和更多的內容,當然筆者也是初學,有很多不足之處,請多包涵。
參考資料
(1)CloudMan,《每天5分鐘玩轉Kubernetes》
(2)李振良,《一天入門Kubernets教程》
(3)李振良,《30分鐘部署一個Kubernetes集群》
(4)cao_xiaobo,《K8S部署Web Dashboard》