實踐篇 | 從寫下Go程式第一行程式碼,到在 K8s 上執行,要經歷多少步?

KevinYan發表於2022-07-30

這篇文章帶你從寫第一行程式碼開始,一步步教你把程式放到 K8s 跑起來。這次我們們先用 Go 做個例子,後面再寫一篇怎麼把 Spring Boot 應用放到 K8s 上執行。

本文的重點,不在於那種語言寫的程式,而是先學會應用 上到 K8s 的步驟,所以程式設計部分的演示非常簡單,恨不能寫一行程式碼就帶你進入後面的 K8s 部署環節,不過要部署我們們得先有個環境,這裡不需要你有啥雲伺服器,電腦上安裝就行了。

K8s 本機環境安裝

在個人電腦上安裝 K8s 可選的軟體,主要有這麼幾種:

  • minikube。
  • Kind。
  • Docker 桌面應用自帶的 K8s 叢集。

其中 minikube、DockerDesktop 內嵌K8s 這兩種,我們們之前都寫文章介紹過,不過兩年過去了,我不再推薦各位安裝 minikube,原因很簡單我的 2021款 “誒嘛姨麥克斯,邁步可”都扛不住他造。還是用後兩者吧,如果圖省事Docker桌面應用自帶的 K8s 叢集完全就夠用,安裝指南可以參考:

一個 Go 應用,想在 K8s 上執行

怎麼把一個 Go 開發的 Web 應用部署到 K8s 叢集上執行,有哪幾個步驟要完成的呢,這裡我們先歸納一下,後面依次對每一步進行演示。

因為 K8s 是基於容器技術的分散式架構方案,所以首先我們需要把要部署的應用程式打包到容器映象裡,當然,在那之前我們得先寫好應用程式碼。

這裡會把我們上面理論部分的知識點再串一遍,主要有這麼幾個步驟:

  • 把 Web 程式打包成容器映象
  • 使用上一步打包的映象,建立應用的Pod
  • 用 Deployment 排程應用
  • 使用 Service 暴露應用
  • 透過 Ingress 代理應用

好了,這五步大家一定要記住,下面我們逐一展開,詳細說說。

把 Web 程式打包成容器映象

首先看下面這個簡單的程式

Go HTTP Server

這裡是用 Go 程式起了一個特別簡單的 HTTP Server,訪問 “/“ 路徑後像頁面上列印一行文字,告訴訪問者他正在訪問的網頁的主機地址。

下面是打包映象用的 Dockerfile

打包 Go 應用映象的 Dockerfile

接下來,我們使用下面的命令打包應用映象:

docker build -t registry.cn-hangzhou.aliyuncs.com/docker-study-lab/simple-app-go:v0.2 .

打包好後,就是上傳啦,這樣各位就能用啦。

docker push registry.cn-hangzhou.aliyuncs.com/docker-study-lab/simple-app-go:v0.2

這個映象倉庫是阿里雲上的,不知道哪位好心人建立的,貌似誰都可以傳,不過前提是你得在阿里雲上開個映象雲的賬號,然後用 docker login 命令配置下自己的客戶端。這塊,我們們就不細說啦,我把程式碼和映象檔案都上傳到了我整理的 K8s 線上資料裡,給公眾號「網管叨bi叨」發私信【k8s】開啟資料就能看到

給公眾號-網管叨叨,傳送 k8s 領取

配置 Pod 和 Deployment

還記得我在上面文章 – K8s 物件導向裡說過

Deployment 是一個複合型的控制器,它包裝了一個叫做 ReplicaSet – 副本集的控制器。ReplicaSet 管理正在執行的Pod數量,Deployment 在其之上實現 Pod 滾動更新,對Pod的執行狀況進行健康檢查以及回滾更新的能力

所以,這裡我們直接把步驟2、3合起來一起說。其實也沒啥好說的,直接上一 YAML 配置

Deployment 物件宣告檔案

拿到這個配置後,直接用 kubectl -f xxx.yaml 命令把 Deployment 提交給 K8s叢集,讓它幫助我們建立好,Deployment、ReplicaSet、Pod 這些物件就好。

這裡我們只是使用了 Deployment 最基本的功能,想了解更多關於滾動更新配置和健康檢查等進階功能的,可以參考之前的文章:

用 Service 暴露服務

建立好上面這幾個物件後,我們的應用只能在 K8s 叢集的內部使用,想能從外部訪問就得把應用暴露出來,這個時候就需要 Service 這個物件了。 Service 物件具體的概念解釋,我們們還是看上一篇文章,這裡不再贅述了。

下面是一個 NodePort 型的 Service,它把我們們的服務暴露在 30088 這個埠。

Service 物件宣告

這樣在電腦上透過 127.0.0.1:30088 就能訪問到我們的服務啦。

用 Ingress 代理服務

Node Port 型別的 Service 物件的缺點,我們們上一篇文章提到過,所以實際操作的時候,我們們可以把上面那個例子裡的 type 欄位去掉,建立一個預設的只能在叢集內使用的 ClusterIp型別的 Service 物件,再用 Ingress 代理 Service,完成服務的向外暴露,這樣更優雅也更好管理一些。

使用 Ingress 前需要先安裝 Ingress Controller ,這裡我們使用開源的 Ingress-Nginx

然後就是宣告代理我們的 Go Web 應用的 Ingress 物件

Ingress YAML

透過 kubctl apply -f 命令把它提交給 K8s 叢集,建立 Ingress 物件。

Ingress 物件建立好後,我們就能透過 app.example.com 訪問我們們的服務啦,當然前提是在電腦上配置一下我們們的 hosts 檔案,新增一下這個域名到127.0.0.1 的繫結。

想了解關於 Ingress 更多的細節,可以看之前的文章:

總結

這裡總結了一下 K8s 常用的入門知識以及相關的實踐操作,只能算是一個非常初級的入門,還有其他很多非常高階的特效能讓我們控制 K8s 對應用的各種排程動作。

本文使用的原始碼、YAML配置、和操作步驟都可以給公眾號 「網管叨bi叨」發私信【k8s】獲得我整理好的線上資料,具體步驟都在這裡:

給公眾號-網管叨叨,傳送 k8s 領取

現在用 K8s 作為基建的公司越來越多,掌握 K8s 對我們做應用架構設計絕對是有好處的,希望這篇入門文章能給你的K8 學習之旅創造一個好的開端,後面還有很多知識需要我們繼續探索。

相關閱讀

本作品採用《CC 協議》,轉載必須註明作者和本文連結
公眾號:網管叨bi叨 | Golang、Laravel、Docker、K8s等學習經驗分享

相關文章