我已经尝试了一段时间,以便在kubernetes集群上启动有状态服务。 该集群有一个主机和一个工人。它运行在运行Ubuntu 18.04的AWS EC2实例之上。
我已经尝试了所有可以想到的方法,但是当我创建有状态服务时,不会将pod调度到节点上。 我认为这与PV有关,但我不知道是什么。 另外,我很难获得任何诊断信息。尝试在pod和容器上运行kubectl日志不会返回任何内容。
我首先尝试使用本地硬件,即本地安装,但这并不能解决问题。
现在,我已经创建了一个AWS EBS卷,并创建了一个引用此内容的PV。
PV正确地绑定到了它,但是我仍然无法使用kubernetes在工作程序节点上调度Pod。
这是我正在使用的.yaml配置文件。
第一个创建名为“ fast”的存储类
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: fast
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Retain
mountOptions:
- debug
volumeBindingMode: Immediate
这是创建PV的yaml文件。
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: fast
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Retain
mountOptions:
- debug
volumeBindingMode: Immediate
最后,这是statefulset yaml文件
apiVersion: apps/v1
kind: StatefulSet
metadata:
namespace: lab4a
name: apache-http
spec:
selector:
matchLabels:
app: httpd
serviceName: "httpd-service"
replicas: 3
template:
metadata:
namespace: lab4a
labels:
app: httpd
spec:
terminationGracePeriodSeconds: 10
containers:
- name: httpd
image: httpd:latest
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/local/apache2/htdocs
volumeClaimTemplates:
- metadata:
name: web-pvc
namespace: lab4a
spec:
accessModes: [ "ReadWriteMany" ]
storageClassName: "fast"
resources:
requests:
storage: 10Gi
kubectl得到pv给了我
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
ebs-pv 10Gi RWX Retain Available 31m
因此,至少就我所知,有理由认为PV已准备就绪。 据我了解,我不需要手动提供PV声明,因为statefulset yaml文件中的volumeClaimTemplates部分将动态执行此操作。
kubectl全部获得-n lab4a给了我
NAME READY STATUS RESTARTS AGE
pod/web-0 0/1 Pending 0 16m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx ClusterIP None <none> 80/TCP 16m
NAME READY AGE
statefulset.apps/web 0/2 16m
当我运行kubectl describe pod web-0 -n lab4a时,我得到以下信息:
Name: web-0
Namespace: lab4a
Priority: 0
PriorityClassName: <none>
Node: <none>
Labels: app=nginx
controller-revision-hash=web-b46f789c4
statefulset.kubernetes.io/pod-name=web-0
Annotations: <none>
Status: Pending
IP:
Controlled By: StatefulSet/web
Containers:
nginx:
Image: k8s.gcr.io/nginx-slim:0.8
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts:
/usr/share/nginx/html from www (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-mjclk (ro)
Conditions:
Type Status
PodScheduled False
Volumes:
www:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: www-web-0
ReadOnly: false
default-token-mjclk:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-mjclk
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 35s (x14 over 16m) default-scheduler 0/2 nodes are available: 2 node(s) had taints that the pod didn't tolerate.
我不知道发生了什么问题,并且我不知道还有什么可以尝试调试此问题的。 kubernetes是否无法将持久卷绑定到节点?还是其他问题?
任何帮助表示赞赏。 谢谢
答案 0 :(得分:0)
AWS EBS不提供ReadWriteMany
(请参阅文档https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes中的表)。
您可以
ReadWriteOnce
(建议)。ReadWriteMany
的PV。您的Pod的容忍度看起来还不错;您能否提供有关节点污点的见解?您是否曾经在此集群上摆弄kubectl taint ...
?这是托管集群,还是您在AWS机器上自行设置了集群?