Consul Helm chart: Connect Injector服务无法工作

202次阅读
没有评论

问题描述

在应用最新版本的Consul Helm chart(0.4.0)时,遇到了Connect Injector服务无法工作的问题。Consul客户端daemonset的pod成功注册到集群中,而Connect Injector webhook的部署也显示为成功运行。以下是pod启动日志:

Listening on ":8080"... Updated certificate bundle received. Updating certs...
10.42.0.1 - - [18/Dec/2018:20:36:26 +0000] "GET /health/ready HTTP/2.0" 204 0

然而,当用户尝试使用注释"consul.hashicorp.com/connect-inject": "true"进行一些示例部署时,没有生成任何sidecar容器。检查injector pod时,没有任何消息表明部署甚至被联系过。

用户最初在一个没有RBAC的集群中遇到了这个问题。他从chart中删除了RBAC的引用并进行了部署,但仍然遇到了上述问题。然后,他在另一个集群上设置/启用了RBAC,并正确安装了chart,但问题仍然存在,即使正确的RBAC设置已经生效。

用户使用Vault作为Consul的证书提供者,检查了两者的日志,没有发现任何错误,并且Consul作为提供者已经正确设置。

用户想知道有没有人有什么检查的建议?

这是用户的配置:

global:
  enabled: false
  domain: consul
  image: "consul:1.4.0"
  imageK8S: "hashicorp/consul-k8s:0.3.0"
  datacenter: dc1
client:
  enabled: true
  join: ["provider=aws region=region tag_key=tag tag_value=tag"]
  grpc: true
  extraConfig: |
    {
      "enable_local_script_checks": true,
      "encrypt": "key"
    }
dns:
  enabled: true
syncCatalog:
  enabled: false
connectInject:
  enabled: true
  default: false
  imageEnvoy: "envoyproxy/envoy:v1.8.0"

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据回答1,问题可能是由于缺少MutatingAdmissionWebhook和ValidatingAdmissionWebhook admission controllers导致的。根据文档,建议启用一组推荐的admission controllers,包括这两个。然而,用户使用Rancher管理K8s集群,在非测试环境下,默认只启用了其中几个admission controllers。用户在升级集群后,这些admission controllers并没有被启用。通过更新Rancher K8s配置并应用更改,用户成功启动了测试的client/server deployments,并成功注入了envoy容器,并在Consul中注册了服务。

TL;DR: 请确保启用了MutatingAdmissionWebhook和ValidatingAdmissionWebhook admission controllers。

方案2

如果方案1不起作用,可以尝试手动注入envoy容器并注册服务。以下是一个示例脚本,可以在容器启动后手动启动envoy容器:

#!/bin/bash
# 启动Consul容器
docker run -d --name consul_container your_consul_image
# 等待Consul容器完全启动
while ! docker exec consul_container echo "Consul is ready"; do
  sleep 1
done
# 启动Connect Injector容器
docker run -d --name connect_injector_container your_connect_injector_image
# 等待Connect Injector容器完全启动
while ! docker exec connect_injector_container echo "Connect Injector is ready"; do
  sleep 1
done
# 启动Envoy容器
docker run -d --name envoy_container your_envoy_image
# 等待Envoy容器完全启动
while ! docker exec envoy_container echo "Envoy is ready"; do
  sleep 1
done
# 注册服务到Consul
docker exec consul_container consul register your_service_definition.json

在这个示例中,我们首先使用docker run命令启动Consul容器,并将其命名为consul_container。然后,使用一个循环来等待Consul容器完全启动(这里是通过在容器内运行echo命令来测试)。一旦Consul容器就绪,我们再使用docker run命令启动Connect Injector容器,并将其命名为connect_injector_container。同样,我们等待Connect Injector容器完全启动。然后,我们使用docker run命令启动Envoy容器,并将其命名为envoy_container。最后,我们使用docker exec命令将服务定义文件your_service_definition.json注册到Consul中。

请注意,这只是一个示例脚本,你需要根据你的实际情况进行修改。

以上是两种可能的解决方案,希望能帮助到你解决问题。如果还有其他问题,请随时提问。

正文完