gpt4 book ai didi

ssl - Hashicorp Consul - 如何从 Kubernetes 集群中的 Pod 中执行经过验证的 TLS

转载 作者:行者123 更新时间:2023-12-02 11:46:38 25 4
gpt4 key购买 nike

我在理解 Consul 端到端 TLS 时遇到了一些困难。作为引用,我在 Kubernetes 中使用 Consul(通过 hashcorp/consul Helm 图表)。只有一个数据中心和 Kubernetes 集群——没有外部各方或顾虑。

我已经配置了我的覆盖 值.yaml 像这样的文件:

global:
datacenter: sandbox

gossipEncryption:
secretName: "consul"
secretKey: "CONSUL_GOSSIP_ENCRYPTION_KEY"

tls:
enabled: true
httpsOnly: true
enableAutoEncrypt: true
serverAdditionalDNSSANs: ["'consul.service.consul'"]

server:
replicas: 3
bootstrapExpect: 3
storage: 20Gi

dns:
clusterIP: 172.20.53.53

ui:
service:
type: 'LoadBalancer'

syncCatalog:
enabled: true

所有其他值都是出厂时的默认值 values.yaml 文件。

这可行,Consul 客户端日志表明所有代理区域都使用 TLS 很好地连接,相关证书和 key 由(据我了解) 创建。 Auto-encryption 领事的特点。

我不明白的是如何启动从 Kubernetes 上的应用程序(在 Pod 中运行)到 Consul 服务器的 HTTPS 连接。由于 Pod 的容器(可能)在其信任库中没有 Consul 根 CA 证书,所有 HTTPS 调用都会失败,根据 wget 下面的例子:
# Connect to Pod:
laptop$> kubectl exec -it my-pod sh

# Attempt valid HTTPS connection:
my-pod$> wget -q -O - https://consul.service.consul:8501
Connecting to consul.service.consul:8501 (10.110.1.131:8501)
ssl_client: consul.service.consul: certificate verification failed: unable to get local issuer certificate
wget: error getting response: Connection reset by peer

# Retry, but ignore certificate validity issues:
my-pod$> wget --no-check-certificate -q -O - https://consul.service.consul:8501/v1/status/leader
"10.110.1.131:8300"

如果容器无法识别证书有效,我应该如何强制从 Kubernetes 上的应用程序到 Consul 的端到端(已验证)HTTPS 连接?
我对证书传播有误解吗?

非常感谢 - 亚伦

最佳答案

感谢 Hashicorp 在他们的 Consul discussion forum 上解决了.

  • 创建一个名为 的 Kubernetes key 领事使用名为 的键CONSUL_GOSSIP_ENCRYPTION_KEY 和适当的加密 key 值。
  • 使用 consul keygen 产生值(value)
  • 安装 hashcorp/领事带有 的 Helm 图表值覆盖.yaml ,例如:
  • global:
    datacenter: sandbox

    gossipEncryption:
    secretName: "consul"
    secretKey: "CONSUL_GOSSIP_ENCRYPTION_KEY"

    tls:
    enabled: true
    httpsOnly: true
    enableAutoEncrypt: true
    serverAdditionalDNSSANs: ["'consul.service.consul'"]

    server:
    replicas: 3
    bootstrapExpect: 3
    storage: 20Gi

    dns:
    clusterIP: 172.20.53.53

    ui:
    service:
    type: 'LoadBalancer'

    syncCatalog:
    enabled: true

  • 创建一个示例 Pod 规范来表示我们的应用程序。
  • 确保它挂载了 Consul 服务器 CA 证书 key 。
  • 确保 Pod 的容器有 主机IP 暴露为环境变量。
  • apiVersion: v1
    kind: Pod
    metadata:
    namespace: default
    name: test-pod
    spec:
    volumes:
    - name: consul-consul-ca-cert
    secret:
    secretName: consul-consul-ca-cert
    hostNetwork: false
    containers:
    - name: consul-test-pod
    image: alpine
    imagePullPolicy: IfNotPresent
    env:
    - name: HOST_IP
    valueFrom:
    fieldRef:
    fieldPath: status.hostIP
    command: ["/bin/sh"]
    args: ["-c", "while true; do sleep 24h; done"]
    volumeMounts:
    - name: consul-consul-ca-cert
    mountPath: /consul/tls/ca
  • 创建 Pod 后,kubectl exec进入它,并确保 ca 证书 curl 软件包已安装(在此示例中我使用的是 Alpine Linux)。
  • ( curl 纯粹用于测试目的)
  • #> apk update
    #> apk add ca-certificates curl
  • 将挂载的 Consul 服务器 CA 证书复制到 /usr/local/share/ca-certificates/并执行update-ca-certificates将其添加到系统根 CA 存储。
  • #> cp /consul/tls/ca/tls.crt /usr/local/share/ca-certificates/consul-server-ca.crt
    #> update-ca-certificates # might give a trivial warning - ignore it
  • 领事服务器 现在可以通过 HTTPS 访问(并且受信任),如下所示:
  • #> curl https://consul.service.consul:8501/v1/status/leader
    ## No TLS errors ##
  • 我们也想和领事谈谈 客户出于性能原因,通过 HTTPS(而不是服务器)。
  • 由于 Consul 客户端有自己的 CA 证书,我们需要从服务器检索它。
  • 这需要 领事-k8s 二进制,所以我们需要得到它。
  • #> cd /usr/local/bin
    #> wget https://releases.hashicorp.com/consul-k8s/0.15.0/consul-k8s_0.15.0_linux_amd64.zip # (or whatever latest version is)
    #> unzip consul-k8s_0.15.0_linux_amd64.zip
    #> rm consul-k8s_0.15.0_linux_amd64.zip
  • 获取领事客户 CA 证书并通过 update-ca-certificates 安装:
  • #> consul-k8s get-consul-client-ca -server-addr consul.service.consul -server-port 8501 -output-file /usr/local/share/ca-certificates/consul-client-ca.crt
    #> update-ca-certificates # might give a trivial warning - ignore it
  • 领事客户现在可以通过 HTTPS 访问(并且受信任),如下所示:
  • #> curl https://$HOST_IP:8501/v1/status/leader
    ## No TLS errors ##
  • 我们也可以毫无问题地从客户端访问 Consul KV 服务:
  • #> curl https://$HOST_IP:8501/v1/kv/foo/bar/baz
    ## No TLS errors ##

    当然,以上所有内容都应该由实现者自动化。这些手动步骤纯粹用于演示目的。

    关于ssl - Hashicorp Consul - 如何从 Kubernetes 集群中的 Pod 中执行经过验证的 TLS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62023421/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com