本章將會講解: pod的概念,以及如何向k8s中部署一個單體應用實例。
在上面的篇幅中,我們了解了docker,並制作、運行了docker鏡像,然后將鏡像發布至中央倉庫了。然后又搭建了本機的k8s環境。本篇將演示如何將單個服務實例部署到k8s。
Pod的含義
k8s的最小部署單元是pod,pod這個單詞的意思是“豆莢”,我們可以想象一下豆莢里邊包含了一顆顆小豆子。與豆莢相似,k8s中包含了一個個pod,pod中運行着我們的程序,如下圖:

在K8s中部署服務
在k8s中部署一個Pod,需要先編寫一個Pod的配置文件,配置文件的格式為yml。配置文件描述了api版本信息,pod類型,名稱,鏡像,端口等信息。本篇要演示的pod.yml內容如下:
在k8s中部署一個Pod,需要先編寫一個Pod的配置文件,配置文件的格式為yml
。配置文件描述了api版本信息,pod類型,名稱,鏡像,端口等信息。本篇要演示的pod.yml內容如下:
apiVersion: v1
kind: Pod
metadata:
name: my-first-demo
labels:
app: my-first-demo
spec:
containers:
- name: my-first-demo
image: hellodm/my-first-demo:v1.0
ports:
- containerPort: 80
這里的鏡像正是我們第一篇文章中創建並發布至中央倉庫的那個鏡像。你也可以替換成其他鏡像,或者自己制作的鏡像。
下面我們將應用部署到k8s,使用如下命令:
$ kubectl create -f pod.yml
pod/my-first-demo created
可以看到,pod created,然后執行kubectl get pods
命令查看一下是否啟動成功:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
my-first-demo 1/1 Running 0 5m55s
可以看到是Running
的狀態,說明啟動沒問題。但事情有時候並不是那么順利,所以這里給出一個錯誤的案例:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
my-first-demo 0/1 ImagePullBackOff 0 4m46s
這個status為ImagePullBackOff
,這樣的錯誤還有好幾個就不一一列舉了,我當時確實碰到了,是鏡像拉取錯誤。如果你也碰到了,自行解決即可(比如鏡像名稱寫錯了,網絡問題等)。
訪問K8s內的應用
回歸主題,上面我們通過kubectl create -f pod.yml
命令,向k8s中部署了一個應用,檢查其狀態是“Running”狀態,那么現在是不是可以直接訪問了呢?不能!因為這個pod是運行在k8s內部,可以理解為他是在一個內網中運行的,所以我們訪問不了。
為了訪問這個應用,我們需要在部署一個類似“反向代理”角色的Pod來幫我們訪問應用。這個Pod是Service類型的,其定義如下:
apiVersion: v1
kind: Service
metadata:
name: my-first-demo-svc
labels:
app: my-first-demo
spec:
type: NodePort
ports:
- port: 80
nodePort: 30000
selector:
app: my-first-demo
我們可以逐行看一下這個配置文件,其Kind為Service類型,端口信息中nodePort: 30000
是說這個 service 會把容器的 80 端口從 node 的 30050 端口暴露出來。selector 部分的配置決定了請求會被發送給集群里的哪些 pod,這里是通過app:my-first-demo
來找的,對應的是我們第一個Pod文件中的labels。下面我們來啟動這個Pod,執行如下命令:
$ kubectl create -f svc.yml
service/my-first-demo-svc created
查看這個Pod的啟動狀態:
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 33d
my-first-demo-svc NodePort 10.108.28.171 <none> 80:30000/TCP 27h
可以看到my-first-demo-svc
啟動成功,那么我們訪問一下看看:
$ curl 'http://localhost:30000/'
<h1>Hello world! <h1>
總結
本篇我們一步步完成了一個簡單應用的部署,這是一個單體應用。而實際中,我們的項目大多非常復雜且龐大。一單服務的用戶多了起來,我們的可用性的要求就高了,單個節點出問題了就等於整個服務不可用,這是不可接受的。怎么做高可用呢?k8s說:我可以的!這個問題后面在寫。
Docker & k8s 系列一:快速上手docker
Docker & k8s 系列二:本機k8s環境搭建
Docker & k8s 系列三:在k8s中部署單個服務實例
Docker & Kubenetes 系列四:集群,擴容,升級,回滾