服务网格简介
服务网格(Service Mesh)是为解决微服务的通信和治理而呈现的一种架构模式。

服务网格将服务间通信以及与此相关的管理控制性能从业务程序中下移到一个基础设施层,从而彻底隔离了业务逻辑和服务通信两个关注点。采纳服务网格后,利用开发者只须要关注并实现利用业务逻辑。服务之间的通信,包含服务发现,通信的可靠性,通信的安全性,服务路由等由服务网格层进行解决,并对应用程序通明。

让咱们来回顾一下微服务架构的倒退过程。在呈现服务网格之前,咱们在微服务应用程序过程内解决服务通信逻辑,包含服务发现,熔断,重试,超时等逻辑,如下图所示: 
 
因为通信代理过程和利用过程一起部署,因而形象地把这种部署形式称为“sidecar”(三轮摩托的挎斗)。 
 
利用间的所有流量都须要通过代理,因为代理以sidecar形式和利用部署在同一台主机上,利用和代理之间的通信被认为是牢靠的。而后由代理来负责找到目标服务并负责通信的可靠性和平安等问题。

当服务大量部署时,随着服务部署的sidecar代理之间的连贯造成了一个如下图所示的网格,被称之为Service Mesh(服务网格),从而得出如下的服务网格定义。

服务网格是一个基础设施层,用于解决服务间通信。云原生利用有着简单的服务拓扑,服务网格保障申请能够在这些拓扑中牢靠地穿梭。在理论利用当中,服务网格通常是由一系列轻量级的网络代理组成的,它们与应用程序部署在一起,但应用程序不须要晓得它们的存在。

一、下载Istio

[root@k8s-master ~]# curl -L https://istio.io/downloadIstio | sh -wget https://github.com/istio/istio/releases/download/1.8.0/istio-1.8.0-linux-amd64.tar.gz[root@k8s-master ~]# tar -zxvf istio-1.8.0-linux-amd64.tar.gz -C /usr/local/[root@k8s-master ~]# vim /etc/profile增加:export PATH=$PATH:/usr/local/istio-1.8.0/bin/ [root@k8s-master ~]# source /etc/profile

二. 装置istio

[root@master49 templates]# kubectl get apiservices -n kube-system |grep metrics-serverv1beta1.metrics.k8s.io                 kube-system/metrics-server   True        13m[root@master49 templates]# kubectl top nodesNAME       CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   master49   366m         9%     1728Mi          14%       master50   376m         9%     2359Mi          19%       master56   344m         8%     2049Mi          17%       node52     2879m        11%    65938Mi         31%       node53     1226m        5%     31879Mi         15% [root@master49 tmp]# kubectl create namespace istio-system[root@master49 tmp]# istioctl x precheckIstio already installed in namespace "istio-system".  Skipping pre-check.  Confirm with 'istioctl verify-install'.Use 'istioctl upgrade' to upgrade or 'istioctl install --set revision=<revision>' to install another control plane.[root@master49 tmp]# istioctl manifest generate --set profile=demo > /tmp/generated-manifest.yaml[root@master49 tmp]# kubectl apply -y /tmp/generated-manifest.yaml

三、显示可用配置文件的列表

[root@master49 templates]# istioctl profile listIstio configuration profiles:    empty    minimal    preview    remote    default    demo
  • minimal: 应用Istio的流量治理性能所需的起码组件集。
  • remote: 用于配置共享管制立体的多集群服务网格 multicluster mesh。
  • sds: 相似于默认配置文件,但也启用 Istio 的 SDS(机密发现服务)。此配置文件附带默认状况下启用的其余身份验证性能(严格双向TLS)。
  • demo: 旨在展现 Istio 性能且资源需要适中的配置。适宜运行 Bookinfo 应用程序和相干工作。这是随疾速入门阐明一起装置的配置,然而,如果您想摸索更高级的工作,则能够稍后自定义配置以启用其余性能。 此配置文件可实现高级别的跟踪和拜访日志记录,因而不适宜进行性能测试。
  • default: 依据 IstioControlPlaneAPI 的默认设置启用组件(倡议用于生产部署)。

在零碎上装置 部署istio

 [root@master49 tmp]# istioctl install --set profile=demo -yDetected that your cluster does not support third party JWT authentication. Falling back to less secure first party JWT. See https://istio.io/docs/ops/best-practices/security/#configure-third-party-service-account-tokens for details.✔ Istio core installed                                                                                                                                 ✔ Istiod installed                                                                                                                                     ✔ Ingress gateways installed                                                                                                                           ✔ Egress gateways installed                                                                                                                            ✔ Installation complete [root@master49 templates]# kubectl get pod -n istio-system -o wideNAME                                    READY   STATUS    RESTARTS   AGE     IP             NODE     NOMINATED NODE   READINESS GATESistio-egressgateway-5589c5994-6hv2d     1/1     Running   0          4h13m   10.17.38.252   node53   <none>           <none>istio-ingressgateway-5848876c99-6v649   1/1     Running   0          4h13m   10.17.38.204   node53   <none>           <none>istiod-7db8c5c846-f4sml                 1/1     Running   0          4h13m   10.17.38.200   node53   <none>           <none>留神:批改istio-ingressgateway的服务裸露类型[root@master49 tmp]# kubectl patch service istio-ingressgateway -n istio-system -p '{"spec":{"type":"NodePort"}}'service/istio-ingressgateway patched

test

### 发版前[root@master49 tmp]# kubectl get pod | grep saasdevpipeline-saas-back-profile-a-6cd5774767-jkzhz                  1/1     Running   0          45mlogstash-saas-back-profile-a-d85c497bb-w7v7g                      1/1     Running   0          18hqasapipeline-saas-back-profile-a-6cd746c664-gz4xj                 1/1     Running   0          19m[root@master49 tmp]# cat lll.yaml apiVersion: apps/v1kind: Deploymentmetadata:  name: devpipeline-saas-back-profile-aspec:  replicas: 1  minReadySeconds: 30 #滚动降级时120s后认为该pod就绪  strategy:    rollingUpdate:  ##因为replicas为3,则整个降级,pod个数在2-4个之间      maxSurge: 1      #滚动降级时会先启动1个pod      maxUnavailable: 0 #滚动降级时容许的最大Unavailable的pod个数  selector:     matchLabels:        app: devpipeline-saas-back        profile: profile-a  template:    metadata:      labels:         app: devpipeline-saas-back        profile: profile-a    spec:      terminationGracePeriodSeconds: 40 ##k8s将会给利用发送SIGTERM信号,能够用来正确、优雅地敞开利用,默认为30秒      volumes:      - name: "cephfs-fuse"        hostPath:          path: "/data/WEBLOG"      - name: "preproductnfs"        hostPath:          path: "/home/nfs"      containers:      - name: devpipeline-saas-back-profile-a        image: harbor.reg/test_jinfu/devpipeline-saas-back:949f788-10        imagePullPolicy: IfNotPresent        volumeMounts:        - name: cephfs-fuse          mountPath: /data/WEBLOG        - name: preproductnfs          mountPath: /home/nfs        resources:          limits:            memory: 2500Mi          requests:            memory: 2000Mi        ports:        - containerPort: 8080        env:        - name: app_name          value: devpipeline-saas-back-profile-a        - name: project_name          value: devpipeline-saas-back        lifecycle:           preStop:            exec:              command: ["/bin/sh","-c","/jar-stop.sh"]          readinessProbe:          httpGet:            path: /api/v1/Status/Version            port: 8080          initialDelaySeconds: 10 #用来示意初始化提早的工夫,也就是通知监测从多久之后开始运行,单位是秒          periodSeconds: 40 #没隔多久执行一次探测          successThreshold: 1 #失败后查看胜利的最小间断胜利次数          timeoutSeconds: 2 #用来示意监测的超时工夫,如果超过这个时长后,则认为监测失败 ---apiVersion: v1kind: Servicemetadata:  name: devpipeline-saas-back-profile-a  labels:    app: devpipeline-saas-back    profile: profile-aspec:  selector:    app: devpipeline-saas-back    profile: profile-a  type: NodePort  ports:  - port: 8080    targetPort: 8080    nodePort: 32111### 发版后[root@master49 tmp]# kubectl get pod | grep saasdevpipeline-saas-back-profile-a-6cd5774767-jkzhz                  2/2     Running   0          2m15slogstash-saas-back-profile-a-d85c497bb-w7v7g                      2/2     Running   0          18hqasapipeline-saas-back-profile-a-6cd746c664-gz4xj                 1/1     Running   0          19m