日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

.NET Core + Kubernetes:Volume

發(fā)布時(shí)間:2023/12/4 asp.net 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET Core + Kubernetes:Volume 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

和 Docker 類(lèi)似,Kubernetes 中也提供了 ?Volume 來(lái)實(shí)現(xiàn)數(shù)據(jù)卷掛載,但 Kubernetes 中 Volume 是基于 Pod,而不是容器,它可被 Pod 中多個(gè)容器共享,另外 Kubernetes 中提供比較豐富的 Volume 類(lèi)型[1],如:emptyDir、hostPath、nfs、persistentVolumeClaim、downwardAPI、secret、configMap 等,每種類(lèi)型都有其特點(diǎn)及使用場(chǎng)景。

下面將介紹幾種常用 Volume 類(lèi)型的使用方式,在這之前先在 k8sdemo .NET Core 服務(wù)中添加以下兩個(gè)接口(鏡像版本升級(jí)為 1.2.0),以方便后面效果演示。

[HttpGet] public string GetConfig([FromQuery]string key) {// ...... }[HttpGet] public string GetVolumeData() {// ...... }

GetConfig:通過(guò)傳入配置文件 appsettings.json 的 key 獲取對(duì)應(yīng)值;GetVolumeData:獲取容器內(nèi) /Data/data.txt 的文件內(nèi)容;

emptyDir

emptyDir 的初始狀態(tài)是一個(gè)沒(méi)有任何內(nèi)容的 Volume,其生命周期與 Pod 一致,當(dāng) Pod 中的容器掛掉時(shí),emptyDir Volume 中的內(nèi)容不會(huì)被清除,容器重啟后數(shù)據(jù)依然可見(jiàn)。只有當(dāng)整個(gè) Pod 從集群中被刪除,emptyDir Volume 中的內(nèi)容才會(huì)被清除。如下:emptyDir Volume 位于 Pod 內(nèi)。

通過(guò)以下配置文件創(chuàng)建的 Pod 中將包含 k8sdemo 和 busybox 兩個(gè) container,busybox 是一個(gè)集成了一些常用 linux 命令的鏡像,這里將使用它在 Pod 內(nèi)進(jìn)行文件內(nèi)容修改。k8sdemo 容器的 /app/Data/ 目錄文件與 busybox 容器的 /data/ 目錄文件將通過(guò) emptyDir Volume 進(jìn)行共享。

apiVersion: apps/v1 kind: Deployment metadata:name: emptydir-demo spec:replicas: 1selector:matchLabels:name: emptydir-demotemplate:metadata:labels:name: emptydir-demospec:containers:- name: k8sdemoimage: beckjin/k8sdemo:1.2.0volumeMounts:- mountPath: /app/Data/name: shareports:- containerPort: 80- name: busyboximage: busyboxcommand:- "/bin/sh"- "-c"- "sleep 3600"volumeMounts:- mountPath: /data/name: sharevolumes:- name: shareemptyDir: {} --- apiVersion: v1 kind: Service metadata:name: emptydir-demo-service spec:selector:name: emptydir-demotype: NodePortports:- port: 80targetPort: 80

執(zhí)行命令 kubectl exec -it emptydir-demo-746f49b55b-p6pzz -c busybox -- /bin/sh 進(jìn)入 busybox ?容器,然后執(zhí)行 echo 'emptyDir Volume' > /data/data.txt,最后訪問(wèn) k8sdemo 服務(wù)的 GetVolumeData 接口獲取文件內(nèi)容:

hostPath

hostPath 類(lèi)型是掛載宿主機(jī)上的文件或目錄到 Pod 中,與 Pod 所在的 Node 是強(qiáng)關(guān)聯(lián)的,所以當(dāng) Pod 因重啟被重新調(diào)度時(shí),一定要確保所在主機(jī)的相關(guān)文件或目錄的正確性,如下:

如下配置中 replicas 字段設(shè)置為 2 ,正常情況下 Pod 將會(huì)在 node1 和 node2 上分別被創(chuàng)建,另外 hostPath 字段中的 path 指定了 /data/k8sdemo/ 目錄掛載到容器內(nèi)的 /app/Data/,所以分別在 node1 和 node2 創(chuàng)建 /data/k8sdemo/data.txt ,內(nèi)容為 node1 hostPath Volume 和 node2 hostPath Volume。

kind: Deployment metadata:name: hostpath-demo spec:replicas: 2selector:matchLabels:name: hostpath-demotemplate:metadata:labels:name: hostpath-demospec:containers:- name: k8sdemoimage: beckjin/k8sdemo:1.2.0volumeMounts:- mountPath: /app/Data/name: shareports:- containerPort: 80volumes:- name: sharehostPath:path: /data/k8sdemotype: Directory --- apiVersion: v1 kind: Service metadata:name: hostpath-demo-service spec:selector:name: hostpath-demotype: NodePortports:- port: 81targetPort: 80

訪問(wèn) k8sdemo 服務(wù)的 GetVolumeData 接口獲取文件內(nèi)容,當(dāng)路由到不同 Pod(即不同的 node) 返回內(nèi)容將不一樣,如下:

nfs

NFS(network file system) 網(wǎng)絡(luò)文件系統(tǒng),類(lèi)似 Windows 中的文件夾共享。首先在 Kubernetes 集群外搭建一個(gè) NFS Server,然后指定文件目錄進(jìn)行共享,最終與 ?Pod 內(nèi)的容器關(guān)聯(lián),實(shí)現(xiàn)數(shù)據(jù)卷掛載,如下:

NFS Server 搭建

  • 在機(jī)器上安裝依賴組件(集群外的機(jī)器 192.168.1.13,并關(guān)閉防火墻)

    yum install -y nfs-utils rpcbind
  • 將主機(jī)上的 /share 目錄作為共享目錄,如果多個(gè)目錄可以添加多行

    [root@localhost ~]# vim /etc/exports /share 192.168.1.0/24(insecure,rw,no_root_squash)
  • 啟動(dòng) NFS

    systemctl start rpcbind.service systemctl enable rpcbind.servicesystemctl start nfs.service systemctl enable nfs.service
  • Kubernetes 集群內(nèi)各節(jié)點(diǎn)安裝 nfs-utils,方便使用 showmount

    yum install -y nfs-utils
  • 完成以上步驟后,在 Kubernetes 集群中任意節(jié)點(diǎn)執(zhí)行 ?showmount -e 192.168.1.13 驗(yàn)證是否正常:

    如下配置中 volumes 指定了 nfs 字段配置,即將 ?NFS Server 中的 /share 目錄掛載到容器內(nèi)的 /app/Data/,與 hostPath Volume 類(lèi)型的主要區(qū)別是依賴單獨(dú)的 NFS Server,和 node 本身并不耦合。

    apiVersion: apps/v1 kind: Deployment metadata:name: nfs-demo spec:replicas: 2selector:matchLabels:name: nfs-demotemplate:metadata:labels:name: nfs-demospec:containers:- name: k8sdemoimage: beckjin/k8sdemo:1.2.0volumeMounts:- mountPath: /app/Dataname: shareports:- containerPort: 80volumes:- name: sharenfs:server: 192.168.1.13path: /share --- apiVersion: v1 kind: Service metadata:name: nfs-demo-service spec:selector:name: nfs-demotype: NodePortports:- port: 82targetPort: 80

    在 NFS Server 中執(zhí)行 echo 'nfs Volume' > /share/data.txt,然后訪問(wèn) k8sdemo 服務(wù)的 GetVolumeData 接口獲取文件內(nèi)容,如下:

    persistentVolumeClaim

    PersistentVolumeClaim(PVC) 與 PersistentVolume(PV) 在使用上是一對(duì)密不可分的組合,PV 主要是資源對(duì)象定義,PVC 主要是對(duì)應(yīng)資源對(duì)象的引用,PV 支持 多種插件類(lèi)型[2] 進(jìn)行實(shí)現(xiàn),以下將繼續(xù)使用 NFS 來(lái)作為 PV 插件。

    如下圖:首先基于 PV 插件在 Kubernetes 集群中創(chuàng)建各種資源規(guī)格的 PV,根據(jù) Pod 需要存儲(chǔ)卷資源創(chuàng)建 PVC,Kubernetes 將符合資源規(guī)格要求且消耗資源最小的 PV 綁定到 PVC,PV 和 PVC 是一對(duì)一的關(guān)系,如果找不到符合條件的 PV,PVC 會(huì)一直處于未綁定狀態(tài),PVC 綁定成功后可被 Pod 內(nèi)的容器引用。

    NFS Server 添加 mount 目錄

    修改 NFS Server /etc/exports 并生效 ,在 Kubernetes 集群中任意節(jié)點(diǎn)執(zhí)行 showmount -e 192.168.1.13 驗(yàn)證是否正常:

    創(chuàng)建 PV

    以下配置將會(huì)創(chuàng)建3個(gè) PV,storage 分別為 500M、1G、2G。

    apiVersion: v1 kind: PersistentVolume metadata:name: pv-share-a spec:nfs:path: /share_aserver: 192.168.1.13accessModes:- ReadWriteManycapacity:storage: 500Mi --- apiVersion: v1 kind: PersistentVolume metadata:name: pv-share-b spec:nfs:path: /share_bserver: 192.168.1.13accessModes:- ReadWriteManycapacity:storage: 1Gi --- apiVersion: v1 kind: PersistentVolume metadata:name: pv-share-c spec:nfs:path: /share_cserver: 192.168.1.13accessModes:- ReadWriteManycapacity:storage: 2Gi

    創(chuàng)建 PVC

    apiVersion: v1 kind: PersistentVolumeClaim metadata:name: pvc-k8sdemo spec:accessModes:- ReadWriteManyresources:requests:storage: 1Gi

    PVC 創(chuàng)建成功后,pv-share-b 的 STATUS 會(huì)變?yōu)?Bound,同時(shí) CLAIM 屬性會(huì)顯示相關(guān)的 PVC,從上圖也可以看出使用的是最小符合資源規(guī)格的 PV,并不會(huì)將 pv-share-c 綁定到當(dāng)前 PVC。更多關(guān)于 PV 和 PVC 屬性說(shuō)明可參考:persistent-volumes[3]

    創(chuàng)建 Pod

    如下配置中 volumes 指定了 persistentVolumeClaim 字段配置,這里只需要設(shè)置 claimName 為前面創(chuàng)建的 PVC 名稱(chēng) pvc-k8sdemo 即可,使用上比較簡(jiǎn)單。

    apiVersion: apps/v1 kind: Deployment metadata:name: pvc-demo spec:replicas: 2selector:matchLabels:name: pvc-demotemplate:metadata:labels:name: pvc-demospec:containers:- name: k8sdemoimage: beckjin/k8sdemo:1.2.0volumeMounts:- mountPath: /app/Dataname: shareports:- containerPort: 80volumes:- name: sharepersistentVolumeClaim:claimName: pvc-k8sdemo --- apiVersion: v1 kind: Service metadata:name: pvc-demo-service spec:selector:name: pvc-demotype: NodePortports:- port: 83targetPort: 80

    在 NFS Server 中執(zhí)行 echo 'pvc Volume share_a' > /share_a/data.txt,share_b、share_c 類(lèi)似,然后訪問(wèn) k8sdemo 服務(wù)的 GetVolumeData 接口獲取文件內(nèi)容,如下:

    configMap

    configMap 主要使鏡像和配置文件解耦,以便實(shí)現(xiàn)鏡像的可移植性和可復(fù)用性,configMap 是配置信息的集合,可直接注入到 Pod 的容器中使用,扮演著配置中心的角色。configMap 可以以數(shù)據(jù)卷的形式掛載,也可以基于環(huán)境變量的形式注入到 Pod 容器中使用。另外 secret 是一種相對(duì)安全的 configMap,它默認(rèn)會(huì)將配置信息進(jìn)行 base64 編碼,使配置不是明文直接存儲(chǔ)在 configMap 中,起到一定的保護(hù)作用。

    下面主要介紹 configMap 以數(shù)據(jù)卷掛載方式的使用,如下圖,在 Kubernetes 集群中創(chuàng)建一個(gè) configMap 資源類(lèi)型,然后供 Pod 內(nèi)的容器使用。

    如下,創(chuàng)建一個(gè)數(shù)據(jù)卷形式的 ConfigMap,appsettings.json 是 .NET Core 程序內(nèi)使用的配置文件。

    apiVersion: v1 kind: ConfigMap metadata:name: configmap-k8sdemo data:appsettings.json: |-{"ServiceName": "k8sdemo"}

    如下配置中 volumes 指定了 configMap 資源的名稱(chēng)為以上創(chuàng)建的 configMap 對(duì)象:configmap-k8sdemo。

    apiVersion: apps/v1 kind: Deployment metadata:name: configmap-demo spec:replicas: 2selector:matchLabels:name: configmap-demotemplate:metadata:labels:name: configmap-demospec:containers:- name: k8sdemoimage: beckjin/k8sdemo:1.2.0volumeMounts:- name: configfilemountPath: /app/appsettings.jsonsubPath: appsettings.jsonports:- containerPort: 80volumes:- name: configfileconfigMap:name: configmap-k8sdemoitems:- key: appsettings.jsonpath: appsettings.json --- apiVersion: v1 kind: Service metadata:name: configmap-demo-service spec:selector:name: configmap-demotype: NodePortports:- port: 84targetPort: 80

    通過(guò)訪問(wèn) k8sdemo 服務(wù)的 GetConfig 接口獲取指定 key 的值:

    參考資料

    [1]

    Volume 類(lèi)型: https://kubernetes.io/docs/concepts/storage/volumes/#types-of-volumes

    [2]

    多種插件類(lèi)型: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#types-of-persistent-volumes

    [3]

    persistent-volumes: https://kubernetes.io/docs/concepts/storage/persistent-volumes/

    總結(jié)

    以上是生活随笔為你收集整理的.NET Core + Kubernetes:Volume的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。