如何将 Azure AKS Kubernetes 集群自签名 CA 添加到 GitLab CI/CD Kubernetes 集成?

Posted

技术标签:

【中文标题】如何将 Azure AKS Kubernetes 集群自签名 CA 添加到 GitLab CI/CD Kubernetes 集成?【英文标题】:How to add an Azure AKS Kubernetes Cluster self-signed CA to GitLab CI/CD Kubernetes integration? 【发布时间】:2018-11-19 09:46:14 【问题描述】:

我正在尝试将我的 Azure AKS Kubernetes 集群添加到我的 GitLab CI/CD Kubernetes 集成中。

我可以在我的电脑上在集群上执行kubectl命令,在我运行这个命令之后:

az aks get-credentials --resource-group <resource-group-name> --name <kubernetes-cluster-name>

它创建了一个.kube/config 文件,其内容如下:

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: <some long base64 string here>
    server: https://<resource-group-name+some-hexadecimal-chars>.hcp.westeurope.azmk8s.io:443
  name: <kubernetes-cluster-name>
contexts:
- context:
    cluster: <kubernetes-cluster-name>
    user: clusterUser_<resource-group-name>_<kubernetes-cluster-name>
  name: <kubernetes-cluster-name>
current-context: <kubernetes-cluster-name>
kind: Config
preferences: 
users:
- name: clusterUser_<resource-group-name>_<kubernetes-cluster-name>
  user:
    client-certificate-data: <some long base64 string here>
    client-key-data: <some long base64 string here>
    token: <some secret string of hexadecimal chars here>

在 GitLab 表单中,我必须输入这些字段:

    Kubernetes 集群名称 API 网址 CA 证书 - 证书颁发机构捆绑包(PEM 格式) 令牌 项目命名空间(可选,唯一)

我尝试了这些值:

    我将&lt;kubernetes-cluster-name&gt; 与 azure 上的集群名称和.kube/config 文件上的集群名称相匹配。 我把从.kube/config文件复制过来的网址https://&lt;resource-group-name+some-hexadecimal-chars&gt;.hcp.westeurope.azmk8s.io:443。 我首先尝试了 .kube/config 文件中的 certificate-authority-data,但没有成功,我已经尝试了 .kube/config 文件中的所有三个 base64 字符串,但都没有成功。 我从.kube/config 文件中放入了令牌。 将此留空,因为它是可选的。

在 GitLab 中,当我尝试点击按钮 Install 安装 Helm Tiller 时,出现此错误:

Something went wrong while installing Helm Tiller
Can't start installation process. nested asn1 error

有时我会收到此错误:

Kubernetes error: SSL_connect returned=1 errno=0 state=error: certificate verify failed

我从昨天开始就在努力让它工作,用谷歌搜索了很多,没有找到任何东西。

我认为问题出在第三个字段 CA 证书上,也许还有其他方法可以从命令行 azkubectl 获取此内容。

这里有人已经将 Kubernetes 从 GitLab 集成到 Azure AKS 工作了吗?

【问题讨论】:

【参考方案1】:

后来我发现.kube/config文件的certificate-authority-data中的base64字符串我正在将其内容复制到GitLab“添加Kubernetes集群”表单的CA Certificate字段中,它是PEM格式,但是base64 编码。

PEM 格式已经是证书位的 base64 编码表示,但中间有一些换行符。整个内容在发送到.kube/config 之前再次经过base64 编码,因此变成了一个大的base64 单行字符串。

我只需要对这个大的单行字符串进行 base64 解码(我在 Chrome 的控制台窗口中使用了 javascript atob("....")),是什么给了我这样的东西:

-----BEGIN CERTIFICATE-----
MIIEyDCCArCgAwIBAgIRAOL3N8oMIwWIxcFTZhTkfgMwDQYJKoZIhvcNAQELBQAw
...
...
...
5gP7yoL1peZ+AWjCgcUVZYiItqrBLpWYDgY9g8btYDUIiWlqkmC0+kBaPfwCtckx
cUp3vlwRITrv0mzrxiQjTLTUpEy7EcD+U6IecA==
-----END CERTIFICATE-----

然后我只是将此内容复制到 GitLab 的“CA 证书”字段中,它就起作用了。

【讨论】:

谢谢!你的提示真的帮助了我!我不知道 base64 编码。 嘿,只是想补充一点,您可以运行以下命令为您执行此操作:kubectl config view --raw -o jsonpath=".clusters[?(@.name == 'YOUR_CLUSTER_NAME')].cluster.certificate-authority-data" | base64 -d | openssl x509 -text

以上是关于如何将 Azure AKS Kubernetes 集群自签名 CA 添加到 GitLab CI/CD Kubernetes 集成?的主要内容,如果未能解决你的问题,请参考以下文章

在 Azure AKS 中使用 Kubernetes Ingress 都有哪些优势

错误:在 Azure Kubernetes 服务 (AKS) 中轮换证书

是否有用于 Azure AKS(Azure kubernetes 服务)集群的 API 网关

停止 AKS(Azure 托管 Kubernetes)中的所有计算

Shell (ssh) 到 Azure AKS (Kubernetes) 群集工作节点

AKS(Azure Kubernetes 服务)和 SQL