前面介紹了 k8s 的一些基礎知識,今天來跟大家示範一下,如果要實際部署一個 application 的實際範例。

先來 golang 的 sample code

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))
}

這是一個簡單 http server

再來撰寫一個 Dockerfile 製作 image

FROM golang:1.11.2-alpine
WORKDIR /helloworld
ADD . /helloworld
RUN cd /helloworld && go build
EXPOSE 8080
ENTRYPOINT ./helloworld

接下 build image

docker build -t {yourname}/helloworld .
docker run --rm -p 8080:8080 -d {yourname}/helloworld

可以先做測試看看

$ curl http://127.0.0.1:8080/ping
Hello World%

再來我們要把 image 推到 publid register ,這邊選 dockerhub

docker push {yourname}/helloworld

接下來我們撰寫 Deployment & service

apiVersion: apps/v1
kind: Deployment
metadata:
  name: first-hellworld-deployment
  labels:
    app: first-helloworld
spec:
  replicas: 3
  selector:
    matchLabels:
      app: first-helloworld
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  minReadySeconds: 5
  template:
    metadata:
      labels:
        app: first-helloworld
    spec:
      containers:
      - name: first-helloworld
      #如果上面沒有自己嘗試,這邊可以用我已經上傳好的 smaple image 直接使用
        image: syhlion/helloworld
        ports:
        - containerPort: 8080
---
kind: Service
apiVersion: v1
metadata:
  name: first-helloworld
spec:
  type: ClusterIP
  selector:
    app: first-helloworld
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080

後面你可以透過 port-foward 測試看看 curl 是不是正常嚕

$ kubectl --kubeconfig ~/.kube/k3s.yaml port-forward svc/first-helloworld 8080:8080

再夠過 curl 就完成測試嚕

$ curl http://127.0.0.1:8080/ping
Hello World%

上述所有的 sample code,我有另外上傳的我的 github 上,有興趣的可以自行 clone 回來使用。

這樣我們終於完成了ㄧ個簡單 k8s 簡易介紹,明天我們來介紹,當服務一堆時,又有因應 dev、qa、prod,我們要怎麼管理這些 yaml 檔。