Kubernetes入門實踐--部署運行Go項目

介紹

前面的幾篇文章從概念層面介紹了Kubernetes是什麼,它的內部架構是怎樣的。而且也在電腦上安裝了Minikube--擁有一個單節點的Kubernetes集羣,讓咱們可以在本身的電腦上開始體驗Kubernetes。今天的文章我準備和你們一塊兒一步步地嘗試作一個Go應用程序的Docker鏡像,把它部署到Minikuebe上運行。今天的文章不須要什麼基礎,Kubernetes的新手朋友們先一塊兒上車學起來。golang

應用程序代碼

咱們用Go寫一個簡單的HTTP ServerServer偵聽3000端口包含"/""/health_check"兩個路由,今天文章的關注點不在怎麼用Go開發程序因此都是Hello World級別的代碼,就不更多解釋了,直接看代碼吧。docker

package main

import (
	"fmt"
	"net/http"
)

func index(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "<h1>Hello World</h1>")
}

func check(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "<h1>Health check</h1>")
}

func main() {
	http.HandleFunc("/", index)
	http.HandleFunc("/health_check", check)
	fmt.Println("Server starting...")
	http.ListenAndServe(":3000", nil)
}
複製代碼

製做程序鏡像

接下來開始製做包含應用程序代碼的Docker鏡像。關於docker相關的使用方法和如何編寫Dockerfile,能夠在公衆號裏回覆關鍵字docker獲取完整的參考筆記。shell

dockerfile

在應用程序的根目錄添加名爲Dockerfile的文件,在文件裏添加以下指令:api

FROM golang:alpine
RUN mkdir /app COPY . /app WORKDIR /app RUN go build -o main . CMD ["/app/main"] 複製代碼

build 鏡像

Dockerfile所在的目錄下執行docker build構建鏡像瀏覽器

➜  docker build -t go-app-img .
複製代碼

docker會依據Dockerfile裏的指令構建鏡像,整個構建的過程相似下面:bash

➜  docker build -t go-app-img .
Sending build context to Docker daemon  9.216kB
Step 1/6 : FROM golang:alpine
alpine: Pulling from library/golang
df20fa9351a1: Pull complete 
ed8968b2872e: Pull complete 
a92cc7c5fd73: Pull complete 
9e0cccf56431: Pull complete 
cbe0275821fc: Pull complete 
Digest: sha256:6042b9cfb4eb303f3bdcbfeaba79b45130d170939318de85ac5b9508cb6f0f7e
Status: Downloaded newer image for golang:alpine
 ---> 3289bf11c284
Step 2/6 : RUN mkdir /app
 ---> Running in b34dccb1f3de
Removing intermediate container b34dccb1f3de
 ---> 1fa1a1c21aa2
Step 3/6 : COPY . /app
 ---> 815660da9d1a
Step 4/6 : WORKDIR /app
 ---> Running in 49dc25fe6bb7
Removing intermediate container 49dc25fe6bb7
 ---> 14776702ccf7
Step 5/6 : RUN go build -o main .
 ---> Running in 3bd4dc1e2bf6
Removing intermediate container 3bd4dc1e2bf6
 ---> 59aa7f96ee42
Step 6/6 : CMD ["/app/main"]
 ---> Running in 6309f604d662
Removing intermediate container 6309f604d662
 ---> 023baffdcb28
Successfully built 023baffdcb28
Successfully tagged go-app-img:latest
複製代碼

驗證鏡像

這一步其實能夠省略,不過爲了確保製做的鏡像是沒有問題,咱們經過docker run命令用這個鏡像運行容器驗證一下。架構

➜ docker run -d -p 3333:3000 --rm --name go-app-container go-app-img
複製代碼

在這裏,咱們指示docker從鏡像go-app-img運行容器,將主機端口3333綁定到容器的內部端口3000,之後臺模式(-d)運行容器,給此容器命名爲go-app-container,並在容器結束運行後自動刪除容器(--rm)。app

打開瀏覽器輸入localhost:3333訪問到的頁面輸出會是:學習

圖片

推送鏡像到DockerHub

測試鏡像沒問題後,將鏡像推送到DockerHub,到時候Kubernetes在部署應用時會根據指定的鏡像名稱從DockerHub上拉取鏡像(鏡像源是可配置的,不必定非得是DockerHub,能夠是私有鏡像倉庫)。測試

➜  docker build -t kevinyan001/kube-go-app .   
...

➜  docker push  kevinyan001/kube-go-app
...
複製代碼

Dockerfile從新構建鏡像,指定鏡像倉庫名。構建完成後將鏡像而後推送到DockerHub上。

上面倉庫名中的kevinyan001是我本身的DockerHub帳號,大家能夠直接使用下面的命令拉取個人鏡像使用,不過仍是建議每一個人動手製做本身的鏡像。

docker pull kevinyan001/kube-go-app:latest
複製代碼

Kubernetes部署應用

部署應用開始須要先定義預期狀態,就是在yaml文件裏聲明具體的Kubernetes對象的各類預期的狀態。而後讓Kubernetes建立對象,以後它會始終驅動集羣的當前狀態向預期狀態移動(好比有節點掛了,會新起節點替代掛掉的節點)。部署完應用後後咱們還須要經過Service向外部暴露應用,這樣才能訪問運行在Kubernetes集羣裏的應用。

下面咱們來一步步遞進地執行這三個步驟。

開始以前咱們須要啓動一下Minikube

minikube start
複製代碼

若是你尚未安裝能夠參照《Minikube-運行在筆記本上的Kubernetes集羣》裏的安裝步驟

定義預期狀態

在部署清單文件(deployment.yaml)中定義預期狀態

apiVersion: apps/v1
kind: Deployment
metadata:
 name: my-go-app
spec:
 replicas: 1
 selector:
 matchLabels:
 app: go-app
 template:
 metadata:
 labels:
 app: go-app
 spec:
 containers:
 - name: go-app-container
 image: kevinyan001/kube-go-app
 resources:
 limits:
 memory: "128Mi"
 cpu: "500m"
 ports:
 - containerPort: 3000
複製代碼

Kubernetes Deployment 對象(清單文件的kind裏指定的)表示運行在集羣中的應用。文件裏還指定了應用須要一個副本運行(replicas),以及運行的容器名和容器的鏡像、資源大小等信息。

DeploymentKubernetes對象的一種,還有其餘不少種對象分別對應Kubernetes裏的不一樣類型的資源。

部署應用

使用上面定義的deployment.yaml建立Deployment對象來運行Go應用程序的容器:

➜ kubectl create -f deployment.yaml
deployment.apps/my-go-app created

➜ kubectl get deployments
NAME        READY     UP-TO-DATE   AVAILABLE   AGE
my-go-app   1/1       1            1           24s

➜ kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
my-go-app-5bb8767f6d-2pdtk   1/1       Running   0          43s
複製代碼

暴露應用

應用部署完後還不能從外部直接訪問,須要把剛纔Deployment對象運行的應用程序做爲Kubernetes的一個Service對外暴露。

➜ kubectl expose deployment my-go-app --type=NodePort --name=go-app-svc --target-port=3000 
service/go-app-svc exposed

➜ kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
go-app-svc   NodePort    10.104.190.231   <none>        3000:31425/TCP   40h
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          6d13h

➜ minikube ip
192.168.64.4
複製代碼

經過kubectl get svc查詢Service能夠獲得主機的31425端口映射到了Kubernetes運行着應用的容器的3000端口。在瀏覽器裏使用Kubernetes集羣IP加NodePort便可訪問到Kubernetes部署的Go應用程序。

打開瀏覽器經過192.168.64.4:31425(以本身實踐時查到的IP和端口爲準)訪問應用程序定義的兩個路由的結果以下:

IndexPage

HealthCheckPage

總結

今天的文章簡單的總結了一下將應用程序部署到Kubernetes集羣的步驟,Kubernetes裏有不少種對象來表明其內部的各類資源,今天部署應用用到的Deployment就是其中的一種,kubectl會根據.yaml文件中的配置信息請求KubernetesapiServer建立各類對象,咱們後續要作的就是繼續研究清楚這些經常使用到的Kubernetes對象。因爲鄙人也是剛開始學習,不免有表達不精確的地方,還請見諒。

相關文章
相關標籤/搜索