You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从VM迁移至Kubernetes:服务证书配置实现方案咨询

好的,我来帮你梳理下在Kubernetes中实现你现有VM环境证书配置的方案,咱们一步步对应原来的架构来拆解:

1. 入口层(对应原VIP的对外SSL)

在K8s里,你可以用Ingress来替代原来的VIP反向代理功能,实现对外的SSL终止和流量路由:

  • 首先把对外的SSL证书(对应原VIP的证书)创建成K8s的Secret(类型为kubernetes.io/tls):
    kubectl create secret tls external-ssl-secret --cert=path/to/external-cert.pem --key=path/to/external-key.pem
    
  • 然后在Ingress资源中配置TLS,指定这个Secret,同时配置路由规则将流量转发到后端服务:
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: app-ingress
    spec:
      tls:
      - hosts:
        - your-domain.com
        secretName: external-ssl-secret
      rules:
      - host: your-domain.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: your-app-service
                port:
                  number: 443
    
    这样客户端访问your-domain.com时,Ingress就会像原来的VIP一样处理SSL,然后把流量转发到后端服务。
2. 集群内部Ingress到服务的HTTPS通信(对应原VIP到VM的HTTPS)

要实现Ingress到后端Pod的HTTPS通信,你需要:

  • 为后端服务准备内部SSL证书(可以是自签证书,或者内部CA签发的证书),同样创建成Secret:
    kubectl create secret tls internal-service-ssl-secret --cert=path/to/internal-cert.pem --key=path/to/internal-key.pem
    
  • 在你的应用Deployment中挂载这个Secret到Pod的指定路径,让应用使用该证书启动HTTPS服务:
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: your-app-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: your-app
      template:
        metadata:
          labels:
            app: your-app
        spec:
          containers:
          - name: your-app
            image: your-app-image:latest
            ports:
            - containerPort: 443
            volumeMounts:
            - name: internal-ssl
              mountPath: /etc/ssl/internal
              readOnly: true
            # 这里根据你的应用配置,指定证书路径,比如Java应用可能需要配置JVM参数
            args: ["--ssl-cert", "/etc/ssl/internal/tls.crt", "--ssl-key", "/etc/ssl/internal/tls.key"]
          volumes:
          - name: internal-ssl
            secret:
              secretName: internal-service-ssl-secret
    
  • 同时,确保Ingress配置中转发到后端服务的端口是443,并且如果Ingress控制器需要验证后端证书,你可能需要添加注解(比如NGINX Ingress需要nginx.ingress.kubernetes.io/backend-protocol: "HTTPS")来指定后端通信协议为HTTPS。
3. 服务与数据库的SSL证书管理(对应原JKS中的数据库证书)

对于应用连接启用SSL的数据库,你需要把数据库的CA证书(或者客户端证书)存储到K8s Secret中,然后挂载到Pod里:

  • 如果只需要验证数据库的CA证书,创建一个通用Secret存储CA证书:
    kubectl create secret generic db-ca-secret --from-file=db-ca.crt=path/to/db-ca.pem
    
  • 如果需要客户端证书认证,创建TLS Secret存储客户端证书和密钥:
    kubectl create secret tls db-client-ssl-secret --cert=path/to/db-client-cert.pem --key=path/to/db-client-key.pem
    
  • 在Deployment中挂载这些Secret,然后在应用配置中指定证书路径(比如Java应用可以把CA证书导入到信任库,或者直接指定信任库路径):
    # 在Deployment的volumes中添加
    volumes:
    - name: db-ca
      secret:
        secretName: db-ca-secret
    # 在container的volumeMounts中添加
    volumeMounts:
    - name: db-ca
      mountPath: /etc/ssl/db
      readOnly: true
    
    然后Java应用可以通过JVM参数指定:
    -Djavax.net.ssl.trustStore=/etc/ssl/db/db-ca.crt -Djavax.net.ssl.trustStoreType=PEM
    
    如果你还是想用JKS格式,也可以提前把数据库证书导入到JKS文件,再把JKS文件作为Secret挂载:
    kubectl create secret generic db-jks-secret --from-file=db-truststore.jks=path/to/db-truststore.jks
    
    挂载后通过JVM参数指定:
    -Djavax.net.ssl.trustStore=/path/to/mounted/db-truststore.jks -Djavax.net.ssl.trustStorePassword=your-password
    
4. 原JKS文件的处理(包含对外服务和数据库证书)

如果你的应用依赖原来的单一JKS文件(同时包含对外服务的密钥对和数据库信任证书),你可以直接把这个JKS文件创建成K8s Secret:

kubectl create secret generic app-jks-secret --from-file=app-keystore.jks=path/to/app-keystore.jks

然后在Deployment中挂载这个Secret到Pod的指定路径,在应用启动参数中指定JKS路径和密码:

volumeMounts:
- name: app-jks
  mountPath: /etc/ssl/jks
  readOnly: true
args: ["--keystore", "/etc/ssl/jks/app-keystore.jks", "--keystore-password", "your-jks-password"]

不过更推荐拆分证书分别管理——把对外服务的密钥对和数据库的证书分开存储成不同的Secret,这样更符合K8s的资源管理最佳实践,便于单独更新某一类证书。

额外注意事项
  • 证书更新:当证书过期时,只需要更新对应的Secret,K8s会自动把新证书挂载到Pod中,你需要确保应用能够热加载证书,或者重启Pod来应用新证书。
  • 证书自动化:可以用K8s的cert-manager来自动化内部证书的签发和续期,减少手动管理的工作量。
  • 安全保障:所有Secret都存储在K8s的etcd中,确保你的集群etcd配置了加密,避免证书泄露。

内容的提问来源于stack exchange,提问作者user1578872

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:33:27