久久国产乱子伦精品免费M,亚洲一区二区三区91,欧美国产在线视频,国产精品视频久久

Kubernetes中的emptyDir存儲卷和節點存儲卷

Kubernetes支持存儲卷類型中,emptyDir存儲卷的生命周期與其所屬的Pod對象相同,它無法脫離Pod對象的生命周期提供數據存儲功能,因此emptyDir通常僅用于數據緩存或臨時存儲。不過基于emptyDir構建的gitRepo存儲卷可以在Pod對象的生命周期起始時從響應的Git倉庫中復制相應的數據文件到底層的emptyDir中,從而使得它具有了一定意義上的持久性。

emptyDir存儲卷

emptyDir存儲卷是Pod對象生命周期中的一個臨時目錄,類似于Docker上的docker掛載卷,在Pod對象啟動時即被創建,而在Pod對象被移除時會被一并刪除。不具有持久能力的emptyDir存儲卷只能用于某些特殊場景中,例如,用一Pod內的多個容器間文件的共享,或者作為容器數據的臨時存儲目錄用于數據緩存系統等。

emptyDir存儲卷則定義于.spec.volumes.emptyDir嵌套字段中,可用字段主要包含兩個,具體如下:

?medium:此目錄所在存儲介質的類型,可取值為defaultMemory,默認為default,表示使用節點的默認存儲介質:Memory 表示基于RAM的臨時文件系統tmpfs,空間受于內存,但性能非常好,通常用于為容器中的應用提供緩存空間。

?sizeLimit:當前存儲卷的空間限額,默認值為 nil,表示不限制;不過在 medium 字段為Memory時,建議定義此限額。

1.創建Pod對象配置清單

下面是一個使用了emptyDir存儲卷的簡單示例,它保持于vol-emptydir.yaml配置文件:

apiVersion: v1
kind: Pod
metadata:
  name: vol-emptydir-pod
spec:
  volumes:
  - name: html
    emptyDir: { }
  containers:
  - name: nginx
    image: nginx:latest
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
  - name: pagegen
    image: alpine
    volumeMounts:
    - name: html
      mountPath: /html
    command: [ "/bin/sh", "-c" ]
    args:                        #定義循環,每10秒向/html/文件中追加寫入當前主機名和時間
    - while true; do
        echo $(hostname) $(date) >> /html/index.html;
        sleep 10;
      done

上面示例中定義的存儲卷名稱為html,掛載于容器nginx的 /usr/share/nginx/html目錄,以及容器pagegen的/html目錄。容器pagegen每隔10秒向存儲卷上的index.html文件中追加一行信息,而容器nginx中的nginx進程則以其站點主頁。如下圖所示:

Kubernetes中的emptyDir存儲卷和節點存儲卷

2.創建Pod對象

kubectl apply -f vol-emptydir.yaml

3.查看Pod狀態 Pod對象的詳細信息中會顯示存儲卷的相關狀態,包括其是否創建成功(在Events字段中輸出)、相關的類型及參數(在Volumes字段中輸出)以及容器中掛載狀態等信息(在Containers字段中輸出),如下面命令所示:

kubectl describe pods/vol-emptydir-pod
Containers:
  nginx:
    Mounts:
      /usr/share/nginx/html from html (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-xxqkj (ro)
  pagegen:
    Command:
      /bin/sh
      -c
    Args:
      while true; do echo $(hostname) $(date) >> /html/index.html; sleep 10; done
    Mounts:
      /html from html (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-xxqkj (ro)

4.訪問Pod中Nginx pagegen容器每隔10秒向 html/index.html 追加寫入信息,Nginx容器掛載的也是此臨時存儲,所以Nginx的網頁文件也是從這里獲取。

curl http://172.20.1.18
vol-emptydir-pod Fri Jun 12 02:47:29 UTC 2020
vol-emptydir-pod Fri Jun 12 02:47:39 UTC 2020
vol-emptydir-pod Fri Jun 12 02:47:49 UTC 2020
vol-emptydir-pod Fri Jun 12 02:47:59 UTC 2020
vol-emptydir-pod Fri Jun 12 02:48:09 UTC 2020
vol-emptydir-pod Fri Jun 12 02:48:19 UTC 2020

5.進入容器 以下分別進入Nginx容器以及pagegen容器查看其掛載

通過 -c 來指定容器名稱進入指定容器

kubectl exec -it pods/vol-emptydir-pod -c nginx -- /bin/sh
# ls /usr/share/nginx/html
index.html
# head -3 /usr/share/nginx/html/index.html
vol-emptydir-pod Fri Jun 12 02:47:29 UTC 2020
vol-emptydir-pod Fri Jun 12 02:47:39 UTC 2020
vol-emptydir-pod Fri Jun 12 02:47:49 UTC 2020

進入pagegen容器

kubectl exec -it pods/vol-emptydir-pod -c pagegen -- /bin/sh
/ # ls /html/
index.html
/ # head -3 /html/index.html
vol-emptydir-pod Fri Jun 12 02:47:29 UTC 2020
vol-emptydir-pod Fri Jun 12 02:47:39 UTC 2020
vol-emptydir-pod Fri Jun 12 02:47:49 UTC 2020
/ # ps aux
PID   USER     TIME  COMMAND
    1 root      0:00 /bin/sh -c while true; do echo $(hostname) $(date) >> /html/index.html; sleep 10; done
  286 root      0:00 /bin/sh
  303 root      0:00 sleep 10
  304 root      0:00 ps aux

作為邊車 (sidecar)的容器pagegen,其每隔10秒生成一行信息追加到存儲卷上的index.html文件中,因此,通過主容器nginx的應用訪問到文件內存也會處理不停的變動中。另外,emptyDir存儲卷也可以基于RAM創建tmpfs文件系統的存儲卷,常用于為容器的應用提高高性能緩存,下面是一個配置示例:

cat vol-emptydir.yaml
apiVersion: v1
kind: Pod
metadata:
  name: vol-emptydir-pod
spec:
  volumes:
  - name: html
    emptyDir:
      medium: Memory                #指定臨時存儲到內存
      sizeLimit: 256Mi              #給予的內存空間大小
  containers:
  - name: nginx
    image: nginx:latest
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
  - name: pagegen
    image: alpine
    volumeMounts:
    - name: html
      mountPath: /html
    command: [ "/bin/sh", "-c" ]
    args:
    - while true; do
        echo $(hostname) $(date) >> /html/index.html;
        sleep 10;
      done

emptyDir卷簡單易用,但僅能用于臨時存儲,另外還存在一些類型的存儲卷構建在emptyDir之上,并額外提供了emptyDir沒有的功能。

節點存儲卷 hostPath

hostPath類型的存儲卷是指將工作節點上某文件系統的目錄或文件掛載于Pod中的一種存儲卷,它可獨立于Pod資源的生命周期,因而具有持久性。但它是工作節點本地的存儲空間,僅適用于特定情況下的存儲卷使用需求,例如,將工作節點上的文件系統關聯為Pod的存儲卷,從而使得容器訪問接待您文件系統上的數據。這一點在運行有管理任務的系統級Pod資源需要訪問節點上的文件時比較有用。

配置hostPath存儲卷的嵌套字段共有兩個:一個是用于指定工作節點上的目錄路徑的必須按字段path 一個是指定存儲卷類型的type,它支持使用的卷類型包含如下幾種:

?DirectoryOrCreate:指定的路徑不存在時自動將其創建為權限是0755的空目錄,屬主屬組均為kubelet。

?Directory:必須存在的目錄路徑

?FileOrCreate:指定的路徑不存在時自動將其創建為權限0644的空文件,屬主和屬組同是kubelet。

?File:必須存在的文件路徑

?Socket:必須存在的Socket文件路徑

?CharDevice:必須存在的字符設備文件路徑

?BlockDevice:必須存在的塊設備文件路徑

Kubernetes中的emptyDir存儲卷和節點存儲卷

下面是定義在vo-hostpath.yaml配置文件中的Pod資源,它運行著日志收集代理應用filebeat,負責收集工作節點及容器相關的日志信息發往Redis服務器,它使用了三個hostPath類型的存儲卷:

1.創建資源配置清單

apiVersion: v1
kind: Pod
metadata:
  name: vo-hostpath-pod
spec:
  containers:
  - name: filebeat
    image: ikubernetes/filebeat:5.6.7-alpine
    env:                            #定義變量
    - name: REDIS_HOST              #變量名
      value: redis.ilinux.io:6379   #變量值
    - name: LOG_LEVEL                   #變量明
      value: info                   #變量值
    volumeMounts:                   #卷掛載配置
    - name: varlog                  #掛載名稱為varlog的卷
      mountPath: /var/log           #掛載到容器中的/var/log目錄中
    - name: socket                  #掛載名稱為socket的卷
      mountPath: /var/run/docker.sock#掛載到容器中的/var/run/docker.sock
    - name: varlibdockercontainers  #掛載名稱為varlibdockercontainers的卷
      mountPath: /var/lib/docker/containers#掛載到容器中的/var/lib/docker/containers目錄中
      readOnly: true                #為只讀掛載
  volumes:                          #卷配置
  - name: varlog                    #自定義的卷名稱
    hostPath:                       #節點路徑配置
      path: /var/log                #在節點上的路徑
      type: DirectoryOrCreate        #節點上不存在/var/log目錄時,則自動創建權限為0755的目錄,屬性信息為kubelet用戶
  - name: varlibdockercontainers
    hostPath:
      path: /var/lib/docker/containers
      type: Directory
  - name: socket
    hostPath:
      path: /var/run/docker.sock
      type: Socket                        #節點上必須存在/var/run/docker.sock,否則創建Pod失敗

2.創建Pod對象

kubectl apply -f vo-hostpath.yaml

3.查看Pod對象詳細信息 如下命令可以到Pod的掛載信息

kubectl describe pods/vo-hostpath-pod | grep -A 12 Volumes
Volumes:
  varlog:
    Type:          HostPath (bare host directory volume)
    Path:          /var/log
    HostPathType:
  varlibdockercontainers:
    Type:          HostPath (bare host directory volume)
    Path:          /var/lib/docker/containers
    HostPathType:
  socket:
    Type:          HostPath (bare host directory volume)
    Path:          /var/run/docker.sock
    HostPathType:

如下這臺Pod運行在了Node02節點之上,那么就會把Node02上的 /var/log 、/var/lib/docker/containers目錄以及 /var/run/docker.sock文件掛載至我們創建的Pod之中。

kubectl get pods -o wide | grep vo-hostpath-pod
vo-hostpath-pod               1/1     Running            0          3m37s   172.20.2.28   k8s-node02   <none>           <none>

4.進入Pod查看掛載信息


kubectl exec -it pods/vo-hostpath-pod -- /bin/sh

#查看/var/log
/ # ls /var/log
alternatives.log          chrony                    kern.log                  syslog.2.gz               vmware-vmsvc-root.1.log
alternatives.log.1        cloud-init-output.log     kern.log.1                syslog.3.gz               vmware-vmsvc-root.2.log
apt                       cloud-init.log            kern.log.2.gz             syslog.4.gz               vmware-vmsvc-root.3.log
auth.log                  containers                kern.log.3.gz             syslog.5.gz               vmware-vmsvc-root.log
auth.log.1                dist-upgrade              kern.log.4.gz             syslog.6.gz               vmware-vmtoolsd-root.log
auth.log.2.gz             dpkg.log                  landscape                 syslog.7.gz               wtmp
auth.log.3.gz             dpkg.log.1                lastlog                   tallylog                  wtmp.1
auth.log.4.gz             dpkg.log.2.gz             lxd                       unattended-upgrades
bootstrap.log             faillog                   pods                      vmware-network.1.log
btmp                      installer                 syslog                    vmware-network.2.log
btmp.1                    journal                   syslog.1                  vmware-network.log

#查看/var/lib/docker/containers信息
/ # ls  /var/lib/docker/containers/
222ff7ab4b939691d4690ebd353e4dae39782d48dba190f6473d02f65e35e9c5  9b362d8f03d2f87573487a8d6a266c1a77b6e2cfb28654ba5a3016008155564f
2ddb2bd4c2dfd44b48a430502e8f0479651ac2084b14070c7bd6f128907e6d27  d2e2af23b3a406d941a1f19a989c6a529b7cfda32a75579ff171148e3bce771d
2f0c31b8e6fff99953a096af8153b37b572f71a3e98a9e09665486b6ca6d940f  e0d8e9913767ef45c700648f20f025440f1313be242b6f0cf3577b1b92d61acb
31baeb1aef75acf16544042add63293e8547008c1ae1d40ab62f8fd24fa203a4  ee09c6588feb6665d24f61a887fe4a9d4df366625f80e9b7b0520c6066b3a754
3dbada0509671af1193b39b86f72d1ed9022914f7ba7886bd975cfa70c554559  ef1fcc1b0de6817b2d2c8b81a187e72a93c960c816ee118bf5ba9d1a07fff7d6
47686a866a3e9f1e0b82bb582072c612b95ea0d1c68951ea44b3f751eb49dbcb  f52a7a55801bec13b26f2c02fbc5c32cb758f690de5480ff246f379ebbb3fac7
6bc85638f22115f3479ef025b94159a7d8e5e5988fb508c28d118f510c767e0f  f6b5e6bc12ba8121d2aceca137eaf31929d46664648154b45800697a8bd5a23c
9afc7bb18dc7d858f514ec001ad47c6fd6d5ac67f25aa0e777c4762b9ccfaf45

#查看/var/run/docker.sock文件
/ # ls -lrth  /var/run/docker.sock
srw-rw----    1 root     ping           0 May  8 03:27 /var/run/docker.sock
/ # exit;

這類Pod資源通常受控于daemonset類型的Pod控制器,它運行于集群中的每個工作節點之上,負責收集工作節點上系統級的相關逐句,因此使用hostPath存儲卷也是理所應當的。

讀者在創建上述Pod資源時,如果有可用的Redis服務器,則可通過REDIS_HOST傳遞給Pod資源,待其Ready之后即可通過Redis服務器查看到由其發送的日志信息。在filebeat應用架構中。這些日志信息會發到Elasticsearch,并通過Kibana進行展示。

另外,使用hostPath存儲卷時需要注意到,不同節點上的文件或許并不完全相同,于是,那些要求事先必須存在的文件或目錄的滿足狀態也可能會有所不同;另外基于資源可用狀態的調度器Pod時,hostPath資源的可用性狀態不會被考慮在內;再者,在節點中創建的文件或目錄默認僅有root可寫,若期望容器內的進程擁有寫權限,則要么將它們運行為特權容器,要么修改節點上的目錄權限。

那些并非執行系統級管理任務的且不受控于Daemonset控制器的無狀態應用在Pod資源被重新調度至其它節點運行時,此前創建的文件或目錄大多數都不會存在。因此hostPath存儲卷雖然能持久保存數據,但對被調度器按需調度的應用來說并不適用,這時需要用到的是獨立于集群節點的持久性存儲卷、即網絡存儲卷。

好啦!今天的分享到這里就結束了,希望大家持續關注馬哥教育官網,每天都會有大量優質內容與大家分享!

文章來源于網絡,侵刪!

相關新聞

歷經多年發展,已成為國內好評如潮的Linux云計算運維、SRE、Devops、網絡安全、云原生、Go、Python開發專業人才培訓機構!

    1. 主站蜘蛛池模板: 宽城| 娄烦县| 边坝县| 黔南| 永安市| 南开区| 尼木县| 平武县| 罗江县| 富顺县| 镇康县| 元阳县| 临西县| 肥乡县| 元朗区| 邯郸县| 凤台县| 香格里拉县| 灵石县| 当雄县| 安岳县| 长顺县| 宿松县| 自治县| 北宁市| 穆棱市| 峨眉山市| 宿松县| 车险| 土默特左旗| 栾城县| 彭水| 远安县| 阆中市| 罗田县| 大邑县| 文昌市| 永康市| 宜都市| 应用必备| 本溪|