在k8s裡面部署自己的go web服務

辣辣的魚~~發表於2020-11-01

我們的目標

今天,試一下在k8s裡面跑自己編寫的go web服務。

1、編寫可執行的go服務

首先,第一步當然是寫一個簡單的go服務,這裡簡單寫了一個http的服務。

package main
​
import (
    "fmt"
    "net/http"
)
​
func main() {
    http.HandleFunc("/", hello)
    server := &http.Server{
        Addr: ":8888",
    }
  fmt.Println("server startup...")
    if err := server.ListenAndServe(); err != nil {
        fmt.Printf("server startup failed, err:%v\n", err)
    }
}
​
func hello(w http.ResponseWriter, _ *http.Request) {
    w.Write([]byte("hello layu!"))
}

一個最簡單的http服務,監聽8080埠,返回 "hello layu" 字串。

2、製作docker映象

接著,我們需要製作映象,製作docker映象需要寫 Dockerfile 檔案

FROM golang:alpine
​
ENV GO111MODULE=on \
    CGB_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64
​
WORKDIR /build
COPY . .
​
RUN go mod init main
RUN go build -o app .
​
EXPOSE 8888
​
CMD ["/build/app"]

在Dockerfile的目錄下執行 docker build

docker build . -t hello_layu:v1.0

 

需要注意的點

1)映象如果拉取的比較慢,可以使用國內源

#cat /etc/docker/daemon.json
{ 
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"], #這句話就是指定用中國科技大學的映象
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}

修改配置之後,記得檢查一下json格式有沒有錯,比如少一個雙引號,多一個逗號啥的

檢查無誤之後就重啟一下docker服務

systemctl restart docker

2)因為沒有配置映象倉庫,所以假設你的k8s有三個node,則都需要執行一遍docker build,防止被排程到的node

本地沒有映象,然後拉不到報錯

 

3、用k8s執行本地映象

接著就是用k8s執行本地映象

編寫yaml檔案

[root@c4 k8s]# cat hello_layu.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-layu-deployment
  labels:
    app: hello-layu
spec:
  selector:
    matchLabels:
      app: hello-layu
  replicas: 2
  template:
    metadata:
      labels:
        app: hello-layu
    spec:
      containers:
      - name: hello-layu
        image: hello_layu:v1.0
        imagePullPolicy: Never
        ports:
        - containerPort: 8888

注意到imagePullPolicy是Never,因為是本地的映象,沒有搭建映象倉庫,如果去pull的話,會報錯

service的yaml檔案

[root@c4 k8s]# cat service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: hello-layu
spec:
  type: LoadBalancer
  selector:
    app: hello-layu
  ports:
  - port: 80
    targetPort: 8888

簡單的kubectl apply

kubectl apply -f ./hello_layu.yaml
kubectl apply -f ./service.yaml

 

最後查一下service的 cluster-ip,然後curl一把,就能看到“hello layu!" 字串回來啦

[root@c4 ~]# kubectl get svc
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
hello-layu   LoadBalancer   10.106.136.147   <pending>     80:31986/TCP   111m
kubernetes   ClusterIP      10.96.0.1        <none>        443/TCP        18h
[root@c4 ~]# curl http://10.106.136.147
hello layu![root@c4 ~]

相關文章