最近這這段時間更新了一些 k8s 相關的部落格和視訊,也收到了一些反饋;大概分為這幾類:
其中以第二種佔大多數,雖然公司進行了雲原生改造,但似乎和純業務研發同學來說沒有太大關係,自己工作也沒有什麼變化。
恰好我之前正好從業務研發的角度轉換到了基礎架構部門,兩個角色我都接觸過,也幫助過一些業務研發瞭解公司的雲原生架構;
為此所以我想系統性的帶大家以研發的角度對 k8s 進行實踐。
因為 k8s 部分功能其實是偏運維的,對研發來說優先順序並不太高;
所以我不太會涉及一些 k8s 運維的知識點,比如安裝、元件等模組;主要以我們日常開發會使用到的元件講起。
這裡我整理了一下目錄,每個章節都有部落格+視訊配合觀看,大家可以按照喜好選擇。
因為還涉及到了視訊,所以只能爭取一週兩更,在兩個月內全部更新完畢。
根據我自己的經驗,以上內容都掌握的話對 k8s 的掌握會更進一步。
首先從第一章【部署應用到 k8s】開始,我會用 Go 寫一個簡單的 Web 應用,然後打包為一個 Docker 映象,之後部署到 k8s 中,並完成其中的介面呼叫。
func main() {
http.HandleFunc("/ping", func(w http.ResponseWriter, r *http.Request) {
log.Println("ping")
fmt.Fprint(w, "pong")
})
http.ListenAndServe(":8081", nil)
}
應用非常簡單就是提供了一個 ping
介面,然後返回了一個 pong
.
# 第一階段:編譯 Go 程式
FROM golang:1.19 AS dependencies
ENV GOPROXY=https://goproxy.cn,direct
WORKDIR /go/src/app
COPY go.mod .
#COPY ../../go.sum .
RUN --mount=type=ssh go mod download
# 第二階段:構建可執行檔案
FROM golang:1.19 AS builder
WORKDIR /go/src/app
COPY . .
#COPY --from=dependencies /go/pkg /go/pkg
RUN go build
# 第三階段:部署
FROM debian:stable-slim
RUN apt-get update && apt-get install -y curl
COPY --from=builder /go/src/app/k8s-combat /go/bin/k8s-combat
ENV PATH="/go/bin:${PATH}"
# 啟動 Go 程式
CMD ["k8s-combat"]
之後編寫了一個 dockerfile
用於構建 docker
映象。
docker:
@echo "Docker Build..."
docker build . -t crossoverjie/k8s-combat:v1 && docker image push crossoverjie/k8s-combat:v1
使用 make docker
會在本地構建映象並上傳到 dockerhub
下一步便是整個過程中最重要的環節了,也是唯一和 k8s 打交道的地方,那就是編寫 deployment。
在之前的視訊《一分鐘瞭解 k8s》中講過常見的元件:
其中我們最常見的就是 deployment,通常用於部署無狀態應用;現在還不太需要了解其他的元件,先看看 deployment 如何編寫:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: k8s-combat
name: k8s-combat
spec:
replicas: 1
selector:
matchLabels:
app: k8s-combat
template:
metadata:
labels:
app: k8s-combat
spec:
containers:
- name: k8s-combat
image: crossoverjie/k8s-combat:v1
imagePullPolicy: Always
resources:
limits:
cpu: "1"
memory: 300Mi
requests:
cpu: "0.1"
memory: 30Mi
開頭兩行的 apiVersion
和 kind
可以暫時不要關注,就理解為 deployment 的固定寫法即可。
metadata:顧名思義就是定義後設資料的地方,告訴 Pod
我們這個 deployment
叫什麼名字,這裡定義為:k8s-combat
中間的:
metadata:
labels:
app: k8s-combat
也很容易理解,就是給這個 deployment
打上標籤,通常是將這個標籤和其他的元件進行關聯使用才有意義,不然就只是一個標籤而已。
標籤是鍵值對的格式,key, value 都可以自定義。
而這裡的 app: k8s-combat
便是和下面的 spec 下的 selector 選擇器匹配,表明都使用 app: k8s-combat
進行關聯。
而 template 中所定義的標籤也是為了讓選擇器和 template 中的定義的 Pod 進行關聯。
Pod 是 k8s 中相同功能容器的分組,一個 Pod 可以繫結多個容器,這裡就只有我們應用容器一個了;後續在講到 istio 和紀錄檔採集時便可以看到其他的容器。
template 中定義的內容就很容易理解了,指定了我們的容器拉取地址,以及所佔用的資源(cpu/ memory
)。
replicas: 1
:表示只部署一個副本,也就是隻有一個節點的意思。
之後我們使用命令:
kubectl apply -f deployment/deployment.yaml
生產環境中往往會使用雲廠商所提供的 k8s 環境,我們本地可以使用 https://minikube.sigs.k8s.io/docs/start/ minikube 來模擬。
就會應用這個 deployment 同時將容器部署到 k8s 中,之後使用:
kubectl get pod
在後臺 k8s 會根據我們填寫的資源選擇一個合適的節點,將當前這個 Pod 部署過去。
就會列出我們剛才部署的 Pod:
❯ kubectl get pod
NAME READY STATUS RESTARTS AGE
k8s-combat-57f794c59b-7k58n 1/1 Running 0 17h
我們使用命令:
kubectl exec -it k8s-combat-57f794c59b-7k58n bash
就會進入我們的容器,這個和使用 docker 類似。
之後執行 curl 命令便可以存取我們的介面了:
root@k8s-combat-57f794c59b-7k58n:/# curl http://127.0.0.1:8081/ping
pong
root@k8s-combat-57f794c59b-7k58n:/#
這時候我們再開一個終端執行:
❯ kubectl logs -f k8s-combat-57f794c59b-7k58n
2023/09/03 09:28:07 ping
便可以列印容器中的紀錄檔,當然前提是應用的紀錄檔是寫入到了標準輸出中。
以上就是這一章節的主要內容,重點就是將我們應用程式設計師打包為 docker 映象後上傳到映象倉庫,再設定好 deployment 由 k8s 進行排程執行。
下一章主要會涉及服務內部的呼叫,感興趣的朋友可以先關注起來。
相關的原始碼和 yaml 資原始檔都存在這裡:
https://github.com/crossoverJie/k8s-combat
作者: crossoverJie
歡迎關注博主公眾號與我交流。
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出, 如有問題, 可郵件(crossoverJie#gmail.com)諮詢。