服务网格简介
服务网格(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

image.png


[root@master49 templates]# kubectl get apiservices -n kube-system |grep metrics-server
v1beta1.metrics.k8s.io                 kube-system/metrics-server   True        13m
[root@master49 templates]# kubectl top nodes
NAME       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 precheck
Istio 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 list
Istio 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 -y
Detected 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 wide
NAME                                    READY   STATUS    RESTARTS   AGE     IP             NODE     NOMINATED NODE   READINESS GATES
istio-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 saas
devpipeline-saas-back-profile-a-6cd5774767-jkzhz                  1/1     Running   0          45m
logstash-saas-back-profile-a-d85c497bb-w7v7g                      1/1     Running   0          18h
qasapipeline-saas-back-profile-a-6cd746c664-gz4xj                 1/1     Running   0          19m




[root@master49 tmp]# cat lll.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: devpipeline-saas-back-profile-a
spec:
  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: v1
kind: Service
metadata:
  name: devpipeline-saas-back-profile-a
  labels:
    app: devpipeline-saas-back
    profile: profile-a
spec:
  selector:
    app: devpipeline-saas-back
    profile: profile-a
  type: NodePort
  ports:
  - port: 8080
    targetPort: 8080
    nodePort: 32111



### 发版后

[root@master49 tmp]# kubectl get pod | grep saas
devpipeline-saas-back-profile-a-6cd5774767-jkzhz                  2/2     Running   0          2m15s
logstash-saas-back-profile-a-d85c497bb-w7v7g                      2/2     Running   0          18h
qasapipeline-saas-back-profile-a-6cd746c664-gz4xj                 1/1     Running   0          19m


锅包肉
89 声望17 粉丝

这个人很懒,没有什么说的。