目次
2. nfs をインストールし、nfs サービスを構成します
1. ストレージボリュームを使用する理由は何ですか?
コンテナー ディスク上のファイルのライフ サイクルは短期間であるため、コンテナー内で重要なアプリケーションを実行するときにいくつかの問題が発生します。まず、コンテナがクラッシュすると、kubelet はコンテナを再起動しますが、コンテナ内のファイルは失われます。コンテナはクリーンな状態 (イメージの元の状態) で再起動されます。次に、複数のコンテナがポッド内で同時に実行されている場合、通常はこれらのコンテナ間でファイルを共有する必要があります。Kubernetes のボリューム抽象化は、これらの問題を非常にうまく解決します。ポッド内のコンテナは、一時停止コンテナを通じてボリュームを共有します。
2. emptyDir ストレージ ボリューム
1. コンセプト
ポッドがノードに割り当てられると、emptyDir ボリュームが最初に作成され、ポッドがノード上で実行されている限り存在します。ボリュームの名前が示すように、最初は空です。ポッド内のコンテナは emptyDir ボリューム内の同じファイルを読み書きできますが、ボリュームは各コンテナ内の同じパスまたは異なるパスにマウントできます。何らかの理由でポッドがノードから削除されると、emptyDir 内のデータは完全に削除されます。
2. ポッドの emptyDir を作成する
vim pod-emptydir.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-emptydir
labels:
app: myapp
tier: frontend
spec:
containers:
- name: myapp
image: nginx:1.14
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
volumeMounts: #定义容器挂载详细信息
- name: html #挂载存储卷的名称,如果跟下面volume字段name值相同,则表示使用volume的这个存储卷
mountPath: /usr/share/nginx/html/ #挂载到容器中的目录路径
- name: busybox
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"] #执行死循环,向挂载的目录下文件写入数据
volumes: #定义存储卷
- name: html #定义存储卷名称
emptyDir: {} #定义存储卷类型
3. emptyDir ストレージ ボリュームを確認する
kubectl apply -f pod-emptydir.yaml
kubectl get pods -o wide
在上面定义了2个容器,其中一个容器是输入日期到index.html中,然后验证访问nginx的html是否可以获取日期。以验证两个容器之间挂载的emptyDir实现共享。
curl 10.244.2.58
3. hostPathストレージボリューム
1. コンセプト
hostPath を使用すると、ノード上のファイル システムをポッドにマウントできます。ポッドがノード上のファイルを使用する必要がある場合は、hostPath を使用できます。同じノード上で実行され、hostPath ボリューム内の同じパスを使用するポッドは、同じファイルを参照できます。
- hostPath ボリュームは、ノードのファイル システム内のファイルまたはディレクトリをクラスターにマウントします。
- hostPath は永続的なストレージを実現できますが、ノードに障害が発生した場合にはデータ損失も発生します。
2. ポッドのホストパスを作成する
vim pod-hostpath.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-hostpath
spec:
containers:
- name: myapp
image: nginx:1.14
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
readOnly: false
volumes: #volumes字段定义了paues容器关联的宿主机或分布式文件系统存储卷
- name: html #定义存储卷名称
hostPath: #定义宿主机存储路径
path: /data/pod/volume1 #挂载宿主机目录的路径
type: DirectoryOrCreate #定义类型,如果宿主机没有此目录则自动创建
3. hostPath ストレージ ボリュームを確認する
kubectl apply -f pod-hostpath.yaml
kubectl get pods -owide
#在node01节点
echo 'node01.com' > /data/pod/volume1/index.html
curl 10.244.2.60
3.nfs共有ストレージボリューム
1. コンセプト
NFSとはNetwork File Systemの略で、ネットワークファイルシステムのことです。Kubernetes では、簡単な設定で NFS を Pod にマウントでき、NFS 内のデータを永続的に保存できると同時に、NFS は同時書き込み操作をサポートします。
emptyDir は、異なるコンテナ間でファイル共有を提供できますが、保存できません。hostPath は、異なるコンテナ間でファイル共有とストレージを提供できますが、ノード制限によって制限され、ノード間で共有できません。現時点では、ネットワーク ストレージ (NAS) が必要です。コンテナーを保存するのに便利で、どのクラスター ノードからでもアクセスできます。この記事では、テストの例として NFS を使用します。
2. nfs をインストールし、nfs サービスを構成します
#配置nfs服务
mkdir /data/volumes -p
chmod 777 /data/volumes
echo '<h1> nfs <h1>' > /data/volumes
vim /etc/exports
/data/volumes 192.168.88.0/24(rw,no_root_squash,sync)
systemctl start rpcbind
systemctl start nfs
showmount -e
3.ポッドの作成
vim pod-nfs.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-nfs
spec:
containers:
- name: myapp
image: nginx:1.14
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
nfs: #定义nfs存储卷信息
path: /data/volumes #挂载nfs服务器的共享目录
server: 192.168.88.60 #nfs服务器的ip地址
4.NFSストレージボリュームを確認する
kubectl apply -f pod-nfs.yaml
curl 10.244.2.61