實驗前提
- 需要你有 macOS 開發環境,本文以此為例,其他型別的開發環境請自行搭建。
- 需要你對 YAML 這一專門用來寫配置檔案的語言有所瞭解。
- 需要你對 Docker 有一些基本的瞭解。
- 需要你對 Kubernetes 中的 Node、Pod、ReplicaSet、Deployment、Service、Ingress、ConfigMap 等一些核心基礎概念有一定的瞭解。
YAML 配置檔案下載地址:
- YAML 檔案:jxlwqq/kubernetes-examples。該專案還有其他一些 Kubernetes 的示例。歡迎 Star。
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...
部署 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 協議》,轉載必須註明作者和本文連結