Istio 1.6 使用 Cert-Manager 加密 Istio网关

这个例子演示了在 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。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345