前面的幾篇文章從概念層面介紹了Kubernetes
是什麼,它的內部架構是怎樣的。而且也在電腦上安裝了Minikube
--擁有一個單節點的Kubernetes
集羣,讓咱們可以在本身的電腦上開始體驗Kubernetes
。今天的文章我準備和你們一塊兒一步步地嘗試作一個Go
應用程序的Docker
鏡像,把它部署到Minikuebe
上運行。今天的文章不須要什麼基礎,Kubernetes
的新手朋友們先一塊兒上車學起來。golang
咱們用Go
寫一個簡單的HTTP Server
,Server
偵聽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
的文件,在文件裏添加以下指令:api
FROM golang:alpine
RUN mkdir /app COPY . /app WORKDIR /app RUN go build -o main . CMD ["/app/main"] 複製代碼
在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
,到時候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
複製代碼
部署應用開始須要先定義預期狀態,就是在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
),以及運行的容器名和容器的鏡像、資源大小等信息。
Deployment
是Kubernetes
對象的一種,還有其餘不少種對象分別對應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和端口爲準)訪問應用程序定義的兩個路由的結果以下:
今天的文章簡單的總結了一下將應用程序部署到Kubernetes
集羣的步驟,Kubernetes
裏有不少種對象來表明其內部的各類資源,今天部署應用用到的Deployment
就是其中的一種,kubectl
會根據.yaml
文件中的配置信息請求Kubernetes
的apiServer
建立各類對象,咱們後續要作的就是繼續研究清楚這些經常使用到的Kubernetes
對象。因爲鄙人也是剛開始學習,不免有表達不精確的地方,還請見諒。