Docker & Kubenetes 系列三:在k8s中部署單個服務實例

本章將會講解: pod的概念,以及如何向k8s中部署一個單體應用實例。html

在上面的篇幅中,咱們瞭解了docker,並製做、運行了docker鏡像,而後將鏡像發佈至中央倉庫了。而後又搭建了本機的k8s環境。本篇將演示如何將單個服務實例部署到k8s。node

Pod的含義

k8s的最小部署單元是pod,pod這個單詞的意思是「豆莢」,咱們能夠想象一下豆莢裏邊包含了一顆顆小豆子。與豆莢類似,k8s中包含了一個個pod,pod中運行着咱們的程序,以下圖:docker

在K8s中部署服務

在k8s中部署一個Pod,須要先編寫一個Pod的配置文件,配置文件的格式爲yml。配置文件描述了api版本信息,pod類型,名稱,鏡像,端口等信息。本篇要演示的pod.yml內容以下:api

在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,使用以下命令:app

$ kubectl create -f pod.yml                  
pod/my-first-demo created

能夠看到,pod created,而後執行kubectl get pods 命令查看一下是否啓動成功:curl

$ kubectl get pods        
NAME            READY   STATUS    RESTARTS   AGE
my-first-demo   1/1     Running   0          5m55s

能夠看到是Running的狀態,說明啓動沒問題。但事情有時候並非那麼順利,因此這裏給出一個錯誤的案例:url

$ kubectl get pods       
NAME            READY   STATUS             RESTARTS   AGE
my-first-demo   0/1     ImagePullBackOff   0          4m46s

這個status爲ImagePullBackOff,這樣的錯誤還有好幾個就不一一列舉了,我當時確實碰到了,是鏡像拉取錯誤。若是你也碰到了,自行解決便可(好比鏡像名稱寫錯了,網絡問題等)。3d

訪問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 系列四:集羣,擴容,升級,回滾
alt 逃離沙漠公衆號

相關文章
相關標籤/搜索