如何使用 TLS 保护 Kubernetes 集群安全

KubernetesKubernetesBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

使用传输层安全协议(Transport Layer Security,TLS)保护你的Kubernetes集群,对于确保Kubernetes生态系统内通信的机密性、完整性和真实性至关重要。本教程将指导你完成在Kubernetes中实施TLS、设置入口TLS(Ingress TLS)以及管理证书的过程,以确保你的Kubernetes环境安全。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/ConfigurationandVersioningGroup(["Configuration and Versioning"]) kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/AdvancedCommandsGroup(["Advanced Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes/BasicCommandsGroup -.-> kubernetes/create("Create") kubernetes/BasicCommandsGroup -.-> kubernetes/expose("Expose") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("Apply") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/label("Label") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/config("Config") subgraph Lab Skills kubernetes/create -.-> lab-419319{{"如何使用 TLS 保护 Kubernetes 集群安全"}} kubernetes/expose -.-> lab-419319{{"如何使用 TLS 保护 Kubernetes 集群安全"}} kubernetes/apply -.-> lab-419319{{"如何使用 TLS 保护 Kubernetes 集群安全"}} kubernetes/describe -.-> lab-419319{{"如何使用 TLS 保护 Kubernetes 集群安全"}} kubernetes/label -.-> lab-419319{{"如何使用 TLS 保护 Kubernetes 集群安全"}} kubernetes/config -.-> lab-419319{{"如何使用 TLS 保护 Kubernetes 集群安全"}} end

使用 TLS 保护 Kubernetes 安全

使用传输层安全协议(TLS)保护 Kubernetes 集群安全,是确保 Kubernetes 生态系统内通信的机密性、完整性和真实性的关键环节。TLS 为 Kubernetes 各个组件之间的通信提供了一个安全通道,比如 API 服务器、kubelet 以及 Pod 到 Pod 之间的通信。

Kubernetes 中的 TLS 基础

Kubernetes 使用 TLS 来保障其各个组件之间的通信安全。Kubernetes API 服务器是控制和通信的核心节点,它需要一个 TLS 证书来与其他组件(如 kubelet、kube-proxy 以及像 kubectl 这样的客户端工具)建立安全连接。

要在 Kubernetes 中设置 TLS,你需要生成并分发必要的证书和密钥。这通常涉及以下步骤:

  1. 生成证书颁发机构(CA)证书:CA 证书用于签署各个组件的证书,从而建立一个可信任的信任链。
  2. 生成各个组件的证书:每个 Kubernetes 组件,例如 API 服务器、kubelet 和 kube-proxy,都需要由 CA 签署的自己的 TLS 证书。
  3. 配置 Kubernetes 组件以使用 TLS 证书:必须对 Kubernetes 组件进行配置,使其使用适当的 TLS 证书进行安全通信。
graph LR CA[证书颁发机构] --> API[API 服务器] CA --> Kubelet[kubelet] CA --> Kube-Proxy[kube-proxy] API --> Client[客户端工具] Kubelet --> Pods[Pods] Kube-Proxy --> Pods

在 Kubernetes 中实施 TLS

要在 Kubernetes 集群中实施 TLS,你可以遵循以下一般步骤:

  1. 生成 CA 证书和密钥

    openssl req -x509 -newkey rsa:4096 -keyout ca.key -out ca.crt -days 365 -nodes
  2. 生成 API 服务器证书和密钥

    openssl req -newkey rsa:4096 -keyout apiserver.key -out apiserver.csr -nodes
    openssl x509 -req -in apiserver.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apiserver.crt -days 365
  3. 配置 Kubernetes API 服务器以使用 TLS 证书

    apiVersion: v1
    kind: Config
    clusters:
      - cluster:
          certificate-authority: /path/to/ca.crt
          server:
        name: kubernetes
    users:
      - name: kubernetes-admin
        user:
          client-certificate: /path/to/apiserver.crt
          client-key: /path/to/apiserver.key
  4. 配置其他 Kubernetes 组件以使用 TLS 证书

    • Kubelet:--kubelet-client-certificate=/path/to/apiserver.crt --kubelet-client-key=/path/to/apiserver.key
    • Kube-proxy:--client-ca-file=/path/to/ca.crt

通过遵循这些步骤,你可以使用 TLS 保护 Kubernetes 集群的通信安全,确保各个组件之间交换的数据的机密性、完整性和真实性。

实施入口TLS(Ingress TLS)

入口(Ingress)是一种Kubernetes资源,它为访问Kubernetes集群内的服务提供了一个入口点。为入口实施传输层安全协议(TLS)对于保护客户端与Kubernetes服务之间的通信安全至关重要。

入口TLS配置

要为入口配置TLS,你需要遵循以下步骤:

  1. 获取TLS证书:你可以使用自签名证书,也可以从受信任的证书颁发机构(CA)获取证书。在本示例中,我们将使用自签名证书。

    openssl req -x509 -newkey rsa:4096 -keyout tls.key -out tls.crt -days 365 -nodes
  2. 创建一个Kubernetes密钥(Secret)来存储TLS证书

    kubectl create secret tls tls-secret --key tls.key --cert tls.crt
  3. 配置入口资源以使用TLS密钥

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: my-ingress
    spec:
      tls:
        - hosts:
            - example.com
          secretName: tls-secret
      rules:
        - host: example.com
          http:
            paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: my-service
                    port:
                      number: 80

在本示例中,入口资源被配置为对example.com主机使用tls-secret密钥。tls-secret包含TLS证书和密钥。

验证入口TLS

要验证入口TLS配置是否正常工作,你可以使用以下步骤:

  1. 使用HTTPS访问入口

  2. 检查TLS连接

    • 在网页浏览器中,你应该看到连接是安全的(例如,一个绿色锁图标)。
    • 你也可以使用openssl命令来检查TLS连接:
      openssl s_client -connect example.com:443

通过实施入口TLS,你可以保护客户端与Kubernetes服务之间的通信安全,确保交换数据的机密性和完整性。

在 Kubernetes 中管理证书

在 Kubernetes 环境中,有效管理 TLS 证书对于确保集群的安全性和可靠性至关重要。Kubernetes 提供了多种管理证书的选项,包括手动证书管理以及使用像 Cert Manager 这样的专用证书管理工具。

手动证书管理

在 Kubernetes 中手动管理证书涉及以下步骤:

  1. 生成证书:你可以使用 opensslcfssl 等工具来生成必要的证书,包括 CA 证书、服务器证书和客户端证书。

  2. 创建 Kubernetes 密钥(Secret):获得证书后,你可以创建 Kubernetes 密钥来在集群中安全地存储它们。

    kubectl create secret tls my-tls-secret --cert=tls.crt --key=tls.key
  3. 配置 Kubernetes 组件:更新 Kubernetes 组件配置(例如,API 服务器、kubelet、入口)以使用存储在密钥中的 TLS 证书。

虽然这种方法可以完全控制证书管理过程,但它可能会变得复杂且耗时,尤其是在大规模或动态的 Kubernetes 环境中。

使用 Cert Manager

Cert Manager 是一个 Kubernetes 插件,用于自动化 TLS 证书的管理。它可以从各种来源(如 Let's Encrypt、HashiCorp Vault 和自签名证书)供应、续订和管理证书。

要使用 Cert Manager,你需要在 Kubernetes 集群中安装它。安装后,你可以创建 Certificate 资源来管理 TLS 证书的生命周期。

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: my-tls-certificate
spec:
  secretName: my-tls-secret
  issuerRef:
    name: letsencrypt-issuer
    kind: ClusterIssuer
  commonName: example.com
  dnsNames:
    - example.com

在此示例中,Cert Manager 将自动为 example.com 域名供应和续订 TLS 证书,并将证书和密钥存储在 my-tls-secret Kubernetes 密钥中。

通过使用 Cert Manager,你可以简化 Kubernetes 集群中 TLS 证书的管理,确保它们在无需人工干预的情况下自动供应、续订和管理。

总结

在本教程中,你已经学习了如何使用TLS保护你的Kubernetes集群安全、实施入口TLS(Ingress TLS)以及在Kubernetes中管理证书。通过遵循上述步骤,你可以在Kubernetes组件之间建立一个可信任的通信链,保护你的API服务器,并确保基于Kubernetes的应用程序的安全性。