标签: google-kubernetes-engine

将 docker 映像从 GCR 拉入 GKE 时出错“无法拉取映像 .... 403 Forbidden”

背景:

我有一个 GKE 集群突然无法从 GCR 提取我的 docker 镜像;两者都在同一个 GCP 项目中。它已经运行良好几个月了,提取图像没有任何问题,现在在没有进行任何更改的情况下开始抛出错误。

(注意:我通常是团队中唯一访问 Google Cloud 的人,尽管我团队中的其他人完全有可能在没有意识到的情况下进行了更改/无意中进行了更改)。

我看过有关此主题的其他一些帖子,但其他人提供的解决方案没有帮助。其中两篇帖子对我来说特别突出,因为它们都是在我的问题开始大约 13/14 天前的同一天发布的。这究竟是巧合还是巧合,谁知道呢。

这篇文章和我有同样的问题;不确定发布的评论是否帮助他们解决了问题,但对我来说还没有解决。这个帖子好像也是同样的问题,但是发帖人说等了一段时间后自己解决了。

问题:

几天前我第一次注意到集群上的问题。通过将映像推送到 GCR 然后弹跳 Pod 来部署新映像kubectl rollout restart deployment

然后所有 Pod 都返回ImagePullBackOff,表示无法从 GCR 获取图像:

kubectl get pods

XXX-XXX-XXX     0/1     ImagePullBackOff   0          13d
XXX-XXX-XXX     0/1     ImagePullBackOff   0          13d
XXX-XXX-XXX     0/1     ImagePullBackOff   0          13d
...
Run Code Online (Sandbox Code Playgroud)

kubectl describe pod XXX-XXX-XXX

Normal   BackOff           20s                kubelet                                Back-off pulling image "gcr.io/<GCP_PROJECT>/XXX:dev-latest"
Warning  Failed            20s                kubelet                                Error: ImagePullBackOff
Normal   Pulling …
Run Code Online (Sandbox Code Playgroud)

docker google-cloud-platform kubernetes google-kubernetes-engine google-container-registry

12
推荐指数
2
解决办法
2万
查看次数

轻松检测 Kubernetes 上已弃用的资源

我们刚刚收到一封来自 GCP 的电子邮件,通知我们我们的集群目前正在使用已弃用的 Beta API,我们需要升级到最新的 API 版本。

我们有 3 个集群在多个命名空间中运行多个资源,因此必须遍历所有集群来检测哪些资源已过时会有点痛苦。

我们控制的服务、部署、horizo​​ntalpodautoscalers、poddisruptionbudgets 等,这些都已经更新了。

但我们有很多服务的清单文件是自动生成的,比如 Halyard 生成的 Spinnaker 服务,或者 Elastic Operator 生成的 ElasticSearch 等。

有什么方法可以按 API 版本过滤所有资源,或者有什么方法可以检测所有命名空间中已弃用的资源?

kubernetes google-kubernetes-engine kube-apiserver

12
推荐指数
1
解决办法
2万
查看次数

添加了 SSL 证书,但显示“Kubernetes 入口控制器假证书”

我是 GCP/Cloud 的新手,我在 GKE 中创建了一个集群并在那里部署了我们的应用程序,在集群中安装了 nginx 作为 pod,我们公司拥有一个授权的 SSL 证书,我已将其上传到 GCP 的证书中。

在 DNS 服务中,我创建了一条与 Ingress IP 匹配的 A 记录。当我在浏览器中调用该 URL 时,它仍然显示该网站仍然不安全,并显示消息“Kubernetes Ingress 控制器假证书”。

我使用了以下指南https://cloud.google.com/load-balancing/docs/ssl-certificates/self-management-certs#console_1

但是,我无法执行步骤 3“将 SSL 证书与目标代理关联”,因为它要求“URL 映射”,而我无法在 GCP Console 中找到它。

有没有人和我一样经历过同样的问题,或者如果有人帮助我,那就太好了。

ssl google-cloud-platform kubernetes google-kubernetes-engine

12
推荐指数
2
解决办法
4万
查看次数

Google容器引擎上的DaemonSets(Kubernetes)

我有一个包含21个节点的Google容器引擎群集,特别是有一个pod我需要始终在具有静态IP地址的节点上运行(出于出站目的).

Kubernetes支持DaemonSets

通过为节点提供与DaemonSet中的nodeSelector匹配的标签,可以将pod部署到特定节点(或一组节点).然后,您可以为标记节点所在的VM实例分配静态IP.但是,GKE似乎不支持DaemonSet类型.

$ kubectl create -f go-daemonset.json 
error validating "go-daemonset.json": error validating data: the server could not find the requested resource; if you choose to ignore these errors, turn validation off with --validate=false

$ kubectl create -f go-daemonset.json --validate=false
unable to recognize "go-daemonset.json": no kind named "DaemonSet" is registered in versions ["" "v1"]
Run Code Online (Sandbox Code Playgroud)

何时支持此功能以及解决方法是什么?

kubernetes google-kubernetes-engine

11
推荐指数
1
解决办法
805
查看次数

如何停止kubernetes集群?

我借助kube-up.sh在Google计算引擎上启动了数据仓库。该脚本创建了主节点和奴才组。在我不再需要它之后,我想停止集群并关闭所有VM,以免浪费金钱来执行实例。当我关闭它时(我只是关闭了所有群集虚拟机,因为我不知道另一种方法),然后在一段时间后再次启动,群集将无法正常工作。“ kubectl获取节点”会显示关于节点的不正确信息(例如,我有ABC节点==奴才,它仅显示甚至不存在的D),所有命令的运行速度都非常慢。也许我关机不正确。如何适当地停止群集并停止VM,以便在某个时间再次启动它?(不删除)

我有什么集群:

kubernetes-master             | us-central1-b
kubernetes-minion-group-nq7f  | us-central1-b
kubernetes-minion-group-gh5k  | us-central1-b
Run Code Online (Sandbox Code Playgroud)

显示“ kubectl获取节点”命令的内容:

[root@common frest0512]# kubectl get nodes
NAME                           STATUS                     AGE       VERSION
kubernetes-master              Ready,SchedulingDisabled   7h        v1.8.0
kubernetes-minion-group-02s7   Ready                      7h        v1.8.0
kubernetes-minion-group-92rn   Ready                      7h        v1.8.0
kubernetes-minion-group-kn2c   Ready                      7h        v1.8.0
Run Code Online (Sandbox Code Playgroud)

关闭主节点之前,它显示正确(名称和仆从数相同)。

google-cloud-platform kubernetes google-kubernetes-engine

11
推荐指数
2
解决办法
2万
查看次数

如何处理已发布的持续卷?

TL; DR.关于如何在删除PVC后访问数据,以及为什么PV在删除PVC后不会消失,我很遗憾.

我正在采取的步骤:

  1. 手动在GCE中创建了一个磁盘:

    gcloud compute disks create --size 5Gi disk-for-rabbitmq --zone europe-west1-b
    
    Run Code Online (Sandbox Code Playgroud)
  2. 跑:

    kubectl apply -f /tmp/pv-and-pvc.yaml
    
    Run Code Online (Sandbox Code Playgroud)

    使用以下配置:

    # /tmp/pv-and-pvc.yaml
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-for-rabbitmq
    spec:
      accessModes:
      - ReadWriteOnce
      capacity:
        storage: 5Gi
      gcePersistentDisk:
        fsType: ext4
        pdName: disk-for-rabbitmq
      persistentVolumeReclaimPolicy: Delete
      storageClassName: standard
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-for-rabbitmq
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 5Gi
      storageClassName: standard
      volumeName: pv-for-rabbitmq
    
    Run Code Online (Sandbox Code Playgroud)
  3. 手动删除了一个PVC(在高级别:我在这里模拟一个灾难性的场景,比如意外删除或错误配置一个helm版本):

    kubectl delete pvc pvc-for-rabbitmq
    
    Run Code Online (Sandbox Code Playgroud)

此时我看到以下内容:

$ kubectl get pv
NAME              CAPACITY   ACCESS MODES …
Run Code Online (Sandbox Code Playgroud)

google-cloud-storage google-cloud-platform kubernetes google-kubernetes-engine

11
推荐指数
4
解决办法
7939
查看次数

Google Cloud Build部署到GKE私有集群

我正在运行带有“ private-cluster”选项的Google Kubernetes Engine。我还定义了“授权主网络”以能够远程访问环境-这很好。现在,我想使用Google Cloud Build设置某种CI / CD管道-成功构建新的docker映像后,该新映像应自动部署到GKE。当我第一次触发新管道时,部署到GKE失败-错误消息是:“无法连接到服务器:拨打tcp xxx.xxx.xxx.xxx:443:I/O超时”。由于我怀疑“连接的主网络”选项是造成连接超时的根本原因,因此我添加了0.0.0。0/0到允许的网络并再次启动Cloud Build作业-这次一切进行得很好,并且在创建Docker映像后将其部署到GKE。好。

剩下的唯一问题是,我真的不想让整个Internet都能够访问我的Kubernetes主服务器-这是一个坏主意,不是吗?

是否有更优雅的解决方案来通过使用允许的主网络来缩小访问范围,并能够通过云构建进行部署?

kubernetes google-kubernetes-engine google-cloud-build

11
推荐指数
2
解决办法
1525
查看次数

GKE 主节点

在 GKE 中,当我们创建节点时,会有一个 master 节点,并且会创建许多 worker 节点。我怀疑主节点是我们创建的一个(提到副本)还是GKE单独创建主节点。形成 gke 集群的拓扑(例如,网格,星形)是什么?

google-kubernetes-engine

11
推荐指数
1
解决办法
2718
查看次数

Kubernetes 是否允许并使用多个 imagePullSecrets 从私有注册表中拉取镜像?

我有一个私人注册表 (gitlab),我的 docker 图像存储在其中。对于部署,会创建一个密钥,允许 GKE 访问注册表。秘密被称为deploy-secret。密钥的登录信息在注册表中很短的时间后就会过期。

我还创建了第二个永久机密,允许访问 docker 注册表,名为permanent-secret.

是否可以用两个秘密指定 Pod?例如:

apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: <your-private-image>
  imagePullSecrets:
  - name: deploy-secret
  - name: permanent-secret
Run Code Online (Sandbox Code Playgroud)

Kubernetes 在稍后尝试重新拉取镜像时,是否会识别出第一个秘密不起作用(不允许对私有注册表进行身份验证),然后成功回退到第二个秘密?

kubernetes google-kubernetes-engine kubernetes-secrets

11
推荐指数
1
解决办法
3756
查看次数

Kubernetes Pod无法从容器注册表(gcp)中提取图像

我想用一个存在于'eu.gcr.io'(相同项目)上的新映像来更新我在kubernetes上的部署,我之前已经做过。但是现在,吊舱无法拉动图像,因为它们无权这样做。这是我们在pod日志中得到的错误。

Failed to pull image "eu.gcr.io/my-gcp-project/my-image:v1.009": 
rpc error: code = Unknown desc = Error response from daemon: 
unauthorized: You don't have the needed permissions to perform this operation,
and you may have invalid credentials.
Run Code Online (Sandbox Code Playgroud)

群集上的服务帐户具有kubernetes adminstorage admin角色,这应该足够。但是,即使我制作了服务帐户项目编辑器(出于调试目的),它仍然不起作用(相同的错误)。

我也尝试过创建一个新的新集群(默认设置)并在那里应用我的部署,但是随后出现了完全相同的问题。

我不确定我可以尝试什么。

任何帮助或建议,我们将不胜感激。

编辑:

我只是发现我仍然可以拉出并部署旧映像。但是,我创建的每个新映像都不能被kubernetes容器所吸引。

google-cloud-platform kubernetes google-kubernetes-engine google-container-registry google-iam

11
推荐指数
1
解决办法
1103
查看次数