热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:k8s学习存储

本文由编程笔记#小编为大家整理,主要介绍了k8s学习-存储相关的知识,希望对你有一定的参考价值。 4.6、存储4.6.1、ConfigMap创建方式文件夹/文件创建mkdir dircd dircat
本文由编程笔记#小编为大家整理,主要介绍了k8s学习-存储相关的知识,希望对你有一定的参考价值。



4.6、存储


4.6.1、ConfigMap


创建方式


文件夹/文件创建

mkdir dir
cd dir
cat > c1.properties <c1.name=c1
EOF
cat > c2.properties <c2.name=c2
EOF
cd ..
cat > c3.properties <c3.name=c3
EOF
# configmap 简写为 cm
# 根据目录创建
kubectl create configmap cm-c1 --from-file=dir
# 根据文件创建
kubectl create configmap cm-c2 --from-file=c3.properties
# 查看
[root@k8s-master configmap]# kubectl get cm
NAME DATA AGE
cm-c1 2 12s
cm-c2 1 7s
# 查看内容
[root@k8s-master configmap]# kubectl get cm cm-c2 -o yaml
apiVersion: v1
data:
c3.properties: |
c3.name=c3
kind: ConfigMap
metadata:
creationTimestamp: "2020-03-08T02:55:45Z"
name: cm-c2
namespace: default
resourceVersion: "280079"
selfLink: /api/v1/namespaces/default/configmaps/cm-c2
uid: d35bfd4e-42bc-491f-b30a-488633d36653

字面量创建

# 使用 --from-literal=KEY=VALUE
kubectl create cm cm-literal --from-literal=lt.name=bart --from-literal=lt.age=16
# 查看
[root@k8s-master configmap]# kubectl get cm cm-literal -o yaml
apiVersion: v1
data:
lt.age: "16"
lt.name: bart
kind: ConfigMap
metadata:
creationTimestamp: "2020-03-08T02:59:41Z"
name: cm-literal
namespace: default
resourceVersion: "280454"
selfLink: /api/v1/namespaces/default/configmaps/cm-literal
uid: 5bd18816-bfd9-4f5d-abd8-5fc20d4ead92

配置文件创建

vim cm.yml

apiVersion: v1
kind: ConfigMap
metadata:
name: cm-special-config
data:
special.how: very
special.type: charm
---
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-env-config
data:
log_level: INFO

kubectl create -f cm.yml
[root@k8s-master configmap]# kubectl get cm
NAME DATA AGE
cm-c1 2 46m
cm-c2 1 45m
cm-env-config 1 13s # 刚创建的
cm-literal 2 41m
cm-special-config 2 13s # 刚创建的

Pod中使用ConfigMap


env使用

vim env.yml

apiVersion: v1
kind: Pod
metadata:
name: cm-test-pod
spec:
containers:
- name: nginx
image: habor-repo.com/library/nginx:v1
command: ["/bin/sh", "-c", "env; echo -e $(SPECIAL_HOW)"] # 打印env和指定key
env: # 容器添加环境变量
- name: SPECIAL_HOW
valueFrom: # 引用 configmap 的值
configMapKeyRef:
name: cm-special-config # configmap 的 name
key: special.how # configmap 中的 key
envFrom: # 环境变量导入
- configMapRef:
name: cm-env-config # configmap 的 name
restartPolicy: Never # 不重启

kubectl create -f env.yaml
kubectl get pod
# 查看日志
[root@k8s-master configmap]# kubectl logs cm-test-pod
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOSTNAME=cm-test-pod
HOME=/root
PKG_RELEASE=1~buster
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
NGINX_VERSION=1.17.9
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
NJS_VERSION=0.3.9
KUBERNETES_PORT_443_TCP_PROTO=tcp
log_level=INFO # fromEnv 中的值
SPECIAL_HOW=very
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
nvery # 打印的 env的value

挂载使用

vim volume.yaml

apiVersion: v1
kind: Pod
metadata:
name: cm-test-pod2
spec:
containers:
- name: nginx
image: habor-repo.com/library/nginx:v1
command: ["/bin/sh", "-c", "cat /etc/config/special.how"] # 文件名就是key,内容就是value
volumeMounts:
- name: config-volume # 挂载位置绑定挂在卷名字
mountPath: /etc/config
volumes:
- name: config-volume # 定义一个挂载卷为configmap的内容
configMap:
name: cm-special-config
restartPolicy: Never # 不重启

kubectl create -f volume.yml
kubectl get pod
# 查看日志
[root@k8s-master configmap]# kubectl logs cm-test-pod2
very

热更新

vim hot.yml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: cm-test-pod3
spec:
replicas: 1
template:
metadata:
labels:
app: cm-test-pod3
spec:
containers:
- name: nginx
image: habor-repo.com/library/nginx:v1
volumeMounts:
- name: config-volume # 挂载位置绑定挂在卷名字
mountPath: /etc/config
volumes:
- name: config-volume # 定义一个挂载卷为configmap的内容
configMap:
name: cm-special-config
restartPolicy: Always # 不支持Never

kubectl create -f hot.yml
[root@k8s-master configmap]# kubectl get pod
NAME READY STATUS RESTARTS AGE
cm-test-pod 0/1 Completed 0 36m
cm-test-pod2 0/1 Completed 0 22m
cm-test-pod3-75fbd58f94-v7rph 1/1 Running 0 5s
# 查看内容
kubectl exec cm-test-pod3-75fbd58f94-v7rph -it -- cat /etc/config/special.type
# 修改 cm-special-config 的值
kubectl edit cm cm-special-config
# 再次查看 (大概10秒钟左右值会自动改变)
kubectl exec cm-test-pod3 -it -- cat /etc/config/special.type
# 修改pod内容强制触发滚动更新,适用于Env环境变量引用的configMap的情况
kubectl patch deployment cm-test-pod3 --patch ‘{"spec": {"template": {"metadata": {"annotations": {"version/config": "20200309"}}}}}‘
[root@k8s-master configmap]# kubectl get pod
NAME READY STATUS RESTARTS AGE
cm-test-pod 0/1 Completed 0 38m
cm-test-pod2 0/1 Completed 0 24m
cm-test-pod3-59688486-xd5zs 1/1 Running 0 23s # pod 已经重启了

主意:!!!



  • 使用ConfigMap挂载的Env不会同步更新(除非Pod重新加载)

  • 使用ConfigMap挂载的Volume会更新(大概10秒)


4.6.2、Secret


Service Account

用来访问Kubernetes API,由Kubernetes自动创建,并会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount

# 假如有个pod为nginx
kubectl exec nignx -it -- ls /run/secrets/kubernetes.io/serviceaccount
ca.crt
namespace
token

OpqueSecret

使用base64来加密一些配置项

echo "admin" | base64 # YWRtaW4K
echo "YWRtaW4K" | base64 -d # admin
echo "123456" | base64 # MTIzNDU2Cg==
echo "MTIzNDU2Cg==" | base64 -d # 123456

vim secret.yml

apiVersion: v1
kind: Secret
metadata:
name: mysecret
data:
name: YWRtaW4K
password: MTIzNDU2Cg==

kubectl create -f secret.yml
# 查看内容
kubectl get secret mysecret -o yaml

vim pod.yml

apiVersion: v1
kind: Pod
metadata:
name: secret-test-pod
spec:
containers:
- name: nginx
image: habor-repo.com/library/nginx:v1
env: # 容器添加环境变量
- name: SEC_USER_NAME
valueFrom: # 引用 secret 的值
secretKeyRef:
name: mysecret # mysecret 的 name
key: name # mysecret 中的 key
- name: SEC_USER_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
volumeMounts:
- name: secret-volume # 挂载位置绑定挂在卷名字
mountPath: /etc/config
volumes:
- name: secret-volume # 定义一个挂载卷为configmap的内容
secret:
secretName: mysecret
restartPolicy: Never # 不重启

kubectl create -f pod.yml
kubectl get pod
# 查看挂载文件
[root@k8s-master secret]# kubectl exec secret-test-pod -it -- ls /etc/config
name password
# 查看环境变量(进入容器内部查看)
[root@k8s-master secret]# kubectl exec secret-test-pod -it -- /bin/bash
root@secret-test-pod:/# echo $SEC_USER_NAME $SEC_USER_PASSWORD
admin 123456

kubernetes.io/dockerconfigjson

使用kubectl创建docker registry认证的secret

kubectl create secret docker-registry --docker-server= --docker-username=<仓库登录名> --docker-password=<登录密码> --docker-emai=<邮箱(随便给)>
# 使用 docker login登录也可以
docker login

在创建Pod的时候指定imagePullSecrets参数

apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
- name: foo
image: roc/awangyang:v1
imagePullSecrets:
- name: myregistrykey # 对应上面创建的

4.6.3、Volume


emptyDir

当 Pod 被分配给节点时,首先创建emptyDir卷,并且只要该 Pod 在该节点上运行,该卷就会存在。正如卷的名字所述,它最初是空的。Pod 中的容器可以读取和写入emptyDir卷中的相同文件,尽管该卷可以挂载到每个容器中的相同或不同路径上。当出于任何原因从节点中删除 Pod 时,emptyDir中的数据将被永久删除

emptyDir的用法有:



  • 暂存空间,例如用于基于磁盘的合并排序

  • 用作长时间计算崩溃恢复时的检查点

  • Web服务器容器提供数据时,保存内容管理器容器提取的文件

vim emptydir.yml

apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: habor-repo.com/library/nginx:v1
name: nginx
volumeMounts:
- mountPath: /cache
name: cache-volume
- image: habor-repo.com/library/busybox:v1
command: ["/bin/sh", "-c", "sleep 3600s;"]
name: busybox
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}

kubectl create -f emptydir.yml
kubectl get pod
kubectl describe pod test-pd
kubectl exec test-pd -c nginx -it -- /bin/bash
# date > /cache/a.txt
kubectl exec test-pd -c nginx -it -- cat /cache/a.txt
# 查看另外一个
kubectl exec test-pd -c busybox -it -- cat /cache/a.txt

hostPath

hostPath卷将主机节点的文件系统中的文件或目录挂载到集群中



  • hostPath的用途如下:运行需要访问 Docker 内部的容器;使用/var/lib/docker的hostPath

  • 在容器中运行 cAdvisor;使用/dev/cgroups的hostPath允许 pod 指定给定的 hostPath 是否应该在 pod

  • 运行之前存在,是否应该创建,以及它应该以什么形式存在

除了所需的path属性之外,用户还可以为hostPath卷指定type











































行为
空字符串(默认)用于向后兼容,这意味着在挂载 hostPath 卷之前不会执行任何检查。
DirectoryOrCreate如果在给定的路径上没有任何东西存在,那么将根据需要在那里创建一个空目录,权限设置为 0755,与 Kubelet 具有相同的组和所有权。
Directory给定的路径下必须存在目录
FileOrCreate如果在给定的路径上没有任何东西存在,那么会根据需要创建一个空文件,权限设置为 0644,与 Kubelet 具有相同的组和所有权。
File给定的路径下必须存在文件
Socket给定的路径下必须存在 UNIX 套接字
CharDevice给定的路径下必须存在字符设备
BlockDevice给定的路径下必须存在块设备

使用这种卷类型是请注意,因为:



  • 由于每个节点上的文件都不同,具有相同配置(例如从 podTemplate 创建的)的 pod 在不同节点上的行为可能会有所不同

  • 当 Kubernetes 按照计划添加资源感知调度时,将无法考虑hostPath使用的资源

  • 在底层主机上创建的文件或目录只能由 root 写入。您需要在特权容器中以 root 身份运行进程,或修改主机上的文件权限以便写入hostPath卷

vim hostpath.yml

apiVersion: v1
kind: Pod
metadata:
name: test-pd2
spec:
containers:
- image: habor-repo.com/library/nginx:v1
name: nginx
volumeMounts:
- mountPath: /cache
name: cache-volume
- image: habor-repo.com/library/busybox:v1
command: ["/bin/sh", "-c", "sleep 3600s;"]
name: busybox
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
hostPath:
path: /data # 本地路径
type: Directory # 目录

# 在所有节点上创建 /data 目录
mkdir /data
kubectl create -f hostpath.yml
kubectl get pod -o wide
# 假设在 k8s-node2 节点上
# date >/data/a.txt
kubectl exec test-pd2 -c nginx -it -- cat /cache/a.txt
# 查看另外一个
kubectl exec test-pd2 -c busybox -it -- cat /cache/a.txt
# 发现有内容

4.6.4、PV&PVC


概念

PersistentVolume(PV)

是由管理员设置的存储,它是群集的一部分。就像节点是集群中的资源一样,PV 也是集群中的资源。 PV 是Volume 之类的卷插件,但具有独立于使用 PV 的 Pod 的生命周期。此 API 对象包含存储实现的细节,即 NFS、iSCSI 或特定于云供应商的存储系统

PersistentVolumeClaim(PVC)

是用户存储的请求。它与 Pod 相似。Pod 消耗节点资源,PVC 消耗 PV 资源。Pod 可以请求特定级别的资源(CPU 和内存)。声明可以请求特定的大小和访问模式(例如,可以以读/写一次或只读多次模式挂载)



  • 静态 pv



    • 集群管理员创建一些 PV。它们带有可供群集用户使用的实际存储的细节。它们存在于 Kubernetes API 中,可用于消费



  • 动态



    • 当管理员创建的静态 PV 都不匹配用户的PersistentVolumeClaim时,集群可能会尝试动态地为 PVC 创建卷。此配置基于StorageClasses:PVC 必须请求 [存储类],并且管理员必须创建并配置该类才能进行动态创建。声明该类为""可以有效地禁用其动态配置

    • 要启用基于存储级别的动态存储配置,集群管理员需要启用 API server 上的DefaultStorageClass[准入控制器]。例如,通过确保DefaultStorageClass位于 API server 组件的--admission-control标志,使用逗号分隔的有序值列表中,可以完成此操作



  • 绑定



    • master 中的控制环路监视新的 PVC,寻找匹配的 PV(如果可能),并将它们绑定在一起。如果为新的 PVC 动态调配 PV,则该环路将始终将该 PV 绑定到 PVC。否则,用户总会得到他们所请求的存储,但是容量可能超出要求的数量。一旦 PV 和 PVC 绑定后,PersistentVolumeClaim绑定是排他性的,不管它们是如何绑定的。 PVC 跟PV 绑定是一对一的映射



持久化卷声明的保护

PVC 保护的目的是确保由 pod 正在使用的 PVC 不会从系统中移除,因为如果被移除的话可能会导致数据丢失当启用PVC 保护 alpha 功能时,如果用户删除了一个 pod 正在使用的 PVC,则该 PVC 不会被立即删除。PVC 的删除将被推迟,直到 PVC 不再被任何 pod 使用

PersistentVolume类型以插件形式实现。Kubernetes 目前支持以下插件类型:



  • GCEPersistentDisk、AWSElasticBlockStore、AzureFile、AzureDisk、FC (Fibre Channel)

  • FlexVolume、Flocker、NFS、iSCSI、RBD (Ceph Block Device)、CephFS

  • Cinder (OpenStack block storage)、Glusterfs、VsphereVolume、Quobyte Volumes

  • HostPath、 VMware Photon、Portworx Volumes、ScaleIO Volumes、StorageOS

PV 访问模式

PersistentVolume可以以资源提供者支持的任何方式挂载到主机上。如下表所示,供应商具有不同的功能,每个PV 的访问模式都将被设置为该卷支持的特定模式。例如,NFS 可以支持多个读/写客户端,但特定的 NFS PV 可能以只读方式导出到服务器上。每个 PV 都有一套自己的用来描述特定功能的访问模式:



  • ReadWriteOnce——该卷可以被单个节点以读/写模式挂载

  • ReadOnlyMany——该卷可以被多个节点以只读模式挂载

  • ReadWriteMany——该卷可以被多个节点以读/写模式挂载

在命令行中,访问模式缩写为:



  • RWO - ReadWriteOnce



  • ROX - ReadOnlyMany



  • RWX - ReadWriteMany







































































































































Volume 插件ReadWriteOnceReadOnlyManyReadWriteMany
AWSElasticBlockStoreAWSElasticBlockStore?--
AzureFile???
AzureDisk?--
CephFS???
Cinder?--
FC??-
FlexVolume??-
Flocker?--
GCEPersistentDisk??-
Glusterfs???
HostPath?--
iSCSI??-
PhotonPersistentDisk?--
Quobyte???
NFS???
RBD??-
VsphereVolume?-- (pod 并列时有效)
PortworxVolume?-?
ScaleIO??-
StorageOS?--

回收策略



  • Retain(保留)——手动回收

  • Recycle(回收)——基本擦除(rm -rf /thevolume/*)

  • Delete(删除)——关联的存储资产(例如 AWS EBS、GCE PD、Azure Disk 和 OpenStack Cinder 卷)将被删除

当前,只有 NFS 和 HostPath 支持回收策略。AWS EBS、GCE PD、Azure Disk 和 Cinder 卷支持删除策略

状态

卷可以处于以下的某种状态:



  • Available(可用):一块空闲资源还没有被任何声明绑定

  • Bound(已绑定):卷已经被声明绑定

  • Released(已释放):声明被删除,但是资源还未被集群重新声明

  • Failed(失败):该卷的自动回收失败

命令行会显示绑定到 PV 的 PVC 的名称


例子


安装nfs

1)NFS 服务主要进程:



  • rpc.nfsd:最主要的 NFS 进程,管理客户端是否可登录

  • rpc.mountd:挂载和卸载 NFS 文件系统,包括权限管理

  • rpc.lockd:非必要,管理文件锁,避免同时写出错

  • rpc.statd:非必要,检查文件一致性,可修复文件

2)关键工具



  • 主要配置文件:/etc/exports

  • NFS 文件系统维护命令:/usr/bin/exportfs

  • 共享资源的日志文件:/var/lib/nfs/*tab

  • 客户端查询共享资源命令:/usr/sbin/showmount

  • 端口配置:/etc/sysconfig/nfs

3)NFS 服务端配置

在 NFS 服务器端的主要配置文件为 /etc/exports 时,通过此配置文件可以设置共享文件目录。每条配置记录由 NFS 共享目录、NFS 客户端地址和参数这 3 部分组成,格式如下:

[NFS 共享目录] [NFS 客户端地址 1 (参数 1, 参数 2, 参数 3……)] [客户端地址 2 (参数 1, 参数 2, 参数 3……)]


  • NFS 共享目录:服务器上共享出去的文件目录

  • NFS 客户端地址:允许其访问的 NFS 服务器的客户端地址,可以是客户端 IP 地址,也可以是一个网段 (192.168.141.0/24)

  • 访问参数:括号中逗号分隔项,主要是一些权限选项

3.1)访问权限参数:



  • ro:客户端对于共享文件目录为只读权限。默认

  • rw:客户端对于共享文件目录具有读写权限

3.2)用户映射参数



  • root_squash:使客户端使用 root 账户访冋时,服务器映射为服务器本地的匿名账号

  • no_root_squash:客户端连接服务端时如果使用的是 root,那么也拥有对服务端分享的目录的 root 权限

  • all_squash:将所有客户端用户请求映射到匿名用户或用户组(nfsnobody)

  • no_all_squash:与上相反。默认

  • anOnuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx)

  • anOngid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GUI=xxx)

3.3)其它配置参数



  • sync:同步写操作,数据写入存储设备后返回成功信息。默认

  • async:异步写提作,数据在未完全写入存储设备前就返回成功信息,实际还在内存

  • wdelay:延迟写入选项,将多个写提请求合并后写入硬盘,减少 I/O 次数, NFS 非正常关闭数据可能丢失。默认

  • no_wdelay:与上相反,不与 async 同时生效,如果 NFS 服务器主要收到小且不相关的请求,该选项实际会降低性能

  • subtree:若输出目录是一个子目录,则 NFS 服务器将检查其父目录的权限。默认

  • no_subtree:即使输出目录是一个子目录, NFS 服务器也不检查其父目录的权限,这样可以提高效率

  • secure:限制客户端只能从小于 1024 的 TCP/IP 端口连接 NFS 服务器。默认

  • insecure:允许客户端从大于 1024 的 TCP/IP 端口连接服务器

4)安装:

#创建一个目录作为共享文件目录
mkdir -p /usr/local/kubernetes/volumes
#给目录增加读写权限
chmod a+rw /usr/local/kubernetes/volumes
#**************** 安装 NFS 服务端 *******************
rpm -qa nfs-utils rpcbind
yum install -y nfs-utils rpcbind
systemctl start rpcbind #启动rpc服务
systemctl status rpcbind #查看rpc服务状态
systemctl start nfs #启动nfs服务
systemctl status nfs #查看nfs服务状态
# 注意:必须要先启动rpc服务,然后再启动NFS服务,如果先启动NFS服务,启动服务时会失败
# 检查开机是否自启动
# 1). chkconfig 配置开机自启动
chkconfig nfs on
chkconfig rpcbind on
chkconfig --list nfs
#nfs 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
chkconfig --list rpcbind
#rpcbind 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
# 2). /etc/rc.local 配置开机自启动
vim /etc/rc.local # 添加下面两行
systemctl start rpcbind
systemctl start nfs
#**************** 安装 NFS 客户端 *******************
# 安装客户端,实际上和服务端一样的
rpm -qa nfs-utils rpcbind
yum install -y nfs-utils rpcbind
systemctl start rpcbind #启动rpc服务
systemctl status rpcbind #查看rpc服务状态
systemctl start nfs #启动nfs服务
systemctl status nfs #查看nfs服务状态
#**************** 分享目录 *******************
mkdir -p /usr/local/kubernetes/volumes
vi /etc/exports
/usr/local/kubernetes/volumes *(rw,sync,no_subtree_check)
# 说明:
# /usr/local/kubernetes/volumes:作为服务目录向客户端开放
# *:表示任何 IP 都可以访问
# rw:读写权限
# sync:同步权限
# no_subtree_check:表示如果输出目录是一个子目录,NFS 服务器不检查其父目录的权限 /usr/local/kubernetes/volumes *(rw,sync,no_subtree_check)
# 重启服务,使配置生效:
systemctl restart nfs
#**************** 客户端挂载分享目录 *******************
# 创建挂载目录
mkdir -p /usr/local/kubernetes/volumes-mount
# 将服务端的目录挂载到本地
mount 192.168.0.130:/usr/local/kubernetes/volumes /usr/local/kubernetes/volumes-mount
#使用 df 查看挂载
# 取消挂载
umount /usr/local/kubernetes/volumes-mount

测试

创建PV

vim pv.yml

apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv-test
spec:
# 设置容量
capacity:
storage: 1Gi
# 访问模式
accessModes:
# 该卷能够以读写模式被多个节点同时加载
- ReadWriteMany
# 回收策略,这里是基础擦除 `rm-rf/thevolume/*`
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
# NFS 服务端配置的路径
path: "/usr/local/kubernetes/volumes"
# NFS 服务端地址
server: 192.168.0.130
readOnly: false

# 部署
kubectl create -f pv.yml
# 查看
[root@k8s-master pv]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
nfs-pv-test 1Gi RWX Recycle Available nfs 2s
# 删除
kubectl delete pv --all
# 释放资源,删除对应的claimRef保存退出即可
kubectl edit pv nfs-pv-test

创建服务和PVC

1)使用spec.template.volumeClaimTemplates定义pvc

vim pvc.yml

apiVersion: v1
kind: Service
metadata:
name: svc-pvc-nginx
labels:
app: svc-pvc-nginx
spec:
selector:
app: nginx
ports:
- name: web
port: 8090
targetPort: 80
clusterIP: None # headless
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx
serviceName: svc-pvc-nginx
replicas: 1 # 为什么给1因为上面创建了一个pv,但是pvc和是一一对应的关系,如果多了就会出问题
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: habor-repo.com/library/nginx:v1
ports:
- name: web
containerPort: 80
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
#必须和要使用的pv的accessModes一致,根据accessModes和storageClassName去请求
accessModes: ["ReadWriteMany"]
storageClassName: nfs
resources:
requests: # 请求使用资源
#Ki、Mi、Gi、Ti、Pi、Ei(International System of units)
#http://physics.nist.gov/cuu/Units/binary.html
storage: 500Mi

kubectl apply -f pvc.yml
kubectl get statefulset
kubectl get pvc
kubectl get pod
# 测试
# 进入 nfs 服务端的分享目录
cd /usr/local/kubernetes/volumes
date >index.html
# 请求测试
kubectl get pod -o wide
[root@k8s-master pv]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-0 1/1 Running 0 33s 10.244.2.155 k8s-node2
[root@k8s-master pv]# curl 10.244.2.155
2020年 03月 08日 星期日 19:31:19 CST
# 删除
kubectl delete statefulset --all
kubectl delete pvc --all
kubectl delete pod --all

2)使用PersistentVolume定义pvc

vim pvc2.yml

apiVersion: v1
kind: Service
metadata:
name: svc-pvc-nginx
labels:
app: svc-pvc-nginx
spec:
selector:
app: nginx
ports:
- name: web
port: 8090
targetPort: 80
clusterIP: None # headless
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx
serviceName: svc-pvc-nginx
replicas: 1 # 为什么给1因为上面创建了一个pv,但是pvc和是一一对应的关系,如果多了就会出问题
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: habor-repo.com/library/nginx:v1
ports:
- name: web
containerPort: 80
volumeMounts:
- name: mypd
mountPath: /usr/share/nginx/html
volumes:
- name: mypd
persistentVolumeClaim:
claimName: www
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: www
spec:
#必须和要使用的pv的accessModes一致,根据accessModes和storageClassName去请求
accessModes: ["ReadWriteMany"]
storageClassName: nfs
resources:
requests:
storage: 100Mi

kubectl apply -f pvc2.yml
kubectl get statefulset
kubectl get pvc
kubectl get pod
# 测试
# 进入 nfs 服务端的分享目录
cd /usr/local/kubernetes/volumes
date >>index.html
# 请求测试
kubectl get pod -o wide
[root@k8s-master pv]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-0 1/1 Running 0 33s 10.244.2.155 k8s-node2
[root@k8s-master pv]# curl 10.244.2.155
2020年 03月 08日 星期日 19:31:19 CST
2020年 03月 08日 星期日 20:00:38 CST
# 删除
kubectl delete statefulset --all
kubectl delete pvc --all
kubectl delete pod --all

推荐阅读
  • 前言: 网上搭建k8s的文章很多,但很多都无法按其说明在阿里云ecs服务器成功搭建,所以我就花了些时间基于自己成功搭建k8s的步骤写了个操作手册,希望对想搭建k8s环境的盆友有所帮 ... [详细]
  • PHP预处理常量详解:如何定义与使用常量 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 在 Kubernetes 中,Pod 的调度通常由集群的自动调度策略决定,这些策略主要关注资源充足性和负载均衡。然而,在某些场景下,用户可能需要更精细地控制 Pod 的调度行为,例如将特定的服务(如 GitLab)部署到特定节点上,以提高性能或满足特定需求。本文深入解析了 Kubernetes 的亲和性调度机制,并探讨了多种优化策略,帮助用户实现更高效、更灵活的资源管理。 ... [详细]
  • 在Kubernetes上部署多个Mitmproxy代理服务器以实现高效流量管理 ... [详细]
  • Envoy 流量分配策略优化
    在本研究中,我们对Envoy的流量分配策略进行了优化,旨在提高系统的稳定性和性能。实验环境包括一个前端代理服务(Envoy,IP地址为172.31.57.10)和五个后端服务。通过调整Envoy的配置,实现了更高效的流量分发和负载均衡,显著提升了整体系统的响应速度和可靠性。 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • Maven Web项目创建时JSP文件常见错误及解决方案
    Maven Web项目创建时JSP文件常见错误及解决方案 ... [详细]
  • Vuforia 开发指南:第二章 环境配置与搭建
    本章节详细介绍了如何在Vuforia官网上完成账号注册及环境配置。首先,访问Vuforia官方网站并点击“Register”按钮,按照提示填写必要的个人信息。提交表单后,系统将验证信息并创建账户。接下来,用户需要下载并安装Vuforia开发工具,确保开发环境的顺利搭建。此外,还提供了详细的配置步骤和常见问题的解决方案,帮助开发者快速上手。 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • 本文整理了Java中org.codehaus.enunciate.config.EnunciateConfiguration.getDefaultRestSubcontext() ... [详细]
  • SecureCRT是一款功能强大的终端仿真软件,支持SSH1和SSH2协议,适用于在Windows环境下高效连接和管理Linux服务器。该工具不仅提供了稳定的连接性能,还具备丰富的配置选项,能够满足不同用户的需求。通过SecureCRT,用户可以轻松实现对远程Linux系统的安全访问和操作。 ... [详细]
author-avatar
手机用户2702933712
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有