Kubernetes的附加组件cert-manager

发布时间:2020年02月18日 阅读:186 次

cert-manager是Kubernetes的附加组件,用于自动管理和颁发各种发行来源的TLS证书。

它将确保证书有效并定期更新,并在到期前尝试在适当的时间更新证书。支持 Let’s Encrypt(一个非盈利性的证书颁发机构), HashiCorp Vault 这些免费证书的签发。

项目地址:https://github.com/jetstack/cert-manager

部署文档:https://cert-manager.io/docs/installation/kubernetes/

k8s版本号:
root@k8s-1:~/ldap/cert# kubectl version
Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.2", GitCommit:"66049e3b21efe110454d67df4fa62b08ea79a19b", GitTreeState:"clean", BuildDate:"2019-05-16T16:23:09Z", GoVersion:"go1.12.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.2", GitCommit:"66049e3b21efe110454d67df4fa62b08ea79a19b", GitTreeState:"clean", BuildDate:"2019-05-16T16:14:56Z", GoVersion:"go1.12.5", Compiler:"gc", Platform:"linux/amd64"}

创建一个名称空间以在其中运行cert-manager

$ kubectl create namespace cert-manager

现在,我们可以继续安装cert-manager。所有资源(CustomResourceDefinitions,cert-manager和webhook组件)都包含在单个YAML清单文件中:

安装CustomResourceDefinitions和证书管理器本身

$ kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.13.0/cert-manager.yaml

注意:如果您正在运行Kubernetes v1.15或更低版本,则需要在该命令上方添加该 --validate=false标志kubectl apply,否则您将收到与x-kubernetes-preserve-unknown-fieldscert-manager CustomResourceDefinition资源中字段 有关的验证错误 这是一个良性错误,由于kubectl执行资源验证的方式而发生

此时需要点时间:因为网络原因拉取yml文件什么的
root@k8s-1:~/ldap/cert# kubectl get pod -n cert-manager                                                                                      
NAME                                       READY   STATUS    RESTARTS   AGE
cert-manager-7f46f4ffdd-pj9qd              1/1     Running   0          45m
cert-manager-cainjector-67ff67fd45-zfhn4   1/1     Running   0          45m
cert-manager-webhook-5c8cf6d9d4-8npr8      1/1     Running   0          45m


部署完测试是否部署成功:创建一个Issuer以测试Webhook正常工作

root@k8s-1:~/ldap/cert# cat test-resources.yaml 
apiVersion: v1
kind: Namespace
metadata:
  name: cert-manager-test
---
#创建仅支持单个namespace的Issuer
apiVersion: cert-manager.io/v1alpha2      
kind: Issuer
metadata:
  name: test-selfsigned
  namespace: cert-manager-test
spec:
  selfSigned: {}    #自签发类型       
---
#创建证书
apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
  name: selfsigned-cert
  namespace: cert-manager-test
spec:
  dnsNames: 
    - example.com
  secretName: selfsigned-cert-tls
  issuerRef:
    name: test-selfsigned

创建测试资源。

$ kubectl apply -f test-resources.yaml


检查新创建证书的状态。您可能需要等待几秒钟,然后cert-manager才能处理证书请求。

root@k8s-1:~/ldap/cert# kubectl describe certificate -n cert-manager-test
Name:         selfsigned-cert
Namespace:    cert-manager-test
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"cert-manager.io/v1alpha2","kind":"Certificate","metadata":{"annotations":{},"name":"selfsigned-cert","namespace":"cert-mana...
API Version:  cert-manager.io/v1alpha2
Kind:         Certificate
Metadata:
  Creation Timestamp:  2020-02-18T05:13:51Z
  Generation:          1
  Resource Version:    113265
  Self Link:           /apis/cert-manager.io/v1alpha2/namespaces/cert-manager-test/certificates/selfsigned-cert
  UID:                 735ef390-520d-11ea-8b7a-fa163eec0c88
Spec:
  Dns Names:
    example.com
  Issuer Ref:
    Name:       test-selfsigned
  Secret Name:  selfsigned-cert-tls
Status:
  Conditions:
    Last Transition Time:  2020-02-18T05:13:51Z
    Message:               Certificate is up to date and has not expired
    Reason:                Ready
    Status:                True
    Type:                  Ready
  Not After:               2020-05-18T05:13:51Z
Events:
  Type    Reason        Age   From          Message
  ----    ------        ----  ----          -------
  Normal  GeneratedKey  11s   cert-manager  Generated a new private key
  Normal  Requested     11s   cert-manager  Created new CertificateRequest resource "selfsigned-cert-504566127"
  Normal  Issued        11s   cert-manager  Certificate issued successfully

Certificate issued successfully显示是成功了!!!


为了配置证书管理器以开始颁发证书, 必须先创建IssuerClusterIssuer资源。这些资源代表特定的签名机构,并详细说明如何满足证书请求。您可以在Issuers 这里阅读更多有关概念的信息

issuers:只能用来签发自己所在 namespace 下的证书
clusterissuers:可以签发任意 namespace 下的证书

创建完Issuer后怎么使用创建证书方法:https://cert-manager.io/docs/usage/


支持的证书发类型:
SelfSigned   #自签发,最简单方式
CA                  #这个ca是说的是能签发的根证书ca,而不是被签发的证书
Vault             #代表证书颁发机构-可以用来签署您的公钥基础设施(PKI)证书的多用途秘密存储
Venafi           #可以从Venafi CloudVenafi Trust Protection Platform实例获取证书
External       #支持外部Issuer类型
ACME


ACME颁发者类型表示在自动证书管理环境(ACME)证书颁发机构服务器中注册的单个帐户。当您创建新的ACME时Issuer,cert-manager将生成一个私钥,该私钥用于通过ACME服务器识别您的身份。

默认情况下,通常由客户端的计算机信任由公共ACME服务器颁发的证书。这意味着,例如,访问由该URL颁发的ACME证书支持的网站,默认情况下,大多数客户端的Web浏览器都会信任该网站。ACME证书通常是免费的。


下面我举例俩个例子:我采用的是第二个


1.CA颁发者代表一个证书颁发机构,据此证书颁发机构的证书和私钥作为Kubernetes存储在群集中Secret,并将用于签署传入的证书请求。然后可以使用此内部CA证书来信任生成的签名证书。

部署方式

为了创建您的CA颁发者,您必须首先将您的CA证书和签名私钥提交给Kubernetes API服务器,以便证书管理器能够检索它们并签署证书。这个秘密应该驻留在相同的命名空间Issuer,或以其他方式在Cluster Resource Namespace中的情况ClusterIssuerCluster Resource Namespace被默认为是cert-manager命名空间中,但是可以被配置为使用所述 --cluster-resource-namespace标志的证书管理器控制器组件。

以下是将用于签名的秘密资源的示例。记下每个字段使用的索引密钥,因为这是证书管理者查找证书和密钥所必需的。还要注意,像所有机密一样,数据必须是base64编码的。该命令$ cat crt.pem | base64将在这里为您提供帮助。

apiVersion: v1
kind: Secret
metadata:
  name: ca-key-pair
  namespace: sandbox
data:
  tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMrVENDQWVHZ0F3SUJBZ0lKQUtQR3dLRGwvNUhuTUEwR0NTcUdTSWIzRFFFQkN3VUFNQk14RVRBUEJnTlYKQkFNTUNHcHZjMmgyWVc1c01CNFhEVEU1TURneU1qRTJNRFUxT0ZvWERUSTVNRGd4T1RFMk1EVTFPRm93RXpFUgpNQThHQTFVRUF3d0lhbTl6YUhaaGJtd3dnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCCkFRQ3doU0IvcVc2L2tMYjJ6cHUrRUp2RDl3SEZhcStRQS8wSkgvTGxseW83ekFGeCtISHErQ09BYmsrQzhCNHQKL0hVRXNuczVSTDA5Q1orWDRqNnBiSkZkS2R1UHhYdTVaVllua3hZcFVEVTd5ZzdPU0tTWnpUbklaNzIzc01zMApSNmpZbi9Ecmo0eFhNSkVmSFVEcVllU1dsWnIzcWkxRUZhMGM3ZlZEeEgrNHh0WnROTkZPakg3YzZEL3ZXa0lnCldRVXhpd3Vzc2U2S01PV2pEbnYvNFZyamVsMlFnVVlVYkhDeWVaSG1jdGkrSzBMV0Nmby9SZzZQdWx3cmJEa2gKam1PZ1l0MzBwZGhYME9aa0F1a2xmVURIZnA4YmpiQ29JMnRhWUFCQTZBS2pLc08zNUxBRVU3OUNMMW1MVkh1WgpBQ0k1VWppamEzVlBXVkhTd21KUEp5dXhBZ01CQUFHalVEQk9NQjBHQTFVZERnUVdCQlFtbDVkVEFaaXhGS2hqCjkzd3VjUldoYW8vdFFqQWZCZ05WSFNNRUdEQVdnQlFtbDVkVEFaaXhGS2hqOTN3dWNSV2hhby90UWpBTUJnTlYKSFJNRUJUQURBUUgvTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFCK2tsa1JOSlVLQkxYOHlZa3l1VTJSSGNCdgpHaG1tRGpKSXNPSkhac29ZWGRMbEcxcFpORmpqUGFPTDh2aDQ0Vmw5OFJoRVpCSHNMVDFLTWJwMXN1NkNxajByClVHMWtwUkJlZitJT01UNE1VN3ZSSUNpN1VPbFJMcDFXcDBGOGxhM2hQT2NSYjJ5T2ZGcVhYeVpXWGY0dDBCNDUKdEhpK1pDTkhCOUZ4alNSeWNiR1lWaytUS3B2aEphU1lOTUdKM2R4REthUDcrRHgzWGNLNnNBbklBa2h5SThhagpOVSttdzgvdG1Sa1A0SW4va1hBUitSaTBxVW1Iai92d3ZuazRLbTdaVXkxRllIOERNZVM1TmtzbisvdUhsUnhSClY3RG5uMDM5VFJtZ0tiQXFONzJnS05MbzVjWit5L1lxREFZSFlybjk4U1FUOUpEZ3RJL0svQVRwVzhkWAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
  tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBc0lVZ2Y2bHV2NUMyOXM2YnZoQ2J3L2NCeFdxdmtBUDlDUi95NVpjcU84d0JjZmh4CjZ2Z2pnRzVQZ3ZBZUxmeDFCTEo3T1VTOVBRbWZsK0krcVd5UlhTbmJqOFY3dVdWV0o1TVdLVkExTzhvT3praWsKbWMwNXlHZTl0N0RMTkVlbzJKL3c2NCtNVnpDUkh4MUE2bUhrbHBXYTk2b3RSQld0SE8zMVE4Ui91TWJXYlRUUgpUb3grM09nLzcxcENJRmtGTVlzTHJMSHVpakRsb3c1Ny8rRmE0M3Bka0lGR0ZHeHdzbm1SNW5MWXZpdEMxZ242ClAwWU9qN3BjSzJ3NUlZNWpvR0xkOUtYWVY5RG1aQUxwSlgxQXgzNmZHNDJ3cUNOcldtQUFRT2dDb3lyRHQrU3cKQkZPL1FpOVppMVI3bVFBaU9WSTRvMnQxVDFsUjBzSmlUeWNyc1FJREFRQUJBb0lCQUNFTkhET3JGdGg1a1RpUApJT3dxa2UvVVhSbUl5MHlNNHFFRndXWXBzcmUxa0FPMkFDWjl4YS96ZDZITnNlanNYMEM4NW9PbmtrTk9mUHBrClcxVS94Y3dLM1ZpRElwSnBIZ09VNzg1V2ZWRXZtU3dZdi9Fb1V3eHFHRVMvcnB5Z1drWU5WSC9XeGZGQlg3clMKc0dmeVltbXJvM09DQXEyLzNVVVFiUjcrT09md3kzSHdUdTBRdW5FSnBFbWU2RXdzdWIwZzhTTGp2cEpjSHZTbQpPQlNKSXJyL1RjcFRITjVPc1h1Vm5FTlVqV3BBUmRQT1NrRFZHbWtCbnkyaVZURElST3NGbmV1RUZ1NitXOWpqCmhlb1hNN2czbkE0NmlLenUzR0YwRWhLOFkzWjRmeE42NERkbWNBWnphaU1vMFJVaktWTFVqbVlQSEUxWWZVK3AKMkNYb3dNRUNnWUVBMTgyaU52UEkwVVlWaUh5blhKclNzd1YrcTlTRStvVi90U2ZSUUNGU2xsV0d3KzYyblRiVwpvNXpoL1RDQW9VTVNSbUFPZ0xKWU1LZUZ1SWdvTEoxN1pvWjN0U1czTlVtMmRpT0lPSHorcTQxQzM5MDRrUzM5CjkrYkFtVmtaSFA5VktLOEMraS9tek5mSkdHZEJadGIweWtTM2t3OUIxTHdnT3o3MDhFeXFSQ2tDZ1lFQTBXWlAKbzF2MThnV2tMK2FnUDFvOE13eDRPZlpTN3dKY3E0Z0xnUWhjYS9pSkttY0x0RFN4cUJHckJ4UVo0WTIyazlzdQpzTFVrNEJobGlVM29iUUJNaUdtMGtITHVBSEFRNmJvdWZBMUJwZjN2VFdHSkhSRjRMeFJsNzc2akw4UXI4VnpxClpURVBtY0R0T0hpYjdwb2I1Z2IzSDhiVGhYeUhmdGZxRW55alhFa0NnWUVBdk9DdDZZclZhTlQrWThjMmRFYk4Kd3dJOExBaUZtdjdkRjZFUjlCODJPWDRCeGR0WTJhRDFtNTNqN2NaVnpzNzFYOE1TN25FcDN1dkFqaElkbDI3KwpZbTJ1dUUyYVhIbDN5VTZ3RzBETFpUcnVIU0Z5TVI4ZithbHRTTXBDd0s1NXluSGpHVFp6dXpYaVBBbWpwRzdmCk1XbVRncE1IK3puc3UrNE9VNFBHUW9FQ2dZQWNqdUdKbS84YzlOd0JsR2lDZTJIK2JGTHhSTURteStHcm16QkcKZHNkMENqOWF3eGI3aXJ3MytjRGpoRUJMWExKcjA5YTRUdHdxbStrdElxenlRTG92V0l0QnNBcjVrRThlTVVBcAp0djBmRUZUVXJ0cXVWaldYNWlaSTNpMFBWS2ZSa1NSK2pJUmVLY3V3aWZKcVJpWkw1dU5KT0NxYzUvRHF3Yk93CnRjTHAwUUtCZ0VwdEw1SU10Sk5EQnBXbllmN0F5QVBhc0RWRE9aTEhNUGRpL2dvNitjSmdpUmtMYWt3eUpjV3IKU25QSG1TbFE0aEluNGMrNW1lbHBDWFdJaklLRCtjcTlxT2xmQmRtaWtYb2RVQ2pqWUJjNnVGQ1QrNWRkMWM4RwpiUkJQOUNtWk9GL0hOcHN0MEgxenhNd1crUHk5Q2VnR3hhZ0ZCekxzVW84N0xWR2h0VFFZCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==

接下来是部署引用此的CA颁发者Secret通过引用规范中ca节中的秘密名称来完成此操作Issuer

apiVersion: cert-manager.io/v1alpha2
kind: Issuer
metadata:
  name: ca-issuer
  namespace: sandbox
spec:
  ca:
    secretName: ca-key-pair


部署后,您可以通过检查证书的就绪状态来检查发行者是否已成功配置。如果已部署,请替换为issuers 此处clusterissuers
issuers:只能用来签发自己所在 namespace 下的证书
clusterissuers:可以签发任意 namespace 下的证书

为CLI配置。

$ kubectl get issuers ca-issuer -n sandbox -o wide
NAME          READY   STATUS                AGE
ca-issuer     True    Signing CA verified   2m


现在可以使用Issuer命名 空间中命名的CA来请求证书ca-issuersandbox


2.ACME

Let’s Encrypt的证书类型(一个非盈利性的证书颁发机构)

我们先创建个clusterissuers的签发机构


apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    email: guleng@example.com
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: example-issuer-account-key
    http01: {}

root@k8s-1:~/ldap/cert/acme# kubectl  get clusterissuers.cert-manager.io
NAME                  READY   AGE
letsencrypt-prod   True    35s


有了签发机构,接下来我们就可以生成免费证书了,cert-manager 给我们提供了 Certificate 这个用于生成证书的自定义CRD对象,它必须局限在某一个 namespace 下,证书最终会在这个 namespace 下以 Secret 的资源对象存储,假如我想在 dashboard 这个 namespace 下生成免费证书(这个 namespace 已存在),创建一个 Certificate 对象:

apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
  name: dashboard-aibee-cn
  namespace: kube-system
spec:
  secretName: example-issuer-account-key
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer
  dnsNames:
  - dashboard.aibee.cn
  acme:
    config:
    - http01:
        ingressClass: nginx
      domains:
      - dashboard.aibee.cn





Tag:cert-manager k8s
相关文章

发表评论: