apiVersion: v1 kind: Pod metadata: name: cunchujuan spec: containers: - name: myapp #定義第一容器用於顯示index.html文件內容 image: ikubernetes/myapp:v1 imagePullPolicy: IfNotPresent volumeMounts: #調用存儲卷 - name: html #使用存儲卷的名稱要和下面定義的同樣 mountPath: /usr/share/nginx/html/ #在容器內部掛載的路徑 - name: busybox #定義第二個容器用於產生index.html內容 image: busybox:latest imagePullPolicy: IfNotPresent volumeMounts: - name: html mountPath: /data/ command: ['/bin/sh','-c','while true;do echo $(date) >> /data/index.html;sleep 2;done'] #該命令會不停向,存儲卷的index.html文件追加時間 volumes: #定義存儲卷 - name: html #定義存儲卷名稱 emptyDir: {} #定義存儲卷類型
在上面,咱們定義了2個容器,其中第二個容器是輸入日期到存儲卷的index.html當中,由於兩個容器都是掛載的同一個存儲卷,因此第一個容器的index.html是和第二個共享的,不停curl 能看見index.html在不停的增加html
apiVersion: v1 kind: Pod metadata: name: cs-hostpath spec: containers: - name: myapp image: ikubernetes/myapp:v1 imagePullPolicy: IfNotPresent volumeMounts: - name: html mountPath: /usr/share/nginx/html/ volumes: - name: html hostPath: #存儲卷類型爲 hostPath path: /data/hostpath #實際node節點上的路徑 type: DirectoryOrCreate
先看下調度到那個node的節點上,這邊調度到cs27節點上了
mkdir /data/hostpath/ -pv #在cs27節點上建立 hostpath的存儲卷文件夾
echo "hostpath存儲卷測試" >/data/hostpath/index.html #在存儲卷裏生成一個主頁文件
curl 訪問一下,能看到文件內容就是上面咱們生成的
注意這邊容器在裏面修改了數據,是會同步到hostpath 的存儲卷的就和掛載同樣node
再找一臺主機充當nfs server
mkdir data #建立nfs文件夾
echo "nfs測試">index.html #建立測試html文件
yum install -y nfs-utils #安裝nfs 軟件
vim /etc/exports #修改nfs配置文件
/data/ 192.168.0.0/24(rw,no_root_squash)
#配置文件 路徑加共享對方的網段nginx
每一個node節點也要安裝 yum install -y nfs-utils ,不然沒法沒掛載驅動
#在node的節點運行showmount -e 50.1.1.111 看看有沒有掛載權限
kubectl apply -f nfs.yaml #載入容器資源
查看下ip ,curl 訪問一下看是否是以前在nfs server上建立的html的測試文件web
[root@k8s-master ~]# kubectl explain pv #查看pv的定義方式 FIELDS: apiVersion kind metadata spec [root@k8s-master ~]# kubectl explain pv.spec #查看pv定義的規格 spec: nfs(定義存儲類型) path(定義掛載卷路徑) server(定義服務器名稱) accessModes(定義訪問模型,有如下三種訪問模型,以列表的方式存在,也就是說能夠定義多個訪問模式) ReadWriteOnce(RWO) 單節點讀寫 ReadOnlyMany(ROX) 多節點只讀 ReadWriteMany(RWX) 多節點讀寫 capacity(定義PV空間的大小) storage(指定大小) [root@k8s-master volumes]# kubectl explain pvc #查看PVC的定義方式 KIND: PersistentVolumeClaim VERSION: v1 FIELDS: apiVersion <string> kind <string> metadata <Object> spec <Object> [root@k8s-master volumes]# kubectl explain pvc.spec spec: accessModes(定義訪問模式,必須是PV的訪問模式的子集) resources(定義申請資源的大小) requests: storage:
mkdir v{1,2,3,}
vim /etc/exports
/data/v1 192.168.0.0/24(rw,no_root_squash)
/data/v2 192.168.0.0/24(rw,no_root_squash)
/data/v3 192.168.0.0/24(rw,no_root_squash)vim
apiVersion: v1 kind: PersistentVolume metadata: name: pv001 labels: name: pv001 spec: nfs: path: /data/v1 server: 50.1.1.111 accessModes: ["ReadWriteMany","ReadWriteOnce",] capacity: storage: 1Gi --- apiVersion: v1 kind: PersistentVolume metadata: name: pv002 labels: name: pv002 spec: nfs: path: /data/v2 server: 50.1.1.111 accessModes: ["ReadWriteMany","ReadWriteOnce",] capacity: storage: 2Gi --- apiVersion: v1 kind: PersistentVolume metadata: name: pv003 labels: name: pv003 spec: nfs: path: /data/v3 server: 50.1.1.111 accessModes: ["ReadWriteMany","ReadWriteOnce",] capacity: storage: 5Gi
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mypvc #name ,給下面調用的 spec: accessModes: ["ReadWriteMany"] #聲明訪問類型,只能匹配到,pv包含的 resources: requests: storage: 3Gi #聲明須要3GB的空間,只能匹配3GB及意思的PV --- apiVersion: v1 kind: Pod metadata: name: cs-hostpath spec: containers: - name: myapp image: ikubernetes/myapp:v1 imagePullPolicy: IfNotPresent volumeMounts: - name: html mountPath: /usr/share/nginx/html/ volumes: - name: html persistentVolumeClaim: #掛載存儲卷類型爲 pvc claimName: mypvc #指定PVC的name爲 "mypvc"
Secret:用於向Pod傳遞敏感信息,好比密碼,私鑰,證書文件等,這些信息若是在容器中定義容易泄露,Secret資源可讓用戶將這些信息存儲在急羣衆,而後經過Pod進行掛載,實現敏感數據和系統解耦的效果。
ConfigMap:主要用於向Pod注入非敏感數據,使用時,用戶將數據直接存儲在ConfigMap對象當中,而後Pod經過使用ConfigMap捲進行引用,實現容器的配置文件集中定義和管理。api
經過 --from-literal 建立服務器
kubectl create secret generic mysecret --from-literal=username=admin --from-literal=password=123456 #建立一個Secret namae爲 mysecret
經過 --from-file建立
每一個文件內容對應一個信息條目。app
[root@cs25 ~]# echo "admin" >username [root@cs25 ~]# echo "123456" >password kubectl create secret generic mysecret2 --from-file=username --from-file=password
經過 --from-env-file建立
文件 env.txt 中每行 Key=Value 對應一個信息條目。curl
[root@cs25 ~]# cat << EOF > env.txt > username=admin > password=12345 > EOF kubectl create secret generic mysecret3 --from-env-file=env.txt
經過 YAML 配置文件:
先用base64 命令對密碼等保密的數據完成轉碼ide
vim secret.yaml
apiVersion: v1 kind: Secret metadata: name: mysecretyaml data: username: YWRtaW4K password: MTIzNDU2Cg== #鍵值
查看
#反解碼
使用secret
apiVersion: v1 kind: Pod metadata: name: pod-secret spec: containers: - name: pod-secret image: nginx volumeMounts: - name: foo #掛載那個存儲卷 mountPath: "/etc/foo" #pod 掛載的路徑 volumes: - name: foo #建立存儲卷,name,用於被pod 調用 secret: #存儲卷類型 secretName: mysecret #用那個文件
exec 進入容器 cd 到/etc/foo 能看到咱們建立mysecret的key 及value
重定向數據
apiVersion: v1 kind: Pod metadata: name: pod-secret spec: containers: - name: pod-secret image: nginx volumeMounts: - name: foo mountPath: "/etc/foo" volumes: - name: foo secret: secretName: mysecret items: #自定義存放路徑及文件名 - key: username path: 233/name #重定向路徑及文件名(key),注意路徑要寫相對路徑 - key: password path: 233/pass
這時候數據都被重定向到"/etc/foo/233" 文件夾裏了
使用這種方式 Secret 還支持動態更新:Secret 更新後,容器中的數據也會更新。
vim secret.yaml
kubectl apply -f secret.yaml
登陸進去查看,name 的 value已經發生了變化
環境變量傳遞 key
apiVersion: v1 kind: Pod metadata: name: pod-secret spec: containers: - name: pod-secret image: nginx env: - name: username #傳遞到容器內部的環境變量 valueFrom: secretKeyRef: name: mysecret #使用那個secret key: username #使用那個key - name: password valueFrom: secretKeyRef: name: mysecret key: password
exec 登陸進去 echo 環境變量
經過環境變量 SECRET_USERNAME 和 SECRET_PASSWORD 成功讀取到 Secret 的數據。
須要注意的是,環境變量讀取 Secret 很方便,但沒法支撐 Secret 動態更新。
Secret 能夠爲 Pod 提供密碼、Token、私鑰等敏感數據;對於一些非敏感數據,好比應用的配置信息,則能夠用 ConfigMap。
configmap 以上添加都支持就不一一舉例了
configmap 來個實例
vim www.conf #建立nging 配置文件
server { server_name www.233.com; listen 8860; root /data/web/html; }
kubectl create configmap configmap-cs --from-file=www.conf
#建立一個name爲"configmap-cs" configmap資源,內容就是以前建立的www.conf
vim nginx-configmap #建立pod
apiVersion: v1 kind: Pod metadata: name: pod-secret spec: containers: - name: pod-secret image: nginx volumeMounts: - name: nginxconf #調用名爲"nginxconf"的存儲卷 mountPath: /etc/nginx/conf.d/ volumes: - name: nginxconf #建立存儲卷 configMap: #存儲卷類型爲configMap name: configmap-cs #使用configmap裏面的"configmap-cs"這個資源
kubectl apply -f nginx-configmap.yaml #載入啓動
查看IP 訪問我剛纔定義的資端口,能正常訪問說明配置文件生效了。
登陸進去查看文件
kubectl edit configmaps configmap-cs
#命令修改資源,使用方法和vim 同樣使用
POD掛載過程
POD先掛載名爲"nginxconf"的存儲卷 "nginxconf"的存儲卷的內容是調用configMap資源裏 "configmap-cs"這個資源生成的 "configmap-cs" 這個資源是讀取www.conf 文件生成的