吾八哥學k8s(二):golang服務部署到kubernetes
- 2020 年 4 月 19 日
- 筆記
本篇主要講解如何將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即可。
瀏覽器里訪問://k8s-demo.local/ping即可看到ping接口的返回值了,到這裡k8s-demo成功部署到k8s集群里了。