.NET Core + Kubernetes:快速体验
Kubernetes[1] 是目前非常主流的容器編排工具,在應用創建、應用部署、應用擴容、應用更新等方面都非常的方便,而且在應用故障時,也可以快速自愈。所以基于微服務架構下的產品,了解 Kubernetes 的使用是非常必要的,我猜測很多人都曾經多次打算自己搭建 Kubernetes 環境,部署個服務試試效果,但卻因為很多原因一次次從入門到放棄,這里應該有部分原因是因 ?Kubernetes 的入門成本相對較高,概念較多,搭建略復雜,所以往往一開始就死在了環境搭建上,導致很多預定的目標都沒能實現。
關于 Kubernetes 概念上的內容這里不再贅述,但概念的部分又是在使用中必須優先掌握的知識,所以建議先通過查看資料對整體架構和使用方式有一定了解后再動手實際操作。
集群搭建
這里將搭建 Kubernetes 集群環境來進行測試,3 臺 Linux 服務器(1個Master,2個Node)。網上有很多 Kubernetes 集群搭建的文章,找了很多最終發現還是李振良的基于 kubeadm 30分鐘部署一個Kubernetes集群[2] 視頻教程對初學者來說較為靠譜,雖然有些操作命令在實際生產環境需要調整,但作為學習來說問題不大,更多細節的優化還是交給更專業的運維人員吧。
為了省去操作系統的安裝我直接在騰訊云購買了 3臺 2C4G 的機器,選擇按量計費模式大半天也就幾塊錢(不是廣告,只是人懶)。基于云服務器搭建需提前在控制臺的安全組設置好以下幾點:
3臺服務器內網互通;
允許服務器訪問外網,需要下載相關依賴內容;
允許客戶端機器通過服務器外網IP訪問;
具體安裝操作步驟完全參考視頻教程即可,但我能肯定有些人還是可能會出各種奇葩問題,只能祝你好運了,以下幾點這里備注一下:
kubeadm init 和 pod 網絡插件只需要在 Master 節點操作;
kubeadm init 中的 --apiserver-advertise-address 設置為內網地址;
通過 hostname k8s-master 可修改 hostname 名稱;
最終通過命令 kubectl get nodes 查看集群中各節點是否已全部 Ready。
構建 .NET Core 服務鏡像
接下來將直接在 Windows ?環境(鏡像構建基于 Windows 還是 Linux 理論上是沒有區別的)下構建 .NET Core 服務的 Docker 鏡像,所以首先需要安裝 Docker for Windows[3],安裝成功后啟動 Docker。
創建一個 API 類型 ASP.NET Core ?Web 應用程序,啟用 Docker 支持,會在項目下自動生成 Dockerfile 文件,命令主要涉及 dotnet restore,dotnet publish。
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base WORKDIR /app EXPOSE 80 EXPOSE 443FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build WORKDIR /src COPY ["K8SDemo/K8SDemo.csproj", "K8SDemo/"] RUN dotnet restore "K8SDemo/K8SDemo.csproj" COPY . . WORKDIR "/src/K8SDemo" RUN dotnet build "K8SDemo.csproj" -c Release -o /app/buildFROM build AS publish RUN dotnet publish "K8SDemo.csproj" -c Release -o /app/publishFROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "K8SDemo.dll"]在 Dockerfile 文件右鍵菜單點擊生成 Docker 鏡像,這與直接在 sln 解決方案文件所在的目錄下執行 docker build -f .\K8SDemo\Dockerfile . 本質是一樣的,只是 VS 已內置好了,執行成功后在 cmd 窗口中通過 docker images 查看當前存在的 Docker 鏡像。
為了能在 Kubernetes 集群中能獲取到這個鏡像,現將 k8sdemo 鏡像推送到個人 docker hub 公開倉庫(實際開發中應該是公司的私有鏡像倉庫)。
如果還沒有 docker hub 賬號,需要先 注冊[4] ;
cmd 窗口通過命令 docker login -u 用戶名 -p 密碼 登錄;
設置 Tag docker tag k8sdemo:latest 用戶名/k8sdemo:1.0.0,因為推送目標只能是當前用戶下;
推送到 docker hub 倉庫 docker push 用戶名/k8sdemo:1.0.0;
部署
以下操作操在?Master 節點進行
創建服務配置文件 k8sdemo.yaml,配置暫且不詳細介紹,后續再針對性說明,先簡單理解為通過鏡像 beckjin/k8sdemo:1.0.0 創建了服務,并將容器內 80 端口映射到服務器某個端口上(NodePort 方式映射的端口會在 30000~32767 范圍內隨機一個):
apiVersion: apps/v1 kind: Deployment metadata:name: k8sdemo spec:replicas: 1selector:matchLabels:name: k8sdemotemplate:metadata:labels:name: k8sdemospec:containers:- name: k8sdemoimage: beckjin/k8sdemo:1.0.0ports:- containerPort: 80imagePullPolicy: IfNotPresent --- kind: Service apiVersion: v1 metadata:name: k8sdemo spec:type: NodePortports:- port: 80targetPort: 80selector:name: k8sdemo通過命令 kubectl apply -f k8sdemo.yaml 創建服務
配置中指定了當依賴的鏡像不存在時會自動拉取,但如果拉取資源的速度較慢,啟動完成的時間可能會比較久,可通過命令 kubectl get pods 和 kubectl describe pod 名稱 查看具體 pod 詳細描述。
通過命令 kubectl get pod,svc 查看服務運行的端口
接著就可以通過 http://${外網IP}:31741/WeatherForecast 調用 API 接口查看效果。
如果需要擴容或縮容,調整配置文件中的 ?replicas 節點值,重新 kubectl apply -f k8sdemo.yaml 即可;
通過命令 kubectl delete -f k8sdemo.yaml 可刪除服務;
總結
其實很長一段時間都在嘗試自己把玩一下 Kubernetes,說實話阻力確實不少,特別是看到很多基于二進制文件的搭建介紹,簡直了。所以好的指導教程確實可以給我們帶來事半功倍的效果,作為入門學習我們并不需要多么強大和安全的測試環境,基本套路都是先玩起來,再深入研究。
參考資料
[1]
Kubernetes: https://kubernetes.io/
[2]30分鐘部署一個Kubernetes集群: https://edu.51cto.com/course/17256.html
[3]Docker for Windows: https://docs.docker.com/docker-for-windows/
[4]注冊: https://hub.docker.com/signup
總結
以上是生活随笔為你收集整理的.NET Core + Kubernetes:快速体验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET CORE WEBAPI文
- 下一篇: 海底捞涨价,有错吗?