星期六, 1月 12, 2019

Kubernetes DaemonSet with Azure AKS 小記

Kubernetes DaemonSet with Azure AKS 小記

OS: openSUSE Leap 15
Kubernetes: 1.10.5 AKS in Azure
VS code: 1.30.2

讀書會閱讀進度來到 Chapter 9 - DaemonSet
  • DaemonSet 主要會在叢集的各個 node 佈署 pod

接下來就來紀錄今天的實驗小記
因為之前的實驗都是一個 node 就可以, 但是 daemonset 如果要有意義, 就要有兩個 nodes 以上
所以首先先來擴展 AKS Cluster 上面的 node 吧

使用 az 指令列出 aks 管理的 cluster, 可以知道 resource group 還有 cluster name
> az  aks  list  -o  table

Name                                  Location ResourceGroup
--------------------                   ---------- -----------------------
myAKScluster20180724  japaneast sakanaK8s      


列出管理 Cluster 的  agentPoolProfiles, 找出 Pool name

> az aks show --resource-group sakanaK8s --name myAKScluster20180724 --query agentPoolProfiles

[
 {
   "count": 1,
   "maxPods": 110,
   "name": "agentpool",
   "osType": "Linux",
   "storageProfile": "ManagedDisks",
   "vmSize": "Standard_F1s"
 }
]

可以觀察到 node pool name 是 agentpool
其實在 vscode 如果有裝 kubernetes extension 也可以觀察到 node pool name


使用 aks scale 指令將 node 擴增到 2 個
> az aks scale --resource-group sakanaK8s --name myAKScluster20180724 --node-count 2 --nodepool-name agentpool

再次觀察 Nodes, 就會發現變成 2 個 nodes


接下來 apply 書上的範例  9-1
內容如下

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: fluentd
namespace: kube-system
labels:
  app: fluentd
spec:
template:
  metadata:
    labels:
      app: fluentd
  spec:
    containers:
    - name: fluentd
      image: fluent/fluentd:v0.14.10
      resources:
        limits:
          memory: 200Mi
        requests:
          cpu: 100m
          memory: 200Mi
      volumeMounts:
      - name: varlog
        mountPath: /var/log
      - name: varlibdockercontainers
        mountPath: /var/lib/docker/containers
        readOnly: true
    terminationGracePeriodSeconds: 30
    volumes:
    - name: varlog
      hostPath:
        path: /var/log
    - name: varlibdockercontainers
      hostPath:
        path: /var/lib/docker/containers

可以使用 kubectl apply -f 9-1-fluentd.yaml 或是在 vscode 內用 Ctrl + Shift + p 去呼叫 Kubernetes: Apply 來套用

觀察相關資訊
> kubectl  describe daemonset  fluentd --namespace kube-system

Name:           fluentd
Selector:       app=fluentd
Node-Selector:  <none>
Labels:         app=fluentd
Annotations:    <none>
Desired Number of Nodes Scheduled: 2
Current Number of Nodes Scheduled: 2
Number of Nodes Scheduled with Up-to-date Pods: 2
Number of Nodes Scheduled with Available Pods: 2
Number of Nodes Misscheduled: 0
Pods Status:  2 Running / 0 Waiting / 0 Succeeded / 0 Failed

> kubectl  get  pods --namespace kube-system -l app=fluentd -o wide

NAME            READY STATUS    RESTARTS AGE IP             NODE
fluentd-bdfxk   1/1 Running   0 45m 10.244.0.137   aks-agentpool-40577543-0
fluentd-ml6b6   1/1 Running   0 45m 10.244.1.3     aks-agentpool-40577543-1

因為上面的 yaml 檔案 namespace 是在 kube-system, 所以查詢的時候要加上 --namespace 才看得到

從資訊上來看, 在兩個 node 上面都有佈署 fluentd 的 pod

接下來驗證如果 node 數量擴增, 那 DaemonSet 是否會如期的將 Pod 部屬上去

使用 aks scale 指令將 node 擴增到 3
> az aks scale --resource-group sakanaK8s --name myAKScluster20180724 --node-count 3 --nodepool-name agentpool

再次觀察相關資訊, 驗證新的 node 有部署 fluentd

> kubectl  get  pods --namespace kube-system -l app=fluentd -o wide

NAME            READY STATUS    RESTARTS AGE IP             NODE
fluentd-bdfxk   1/1 Running   0 55m 10.244.0.137   aks-agentpool-40577543-0
fluentd-ml6b6   1/1 Running   0 55m 10.244.1.3     aks-agentpool-40577543-1
fluentd-x7k9h   1/1 Running   0 1m 10.244.2.3     aks-agentpool-40577543-2

接下來實驗 限制 DaemonSet 只在某些 node 上面佈署

書上的方式是透過 label 的方式來限制

使用 kubectl label 指令來建立 label

> kubectl  label  nodes aks-agentpool-40577543-2  ssd=true
node/aks-agentpool-40577543-2 labeled

使用 label selector 來觀察

> kubectl  get  nodes -l  ssd

NAME                       STATUS ROLES AGE   VERSION
aks-agentpool-40577543-2   Ready agent 10m   v1.10.5

目前只有一個 node 有加上 ssd label

接下來測試書中的範例  9-2-nginx-fast-storage.yaml
內容如下
重點在有進行 label 的指定

apiVersion: extensions/v1beta1
kind: "DaemonSet"
metadata:
labels:
  app: nginx
  ssd: "true"
name: nginx-fast-storage
spec:
template:
  metadata:
    labels:
      app: nginx
      ssd: "true"
  spec:
    nodeSelector:
      ssd: "true"
    containers:
      - name: nginx
        image: nginx:1.10.0

使用 kubectl apply 來套用
> kubectl  apply -f 9-2-nginx-fast-storage.yaml

觀察相關資訊

> kubectl  get  pods -l ssd -o wide

NAME                       READY STATUS RESTARTS   AGE IP NODE
nginx-fast-storage-txl5n   1/1 Running 0    5m 10.244.2.4 aks-agentpool-40577543-2

可以觀察到 只有 label 有 ssd=true 的 node 被佈署 pods

當然也可以實驗將 node 加上 ssd 的 label
> kubectl  label  nodes aks-agentpool-40577543-1 ssd=true

node/aks-agentpool-40577543-1 labeled

再次觀察

> kubectl get  pods -l ssd -o wide

NAME                       READY STATUS RESTARTS   AGE IP NODE
nginx-fast-storage-k5snc   1/1 Running 0    1m 10.244.1.4 aks-agentpool-40577543-1
nginx-fast-storage-txl5n   1/1 Running 0    9m 10.244.2.4 aks-agentpool-40577543-2


做完今天的實驗, 來進行收尾

刪除剛剛建立的 daemonset

> kubectl delete -f 9-1-fluentd.yaml

> kubectl  delete -f 9-2-nginx-fast-storage.yaml

將規模縮回 1 個 nodes

> az aks scale --resource-group sakanaK8s --name myAKScluster20180724 --node-count 1 --nodepool-name agentpool

今天大概就這樣了

~ enjoy it

Reference:

沒有留言: