istio ca控制器

使用Kubernetes CSR的自定义CA集成

使用Kubernetes CA部署Istio

使用Kubernetes CA部署Istio

  1. 使用istioctl以下配置在集群上部署Istio

    cat <<EOF > ./istio.yaml
    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    spec:
     pilot:
       k8s:
         env:
         # Indicate to Istiod that we use an Custom Certificate Authority
         - name: EXTERNAL_CA
           value: ISTIOD_RA_KUBERNETES_API
         # Tells Istiod to use the Kubernetes legacy CA Signer
         - name: K8S_SIGNER
           value: kubernetes.io/legacy-unknown
    EOF
    istioctl install --set profile=demo -f ./istio.yaml
  2. bookinfo在bookinfo名称空间中部署示例应用程序。确保在Istio根目录中执行以下命令

验证安装的证书是否正确

部署工作负载后,以上这些工作负载会将CSR请求发送给Istiod,然后将其转发给Kubernetes CA进行签名。如果一切顺利,则将已签名的证书发送回安装它们的工作负载。要验证它们是否已被Kubernetes CA签名,您需要首先提取签名的证书。

转储在名称空间中运行的所有Pod。

选择任何一个正在运行的吊舱进行下一步。

获取Istio代理用于mTLS的证书链和CA根证书。

proxy_secret json文件在trustedCA字段中包含mTLS的CA根证书。请注意,此证书是base64编码的。

Kubernetes CA使用的证书(特别是kubernetes.io/legacy-unknown签名者)被加载到与bookinfo命名空间中的每个服务帐户关联的机密上。

选择一个与任何服务帐户关联的秘密名称。它们的名称中有一个"令牌"。

在ca.crt输出字段包含base64编码Kubernetes CA证书。

将ca.cert上一步中获得的结果与前一步中的TrustedCA字段内容进行比较。这两个应该是相同的。

(可选)按照bookinfo示例中的其余步骤进行操作,以确保服务之间的通信按预期进行。

使用自定义CA

假设定制CA实现的控制器具有读取和签名Kubernetes CSR请求的必要权限。有关更多详细信息,请参考Kubernetes CSR文档。请注意,以下步骤取决于外部来源,并且可能会更改。

在Kubernetes集群中部署自定义CA控制器

  1. 在此示例中,我们使用开源证书颁发机构实现。该代码构建了一个控制器,该控制器读取Kubernetes集群上的CSR资源,并使用本地密钥创建证书。请按照页面上的说明进行操作:

    1. 构建证书控制器docker 镜像

    2. 将镜像上传到Docker registry

    3. 生成Kubernetes manifest以部署它

  2. 将上一步中生成的Kubernetes清单部署在signer-ca-system名称空间中的本地集群上。

确保所有服务都在运行。

  1. 获取CA的公钥。这被编码在signer-ca-system名称空间中的秘密" signer-ca- *"中。

该tls.crt字段包含base64编码的公共密钥文件。记录下来以备将来使用。

将CA根证书加载到istiod可以访问的secret中

  1. 将机密加载到istiod名称空间中。

Istio必须执行此步骤,以验证工作负载证书已由正确的证书颁发机构签名,并将根证书添加到信任捆绑中以使mTLS正常工作。

部署Istio

使用istioctl以下配置在集群上部署Istio 。

  1. bookinfo在bookinfo名称空间中部署示例应用程序。

验证安装的自定义CA证书是否正确

部署工作负载后,以上这些工作负载会将CSR请求发送给Istiod,然后将其转发给Kubernetes CA进行签名。如果一切顺利,则将已签名的证书发送回安装它们的工作负载。为了验证Kubernetes CA确实已对它们进行了签名,您需要首先提取已签名的证书。

转储在名称空间中运行的所有Pod。

选择任何正在运行的吊舱进行下一步。

获取Istio代理用于mTLS的证书链和CA根证书。

该proxy_secretJSON文件包含在MTLS CA根证书trustedCA领域。请注意,此证书是base64编码的。

将以上步骤中获得的CA根证书与external-ca-cert中的" root-cert.pem"值进行比较。这两个应该是相同的。

(可选)按照bookinfo示例中的其余步骤进行操作,以确保服务之间的通信按预期进行。

证书签发原理

判断使用哪种类型的CertificateAuthority

CreateCertificate处理传入的证书签名请求(CSR).它进行身份验证和授权.验证后,签署证书以证明:SAN是身份验证结果中呼叫者的身份.主题公钥是CSR中的公钥.有效期限是请求中的ValidityDuration,如果给定的期限无效,则为默认值.它由CA签名密钥签名。

k8s ra

k8s ra 的sign法法最终调用k8sSign

k8sSign 使用chiron签发证书,发出csrrequest

ca

Sign接受PEM编码的CSR,主题ID和生存期,并返回已签名的证书.如果forCA为true,则签名证书为CA证书,否则为工作负载证书。

Last updated

Was this helpful?