Istio 1.5.1部署及实战

Istio

官方文档 https://istio.io/zh/docs
部分资料参考:https://jicki.me/istio/2020/04/13/Istio-1.5/
https://jimmysong.io/istio-handbook/concepts/traffic-management-basic.html

一、基础概念及原理

Istio 是什么?(衣撕丢)

  • 云平台令使用它们的公司受益匪浅。但不可否认的是,上云会给 DevOps 团队带来压力。为了可移植性,开发人员必须使用微服务来构建应用,同时运维人员也正在管理着极端庞大的混合云和多云的部署环境。 Istio 允许您连接、保护、控制和观察服务。
  • 从较高的层面来说,Istio 有助于降低这些部署的复杂性,并减轻开发团队的压力。它是一个完全开源的服务网格,作为透明的一层接入到现有的分布式应用程序里。它也是一个平台,拥有可以集成任何日志、遥测和策略系统的 API 接口。Istio 多样化的特性使您能够成功且高效地运行分布式微服务架构,并提供保护、连接和监控微服务的统一方法。

服务网格 又是什么?

  • 服务网格 - 用来描述组成这些应用程序的微服务网络以及它们之间的交互。随着服务网格的规模和复杂性不断的增长,它将会变得越来越难以理解和管理。它的需求包括服务发现、负载均衡、故障恢复、度量和监控等。服务网格通常还有更复杂的运维需求,比如 A/B 测试、金丝雀发布、速率限制、访问控制和端到端认证。

Istio 架构

image.png
  • Istio 服务网格从逻辑上分为数据平面和控制平面。
    数据平面  由一组智能代理(Envoy)组成,被部署为 sidecar。这些代理通过一个通用的策略和遥测中心(Mixer)传递和控制微服务之间的所有网络通信。
    控制平面  管理并配置代理来进行流量路由。此外,控制平面配置 Mixer 来执行策略和收集遥测数据。

Istio 组件

Envoy

  • Istio 使用 Envoy 代理的扩展版本。

  • Envoy是用 C++ 开发的高性能代理,用于协调服务网格中所有服务的入站和出站流量。

  • Envoy 代理是唯一与数据平面流量交互的 Istio 组件。

  • Envoy 代理被部署为服务的 sidecar,在逻辑上为服务增加了 Envoy 的许多内置特性:
    1.动态服务发现
    2.负载均衡
    3.TLS 终端
    4.HTTP/2 与 gRPC 代理
    5.熔断器
    6.健康检查
    7.基于百分比流量分割的分阶段发布
    8.故障注入
    9.丰富的指标

  • sidecar 代理模型
    sidecar   允许 Istio 提取大量关于流量行为的信号作为属性。反之,Istio 可以在 Mixer 中使用这些属性来执行决 策,并将它们发送到监控系统,以提供整个网格的行为信息。
    sidecar   还允许您向现有的部署添加 Istio 功能,而不需要重新设计架构或重写代码。

  • Envoy 代理在 istio 中可以实现
    1.流量控制功能:  通过丰富的 HTTP、gRPC、WebSocket 和 TCP 流量路由规则来执行细粒度的流量控制。
    2.网络弹性特性:  重试设置、故障转移、熔断器和故障注入。
    3.安全性和身份验证特性:  执行安全性策略以及通过配置 API 定义的访问控制和速率限制。

Mixer

  • Mixer   是一个平台无关的组件。Mixer 在整个服务网格中执行访问控制和策略使用,并从 Envoy 代理和其他服务收集遥测数据。代理提取请求级别属性,并将其发送到 Mixer 进行评估。您可以在我们的 Mixer 配置文档中找到更多关于属性提取和策略评估的信息。
  • Mixer   包括一个灵活的插件模型。该模型使 Istio 能够与各种主机环境和后端基础设施进行交互。因此,Istio 从这些细节中抽象出 Envoy 代理和 Istio 管理的服务。

Pilot

  • Pilot   主要是为 Envoy sidecar 提供服务发现、用于智能路由的流量管理功能(例如,A/B 测试、金丝雀发布等)以及弹性功能(超时、重试、熔断器等)。
  • Pilot   将控制流量行为的高级路由规则转换为特定于环境的配置,并在运行时将它们传播到 sidecar。
  • Pilot   将特定于平台的服务发现机制抽象出来,并将它们合成为任何符合 Envoy API 的 sidecar 都可以使用的标准格式。
  • 平台适配器 与 Envoy 交互图 (平台   支持 kubernetes、Consul、gcp、Nomad等)
    1.平台启动一个服务的新实例,该实例通知其平台适配器。
    2.平台适配器使用 Pilot 抽象模型注册实例。
    3.Pilot 将流量规则和配置派发给 Envoy 代理,来传达此次更改。
    4.可以使用 Istio 的流量管理 API 通过 Pilot 优化 Envoy 配置,以便对服务网格中的流量进行更细粒度地控制。


    image.png

Citadel

  • Citadel   通过内置的身份和证书管理,可以支持强大的服务到服务以及最终用户的身份验证。
  • Citadel   可以用来升级服务网格中的未加密流量。
  • Citadel、operator   结合使用可以执行基于服务身份的策略,而不是相对不稳定的 3 层或 4 层网络标识。
  • Citadel   使用 Istio 的授权特性来控制谁可以访问您的服务。

Galley

  • Galley   是 Istio 的配置验证、提取、处理和分发组件。它负责将其余的 Istio 组件与从底层平台(例如 Kubernetes)获取用户配置的细节隔离开来。

二、安装Istio Install

我这里 Kubernetes 版本为1.18 目前只有这么一个集群
  • 安装 Istio 环境准备
    1.搭建 Kubernetes 集群, ( 请按照官方提供的兼容测试版本安装 目前支持 1.14, 1.15, 1.16 )
    2.下载 Istio 项目包. 项目包内包括(安装文件、示例和 istioctl 命令行工具。)
    3.安装 Istio. 通过 istioctl 客户端工具直接安装istio 到 Kubernetes 中.

搭建 Kubernetes

这一部分这里就省略了, 如需这一部分 文档, 请参考其他的博文。

下载 Istio 项目包

在 macOS 或 Linux 系统中, 也可以通过以下命令下载最新版本的 Istio

# 新建目录
mkdir -p /opt/istio && cd /opt/istio

# 设置安装版本
export ISTIO_VERSION=1.5.1

# 下载文件
curl -L https://istio.io/downloadIstio | sh -

#输出如下:

Istio 1.5.1 Download Complete!

Istio has been successfully downloaded into the istio-1.5.1 folder on your system.

Next Steps:
See https://istio.io/docs/setup/kubernetes/install/ to add Istio to your Kubernetes cluster.

To configure the istioctl client tool for your workstation,
add the /opt/istio/istio-1.5.1/bin directory to your environment path variable with:
         export PATH="$PATH:/opt/istio/istio-1.5.1/bin"

Begin the Istio pre-installation verification check by running:
         istioctl verify-install 

Need more information? Visit https://istio.io/docs/setup/kubernetes/install/ 

#配置环境变量
vi /etc/profile
# 添加
export PATH="$PATH:/opt/istio/istio-1.5.1/bin"

# 生效配置
source /etc/profile

#验证安装
istioctl verify-install

Checking the cluster to make sure it is ready for Istio installation...

#1. Kubernetes-api
-----------------------
Can initialize the Kubernetes client.
Can query the Kubernetes API Server.

#2. Kubernetes-version
-----------------------
Istio is compatible with Kubernetes: v1.18.0.

#3. Istio-existence
-----------------------
Istio will be installed in the istio-system namespace.

#4. Kubernetes-setup
-----------------------
Can create necessary Kubernetes configurations: Namespace,ClusterRole,ClusterRoleBinding,CustomResourceDefinition,Role,ServiceAccount,Service,Deployments,ConfigMap. 

#5. SideCar-Injector
-----------------------
This Kubernetes cluster supports automatic sidecar injection. To enable automatic sidecar injection see https://istio.io/docs/setup/kubernetes/additional-setup/sidecar-injection/#deploying-an-app

-----------------------
Install Pre-Check passed! The cluster is ready for Istio installation.

#配置 istioctl 命令自动补全
#  创建目录
mkdir -p /usr/share/istio

# 拷贝补全脚本
cp tools/istioctl.bash /usr/share/istio/


# 导入自动补全
source /usr/share/istio/istioctl.bash



# 添加到 bashrc 中
vi ~/.bashrc
# 添加如下:
# istio
source /usr/share/istio/istioctl.bash


# 测试tab补全

[root@k8s-node-1 istio-1.5.1]# istioctl 
analyze          authz            dashboard        experimental     manifest         profile          proxy-status     upgrade          verify-install   
authn            convert-ingress  deregister       kube-inject      operator         proxy-config     register         validate         version  
  • 目录结构说明
  • bin  目录包含 istioctl 的客户端文件。istioctl 工具用于手动注入 Envoy sidecar 代理。
  • manifest.yaml  文件的 sha码。
  • samples  目录包含 istio 的实例应用程序。
  • tools  目录包含 一些脚本
    -- convert_RbacConfig_to_ClusterRbacConfig.sh
    -- dump_kubernetes.sh
    -- _istioctl
    -- istioctl.bash  istio 命令tab自动补全的脚本
  • install  目录包含如下目录: (istio除了支持 kubernetes 之外还支持 consul 和 gcp)
    -- consul  目录
    -- gcp  目录
    -- kubernetes  目录包含 kuebrnetes 服务相关的 YAML 文件。
    -- tools   目录

安装 istio

  • istio 包含两种安装方式
    1.通过 istioctl 客户端命令安装 (推荐)
    2.通过 helm 进行安装
# 通过如下命令进行安装 (manifest 是资源清单, profile 指定类型的清单)
istioctl manifest apply --set profile=demo 

输出如下:
- Applying manifest for component Base...
✔ Finished applying manifest for component Base.
- Applying manifest for component Pilot...
✔ Finished applying manifest for component Pilot.
- Applying manifest for component EgressGateways...
- Applying manifest for component IngressGateways...
- Applying manifest for component AddonComponents...
✔ Finished applying manifest for component EgressGateways.
✔ Finished applying manifest for component IngressGateways.
✔ Finished applying manifest for component AddonComponents.

✔ Installation complete
#查看部署情况

#如果集群运行在一个不支持外部负载均衡器的环境中(例如:minikube),istio-ingressgateway 的 EXTERNAL-IP 将显示为 <pending> 状态。请使用服务的 NodePort 或 端口转发来访问网关。
kubectl get pods -n istio-system
NAME                                   READY   STATUS    RESTARTS   AGE
grafana-5f6f8cbf75-lqnjg               1/1     Running   0          17m
istio-egressgateway-74896c8487-mjlg8   1/1     Running   0          17m
istio-ingressgateway-54d494869-7npql   1/1     Running   0          17m
istio-tracing-9dd6c4f7c-x5kcp          1/1     Running   0          17m
istiod-756bd84654-n2k6m                1/1     Running   0          18m
kiali-869c6894c5-64vmw                 1/1     Running   0          17m
prometheus-c89875c74-rgzdx             2/2     Running   0          17m


kubectl get svc -n istio-system 
NAME                        TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                                                                                                      AGE
grafana                     ClusterIP      10.254.35.48    <none>        3000/TCP                                                                                                                                     158m
istio-egressgateway         ClusterIP      10.254.10.123   <none>        80/TCP,443/TCP,15443/TCP                                                                                                                     158m
istio-ingressgateway        LoadBalancer   10.254.26.46    <pending>     15020:32142/TCP,80:30000/TCP,443:32701/TCP,15029:30413/TCP,15030:30781/TCP,15031:31714/TCP,15032:32419/TCP,31400:30673/TCP,15443:31123/TCP   158m
istio-pilot                 ClusterIP      10.254.54.205   <none>        15010/TCP,15011/TCP,15012/TCP,8080/TCP,15014/TCP,443/TCP                                                                                     158m
istiod                      ClusterIP      10.254.3.7      <none>        15012/TCP,443/TCP                                                                                                                            158m
jaeger-agent                ClusterIP      None            <none>        5775/UDP,6831/UDP,6832/UDP                                                                                                                   158m
jaeger-collector            ClusterIP      10.254.2.80     <none>        14267/TCP,14268/TCP,14250/TCP                                                                                                                158m
jaeger-collector-headless   ClusterIP      None            <none>        14250/TCP                                                                                                                                    158m
jaeger-query                ClusterIP      10.254.61.2     <none>        16686/TCP                                                                                                                                    158m
kiali                       ClusterIP      10.254.7.135    <none>        20001/TCP                                                                                                                                    158m
prometheus                  ClusterIP      10.254.8.200    <none>        9090/TCP                                                                                                                                     158m
tracing                     ClusterIP      10.254.39.104   <none>        80/TCP                                                                                                                                       158m
zipkin                      ClusterIP      10.254.32.230   <none>        9411/TCP                                                                                                                                     158m
  • 组件说明
  • tracing  全链路监控。
  • istio-pilot  服务发现与服务配置。
  • kiali  可视化服务网格展示。
    服务拓扑图
    分布式跟踪
    指标度量收集和图标
    配置校验
    健康检查和显示
    服务发现
  • prometheus  大家都懂的监控。
  • grafana  prometheus监控的展示webui。
  • istio-ingressgateway  出口网关。
  • istio-egressgateway  入口网关。
  • jaeger 
    jaeger-agent  jaeger client的一个代理程序,client将收集到的调用链数据发给agent,然后由agent发给collector;
    jaeger-collector  负责接收jaeger client或者jaeger agent上报上来的调用链数据,然后做一些校验,比如时间范围是否合法等,最终会经过内部的处理存储到后端存储;
    jaeger-query  专门负责调用链查询的一个服务。
  • 修改 istio-ingressgateway 网络类型 为 NodePort
kubectl patch service istio-ingressgateway -n istio-system -p '{"spec":{"type":"NodePort"}}'

kubectl get svc -n istio-system istio-ingressgateway 
NAME                   TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                                                                                                                                      AGE
istio-ingressgateway   NodePort   10.254.26.46   <none>        15020:32142/TCP,80:30000/TCP,443:32701/TCP,15029:30413/TCP,15030:30781/TCP,15031:31714/TCP,15032:32419/TCP,31400:30673/TCP,15443:31123/TCP   176m

#验证 istio版本
[root@k8s-node-1 ~]# istioctl version
client version: 1.5.1
control plane version: 1.5.1
data plane version: 1.5.1 (3 proxies)

#Kiali 组件
#Kiali 以 web ui 的方式可视化服务网格。
#查看 kiali svc
[root@k8s-node-1 kubeadm]# kubectl get svc -n istio-system  kiali
NAME    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)     AGE
kiali   ClusterIP   10.254.7.135   <none>        20001/TCP   4h24m
#配置访问(我这里的node节点为云主机,所以我配置了一个 ingress)
[root@k8s-node-1 ~]# cat kiali-ingress.yaml 
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: kiali-ingress
  namespace: istio-system
spec:
  rules:
  - host: kiali.aaa.me
    http:
      paths:
      - backend:
          serviceName: kiali
          servicePort: 20001

#创建ingress服务
[root@k8s-node-1 kubeadm]# kubectl apply -f kiali-ingress.yaml 
ingress.extensions/kiali-ingress created

# 查看服务
[root@k8s-node-1 ~]# kubectl get ingress -n istio-system 
NAME            CLASS    HOSTS             ADDRESS       PORTS   AGE
kiali-ingress   <none>   kiali.jicki.me    10.254.8.81   80      2m31s

Istio Profile

Profile 相关的介绍以及具体的区别

  • istioctl profile list 命令可查看当前版本的 profile
[root@k8s-node-1 istio]# istioctl profile list
Istio configuration profiles:
    minimal
    remote
    separate
    default
    demo
    empty
  • profile  包含如下:
    1.remote 远程kubernetes部署, 以及多kubernetes集群
    2.separatei 独立部署,不建议使用,后续可能删除
    3.default 默认安装, 根据IstioControlPlaneAPI的默认设置启用组件, 建议用于生产部署
    4.demo 演示实例,展示istio 所有功能且资源需求适中的配置
    5.empty 不部署任何内容。用于导出空的配置文件。
    6.minimal 最小化安装。


  • istioctl profile dump profileName 可以打印或者导出profile配置
    这里导出的文件就是kubernetes 的 YAML 编排文件。api 为 istio 的 api。
    这里可以导出 default 然后根据自己的环境自定义适合自己的 profile。
[root@k8s-node-1 istio]# istioctl profile dump default > default.yaml

istio injection

  • injection 注入后的变化
    1.原生 pod   –> pods 包含 程序 项目。
    2.注入以后 pod   –> pods 包含 程序 项目、istio-init、istio-proxy。
    2.1.istio-init  用于初始化网络配置, iptables 路由配置。
    2.2.istio-proxy  用于当前pod 与集群内部其他资源进行交互。
  • 可以被 injection 的服务
    1.Deployment - 注入后会添加 istio-init、istio-proxy 。
    2.ReplicaSet - 注入后会添加 istio-init、istio-proxy 。
    3.DeamonSet - 注入后会添加 istio-init、istio-proxy 。
    4.Pod - 注入后会添加 istio-init、istio-proxy 。
    5.Job - 注入后会添加 istio-init、istio-proxy 。
    6.Service - 注入后不会添加任何组件。
    7.Secrets - 注入后不会添加任何组件。
    8.ConfigMap - 注入后不会添加任何组件。
    9.deployment yaml 编排文件注入
    istioctl kube-inject -f nginx-test.yaml 对 Deployment编排文件进行注入(会修改yaml文件内容)
    kubectl apply -f <(istioctl kube-inject -f nginx-test.yaml) 注入并 创建 服务到kubernetes中, 这样操作不会改变原有的编排文件。

三、实操使用

对某个namespaces实现injection 自动注入

# 注入
[root@k8s-node-1 ~]# kubectl label namespace default istio-injection=enabled
namespace/jicki labeled


# 检测注入情况
[root@k8s-node-1 ~]# istioctl analyze -n default
✔ No validation issues found when analyzing namespace: default.


# 查看 namespace 的 labels
[root@k8s-node-1 ~]# kubectl get ns --show-labels
NAME              STATUS   AGE     LABELS
default           Active   9d     istio-injection=enabled

手动注入

kubectl apply -f <(istioctl kube-inject -f  file_name.yaml)

实战1、实现对流量控制

#创建pod
vim  nginx-test.yaml
apiVersion: apps/v1
kind: Deployment 
metadata: 
  name: nginx-1
  labels:
    web: nginx-1
spec: 
  replicas: 1
  selector:
    matchLabels:
      web: nginx-1
  template: 
    metadata: 
      labels: 
        app: nginx 
        web: nginx-1
        version: v1.0.0
    spec: 
      containers: 
        - name: nginx 
          image: nginx:alpine 
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
              name: http
          command: ["/bin/sh", "-c", "echo 'hello nginx-1' > /usr/share/nginx/html/index.html; nginx  -g  'daemon off;'"]
---
apiVersion: apps/v1
kind: Deployment 
metadata: 
  name: nginx-2
  labels:
    web: nginx-2
spec: 
  replicas: 1
  selector:
    matchLabels:
      web: nginx-2
  template: 
    metadata: 
      labels: 
        app: nginx 
        web: nginx-2
        version: v1.0.1
    spec: 
      containers: 
        - name: nginx 
          image: nginx:alpine 
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
              name: http
          command: ["/bin/sh", "-c", "echo 'hello nginx-2' > /usr/share/nginx/html/index.html; nginx  -g  'daemon off;'"]
---
apiVersion: apps/v1
kind: Deployment 
metadata: 
  name: nginx-3
  labels:
    web: nginx-3
spec: 
  replicas: 1
  selector:
    matchLabels:
      web: nginx-3
  template: 
    metadata: 
      labels: 
        app: nginx 
        web: nginx-3
        version: v1.0.2
    spec: 
      containers: 
        - name: nginx 
          image: nginx:alpine 
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
              name: http
          command: ["/bin/sh", "-c", "echo 'hello nginx-3' > /usr/share/nginx/html/index.html; nginx  -g  'daemon off;'"]
---
apiVersion: apps/v1
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc-1
  labels:
    web: nginx-1
spec:
  ports:
    - port: 80
      name: http
      targetPort: 80
      protocol: TCP
  selector:
    web: nginx-1
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc-2
  labels:
    web: nginx-2
spec:
  ports:
    - port: 80
      name: http
      targetPort: 80
      protocol: TCP
  selector:
    web: nginx-2
---
apiVersion: apps/v1
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc-3
  labels:
    web: nginx-3
spec:
  ports:
    - port: 80
      name: http
      targetPort: 80
      protocol: TCP
  selector:
    web: nginx-3
---
apiVersion: v1 
kind: Service
metadata: 
  name: nginx-svc 
  labels:
    app: nginx
spec: 
  ports: 
    - port: 80
      name: http
      targetPort: 80
      protocol: TCP 
  selector: 
    app: nginx
  • 创建服务(后续实验都用该服务)
[root@k8s-node-1 istio]# kubectl apply -f <(istioctl kube-inject -f nginx-test.yaml)
deployment.apps/nginx-deployment created

#查看生成的pod
[root@master demo-file]# kubectl get po
NAME                              READY   STATUS    RESTARTS   AGE
nginx-1-6cf586866c-5gj2n          2/2     Running   0          5h53m
nginx-2-dffbd7fc4-jcs62           2/2     Running   0          5h53m
nginx-3-58db9d749-jk52v           2/2     Running   0          5h35m

#观察边车服务过程注入
[root@master demo-file]# kubectl describe po nginx-1-6cf586866c-5gj2n
#略

#查看 istio 对外服务的端口以及相关进程
#可以发现除了80端口还有其他5个额外的端口
[root@master demo-file]# kubectl exec -it nginx-1-6cf586866c-5gj2n -c istio-proxy -- netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:15006           0.0.0.0:*               LISTEN      15/envoy            
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:15090           0.0.0.0:*               LISTEN      15/envoy            
tcp        0      0 127.0.0.1:15000         0.0.0.0:*               LISTEN      15/envoy            
tcp        0      0 0.0.0.0:15001           0.0.0.0:*               LISTEN      15/envoy            
tcp6       0      0 :::15020                :::*                    LISTEN      1/pilot-agent 

#查看配置的三个 service 的 endpoints
[root@master demo-file]# kubectl get ep
NAME           ENDPOINTS                                          AGE
ceph.com-rbd   <none>                                             2d23h
kubernetes     172.24.49.78:6443                                  4d8h
nginx-svc      10.254.65.113:80,10.254.70.81:80,10.254.70.82:80   6h
nginx-svc-1    10.254.70.81:80                                    6h
nginx-svc-2    10.254.65.113:80                                   6h
nginx-svc-3    10.254.70.82:80                                    5h41m
  • 配置一个 Virtual Service
[root@master demo-file]# cat nginx-test-load.yaml 
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: nginx-svc-vs
spec:
  hosts: 
  - "*"
  gateways:
  - istio-system/ingressgateway
  http:
  - route:
    - destination:
        host: nginx-svc-1.default.svc.cluster.local
      weight: 20
    - destination:
        host: nginx-svc-2.default.svc.cluster.local
      weight: 50
    - destination:
        host: nginx-svc-3.default.svc.cluster.local
      weight: 30

#VirtualService 服务并非是 kubernetes 中实际的 service 服务。
#kubectl get virtualservices 使用这个命令查看 Virtual Service
#创建Virtual Service
kubectl apply -f nginx-test-load.yaml
#查看Virtual Service
[root@master demo-file]# kubectl get virtualservices
NAME           GATEWAYS                        HOSTS   AGE
nginx-svc-vs   [istio-system/ingressgateway]   [*]     6h2m
  • 创建gateway及ingress实现从外部访问(从内部访问可略过此步)
[root@master demo-file]# cat nginx-gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: app-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"

[root@master demo-file]# cat nginx-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  generation: 1
  labels:
    cattle.io/creator: norman
  name: myapp-gateway
  namespace: istio-system
spec:
  rules:
  - host: wp.abc.com
    http:
      paths:
      - backend:
          serviceName: istio-ingressgateway
          servicePort: 80
#创建gateway及ingress
kubectl apply -f nginx-ingress.yaml
kubectl apply -f nginx-gateway.yaml
  • 模拟访问
while true;
do
wget -q -O - http://wp.abc.com/;
done
  • 通过kiali查看流量情况


实战2、实现对特定流量控制

  • 修改Virtual Service配置
[root@master demo-file]# cat nginx-test-headers-user.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: nginx-svc-vs
spec:
  hosts: 
  #- nginx-svc.default.svc.cluster.local
  - "*"
  gateways:
  - istio-system/ingressgateway
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: nginx-svc-2.default.svc.cluster.local
  - route:
    - destination:
        host: nginx-svc-1.default.svc.cluster.local
#应用配置
kubectl apply -f nginx-test-headers-user.yaml
  • 访问测试
[root@master demo-file]# curl wp.abc.com
hello nginx-1
[root@master demo-file]# curl wp.abc.com -Hend-user:jason
hello nginx-2

实战3、实现对特定流量控制,并附件其他动作

  • 修改Virtual Service配置
[root@master demo-file]# cat nginx-test-headers-user-sleep2s.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: nginx-svc-vs
spec:
  hosts: 
  - "*"
  gateways:
  - istio-system/ingressgateway
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    fault:
      delay:
        percent: 100    #触发占比100%
        fixedDelay: 2s
    route:
    - destination:
        host: nginx-svc-2.default.svc.cluster.local
  - route:
    - destination:
        host: nginx-svc-1.default.svc.cluster.local
#应用配置
kubectl apply -f  nginx-test-headers-user-sleep2s.yaml
  • 访问测试
[root@master demo-file]# curl wp.abc.com
hello nginx-1
[root@master demo-file]# curl wp.abc.com -Hend-user:jason
#等待两秒,返回数据
hello nginx-2

实战4、实现故障注入

  • 修改Virtual Service配置
[root@master demo-file]# cat nginx-test-headers-user-httpstatus.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: nginx-svc-vs
spec:
  hosts: 
  - "*"
  gateways:
  - istio-system/ingressgateway
  http:
  - fault:
      abort:
        httpStatus: 500
        percentage:
          value: 90      #触发占比90%
    match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: nginx-svc-2.default.svc.cluster.local
  - route:
    - destination:
        host: nginx-svc-1.default.svc.cluster.local

#应用配置
kubectl apply -f nginx-test-headers-user-httpstatus.yaml
  • 访问测试
[root@master demo-file]# curl wp.abc.com
hello nginx-1
[root@master demo-file]# curl wp.abc.com -Hend-user:jason
fault filter abort
#返回状态码为500。

更多实战内容、可从官网获取。

Istio Upgrade

注意事项
升级 Istio 之前, 请确认是否支持升级 istioctl manifest versions 查看支持版本。

升级过程中可能发生流量中断。为了缩短流量中断时间, 请确保每个组件(Citadel 除外)至少运行有两个副本。同时, 确保 PodDistruptionBudgets 配置最小可用性为 1。

确保 istio profile 与 需要升级的版本所配置的 profile 一致。

升级步骤
1. 下载需要升级的 istio 版本 curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.5.1 sh -

2. 替换 istioctl 二进制文件, 或者 更改 istio 的环境变量PATH路径到新版本的目录中。

3. 如果配置了 istioctl 自动补全,还需要替换为 新的 自动补全脚本。

4. 使用新的 istioctl 导出新版本的 profile 文件 istioctl profile dump demo > demo.yaml

5. 修改 demo.yaml 文件, 将其中 jwtPolicy 身份验证机构修改为 first-party-jwt。Istio 将默认使用第三方令牌。

5.1  验证是否支持 第三方令牌。kubectl get --raw /api/v1 | jq '.resources[] | select(.name | index("serviceaccounts/token"))'

5.1.1 jwtPolicy = third-party-jwt 使用第三方令牌 更安全 Istio 默认使用这个选项。

5.1.2  jwtPolicy = first-party-jwt 使用第一方令牌 属性比较不安全。

6. istioctl upgrade -f demo.yaml 命令进行升级。

7. 观察 kubernets 中 istio-system 的服务更新完成。

8. 重新注入环境中部署的服务, 用以更新注入数据。

8.1 对于自动注入的情况可使用如下命令:

8.1.1 kubectl rollout restart deployment

8.1.2 kubectl rollout restart statefulset

8.1.3 kubectl rollout restart daemonset

8.2 对于手动注入的情况( 需要重新 apply 一下服务) :

8.2.1 kubectl apply -f <(istioctl kube-inject -f nginx-test.yaml)
9. 检查升级, 执行 istioctl version 检查

9.1 client version 版本是否为新版本。

9.2 control plane version 版本是否为新版本。

9.3 data plane version 中是否全部 proxies 都为新版本。

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

推荐阅读更多精彩内容