[用调查结果的详细信息重写了问题。]
我正在运行一个包含大约 100 个容器的 Google Container Engine 集群,每天执行大约 100,000 个 API 调用。一些 pod 开始在 DNS 解析中失败 50%。我深入研究了这一点,它只发生在正在运行的节点上的 pod 上kube-dns。我还注意到,这只发生在系统中的节点因内存不足而关闭之前。
后台 resque 作业附加到 Google API,然后将数据上传到 S3。当我看到失败的作业时,它们会因“名称解析暂时失败”而失败。这发生在“accounts.google.com”和“s3.amazonaws.com”上。
当我登录到服务器,并尝试以连接到这些(或其他主机)host,nslookup或dig它似乎工作就好了。当我连接到 rails 控制台并运行在队列中失败的相同代码时,我不会发生故障。然而,正如我所说,这些后台故障似乎是间歇性的(大约 50% 的时间运行在节点上运行的工作程序kube-dns)。
到目前为止,我的临时修复是删除失败的 pod,并让 kubernetes 重新安排它们,并继续这样做,直到 kubernetes 将它们安排到一个没有运行的节点kube-dns。
顺便说一下,删除故障节点并没有解决这个问题。它只是导致 kubernetes 将所有内容移动到其他节点并移动了问题。
我正在做以下事情:
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) 当我在 GKE 中创建新节点池时,磁盘大小默认为 100GB。然而,当我通过 SSH 连接到已运行一段时间的节点时,运行后df -h仅使用了 32GB。(我其实不知道这32GB是从哪里来的)
节点真的需要 100GB 磁盘空间吗?例如,我可以仅使用 10GB 来运行它们吗?首先,我认为 Pod 会耗尽卷的空间,但在 GKE 上,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,但它们对我来说没有任何有意义的内容。
有什么想法去哪里看吗?
我有一个包含少量节点的 GKE 集群,我希望该集群中的 Pod 能够连接到专用网络上的远程主机,该网络可以通过 GCE 提供的站点到站点 VPN 进行访问。据我所知,没有简单的方法可以为出站连接的 Pod 分配地址吗?(每次添加或更换节点时将每个 pod-cidr 添加到 VPN 配置似乎不太可行。)我是否必须在集群外部设置 NAT 桥,或者是否有某种 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
我刚刚开始使用 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
我有一个带有私有 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)
我究竟做错了什么?
我在将 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 集群。
我无法使用数据库的私有 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
kubernetes ×6
bastion ×1
docker ×1
hipaa ×1
networking ×1
proxy ×1
redis ×1
vpc-peering ×1
vpn ×1