美文网首页
Istio 1.6 使用 Cert-Manager 加密 Ist

Istio 1.6 使用 Cert-Manager 加密 Ist

作者: cjzhao | 来源:发表于2020-05-30 07:47 被阅读0次

    这个例子演示了在 Istio 中使用 Let's Encrypt 签发 TLS 证书为Istio网关提供安全加固的过程。最终实现通过https的方式访问官方的Bookinfo应用。

    istio1.6版本最新的文档中,删除了使用cert-manager加密k8s ingress部分的内容,本文将从cert-manager的安装开始,介绍如何使用Let's Encrypt签发证书给我们的Istio网关使用。
    istio1.6版本默认开启了 Secrets Discovery Service (SDS) 提供 hot-swapped 功能,因此配置过程相对简单很多。

    安装cert-manager

    cert-manager是Kubernetes原生的证书管理控制器。 它可以帮助您从多种来源颁发证书,例如Let’s Encrypt,HashiCorp Vault,Venafi,简单的签名密钥对或自签名。

    它将确保证书有效并且是最新的,证书到期会自动申请续期。

    可以将其与Istio网关集成以管理TLS证书。

    其架构图如下:


    ar.jpg

    如上图所示,cert-manager会负责从各种渠道的申请证书,然后自动生成kubernetes secrets以供您使用。

    部署cert-manager非常容易,在您的k8s集群创建以下资源即可:

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

    默认情况下,cert-manager将安装到cert-manager名称空间中。

    安装istio 1.6

    istio 1.6的安装完全参考官方文档即可,按顺序执行如下命令:

    $ curl -L https://istio.io/downloadIstio | sh -
    
    $ cd istio-1.6.0
    
    $ export PATH=$PWD/bin:$PATH
    
    $ istioctl manifest apply
    

    如果需要自定义部署的参数,可在istio-1.6.0/manifests/profiles目录内拷贝一个默认的配置进行更改,然后通过下面的命令安装:

    istioctl manifest apply --set profile=istio-1.6.0/manifests/profiles/xxx.yaml
    

    正常情况下默认配置即可,由于我本人的环境用的是某云的容器服务,默认开启了LoadBalance,是收费的服务哦,所以我把istio-ingressgateway的type改为了NodePort,然后通过另一台服务器把80,443端口用nginx做4层转发到NodePort,确保通过外网IP能直接访问到ingressgateway。

    这样,我们的Istio就安装完毕了。

    配置cert-manager的证书颁发机构(Issuer)

    我暂时不说为什么要到这步才配置issuer,大家可以思考一下,本节结尾会给大家解释。

    本例使用Let’s Encrypt的证书,Issuer配置如下:

    apiVersion: cert-manager.io/v1alpha2
    kind: ClusterIssuer
    metadata:
      name: letsencrypt
    spec:
      acme:
        server: https://acme-v02.api.letsencrypt.org/directory
        privateKeySecretRef:
          name: letsencrypt-issuer-account-key
        solvers:
        - http01:
           ingress:
             ingressTemplate:
               metadata:
                 annotations:
                   kubernetes.io/ingress.class: istio
    ---
    apiVersion: cert-manager.io/v1alpha2
    kind: ClusterIssuer
    metadata:
      name: letsencrypt-staging
    spec:
      acme:
        server: https://acme-staging-v02.api.letsencrypt.org/directory
        privateKeySecretRef:
          name: letsencrypt-staging-issuer-account-key
        solvers:
        - http01:
           ingress:
             ingressTemplate:
               metadata:
                 annotations:
                   kubernetes.io/ingress.class: istio
    
    

    我们配置成ClusterIssuer,保存在所有的namespace都可以使用这个Issure为申请证书。

    在Let’s Encrypt申请证书的第一步就是要验证申请方对域名的控制权(所有权),有两种验证方式:

    • 通过配置DNS。
    • 通过Http回调,即Let’s Encrypt会像您申请的域名发送一个http请求,获取相应的凭证,以验证域名的所有权。

    DNS方式需要域名服务商提供相应的SDK才能实现,目前国内主流的厂商都还不支持,所以我们使用Http的方式。

    配置中solvers就是配置http方式验证域名的所有权,申请证书时cert-manager会启动一个pod来响应Let’s Encrypt的请求,并使用kubernetes ingress来暴露在公网。

    那在我们的环境中,使用istio gateway来配置ingress的访问,所以需要加上annotations: kubernetes.io/ingress.class: istio 来告诉istio gateway来处理这个网关的映射。

    这就是为什么我们先要把istio部署上的原因。

    部署BookInfo应用

    执行如下命令部署BookInfo:

    #创建一个新的命名空间:
    kubectl create ns istiodemo
    
    #将BookInfo部署到istiodemo命名空间
    kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -n istiodemo
    
    

    配置证书

    在正式进入这一步之前,我们需要确保我们申请证书的域名test.app.nafanli.com正确的解析到istio gateway对应的公网地址。

    创建证书申请请求:

    apiVersion: cert-manager.io/v1alpha2
    kind: Certificate
    metadata:
      name: ingress-cert
      namespace: istio-system
    spec:
      dnsNames:
        - hello.app.nafanli.com
      secretName: ingress-cert
      issuerRef:
        name: letsencrypt
        kind: ClusterIssuer
    

    执行下面的命令查看证书申请状态:

    kubectl describe cert ingress-cert -n istio-system
    

    如果一切正常,您将会看到如下输出:

    Events:
      Type    Reason        Age   From          Message
      ----    ------        ----  ----          -------
      Normal  GeneratedKey  92s   cert-manager  Generated a new private key
      Normal  Requested     92s   cert-manager  Created new CertificateRequest resource "ingress-cert-538540713"
      Normal  Issued        14s   cert-manager  Certificate issued successfully
    

    表示我们的证书已经申请成功。

    执行以下命令可以查看证书内容:

    kubectl get secret ingress-cert -o yaml -n istio-system
    

    这里就不贴出证书内容了。

    配置BookInfo应用网关

    istio官方的BookInof默认网关是http的,因此,我们先从istio-1.6.0/samples/bookinfo/networking/bookinfo-gateway.yaml拷贝一份来改一改,我们重名命为bookinfo-gateway-tls.yaml,最后修改为https后如下:

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: bookinfo-gateway
    spec:
      selector:
        istio: ingressgateway # use istio default controller
      servers:
      - port:
          number: 443
          name: https
          protocol: HTTPS
        tls:
          mode: SIMPLE
          credentialName: ingress-cert
        hosts:
        - hello.app.nafanli.com
    ---
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: bookinfo
    spec:
      hosts:
      - hello.app.nafanli.com
      gateways:
      - bookinfo-gateway
      http:
      - match:
        - uri:
            exact: /productpage
        - uri:
            prefix: /static
        - uri:
            exact: /login
        - uri:
            exact: /logout
        - uri:
            prefix: /api/v1/products
        route:
        - destination:
            host: productpage
            port:
              number: 9080
    

    这里面要特别注意credentialName: ingress-cert必须和我们刚才申请证书的secret名字完全相同。

    执行下面的命令创建https网关:

    kubectl create -f bookinfo-gateway-tls.yaml -n istiodemo
    

    OK,我们的应用不出意外的话可以通过https://hello.app.nafanli.com/productpage访问到了。

    如下图所示:

    640.png

    我们可以看到由Let's Encrypt颁发的证书,所有主流浏览器都是绿色的。

    Let's Encrypt颁发的证书有效期为3个月,但是cert-manager会在证书到期时自动为你续期,你也不用关心证书会过期的问题了。

    您还会在花很多钱去买证书吗?

    本文到些结束,喜欢关注我们的公众号:fancoder。

    相关文章

      网友评论

          本文标题:Istio 1.6 使用 Cert-Manager 加密 Ist

          本文链接:https://www.haomeiwen.com/subject/rztczhtx.html