從零開始寫一個執行在 Kubernetes 叢集上的 Gin 應用

jxlwqq發表於2021-07-22

實驗前提

  • 需要你有 macOS 開發環境,本文以此為例,其他型別的開發環境請自行搭建。
  • 需要你對 YAML 這一專門用來寫配置檔案的語言有所瞭解。
  • 需要你對 Docker 有一些基本的瞭解。
  • 需要你對 Kubernetes 中的 Node、Pod、ReplicaSet、Deployment、Service、Ingress、ConfigMap 等一些核心基礎概念有一定的瞭解。

YAML 配置檔案下載地址:

git clone https://github.com/jxlwqq/kubernetes-examples.git
cd deploying-simple-hello-gin-app

安裝 Docker for Mac

下載地址:hub.docker.com/editions/community/...

啟動並開啟 Kubernetes 功能,功能開啟過程中,Docker 將會自動拉取 Kubernetes 相關映象,所以全程需要使用特殊姿勢上網。

為啥不使用 minikube?minikube + virtualbox + kubectl 安裝起來太繁瑣了,而且即使使用特殊姿勢上網,你也不一定能搞定。當然阿里雲提供了一篇安裝教程可以參考。

本地埠準備

請確保本地 localhost 的 80 埠沒有被佔用,已在使用的請在實驗期間暫時關閉佔用 80 埠的服務。

切換叢集

如果你本地有多個 Kubernetes 的叢集配置,請先切換至名為 docker-desktop 的叢集:

kubectl config use-context docker-desktop

原始碼

一個簡單的 Gin 應用程式看起來是這樣的:

package main

import "github.com/gin-gonic/gin"

func main() {
    r := gin.Default()

    r.GET("/hello", func(c *gin.Context) {
        c.String(200, "Hello, Gin!")
    })

    _ = r.Run(":8080")
}

go.mod 檔案包含應用所需的依賴:

module hello-gin

go 1.16

require github.com/gin-gonic/gin v1.7.2 // indirect

Docker 映象

應用的 Dockerfile 如下所示:

# 多階段構建:提升構建速度,減少映象大小

# 從官方倉庫中獲取 1.16 的 Go 基礎映象
FROM golang:1.16-alpine AS builder
# 設定工作目錄
WORKDIR /go/src/hello-gin
# 複製專案檔案
ADD . /go/src/hello-gin
# 下載依賴
RUN go get -d -v ./...
# 構建名為"app"的二進位制檔案
RUN go build -o app .

# 獲取輕型 Linux 發行版,大小僅有 5M 左右
FROM alpine:latest
# 將上一階段構建好的二進位制檔案複製到本階段中
COPY --from=builder /go/src/hello-gin/app .
# 設定監聽埠
EXPOSE 8080
# 配置啟動命令
CMD ["./app"]

構建並提交映象:

jxlwqq 是我的 Docker Hub 賬號,這裡需要換成你自己的賬號。如果沒有賬號,需要先註冊:hub.docker.com/signup

這一步如果想跳過的話,暫時可以直接拉取我製作好的映象:docker pull jxlwqq/hello-gin:latest

docker build -f Dockerfile -t jxlwqq/hello-gin:latest . # 構建映象
docker login # 登入
docker push jxlwqq/hello-gin:latest # 提交映象

前提條件:部署 nginx ingress

為了讓 Ingress 資源工作,叢集必須有一個正在執行的 Ingress 控制器。 Kubernetes 官方目前支援和維護 GCE 和 nginx 控制器。

這裡我們選擇 Ingress-nginx 控制器:

kubectl apply -f ../ingress-nginx/deploy.yaml

注: deploy.yaml 檔案內容來源自:github.com/kubernetes/ingress-ngin...

詳細操作說明見:github.com/kubernetes/ingress-ngin...

部署 hello gin 應用

執行以下命令:

kubectl apply -f hello-gin-deployment-and-service.yaml
kubectl apply -f ingress.yaml

返回:

service/hello-gin-svc created
deployment.apps/hello-gin created
ingress.networking.k8s.io/hello-gin-ingress created

hello-gin-deployment-and-service.yaml 檔案解讀:

apiVersion: apps/v1 # api 版本
kind: Deployment # 資源物件型別
metadata: # Deployment 後設資料
  name: hello-gin # 物件名稱
spec: # 物件規約
  selector: # 選擇器,作用:選擇帶有下列標籤的Pod
    matchLabels: # 標籤匹配
      app: hello-gin # 標籤KeyValue
  template: # Pod 模版
    metadata: # Pod後設資料
      labels: # Pod 標籤
        app: hello-gin # Pod 標籤,與上述的 Deployment.selector中的標籤對應
    spec: # Pod 物件規約
      containers: # 容器
        - name: hello-gin # 容器名稱
          image: jxlwqq/hello-gin:latest # 映象名稱:映象版本
          resources: # 資源限制
            limits: # 簡單理解為max資源值
              memory: "128Mi"
              cpu: "500m"
            requests: # 簡單理解為min資源值
              memory: "128Mi"
              cpu: "500m"
          ports: # 埠
            - containerPort: 8080 # 埠號
---
apiVersion: v1 # api 版本
kind: Service # 物件型別
metadata: # 後設資料
  name: hello-gin-svc # 物件名稱
spec: # 規約
  selector: # 選擇器
    app: hello-gin # 標籤選擇器,與 Pod 的標籤對應
  ports:
    - port: 8080 # Service 埠號
      targetPort: 8080 # Pod 暴露的埠號

ingress.yaml 檔案解讀:

apiVersion: networking.k8s.io/v1 # api 版本
kind: Ingress # 物件型別
metadata: # 後設資料
  name: hello-gin-ingress # 對應名稱
spec: # 規約
  rules: # 規則
    - http:
        paths: # 路徑
          - path: /
            pathType: Prefix
            backend: # 後端服務
              service: # 服務
                name: hello-gin-svc # service 名稱
                port:
                  number: 8080 # 埠號

訪問驗證:

curl 127.0.0.1/hello # 返回 Hello, Gin!

清理

kubectl delete -k .
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章