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