我们只是尝试 Kubernetes 设置并严格遵循文档(此时)。 我们在 DigitalOcean 上,还有很多与之相关的教程和文档(下面添加了所有这些以供参考)。
此时,我成功部署了两个 Pod,现在尝试以最简单的方式为它们配置负载均衡器。一切都已部署,但负载均衡器无法初始化,并出现以下错误:
Error syncing load balancer: failed to ensure load balancer: failed to build load-balancer request: specified health check port 8080 does not exist on service default/https-with-cert
如果我直接对 Pod 执行 ping 操作,我会验证运行状况检查实际上正在对 Pod 进行操作。事实上,这与我们过去两年在手动设置基础设施中使用的健康检查相同。
构建正在通过 github actions 运行,一切都顺利进行:
deployment.yml 如下所示:
---
kind: Service
apiVersion: v1
metadata:
name: https-with-cert
annotations:
service.beta.kubernetes.io/do-loadbalancer-protocol: "http"
service.beta.kubernetes.io/do-loadbalancer-algorithm: "round_robin"
service.beta.kubernetes.io/do-loadbalancer-tls-ports: "443"
service.beta.kubernetes.io/do-loadbalancer-certificate-id: "c1eae56c-42cd-4953-9ab9-1a6facae87f8"
# "api.priz.guru" should be configured to point at the IP address of the DO load-balancer
service.beta.kubernetes.io/do-loadbalancer-hostname: "api.priz.guru"
service.beta.kubernetes.io/do-loadbalancer-enable-proxy-protocol: "true"
service.beta.kubernetes.io/do-loadbalancer-disable-lets-encrypt-dns-records: "false"
service.beta.kubernetes.io/do-loadbalancer-size-unit: "2"
service.beta.kubernetes.io/do-loadbalancer-healthcheck-port: "8080"
service.beta.kubernetes.io/do-loadbalancer-healthcheck-protocol: "http"
service.beta.kubernetes.io/do-loadbalancer-healthcheck-path: "/v1/ping"
spec:
type: LoadBalancer
selector:
app: priz-api
ports:
- name: http
protocol: TCP
port: 80
targetPort: 8080
- name: https
protocol: TCP
port: 443
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: priz-api
labels:
app: priz-api
spec:
# modify replicas according to your case
replicas: 2
strategy:
type: RollingUpdate
selector:
matchLabels:
app: priz-api
template:
metadata:
labels:
app: priz-api
spec:
containers:
- name: priz-api
image: <IMAGE>
env:
- name: PRIZ_DATABASE_URL
value: "${PRIZ_DATABASE_URL_PROD}"
- name: PRIZ_DATABASE_USER
value: "${PRIZ_DATABASE_USER_PROD}"
- name: PRIZ_DATABASE_PASSWORD
value: "${PRIZ_DATABASE_PASSWORD_PROD}"
- name: PRIZ_AUTH0_DOMAIN
value: "${PRIZ_AUTH0_DOMAIN_PROD}"
- name: PRIZ_AUTH0_API_DOMAIN
value: "${PRIZ_AUTH0_API_DOMAIN_PROD}"
- name: PRIZ_AUTH0_API_CLIENT_ID
value: "${PRIZ_AUTH0_API_CLIENT_ID_PROD}"
- name: PRIZ_AUTH0_API_CLIENT_SECRET
value: "${PRIZ_AUTH0_API_CLIENT_SECRET_PROD}"
- name: PRIZ_APP_BASE_URL
value: "${PRIZ_APP_BASE_URL_PROD}"
- name: PRIZ_STRIPE_API_KEY_SECRET
value: "${PRIZ_STRIPE_API_KEY_SECRET_PROD}"
- name: PRIZ_SEARCH_HOST
value: "${PRIZ_SEARCH_HOST_PROD}"
ports:
- containerPort: 8080
resources:
requests:
cpu: 500m
memory: 500Mi
limits:
cpu: 2000m
memory: 2000Mi
我该如何调试这个问题?缺少什么?
我们使用的一些参考资料: https://docs.digitalocean.com/products/kubernetes/how-to/add-load-balancers/ https://docs.digitalocean.com/products/kubernetes/how-to/configure-load-balancers/ https://github.com/digitalocean/digitalocean-cloud-controller-manager/tree/master/docs/controllers/services/examples
我不知道是否是同样的问题,但按照以下步骤操作时出现了相同的错误消息
事实上,它第一次就工作了,但我已经删除了集群并在新集群上进行测试,以确保我现在修改的脚本可以从头开始工作......
我第二次遇到上述错误
所以我再次查看说明并注意到
此设置将使用具有三个节点的 DigitalOcean Kubernetes 集群,但您也可以手动创建集群。
为了节省成本,我设置了单节点集群
所以我再次开始使用默认的 3 节点集群,它按预期工作。
这里是 Azure 用户,所以这对于 DigitalOcean 来说可能有点不同,但无论如何都是这样!
当云提供商为您提供负载均衡器时,根据云提供商的配置,kubelet 或控制平面都需要权限,以便在网络布局发生变化时(例如新节点上线时、新节点上线时)对负载均衡器进行更改。举几个例子,现有节点离线,尽管还有其他条件会改变网络布局)。
当您收到此错误时,这是因为集群的这 2 个组件之一缺少其所需的权限。
以Azure为例,当我们创建集群时,控制平面和kubelet有权编辑同一资源组中的资源。因此,如果我们在不同的资源组中创建网络,那么我们必须手动向网络资源组中的集群子网添加角色分配,从而授予控制平面和 kubelet 对该子网进行更改的权限。
快速阅读 DigitalOcean 文档可以确认 Azure 称之为资源组,DigitalOcean 称之为项目。我怀疑您的负载均衡器、VPC 和集群(或这 3 者的某种组合)可能位于不同的项目中,因此您需要将它们全部与同一个项目关联。