吾八哥學k8s(二):golang服務部署到kubernetes

本篇主要講解如何將golang的服務部署到kubernetes集羣裏,附帶相關的golang的demo和yml文件內容。純新手入門方式,生產服務須要完整的CI/CD流程來支持。html

golang服務代碼

這裏簡單寫一個k8s-demo的服務,提供兩個接口ping和version接口,main.go文件代碼以下:linux

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.gogit

Dockerfile文件

這裏只提供最基礎的demo寫法,若是有額外的需求在dockerfile文件內補充就行,Dockerfile文件內容以下:github

FROM alpine
ADD k8s-demo /data/app/
WORKDIR /data/app/
CMD ["/bin/bash","-c","./k8s-demo"]


CI構建腳本

寫一個build.sh,用於編譯二進制文件,而後進行docker鏡像打包和推送進行到鏡像倉庫:golang

#!/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腳本文件便可,請確保此步驟成功將鏡像推送到你的鏡像倉庫裏。docker

kubernetes部署

準備建立deployment的yaml文件api

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文件裏的每項內容作什麼用的下一篇再補充,這裏先把服務部署起來找找成就感!bash

k8s部署app

在已經搭建好k8s環境的master節點裏使用kubectl命令來執行部署,命令以下:

kubectl apply -f k8s-demo.yaml

執行效果以下:

1586531413176.jpg

稍等會經過經過查詢pods列表的命令:kubectl get pods 來查看pod運行狀態,以下圖:

image.png

配置外部訪問

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集羣裏了。

相關文章
相關標籤/搜索