我安装了一个 OpenShift 集群用于测试目的,并且由于我在公司网络后面,我需要在任何想要发出外部请求的 Pod 中包含一些根证书。在创建 Pod 时如何自动注入这些证书?
我在本地 CentOS 7 VM 中运行 OpenShift Origin (OKD) 3.11,并在其上配置了 GlusterFS 存储。我的虚拟机本身已经有多个问题,这在尝试访问网络时给了我错误:x509: certificate signed by unknown authority
. 我通过在 /etc/pki/ca-trust/source/anchors 中添加我的公司根证书并运行update-ca-trust
命令来解决这个问题。
例如,当我在 OpenShift 集群中运行 docker-registry 部署时,由于创建的 Pod 无权访问主机根证书,因此x509: certificate signed by unknown authority
在尝试从 docker.io 提取图像时再次出错。我通过创建一个包含所有需要的根证书的 ConfigMap 并将它们安装在注册表部署配置上的一个卷中解决了这个问题。
我以为我只需要在所有想要请求外部网络的部署配置中安装一个卷。但后来我配置了一个 Jenkins 实例,我意识到了一些新的东西:当管道运行时,Jenkins 会创建一个带有适配代理的 Pod(例如:Spring Boot 应用程序需要一个 Maven 代理)。由于我无法控制这些创建的 pod,因此它们无法拥有带有所有根证书的已安装卷。因此,例如,我有一个helm init --client-only
在发布我的应用程序图表之前运行的管道,并且这个命令给出了一个x509: certificate signed by unknown authority
错误,因为这个 pod 没有根证书。
我发现 PodPreset 可能是解决我的问题的完美方法,但是当我在集群中启用此功能并创建 PodPreset 时,不会填充新的 pod。我在OpenShift 文档中读到 PodPresets 从 3.7 开始不再受支持,所以我认为这可能是它无法正常工作的原因。
这是我的 PodPreset 定义文件:
kind: PodPreset
apiVersion: settings.k8s.io/v1alpha1
metadata:
name: inject-certs
spec:
selector: {}
volumeMounts:
- mountPath: /etc/ssl/certs/cert1.pem
name: ca
subPath: cert1.pem
- mountPath: /etc/ssl/certs/cert2.pem
name: ca
subPath: cert2.pem
- mountPath: /etc/ssl/certs/cert3.pem
name: ca
subPath: cert3.pem
- mountPath: /etc/ssl/certs/cert4.pem
name: ca
subPath: cert4.pem
- mountPath: /etc/ssl/certs/cert5.pem
name: ca
subPath: cert5.pem
- mountPath: /etc/ssl/certs/cert6.pem
name: ca
subPath: cert6.pem
volumes:
- configMap:
defaultMode: 420
name: ca-pemstore
name: ca
我不知道是否有任何方法可以使 PodPresets 在 OpenShift 3.11 上运行,或者是否有另一种解决方案可以在创建的 pod 中注入这样的证书文件。这真的很棒。