iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 23
0
DevOps

從開源雲到邊緣運算系列 第 23

[Day 23]K3s 部署 - Affinity 功能校驗 - Pod 篇

  • 分享至 

  • xImage
  •  

活動資訊:https://www.open-ecosystem.io/
本篇為什麼會先貼出活動資訊呢?,因為就在發文的同時,我們也在Cloud Native forum 2019的活動現場,本次活動(似乎也有簡介K3s的東西)。

回歸正題~,本篇我們延續一下上篇Affinity的技術執行,在上篇提到其實Affinity的主軸概念是以標籤化識別機制(Label Regionize),在Node機制時我們可以透過設計Node Label,在Pod派送的過程中進行功能進行選擇Node機制的中介,而本篇所需要介紹的Pod Affinity這東西,基本功能上也是參考標籤,但基準是從Node標籤演變成了Pod標籤,而基於 Affinity-傾向性派送功能之上,其實也衍生了AntiAffinity-反傾向性派送,概念上說就是在 Pod 派送時,防止將Pod擺放在相同的Node之上的派送防護性質,本篇我們就從 Pod Affinity持續進行k3s的測試吧。

Pod Affinity

Affinity 參考 Pod 設計

  • Pod 設計
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
  namespace: default
  labels:
    app: mysql
spec:
  containers:
  - image: mysql:latest
    name: mysql
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: password
  • 執行示意圖
    https://ithelp.ithome.com.tw/upload/images/20191016/20121071hlI3pUdB7C.png

Pod 派送

  • 派送指令
kubectl create -f ${pod-name}
  • 檢視狀態
kubectl get pod -o wide
  • 執行示意圖
    https://ithelp.ithome.com.tw/upload/images/20191016/20121071SYoHaRoDfQ.png

Hard Mode

成功派送案例

相依 Pod 設計

  • Pod 設計
apiVersion: v1
kind: Pod
metadata:
  name: grafana-pod-mysql
  labels:
    app: grafana
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - mysql
        topologyKey: kubernetes.io/hostname
  containers:
  - name: grafana
    image: grafana/grafana
  • 執行示意圖
    https://ithelp.ithome.com.tw/upload/images/20191016/20121071t2ufjBK2RY.png
派送 Pod
  • 派送指令
kubectl create -f ${pod-name}
  • 執行示意圖
    https://ithelp.ithome.com.tw/upload/images/20191016/20121071hqmV5AqVSF.png
Pod 狀態檢查
  • 檢視狀態
kubectl get pod -o wide
  • 執行示意圖
    https://ithelp.ithome.com.tw/upload/images/20191016/20121071OxWZpnu3ae.png
  • 檢視狀態
kubectl describe pod -o wide
  • 執行示意圖
    https://ithelp.ithome.com.tw/upload/images/20191016/20121071XHvRVpJ8bF.png

派送失敗案例

相依 Pod 設計

  • Pod 設計
apiVersion: v1
kind: Pod
metadata:
  name: grafana-pod-mongodb
  labels:
    app: grafana
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - mongodb
        topologyKey: kubernetes.io/hostname  
  containers:
  - name: grafana
    image: grafana/grafana
  • 執行示意圖
    https://ithelp.ithome.com.tw/upload/images/20191016/20121071gyBrn2mUgi.png
派送 Pod
  • 派送指令
kubectl create -f ${pod-name}
  • 執行示意圖
    https://ithelp.ithome.com.tw/upload/images/20191016/201210710WX44MPfZo.png
Pod 狀態檢查
  • 檢視狀態
kubectl get pod -o wide
  • 執行示意圖
    https://ithelp.ithome.com.tw/upload/images/20191016/201210719YktE22iFJ.png
  • 檢視狀態
kubectl describe pod -o wide
  • 執行示意圖
    https://ithelp.ithome.com.tw/upload/images/20191016/20121071M1ZZKLsH0Q.png

Soft Mode

相依 Pod 設計

  • Pod 設計
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
  namespace: default
  labels:
    app: mysql
spec:
  containers:
  - image: mysql:latest
    name: mysql
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: password
  • 執行示意圖
    https://ithelp.ithome.com.tw/upload/images/20191017/20121071hzNkZKIUND.png

相依對應Pod標籤派送案例

相依 Pod 設計

  • Pod 設計
apiVersion: v1
kind: Pod
metadata:
  name: grafana-pod-mysql
  labels:
    app: grafana
spec:
  affinity:
    podAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: app
              operator: In
              values:
              - mysql
          topologyKey: kubernetes.io/hostname
  containers:
  - name: grafana
    image: grafana/grafana
  • 執行示意圖
    https://ithelp.ithome.com.tw/upload/images/20191017/20121071jfD5xIQJqW.png
派送 Pod
  • 派送指令
kubectl create -f ${pod-name}
  • 執行示意圖
    https://ithelp.ithome.com.tw/upload/images/20191017/20121071JIyC3aaWVB.png
Pod 狀態檢查
  • 檢視狀態
kubectl get pod -o wide
  • 執行示意圖
    https://ithelp.ithome.com.tw/upload/images/20191017/20121071PhhGEv8Qzd.png
  • 檢視狀態
kubectl describe pod -o wide
  • 執行示意圖
    https://ithelp.ithome.com.tw/upload/images/20191017/20121071QAagWkHGRt.png

可用節點派送案例

相依 Pod 設計

  • Pod 設計
apiVersion: v1
kind: Pod
metadata:
  name: grafana-pod-mongodb
  labels:
    app: grafana
spec:
  affinity:
    podAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: app
              operator: In
              values:
              - mongodb
          topologyKey: kubernetes.io/hostname
  containers:
  - name: grafana
    image: grafana/grafana
  • 執行示意圖
    https://ithelp.ithome.com.tw/upload/images/20191017/20121071nLZmSOq5YA.png
派送 Pod
  • 派送指令
kubectl create -f ${pod-name}
  • 執行示意圖
    https://ithelp.ithome.com.tw/upload/images/20191017/20121071DBSn3FsiQN.png
Pod 狀態檢查
  • 檢視狀態
kubectl get pod -o wide
  • 執行示意圖
    https://ithelp.ithome.com.tw/upload/images/20191017/20121071ja5OVchMZY.png
  • 檢視狀態
kubectl describe pod -o wide
  • 執行示意圖
    https://ithelp.ithome.com.tw/upload/images/20191017/20121071MYwP3tIBJc.png

Pod AntiAffinity

功能簡介

Pod 之間互不相依擺放,將對於節點壓力較大的Pod(如:DB/ML/DL功能)進行間格擺放。

參考Pod設計

  • Pod 設計
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
  namespace: default
  labels:
    app: mysql
spec:
  containers:
  - image: mysql:latest
    name: mysql
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: password
  • 執行示意圖
    https://ithelp.ithome.com.tw/upload/images/20191016/20121071hlI3pUdB7C.png

排斥Pod設計

  • Pod 設計
apiVersion: v1
kind: Pod
metadata:
  name: postgresql-antipod-mysql
  labels:
    app: postgresql
spec:
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - mysql
        topologyKey: kubernetes.io/hostname
  containers:
  - name: postgresql
    image: postgres:latest
    env:
    - name:  POSTGRES_PASSWORD
      value: password
  • 執行示意圖
    https://ithelp.ithome.com.tw/upload/images/20191016/20121071Uj8YDssVhk.png

功能檢視

派送 Pod

  • 派送指令
kubectl create -f ${pod-name}
  • 執行示意圖
    https://ithelp.ithome.com.tw/upload/images/20191017/20121071mrRfFn3Eue.png

檢視 Pod 狀態

  • 派送指令
kubectl get pod -o wide
  • 執行示意圖
    https://ithelp.ithome.com.tw/upload/images/20191017/20121071rA4rhp1TxT.png
  • 派送指令
kubectl describe pod -o wide
  • 執行示意圖
    https://ithelp.ithome.com.tw/upload/images/20191017/20121071rJGAdCDMus.png

  • 下篇開始介紹 Service的功能與驗證叢集狀態。

上一篇
[Day 22]K3s 部署 - Affinity 功能校驗 - Node 篇
下一篇
[Day 24]K3s 上 PV / PVC 驗證與叢集技術總結分析
系列文
從開源雲到邊緣運算30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言