标签: google-kubernetes-engine

Google Container Engine 中的间歇性 DNS 故障

[用调查结果的详细信息重写了问题。]

我正在运行一个包含大约 100 个容器的 Google Container Engine 集群,每天执行大约 100,000 个 API 调用。一些 pod 开始在 DNS 解析中失败 50%。我深入研究了这一点,它只发生在正在运行的节点上的 pod 上kube-dns。我还注意到,这只发生在系统中的节点因内存不足而关闭之前。

后台 resque 作业附加到 Google API,然后将数据上传到 S3。当我看到失败的作业时,它们会因“名称解析暂时失败”而失败。这发生在“accounts.google.com”和“s3.amazonaws.com”上。

当我登录到服务器,并尝试以连接到这些(或其他主机)hostnslookupdig它似乎工作就好了。当我连接到 rails 控制台并运行在队列中失败的相同代码时,我不会发生故障。然而,正如我所说,这些后台故障似乎是间歇性的(大约 50% 的时间运行在节点上运行的工作程序kube-dns)。

到目前为止,我的临时修复是删除失败的 pod,并让 kubernetes 重新安排它们,并继续这样做,直到 kubernetes 将它们安排到一个没有运行的节点kube-dns

顺便说一下,删除故障节点并没有解决这个问题。它只是导致 kubernetes 将所有内容移动到其他节点并移动了问题。

google-compute-engine kubernetes google-kubernetes-engine

6
推荐指数
1
解决办法
1719
查看次数

将带有两个标签的图像推送到 gcr.io 会产生两个不同的图像

我正在做以下事情:

docker build -t gcr.io/projid/imgname:333 -t gcr.io/projid/imgname:latest 。

docker login -u _json_key -p "$(cat /secrets/service-account.json)" https://gcr.io

docker push gcr.io/projid/imgname:333

docker push gcr.io/projid/imgname:latest

第一个推送命令的输出:

Pushing to google container registry ...
The push refers to a repository [gcr.io/projid/imgname]
24af4f7c7118: Preparing
17b0972980d8: Preparing
6d6a6425aacb: Preparing
809c8c0dd73c: Preparing
e8d45b8ab3ca: Preparing
e8fa134cb7b8: Preparing
7cbcbac42c44: Preparing
e8fa134cb7b8: Waiting
7cbcbac42c44: Waiting
809c8c0dd73c: Layer already exists
e8d45b8ab3ca: Layer already exists
7cbcbac42c44: Layer already exists
e8fa134cb7b8: Layer already exists
17b0972980d8: Pushed
24af4f7c7118: Pushed
6d6a6425aacb: Pushed
333: digest: sha256:dae8cf914ba49928e6f0a34f6740802403813e6d10aa1c1d448a62ce9bb69066 size: …
Run Code Online (Sandbox Code Playgroud)

docker google-kubernetes-engine

6
推荐指数
1
解决办法
1360
查看次数

GKE 节点建议的磁盘大小?

当我在 GKE 中创建新节点池时,磁盘大小默认为 100GB。然而,当我通过 SSH 连接到已运行一段时间的节点时,运行后df -h仅使用了 32GB。(我其实不知道这32GB是从哪里来的)

节点真的需要 100GB 磁盘空间吗?例如,我可以仅使用 10GB 来运行它们吗?首先,我认为 Pod 会耗尽卷的空间,但在 GKE 上,Pod 提供自己的附加持久磁盘,并且不会添加到节点的磁盘空间,所以我很困惑为什么需要这么大的卷对于节点本身?

kubernetes google-kubernetes-engine

6
推荐指数
2
解决办法
7006
查看次数

Pod 陷入“待处理”状态,没有记录任何事件

我不知道在哪里寻找提示。

我们已经在开发集群中使用 Helm Chart安装了 gitlab-runners。大多数情况下,这是有效的,但在过去一周左右的时间里,我们经历了 Pod 陷入状态Pending而没有任何进一步日志的情况。在某个我无法更好定义的时刻,所有 Pod 都被调度到节点上,然后下一批再次陷入困境Pending

我们使用 GKE,并为 gitlab-runner pod 设置了一个可抢占节点的节点池。我们运行 kubernetes v1.15.4-gke.18

我们知道 Pod 被卡住的原因有多种Pending,但我总是期望在运行kubectl describe <GITLAB_RUNNER_POD>kubectl get events. 问题是,没有。没有事件。

我们启用了 stackdriver 日志记录,我可以Kubernetes Apiservice Requests在下面看到日志Kubernetes Cluster,但它们对我来说没有任何有意义的内容。

有什么想法去哪里看吗?

kubernetes google-cloud-platform google-kubernetes-engine

6
推荐指数
1
解决办法
9159
查看次数

GKE Pod 通过 VPN 连接?

我有一个包含少量节点的 GKE 集群,我希望该集群中的 Pod 能够连接到专用网络上的远程主机,该网络可以通过 GCE 提​​供的站点到站点 VPN 进行访问。据我所知,没有简单的方法可以为出站连接的 Pod 分配地址吗?(每次添加或更换节点时将每个 pod-cidr 添加到 VPN 配置似乎不太可行。)我是否必须在集群外部设置 NAT 桥,或者是否有某种 Kubernetes 方法来控制出站地址一个吊舱?

vpn kubernetes google-kubernetes-engine

5
推荐指数
1
解决办法
3241
查看次数

使用不同的机器类型调整 kubernetes 集群的大小?

我想在现有的 kubernetes 集群中添加一个新节点,但机器类型不同。对于新节点,我将为其添加标签,以便仅在其上运行某些应用程序。

我尝试了以下命令

gcloud compute instance-groups managed resize CONTAINER_GROUP --zone ZONE --size 5 --machine-type n1-standard-8
Run Code Online (Sandbox Code Playgroud)

它返回一个错误

错误:(gcloud.compute.instance-groups.managed.resize)无法识别的参数:--machine-type n1-standard-8

如何将新节点添加到具有不同机器类型的现有 kubernetes 集群中?

google-compute-engine kubernetes google-cloud-platform google-kubernetes-engine

5
推荐指数
2
解决办法
5788
查看次数

我可以从 GKE 集群中删除外部 IP 吗?

我刚刚开始使用 Google Kubernetes Engine (GKE),我很喜欢它。

我花了一些时间让内部负载均衡器正常工作,这样我的应用程序就有了 10.128.0.0/16 IP。

现在我想知道,我可以从集群中删除外部 IP 吗?

我发现 Google 需要集群上的外部 IP,并且无法将其删除。有人对这个有经验么?

我正在处理健康数据,并且犹豫是否将生产应用程序部署到具有外部 IP 的集群中。我认为我的项目上的防火墙提供了足够的保护,但如果我打算将个人健康数据放入其中,我只是觉得系统具有外部 IP 是错误的。如果您不知道“我可以从集群中删除外部 IP 吗?”的答案。问题,我很想得到一些评论。我在 Google 的 HIPAA 合规性文档中看到GKE 是涵盖产品。

networking hipaa google-cloud-platform google-kubernetes-engine

5
推荐指数
1
解决办法
5155
查看次数

GCP:通过代理在私有集群上运行 kubectl exec

我有一个带有私有 IP 的私有 kubernetes 集群。为了访问它,我设置了一个带有鱿鱼代理的堡垒主机。它看起来像这样:

My host -> bastion -> private cloud
Run Code Online (Sandbox Code Playgroud)

常规 kubectl 命令可以按预期抛出代理:

$ HTTPS_PROXY=socks5://127.0.0.1:1080 kubectl get pods 
No resources found.
Run Code Online (Sandbox Code Playgroud)

问题是当尝试 ssh 到 pod 时:

$ HTTPS_PROXY=socks5://127.0.0.1:1080 kubectl exec -it "some-pod" -- /bin/bash
error: error sending request: Post https://<master-ip>/api/v1/namespaces/ns/pods/some-pod/exec?command=%2Fbin%2Fbash&container=xxx&container=xxx&stdin=true&stdout=true&tty=true: EOF
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

proxy bastion google-kubernetes-engine

5
推荐指数
1
解决办法
3563
查看次数

如何将 Kubernetes 集群内的 Redis 集群配置为可供外部应用程序访问

我在将 Kubernetes 上的 Redis 集群暴露给外部应用程序时遇到问题。使用 Kubernetes 负载均衡器服务,我可以将外部 IP 分配给 Redis,以提供初始连接。问题是,每当客户端收到MOVED命令时,IP 地址都是 Kubernetes 内部 POD IP,集群外部的 Redis 客户端无法访问该 IP 地址。

redis-cli以下是演示的示例会话:

10.150.0.5:7000> set test value
-> Redirected to slot [6918] located at 10.28.1.9:6379
Could not connect to Redis at 10.28.1.9:6379: Operation timed out
Run Code Online (Sandbox Code Playgroud)

你如何解决这个问题?我读过的教程/指南都没有对将集群暴露给外部服务提供太多说明。大多数人关心的是在 K8s 中设置 Redis 集群。

redis kubernetes google-kubernetes-engine

5
推荐指数
1
解决办法
9143
查看次数

无法通过私有 IP 从 GKE 连接到 Cloud SQL Postgres

我无法使用数据库的私有 IP 从 GKE 集群访问运行 Postgres 的 Cloud SQL 实例。我找到的所有文档都建议使用支持 VPC 的集群来完成此操作,但我仍然无法访问数据库。

具体来说,我可以从集群中的节点访问数据库,但我无法从节点上的容器内访问数据库,除非我使用主机的网络运行 docker 容器。这让我相信我对 GCP VPC 和 Kubernetes 的网络组件如何相互交互存在误解。

专有网络

我的 VPC 有一个子网和两个次要范围:

IP 范围:10.0.0.0/16
次要范围 - pod: 10.1.0.0/16
次要范围 - 服务: 10.2.0.0/16

这是使用以下 Terraform 配置创建的:

resource "google_compute_subnetwork" "cluster" {
  ip_cidr_range            = "10.0.0.0/16"
  name                     = "cluster"
  network                  = google_compute_network.vpc.self_link

  secondary_ip_range {
    ip_cidr_range = "10.1.0.0/16"
    range_name    = "pods"
  }

  secondary_ip_range {
    ip_cidr_range = "10.2.0.0/16"
    range_name    = "services"
  }
}
Run Code Online (Sandbox Code Playgroud)

数据库

我的云 SQL 数据库运行 Postgres 11 并配置为仅允许通过私有 IP 进行连接。我已与一组全局计算地址建立了对等连接,以允许从我的 VPC …

google-cloud-sql google-cloud-platform google-kubernetes-engine vpc-peering

5
推荐指数
1
解决办法
2993
查看次数