本篇主要講解如何將golang的服務部署到kubernetes集群里,附帶相關的golang的demo和yml文件內容。純新手入門方式,生產服務需要完整的CI/CD流程來支持。 golang服務代碼 這裡簡單寫一個k8s-demo的服務,提供兩個介面ping和version介面,main.go文件代 ...
本篇主要講解如何將golang的服務部署到kubernetes集群里,附帶相關的golang的demo和yml文件內容。純新手入門方式,生產服務需要完整的CI/CD流程來支持。
golang服務代碼
這裡簡單寫一個k8s-demo的服務,提供兩個介面ping和version介面,main.go文件代碼如下:
package main import ( "net/http" "github.com/gin-gonic/gin" ) func statusOKHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"status": "success"}) } func versionHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"version": "v1.0"}) } func main() { router := gin.New() router.Use(gin.Recovery()) router.GET("/ping", statusOKHandler) router.GET("/version", versionHandler) router.Run(":8080") }
構建命令:CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o k8s-demo main.go
Dockerfile文件
這裡只提供最基礎的demo寫法,如果有額外的需求在dockerfile文件內補充就行,Dockerfile文件內容如下:
FROM alpine
ADD k8s-demo /data/app/
WORKDIR /data/app/
CMD ["/bin/bash","-c","./k8s-demo"]
CI構建腳本
寫一個build.sh,用於編譯二進位文件,然後進行docker鏡像打包和推送進行到鏡像倉庫:
#!/bin/bash
set -e
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o k8s-demo main.go
docker build -t www.5bug.wang/docker/k8s-demo:1.0 .
docker push www.5bug.wang/docker/k8s-demo:1.0
執行build.sh腳本文件即可,請確保此步驟成功將鏡像推送到你的鏡像倉庫里。
kubernetes部署
準備創建deployment的yaml文件
kubernetes版本1.18,我這裡使用yaml文件創建deployment來部署k8s-demo服務到k8s集群里,k8s-demo.yaml文件內容如下:
--- apiVersion: apps/v1 kind: Deployment metadata: name: k8s-demo namespace: default labels: app: k8s-demo spec: selector: matchLabels: app: k8s-demo replicas: 4 revisionHistoryLimit: 10 minReadySeconds: 5 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 1 template: metadata: labels: app: k8s-demo spec: containers: - image: www.5bug.wang/docker/k8s-demo:1.0 imagePullPolicy: IfNotPresent name: k8s-demo ports: - containerPort: 8080 protocol: TCP resources: limits: cpu: 100m memory: 100Mi requests: cpu: 50m memory: 50Mi livenessProbe: tcpSocket: port: 8080 initialDelaySeconds: 10 timeoutSeconds: 3 readinessProbe: httpGet: path: /ping port: 8080 initialDelaySeconds: 10 timeoutSeconds: 2 --- apiVersion: v1 kind: Service metadata: name: k8s-demo-svc namespace: default labels: app: k8s-demo spec: ports: - name: api port: 8080 protocol: TCP targetPort: 8080 selector: app: k8s-demo --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: k8s-demo-ingress namespace: default spec: rules: - host: k8s-demo.local http: paths: - path: / backend: serviceName: k8s-demo-svc servicePort: api
此yaml文件里主要定義了三種資源:deployment、service、ingress,都配置在預設的namespace里,yaml文件里的每項內容做什麼用的下一篇再補充,這裡先把服務部署起來找找成就感!
k8s部署
在已經搭建好k8s環境的master節點里使用kubectl命令來執行部署,命令如下:
kubectl apply -f k8s-demo.yaml
執行效果如下:
稍等會通過通過查詢pods列表的命令:kubectl get pods 來查看pod運行狀態,如下圖:
配置外部訪問
k8s的服務支持外部訪問的方式有好幾種,我這裡我採用了ingress的方式,由於是本地使用,所以這裡需要綁下host文件,通過查詢ingress的命令查詢ingress列表可以得知host綁什麼IP地址,如下::
5bug.wang-MacBook:~/codes/projects/k8s-demo$ kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
k8s-demo-ingress <none> k8s-demo.local 192.168.99.103 80 7m26s
修改/etc/hosts文件,增加:192.168.99.103 k8s-demo.local即可。
瀏覽器里訪問:http://k8s-demo.local/ping即可看到ping介面的返回值了,到這裡k8s-demo成功部署到k8s集群里了。