kubernetes - Kubernetes:无法获取 GCE GCECloudProvider 并出现错误
问题描述
我已经使用 kubeadm 在 GCE 上建立了一个自定义 kubernetes 集群。我正在尝试将 StatefulSets 与持久存储一起使用。
我有以下配置:
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: gce-slow
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-standard
zones: europe-west3-b
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: myname
labels:
app: myapp
spec:
serviceName: myservice
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: mycontainer
image: ubuntu:16.04
env:
volumeMounts:
- name: myapp-data
mountPath: /srv/data
imagePullSecrets:
- name: sitesearch-secret
volumeClaimTemplates:
- metadata:
name: myapp-data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: gce-slow
resources:
requests:
storage: 1Gi
我收到以下错误:
Nopx@vm0:~$ kubectl describe pvc
Name: myapp-data-myname-0
Namespace: default
StorageClass: gce-slow
Status: Pending
Volume:
Labels: app=myapp
Annotations: volume.beta.kubernetes.io/storage-provisioner=kubernetes.io/gce-pd
Finalizers: [kubernetes.io/pvc-protection]
Capacity:
Access Modes:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning ProvisioningFailed 5s persistentvolume-controller Failed to provision volume
with StorageClass "gce-slow": Failed to get GCE GCECloudProvider with error <nil>
我在黑暗中行走,不知道缺少什么。它不起作用似乎是合乎逻辑的,因为供应商从不向 GCE 进行身份验证。非常感谢任何提示和指示。
编辑
我在这里尝试了解决方案,通过在 kubeadm 中编辑配置文件kubeadm config upload from-file
,但错误仍然存在。kubadm 配置现在看起来像这样:
api:
advertiseAddress: 10.156.0.2
bindPort: 6443
controlPlaneEndpoint: ""
auditPolicy:
logDir: /var/log/kubernetes/audit
logMaxAge: 2
path: ""
authorizationModes:
- Node
- RBAC
certificatesDir: /etc/kubernetes/pki
cloudProvider: gce
criSocket: /var/run/dockershim.sock
etcd:
caFile: ""
certFile: ""
dataDir: /var/lib/etcd
endpoints: null
image: ""
keyFile: ""
imageRepository: k8s.gcr.io
kubeProxy:
config:
bindAddress: 0.0.0.0
clientConnection:
acceptContentTypes: ""
burst: 10
contentType: application/vnd.kubernetes.protobuf
kubeconfig: /var/lib/kube-proxy/kubeconfig.conf
qps: 5
clusterCIDR: 192.168.0.0/16
configSyncPeriod: 15m0s
conntrack:
max: null
maxPerCore: 32768
min: 131072
tcpCloseWaitTimeout: 1h0m0s
tcpEstablishedTimeout: 24h0m0s
enableProfiling: false
healthzBindAddress: 0.0.0.0:10256
hostnameOverride: ""
iptables:
masqueradeAll: false
masqueradeBit: 14
minSyncPeriod: 0s
syncPeriod: 30s
ipvs:
minSyncPeriod: 0s
scheduler: ""
syncPeriod: 30s
metricsBindAddress: 127.0.0.1:10249
mode: ""
nodePortAddresses: null
oomScoreAdj: -999
portRange: ""
resourceContainer: /kube-proxy
udpIdleTimeout: 250ms
kubeletConfiguration: {}
kubernetesVersion: v1.10.2
networking:
dnsDomain: cluster.local
podSubnet: 192.168.0.0/16
serviceSubnet: 10.96.0.0/12
nodeName: mynode
privilegedPods: false
token: ""
tokenGroups:
- system:bootstrappers:kubeadm:default-node-token
tokenTTL: 24h0m0s
tokenUsages:
- signing
- authentication
unifiedControlPlaneImage: ""
编辑
感谢 Anton Kostenko,这个问题在评论中得到了解决。最后的编辑加上kubeadm upgrade
解决了这个问题。
解决方案
答案花了我一段时间,但这里是:
在 Google Kubernetes Engine 之外的 Kubernetes 中使用 GCECloudProvider 具有以下先决条件(最后一点是 Kubeadm 特定的):
VM 需要使用有权配置磁盘的服务帐户运行。可以在此处找到有关如何使用服务帐户运行 VM 的信息
Kubelet 需要使用参数运行
--cloud-provider=gce
。为此KUBELET_KUBECONFIG_ARGS
,必须对 in/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
进行编辑。然后可以使用以下命令重新启动 Kubeletsudo systemctl restart kubelet
Kubernetes cloud-config 文件需要配置。该文件可以在以下位置找到,
/etc/kubernetes/cloud-config
以下内容足以让云提供商工作:[Global] project-id = "<google-project-id>"
Kubeadm 需要将 GCE 配置为其云提供商。问题中发布的配置适用于此。但是,
nodeName
必须改变。
推荐阅读
- ios - 我收到此错误 -> 收到 500 错误。在 Swift GraphQL 中
- python - Pytube 模块标题未给出
- ios - 将多个图像保存到用户设备时如何处理错误?
- python - 始终转到与目标歌曲的 BPM 兼容的最接近的数字
- postgresql - 不直接使用其名称访问 PostgreSQL 表
- mysql - Google 数据洞察中的 GROUP BY 查询
- java - 这是选择排序还是冒泡排序?
- reactjs - TypeError:nextCallback 不是函数
- wordpress - 如何使用进度条(wordpress)显示 woocommerce 点
- c - 计算元素频率的C程序