假设我有一个StatefulSet
定义
apiVersion: v1
kind: StatefulSet
metadata:
name: web
spec:
...
volumeClaimTemplates:
— metadata:
name: www
spec:
resources:
requests:
storage: 1Gi
这将为我创建一个PersistentVolumeClaim
(PVC),每个吊舱的PersistentVolume
(PV)为1 GiB。
我怎么写这样的东西
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: www
spec:
...
resources:
requests:
storage: 1Gi
...
是否将其与StatefulSet
连接起来,使其仍然为每个吊舱创建PVC和PV?
答案 0 :(得分:1)
我猜在您的问题中,您使用的是this website中的statfulset示例,因此我将遵循其命名约定。
我要为您提供的解决方案已经过我自己的测试,似乎可行。
在k8s api reference中,您可以找到以下定义:
volumeClaimTemplates是允许窗格引用的声明列表。 StatefulSet控制器负责以维持容器身份的方式将网络身份映射到声明。此列表中的每个声明必须在模板的一个容器中至少具有一个匹配的(按名称)volumeMount。此列表中的声明优先于模板中具有相同名称的任何卷。
因此,这意味着只要您具有特定名称的volumeclaim,staefulset便会使用它而无需创建新名称。这意味着您可以手动创建一些pv / pvc,statefulset将使用它们。
您需要做的就是正确命名您的pvc。这个名字应该看起来如何? 这是第一部分:
volumeClaimTemplates:
- metadata:
name: www <-here is the first part
第二部分是广告连播名称。
(请查看can-i-rely-on-volumeclaimtemplates-naming-convention上的Stack问题。)
这两个部分结合在一起创建了pvc的名称(用破折号分隔),例如
www-web-0 <- this is how you are supposed to name one of your pvcs
│ └ second part (pod name)
└ first part
如果您已经拥有(自动配置的)PVC,请使用
kubectl get pvc <pvcname> -oyaml > pvcname.yaml
kubectl get pv <pvname> -oyaml > pvname.yaml
将其规范保存到磁盘。然后您可以运行:
kubectl apply -f pvcname.yaml
kubectl apply -f pvname.yaml
应用pvc / pv配置。请记住,某些yaml文件在运行kubectl apply
之前可能需要进行一些修改。