• 云原生应用综合练习上


    前面分类介绍各模块知识,此篇博客将开展综合练习,练习的例子是Istio官网的bookinfo这个应用。bookinfo的架构如下所示,可以看到不同的服务才用了不同的技术栈,但是通过image部署,可以屏蔽掉不同技术栈带来的部署差异问题。

    productpage会调用details和reviews两个微服务,用来生成前端页面。
    details中包含了书籍的信息。
    reviews中包含了书籍相关的评论,它会调用ratings微服务。
    ratings中包含了由书籍评价组成的评级信息。
    reviews有3个版本,可用来展示各服务间的链路调用关系
    v1版本不会调用ratings服务。
    v2版本会调用ratings服务,并使用1到5个黑色图标显示评分信息。
    v3版本会调用ratings服务,并使用1到5个红色图标显示评分信息。

    综合练习中将涉及9个小案例练习,具体练习如下所示:

      一:接下来开始第一个Task练习:将bookInfo应用发布到Istio Ingress网关

    1.1:用如下命令安装Istio。

    1. curl -L https://istio.io/downloadIstio | sh -
    2. cd istio-1.xx.0
    3. cp bin/istioctl /usr/local/bin
    4. istioctl install --set profile=demo -y

    1.2:将Istio官网下的BookInfo应用和网关配置copy过来,部署到集群上,yaml文件地址如下

    1. samples/bookinfo/platform/kube/bookinfo.yaml
    2. samples/bookinfo/networking/bookinfo-gateway.yaml

    bookinfo-gateway.yaml文件的配置如下所示,可以看到VirtualService中将流量导入到后端的productpage应用上。

     1.3:查看Istio Ingress的svc的端口信息。

    1.4:在外网通过node节点IP地址+svc端口信息访问bookinfo应用中的productpage,访问结果如下所示,说明应用被成功发布到了网关上。

    二:接下来进行第二个Task,增加安全机制,将http访问方式转换成https

    2.1: 生成x509的证书并存放到secret对象里面。因为是通过node节点IP访问的应用,所有生成证书时Inc./CN=node节点IP。

    1. openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -subj '/O=cncamp Inc./CN=node节点IP' -keyout bookinfo.key -out bookinfo.crt
    2. kubectl create -n istio-system secret tls bookinfo-credential --key=bookinfo.key --cert=bookinfo.crt

    2.2: 配置新的Gateway,Gateway里面配置上https的credentials.

    1. apiVersion: networking.istio.io/v1beta1
    2. kind: Gateway
    3. metadata:
    4. name: bookinfo-gateway
    5. spec:
    6. selector:
    7. istio: ingressgateway
    8. servers:
    9. - hosts:
    10. - '*'
    11. port:
    12. name: https-bookinfo
    13. number: 443
    14. protocol: HTTPS
    15. tls:
    16. mode: SIMPLE
    17. credentialName: bookinfo-credential

    2.3:在safari上通过https方式访问应用,信任网站后,访问成功。结果如下(备注:如果用chrome访问会失败,因为是自签发的证书)。因为是https方式,所以这里是node节点IP加31287端口。

    三:接下来开始第三个Task,开启mTLS

    3.1:通过productpage 的SVC地址访问应用,访问成功。

    3.2:在isto-system根namespace下创建PeerAuthentication对象.

    (kubectl apply -f mtls.yaml -n istio-system)

    1. apiVersion: security.istio.io/v1beta1
    2. kind: PeerAuthentication
    3. metadata:
    4. name: "default"
    5. spec:
    6. mtls:
    7. mode: STRICT

     3.3: 再次通过SVC地址应用,访问会失败,request被peer reset了。

     浏览器通过https访问应用,仍然能成功。

    可以看到通过启动全链路的mTLS,这样不在Istio管控内的直接去访问后端应用是不成功,但是浏览器访问仍然成功,因为浏览器是把请求发送给Istio Ingress Gateway,Gateway再转发到后端服务。这样从浏览器到Ingress Gateway是单向的TLS访问,Gateway到后端服务是mTLS,这样就增强了访问的安全。

    第四:接着再进入第四个Task,给应用进行认证和授权,保证被允许的客户端才能访问到应用。

    4.1: 创建RequestAuthentication和AthorizationPoliy.RequestAuthentication中定义了如果访问details服务,需要验证token。AuthorizationPoliy中定义访问服务的客户端必须带上由“testing@secure.istio.io/testing@secure.istio.io”签发的Token才允许访问。

    1. apiVersion: security.istio.io/v1beta1
    2. kind: RequestAuthentication
    3. metadata:
    4. name: "details"
    5. spec:
    6. selector:
    7. matchLabels:
    8. app: details
    9. jwtRules:
    10. - issuer: "testing@secure.istio.io"
    11. jwksUri: "https://raw.githubusercontent.com/istio/istio/release-1.12/security/tools/jwt/samples/jwks.json"
    1. apiVersion: security.istio.io/v1beta1
    2. kind: AuthorizationPolicy
    3. metadata:
    4. name: require-jwt
    5. spec:
    6. selector:
    7. matchLabels:
    8. app: details
    9. action: ALLOW
    10. rules:
    11. - from:
    12. - source:
    13. requestPrincipals: ["testing@secure.istio.io/testing@secure.istio.io"]

    4.2:查看ProductPage服务,这个服务就访问了Details服务。

    4.3:创建上面的认证和授权对象后,再次访问productpage服务,可以看到details服务已经无法访问了。因为productpage在访问details服务时并没有带着token进行访问。

    4.4:如果要重新访问details服务,那么productpage服务需要进行代码修改,带上有效token访问details才行。通过上面的例子可以看到通过配置认证和授权,微服务间的访问都需要带上有效token才行,而客户端在获取token时,就能对客户端进行认证和授权。通过这种方式让微服务间的访问更加安全。

    五:接下来再演示如果浏览器中输入了http,如何自动跳转成https访问方式,让客户体验更好

    5.1:配置Gateway,增加https redirect跳转即可完成自动跳转。

    1. apiVersion: networking.istio.io/v1beta1
    2. kind: Gateway
    3. metadata:
    4. name: bookinfo-gateway
    5. spec:
    6. selector:
    7. istio: ingressgateway
    8. servers:
    9. - hosts:
    10. - '*'
    11. port:
    12. name: https-bookinfo
    13. number: 443
    14. protocol: HTTPS
    15. tls:
    16. mode: SIMPLE
    17. credentialName: bookinfo-credential
    18. - hosts:
    19. - '*'
    20. port:
    21. name: http-bookinfo
    22. number: 80
    23. protocol: HTTP
    24. tls:
    25. httpsRedirect: true

    5.2:在集群里面,通过ingress gateway的svc的IP地址访问productpage,用http方式访问,http映射到80端口,可以看到会自动化跳转到443端口上,也就是https方式访问。

    以上就是对前面五个场景的练习,在下一篇博客中将对后面4个场景进行练习。

  • 相关阅读:
    简易LDO设计(包含原理图、PCB和实验)
    线程的深度剖析
    LVS+Keepalived 高可用集群
    redis方法 setIfAbsent
    acwing第77场周赛 前两题
    阿里提前批(阿里云)一面30min
    低代码物联网平台的业务应用场景有哪些?
    后端php项目和数据库启动
    《嵌入式 – GD32开发实战指南》第19章 程序加密
    面试:插件化相关---资源
  • 原文地址:https://blog.csdn.net/qiaotl/article/details/126034012