Kubernetes利用postStart事件解决Java自签名证书导入的问题

282 阅读1分钟

问题

JAVA访问自签名证书提供的服务时会出现unable to find valid certification path to requested target的问题,导致不能正常请求所需的服务,可参考:juejin.cn/post/718287…

Kubernetes 支持 postStart 和 preStop 事件。 当一个容器启动后,Kubernetes 将立即发送 postStart 事件,我们可以利用postStart事件,在容器启动后导入自签名证书。

  1. 挂载服务器证书
**- 导入证书**
kubectl -n xx  create configmap cloud-server-tls --from-file=./server.crt

**- 通过增加ENV加载证书**
env:
- name: CLOUD_SERVER_CERT
  valueFrom:
    configMapKeyRef:
      name: cloud-server-tls
      key: server.crt
      
**- 或者通过增加volume加载证书**
spec:
  containers:
    ...
    volumeMounts:
      - name: server-tls
        mountPath: /tmp
  volumes:
   - name: server-tls
     configMap:
       name: cloud-server-tls
       items:
         - key: server.crt
           path: server.crt
  1. 加入postStart配置
**- 通过增加ENV加载证书**
lifecycle:
  postStart:
    exec:
      command: [ "/bin/sh", "-c", 'echo """$CLOUD_SERVER_CERT""" > /tmp/server.crt; keytool -import -alias casserver -keystore $JAVA_HOME/lib/security/cacerts -file /tmp/server.crt -storepass changeit -noprompt' ]
      
**- 或者通过增加volume加载证书**
lifecycle:
  postStart:
    exec:
      command: [ "/bin/sh", "-c", 'keytool -import -alias casserver -keystore $JAVA_HOME/lib/security/cacerts -file /tmp/server.crt -storepass changeit -noprompt' ]

不同环境的$JAVA_HOME/lib/security/cacerts可能不同,根据实现情况修改。