1. 程式人生 > 其它 >原生Kubernetes容器雲平臺應用部署

原生Kubernetes容器雲平臺應用部署

案例——原生Kubernetes容器雲平臺應用部署

一、案例目標

(1)瞭解YAML檔案的語法。

(2)掌握Deployment、Pod、Service的部署。

(3)基於Kubernetes部署Wordpress服務。

二、案例分析

1.規劃節點

主機名

節點

master

master節點

node

node節點

2.基礎準備

Kubernetes叢集已部署完成。虛擬機器要求能連線外網。

三、案例實施

1. YAML檔案

YAML是專門用來寫配置檔案的語言,非常簡潔和強大,使用比JSON更方便。它實質上是一種通用的資料序列化格式。

YAML語法規則:

① 大小寫敏感。

② 使用縮排表示層級關係。

③ 縮排時不允許使用Tab鍵,只允許使用空格。

④ 縮排的空格數目不重要,只要相同層級的元素左側對齊即可。

⑤ “#”表示註釋,從這個字元一直到行尾,都會被解析器忽略。

在Kubernetes中,只需要知道兩種結構型別即可:

① Lists

② Maps

使用YAML用於K8S的定義帶來的好處包括:

① 便捷性:不必新增大量的引數到命令列中執行命令。

② 可維護性:YAML檔案可以通過源頭控制,跟蹤每次操作。

③ 靈活性:YAML檔案可以建立比命令列更加複雜的結構。

(1)YAML Maps

Map顧名思義指的是字典,即一個Key:Value的鍵值對資訊。例如:

---

apiVersion: v1

kind: Pod

注意:---為可選的分隔符,當需要在一個檔案中定義多個結構的時候需要使用。上述內容表示有兩個鍵apiVersionkind,分別對應的值為v1Pod

Maps的value既能夠對應字串也能夠對應一個Maps。例如:

---

apiVersion: v1

kind: Pod

metadata:

name: kube100-site

labels:

app: web

上述的YAML檔案中,metadata這個KEY對應的值為一個Maps,而巢狀的labels這個KEY的值又是一個Map。實際使用中可視情況進行多層巢狀。

YAML處理器根據行縮排來知道內容之間的關聯。上述例子中,使用兩個空格作為縮排,但空格的數量並不重要,只是要求至少一個空格並且所有縮排保持一致。例如name和labels是相同縮排級別,因此YAML處理器知道它們屬於同一map;app是lables的值,因為app的縮排量比labels更大。

(2)YAML Lists

List即列表,類似於陣列,例如:

args

-beijing

-shanghai

-shenzhen

-guangzhou

可以指定任何數量的項在列表中,每個項的定義以破折號“-”開頭,並且與父元素之間存在縮排。在JSON格式中,表示如下:

{

"args": ["beijing", "shanghai", "shenzhen", "guangzhou"]

}

當然Lists的子項也可以是Maps,Maps的子項也可以是List,例如:

---

apiVersion: v1

kind: Pod

metadata:

name: kube100-site

labels:

app: web

spec:

containers:

- name: front-end

image: nginx

ports:

- containerPort: 80

- name: flaskapp-demo

image: jcdemo/flaskapp

ports: 8080

如上述檔案所示,定義一個containers的List物件,每個子項都由name、image、ports組成,每個ports都有一個KEY為containerPort的Map組成

2. 部署應用

在Kubernetes上執行WordPress的好處是顯而易見的。首先是安裝非常簡單(在已有叢集的情況下),其次是可靠性更高,第三是規模可以伸縮。當然,可以在多個雲之間更為容易地遷移也是非常重要的一點。

Kubernetes上執行WordPress是一個可伸縮性服務運行於雲原生叢集的典型案例,拿來學習也是極好的。

(1)新建namespace

新建blog namespace,將應用都部署到blog這個名稱空間下面。

(2)建立MySQL的Deployment物件

建立一個MySQL的Deployment物件wordpress-db.yaml。

然後建立上面的wordpress-db.yaml檔案。

然後檢視Service的詳細情況。

可以看到Endpoints部分匹配到了一個Pod,生成了一個clusterIP為10.111.133.108,現在就可以通過這個clusterIP加上定義的3306埠訪問MySQL服務了。

(3)建立Wordpress服務

建立Wordpress服務,將上面的wordpress的Pod轉換成Deployment物件wordpress.yaml。

value: 10.111.233.108:3306 # 此處的IP,是mysql svc的clusterIP

注意:要新增屬性type: NodePort,然後建立wordpress.yaml檔案。

(4)編寫YAML檔案

編寫YAML檔案wordpress-pod.yaml。

注意:這裡針對MySQL這個容器做了一個數據卷的掛載,這是為了能夠將MySQL的資料能夠持久化到節點上,這樣下次MySQL容器重啟過後資料不至於丟失。

(5)建立Pod

(6)訪問服務

檢視svc。

可以看到Wordpress服務產生了一個32012的埠,現在通過任意節點的NodeIP加上32012埠,就可以訪問Wordpress應用了

3. 優化應用

(1)增加健康檢測

liveness probe和rediness probe是提高應用穩定性非常重要的方法。

livenessProbe:

tcpSocket: #通過埠探測的方式

port: 80

initialDelaySeconds: 3

periodSeconds: 3

readinessProbe:

tcpSocket: #通過埠探測的方式

port: 80

initialDelaySeconds: 5

periodSeconds: 10

增加上面兩個探針,每10s檢測一次應用是否可讀,每3s檢測一次應用是否存活。

(2)增加Pod資源限制

配置HPA,讓應用能夠自動應對流量高峰期。

resources:

limits:

cpu: 200m

memory: 200Mi

requests:

cpu: 100m

memory: 100Mi

(3)增加滾動更新策略

增加滾動更新策略,這樣可以保證在更新應用的時候,服務不會被中斷。

replicas: 2

revisionHistoryLimit: 10

minReadySeconds: 5

strategy:

type: RollingUpdate

rollingUpdate:

maxSurge: 1

maxUnavailable: 1

(4)修改MySQL主機值

如果MySQL服務被重新建立了的話,它的clusterIP非常有可能就變化了,所以上面環境變數中的WORDPRESS_DB_HOST的值就會有問題,會導致訪問不了資料庫服務,這個地方可以直接使用Service的名稱來代替host,這樣即使clusterIP變化了,也不會有任何影響。

env:

- name: WORDPRESS_DB_HOST

value: mysql:3306

(5)新增initcontainer

在部署Wordpress服務的時候,MySQL服務已經啟動起來了嗎?如果沒有啟動起來,則無法連線資料庫。此時在啟動Wordpress應用之前,需要檢查一下MySQL服務,如果服務正常的話,就可以開始部署應用。

initContainers:

- name: init-db

image: busybox

command: ['sh', '-c', 'until nslookup mysql; do echo waiting for mysql service; sleep 2; done;']

直到MySQL服務建立完成後,initContainer才結束,結束完成後開始下面的部署。

(6)整合YAML

把部署的應用整合到一個YAML檔案wordpress-all.yaml中。

(7)建立服務

(8)配置HPA

用kubectl autoscale命令為wordpress-deploy建立一個HPA物件,最小的 Pod 副本數為1,最大為10,HPA會根據設定的CPU使用率(10%)動態的增加或者減少Pod數量。

(9)訪問服務

在瀏覽器中輸入http://任意Node_IP:32574來訪問服務