原生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
注意:---為可選的分隔符,當需要在一個檔案中定義多個結構的時候需要使用。上述內容表示有兩個鍵apiVersion和kind,分別對應的值為v1和Pod。
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來訪問服務