Kubernetes (K8S) - Mac 本地執行練習上手 如何用 K8S 快速佈建一個 Go Server

Kubernetes (K8S) - Mac 本地執行練習上手 如何用 K8S 快速佈建一個 Go Server

如何在 Mac 本地快速透過 K8S 啟用一個服務,這裡以一個簡易的 go server 為例子,一步步來說明如何啟動。

安裝 minikube

brew install minikube

啟動 minikube

# 啟動 minikube,啟動 k8s cluster
minikube start

# 查看 minikube 狀態
minikube status

查看目前 cluster 運行狀態

kubectl get all

查看pods狀態

kubectl get pods

準備 Images

先建立一個 Dockerfile

ARG GO_VERSION=1.12
FROM golang:${GO_VERSION}-alpine
WORKDIR /app
ADD . /app
RUN cd /app && go build
EXPOSE 8080
ENTRYPOINT ./app

建立一個 main.go

package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/ping", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello World")
    })
    log.Fatal(http.ListenAndServe(":8080", nil))
}

打包成 image

docker build . -t adon988/go-test

//重新打包方式
docker build --no-cache -t adon988/go-test .

查看 images

docker images

運行 container

docker run --rm -p 8080:8080 -d adon988/go-test

前往 http://localhost:8080/ping 若出現 Hello world ,就表示成功

將 images push 至 docker hub

先在 docker-hub 建立 repository ,名稱為 adon988/go-test

接著 push image 到 docker hub:

docker push adon988/go-test

準備 Yaml

Pod.yaml 幾本格式說明

# API 版本,需要依照 kind 的物件來決定 version 
apiVersion:
	v1, app/v1


# 建立的物件
kind:
	Pod, Service (v1)
	Deployment, ReplicaSet (apps/v1)

# 描述物件及標籤
metadata:
	name, labels..

# 物件要安裝哪些功能
spec:
	containers, name, image, selector..

舉例來說,建立一個 gotest-k8s.yaml

apiVersion: v1
kind: Service
metadata:
  name: go-app-service
spec:
  selector:
    app: go-test
  ports:
  - protocol: "TCP"
    port: 8080
    targetPort: 8080
  type: LoadBalancer

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-test
spec:
  selector:
    matchLabels:
      app: go-test
  replicas: 3
  template:
    metadata:
      labels:
        app: go-test
    spec:
      containers:
      - name: go-app
        image: adon988/go-test:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 8080

啟動 k8s cluster

minikube start

執行部署

kubectl apply -f gotest-k8s.yaml

//---出現以下訊息表示建立成功
service/go-app-service created
deployment.apps/go-test created

(如果出現 Unable to connect to the server: dial tcp 192.168.99.100:8443: i/o timeout,原因是還沒有啟動 k8s cluster,執行 minikube start 即可)

查看pods狀態

 kubectl get pods
 
#---看到以下狀態表示已經運行成功
NAME                       READY   STATUS    RESTARTS   AGE
go-test-78f99bd6b7-nl2kb   1/1     Running   0          77s
go-test-78f99bd6b7-qwhrn   1/1     Running   0          77s
go-test-78f99bd6b7-ttqtk   1/1     Running   0          78s

取得 deployment 暴露出的 ip

minikube service go-app-service --url

//--例如,返回以下位置
http://192.168.99.100:32061

前往回傳的網址就可以看到 k8s 裡面的 go 回傳的內容

http://192.168.99.100:32061

(這裡還會遇到 ErrImageNeverPull 問題)

刪除運行的 K8s

刪除 k8s運行的項目

 kubectl delete -f gotest-k8s.yaml