我们成功地根据项目要求创建了 Pod、服务和复制控制器。现在,我们计划使用 Kubernetes 在 AWS 中设置持久性存储。我已经创建了 YAML 文件以在 AWS 中创建 EBS 卷,它按预期工作正常。我能够声明卷并成功装载到我的 pod(这仅适用于单个副本(。
我能够成功创建文件。卷也正在创建,但我的 Pod 将进入挂起状态,卷在 AWS 中仍显示可用状态。我无法看到那里的任何错误日志。
存储文件:
kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
name: mongo-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
主文件:
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: web2
spec:
selector:
matchLabels:
app: mongodb
serviceName: "mongodb"
replicas: 2
template:
metadata:
labels:
app: mongodb
annotations:
pod.alpha.kubernetes.io/initialized: "true"
spec:
containers:
- image: mongo
name: mongodb
ports:
- name: web2
containerPort: 27017
hostPort: 27017
volumeMounts:
- mountPath: "/opt/couchbase/var"
name: mypd1
volumeClaimTemplates:
- metadata:
name: mypd1
annotations:
volume.alpha.kubernetes.io/storage-class: mongo-ssd
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 10Gi
库贝克特尔版本:
Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.2", GitCommit:"5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", GitTreeState:"clean", BuildDate:"2018-01-18T10:09:24Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"8", GitVersion:"v1.8.6", GitCommit:"6260bb08c46c31eea6cb538b34a9ceb3e406689c", GitTreeState:"clean", BuildDate:"2017-12-21T06:23:29Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"linux/amd64"}
我可以看到您在容器中使用了hostPort
。在这种情况下,如果您的集群中没有多个节点,则 One Pod 将保持挂起状态。因为它不适合任何节点。
containers:
- image: mongo
name: mongodb
ports:
- name: web2
containerPort: 27017
hostPort: 27017
当我描述我的待处理 Pod 时出现此错误
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 27s (x7 over 58s) default-scheduler No nodes are available that match all of the predicates: PodFitsHostPorts (1).
容器中的HostPort
将与节点绑定。假设您正在使用 HostPort 10733,但另一个 Pod 已经在使用该端口,现在您的 Pod 无法使用该端口。因此,它将处于待处理状态。如果您有副本 2,并且两个 Pod 都部署在同一节点中,则也无法启动它们。
因此,您需要使用端口作为HostPort,您可以肯定地说没有其他人在使用。