我是kubenetes的新手。我已经在两台机器上设置了一个Kubernetes集群。以及当我使用有状态集部署Pod时。但是kubernetes没有创建pvc。
我正在做POC,用于在kubernets集群上安装Redis集群,为此,我从站点url下面下载了有状态集。 [https://medium.com/zero-to/setup-persistence-redis-cluster-in-kubertenes-7d5b7ffdbd98]
这个有状态的集合可以在minikube上正常工作,但是当我在kubernetes集群(我已经用2台机器创建)上部署它时,出现了以下错误:
root@xen-727:/usr/local/bin# kubectl get pods
NAME READY STATUS RESTARTS AGE
redis-cluster-0 0/1 Pending 0 13m
root@xen-727:/usr/local/bin# kubectl describe pod redis-cluster-0
Name: redis-cluster-0
Namespace: default
Node: /
Labels: app=redis-cluster
controller-revision-hash=redis-cluster-b5b75cc79
statefulset.kubernetes.io/pod-name=redis-cluster-0
Annotations: <none>
Status: Pending
IP:
Controllers: <none>
Containers:
redis-cluster:
Image: tiroshanm/kubernetes-redis-cluster:latest
Ports: 6379/TCP, 16379/TCP
Command:
/usr/local/bin/redis-server
Args:
/redis-conf/redis.conf
Liveness: exec [sh -c redis-cli -h $(hostname) ping] delay=20s timeout=1s period=3s #success=1 #failure=3
Readiness: exec [sh -c redis-cli -h $(hostname) ping] delay=15s timeout=5s period=10s #success=1 #failure=3
Environment: <none>
Mounts:
/data from data (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-h22jv (ro)
Conditions:
Type Status
PodScheduled False
Volumes:
data:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: data-redis-cluster-0
ReadOnly: false
default-token-h22jv:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-h22jv
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready=:Exists:NoExecute for 300s
node.kubernetes.io/unreachable=:Exists:NoExecute for 300s
Events:
FirstSeen LastSeen Count From SubObjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
15m 14m 4 default-scheduler Warning FailedScheduling pod has unbound immediate PersistentVolumeClaims (repeated 2 times)
root@xen-727:/usr/local/bin# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESSMODES STORAGECLASS AGE
data-redis-cluster-0 Pending slow 15m
root@xen-727:/usr/local/bin# kubectl get pv
No resources found.
我创建了一个存储类:
root@xen-727:/usr/local/bin# kubectl get sc
NAME TYPE
slow (default) kubernetes.io/gce-pd
但是经过大量搜索后,看来kubernetes没有使用此存储类来创建pv。
存储类代码:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: slow
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-standard
下面是我的完整代码:
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: redis-cluster
labels:
app: redis-cluster
spec:
serviceName: redis-cluster
replicas: 6
template:
metadata:
labels:
app: redis-cluster
annotations:
spec:
containers:
- name: redis-cluster
image: tiroshanm/kubernetes-redis-cluster:latest
imagePullPolicy: Always
ports:
- containerPort: 6379
name: client
- containerPort: 16379
name: gossip
command: ["/usr/local/bin/redis-server"]
args: ["/redis-conf/redis.conf"]
readinessProbe:
exec:
command:
- sh
- -c
- "redis-cli -h $(hostname) ping"
initialDelaySeconds: 15
timeoutSeconds: 5
livenessProbe:
exec:
command:
- sh
- -c
- "redis-cli -h $(hostname) ping"
initialDelaySeconds: 20
periodSeconds: 3
volumeMounts:
- name: data
mountPath: /data
readOnly: false
volumeClaimTemplates:
- metadata:
name: data
labels:
name: redis-cluster
annotations:
volume.alpha.kubernetes.io/storage-class: anything
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 100Mi
预期输出: 它应该创建6个节点,分别具有6个pvc和6个pv。
答案 0 :(得分:0)
您需要创建要通过PersistentVolumeClaim
请求的存储。
here中提供了卷类型的示例。
PersistentVolume
(PV)是集群中由管理员配置的一块存储。它是群集中的资源,就像节点是群集资源一样。 PV是类似于Volumes的卷插件,但是其生命周期独立于使用PV的任何单个容器。该API对象捕获NFS,iSCSI或特定于云提供商的存储系统的存储实现细节。
PersistentVolumeClaim
(PVC)是用户存储的请求。它类似于吊舱。容器消耗节点资源,PVC消耗PV资源。 Pod可以请求特定级别的资源(CPU和内存)。声明可以请求特定的大小和访问模式(例如,可以一次读/写或多次只读安装)。
如果您使用的是GCE,则可以使用gcePersistentDisk
一个
gcePersistentDisk
卷将Google Compute Engine(GCE)Persistent Disk装入您的Pod。与emptyDir
不同,gcloud
在删除Pod时会被擦除,它保留了PD的内容,而只是卸载了该卷。这意味着可以在PD中预填充数据,并且可以在Pod之间“传递”数据。
您需要使用gcloud compute disks create --size=500GB --zone=us-central1-a my-data-disk
命令在GCE内创建驱动器:
POD
并在apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes:
- name: test-volume
# This GCE PD must already exist.
gcePersistentDisk:
pdName: my-data-disk
fsType: ext4
中使用它,如下例所示:
nfs
如果愿意,您可以设置自己的setAttribute()
服务器,并在Kubernetes中使用它,here提供了有关如何设置它的示例。
您还可以查看有关如何use volumes on AWS的文档。
希望这足以为您提供帮助。