• 超详细教程,一文入门Istio架构原理及实战应用


    Istio简介

    2.1、istio架构

    实际上Istio 就是 Service Mesh 架构的一种实现,服务之间的通信(比如这里的 Service A 访问 Service B)会通过代理(默认是 Envoy)来进行。

    而且中间的网络协议支持 HTTP/1.1,HTTP/2,gRPC 或者 TCP,可以说覆盖了主流的通信协议。代理这一层,称之为数据平面。

    控制平面做了进一步的细分,分成了 Pilot、Citadel 和 Galley,它们的各自功能如下:

    • Pilot:为 Envoy 提供了服务发现,流量管理和智能路由(AB 测试、金丝雀发布等),以及错误处理(超时、重试、熔断)功能。
    • Citadel:为服务之间提供认证和证书管理,可以让服务自动升级成 TLS 协议。
    • Galley:Galley 是 Istio 的配置验证、提取、处理和分发组件。它负责将其余的 Istio 组件与从底层平台(例如 Kubernetes)获取用户配置的细节隔离开来。

    数据平面会和控制平面通信,一方面可以获取需要的服务之间的信息,另一方面也可以汇报服务调用的 Metrics 数据。

    2.1、为什么使用 Istio?

    通过负载均衡、服务间的身份验证、监控等方法,Istio 可以轻松地创建一个已经部署了服务的网络,而服务的代码只需很少更改甚至无需更改。通过在整个环境中部署一个特殊的 sidecar 代理为服务添加 Istio 的支持,而代理会拦截微服务之间的所有网络通信,然后使用其控制平面的功能来配置和管理 Istio,这包括:

    • 为 HTTP、gRPC、WebSocket 和 TCP 流量自动负载均衡。
    • 通过丰富的路由规则、重试、故障转移和故障注入对流量行为进行细粒度控制。
    • 可插拔的策略层和配置 API,支持访问控制、速率限制和配额。
    • 集群内(包括集群的入口和出口)所有流量的自动化度量、日志记录和追踪。
    • 在具有强大的基于身份验证和授权的集群中实现安全的服务间通信。

    Istio 为可扩展性而设计,可以满足不同的部署需求。

    2.2、核心特性

    Istio 以统一的方式提供了许多跨服务网络的关键功能。

    2.2.1、流量管理

    Istio 简单的规则配置和流量路由允许您控制服务之间的流量和 API 调用过程。

    Istio 简化了服务级属性(如熔断器、超时和重试)的配置,并且让它轻而易举的执行重要的任务(如 A/B 测试、金丝雀发布和按流量百分比划分的分阶段发布)。

    有了更好的对流量的可视性和开箱即用的故障恢复特性,就可以在问题产生之前捕获它们,无论面对什么情况都可以使调用更可靠,网络更健壮。

    2.2.2、安全

    Istio 的安全特性解放了开发人员,使其只需要专注于应用程序级别的安全。

    Istio 提供了底层的安全通信通道,并为大规模的服务通信管理认证、授权和加密。有了 Istio,服务通信在默认情况下就是受保护的,可以让您在跨不同协议和运行时的情况下实施一致的策略——而所有这些都只需要很少甚至不需要修改应用程序。

    Istio 是独立于平台的,可以与 Kubernetes(或基础设施)的网络策略一起使用。但它更强大,能够在网络和应用层面保护pod到 pod 或者服务到服务之间的通信。

    2.2.3、可观察性

    Istio 健壮的追踪、监控和日志特性让您能够深入的了解服务网格部署。

    通过 Istio 的监控能力,可以真正的了解到服务的性能是如何影响上游和下游的;而它的定制 Dashboard 提供了对所有服务性能的可视化能力,并让您看到它如何影响其他进程。

    Istio 的 Mixer 组件负责策略控制和遥测数据收集。它提供了后端抽象和中介,将一部分 Istio 与后端的基础设施实现细节隔离开来,并为运维人员提供了对网格与后端基础实施之间交互的细粒度控制。

    所有这些特性都使您能够更有效地设置、监控和加强服务的 SLO。当然,底线是您可以快速有效地检测到并修复出现的问题。

    2.3、平台支持

    Istio 独立于平台,被设计为可以在各种环境中运行,包括跨云、内部环境、Kubernetes、Mesos 等等。您可以在 Kubernetes 或是装有 Consul 的 Nomad 环境上部署 Istio。Istio 目前支持:

    • Kubernetes 上的服务部署
    • 基于 Consul 的服务注册
    • 服务运行在独立的虚拟机上

    3、Istio快速入门

    下面我们将Istio进行部署安装,来体验下它的魅力。

    3.1、搭建kubernetes集群

    Istio运行在kubernetes平台是最佳的选择,所以我们先搭建kubernetes环境。

    注意:初学者请参考课程资料提供的 一键安装文档

    3.1.1、环境准备

    准备3台Centos7虚拟机:

    名称 IP 角色 CPU 内存 硬盘
    node1 192.168.31.106 master 2核 4GB 100GB
    node2 192.168.31.107 node 2核 4GB 100GB
    node3 192.168.31.108 node 2核 4GB 100GB

    3.1.2、前置工作

    搭建K8S之前,需要一些前置的准备工作,否则不能完成集群的搭建。yum如果不能用,则使用 yum -y install yum-utils 或者 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo ,然后再使用yum。

    #修改主机名
    hostnamectl  set-hostname node2
    hostnamectl  set-hostname node3
    #更新yum源,并且完成yum update操作
    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
    wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
    #如果wget无法使用直接输入 yum install wget安装即可
    yum makecache
    yum -y update
    #安装docker
    yum install -y yum-utils device-mapper-persistent-data lvm2
    yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    yum makecache fast
    yum -y install docker-ce
    
    #启动docker服务
    systemctl start docker.service
    #开机自启
    systemctl enable docker.service
    
    #添加docker阿里云加速器
    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://c6n8vys4.mirror.aliyuncs.com"]
    }
    EOF
    
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
    #测试一下,看下载速度怎么样
    docker pull redis
    docker rmi redis:latest
    #关闭防火墙
    systemctl stop firewalld.service
    systemctl disable firewalld.service
    
    #添加hosts映射 可略过 这里设置的目的是为了后续操作中通过 scp将某一个节点上的文件传到别的节点上
    vim /etc/hosts
    192.168.31.106 node1
    192.168.31.107 node2
    192.168.31.108 node3
    
    scp /etc/hosts node2:/etc/
    scp /etc/hosts node3:/etc/
    #设置node1到node2、node3免登陆
    ssh-keygen #一路下一步操作
    ssh-copy-id node2
    ssh-copy-id node3
    
    #测试
    ssh node2
    ssh node3

    3.1.3、搭建集群

    #修改系统参数
    # 将 SELinux 设置为 permissive 模式(相当于将其禁用)
    setenforce 0
    sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
    
    # 禁用swap文件,编辑/etc/fstab,注释掉引用 swap 的行
    vim /etc/fstab
    swapoff -a
    
    # 设置网桥参数
    vim /etc/sysctl.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1
    net.ipv4.tcp_tw_recycle = 0
    
    scp /etc/sysctl.conf node2:/etc/
    scp /etc/sysctl.conf node3:/etc/
    
    #立即生效
    sysctl -p
    #如果出现/proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory
    #执行modprobe br_netfilter,再试即可
    
    #安装kubectl
    vim /etc/yum.repos.d/kubernetes.repo
    
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    enabled=1
    gpgcheck=0
    
    yum list kubectl –showduplicates
    yum install -y kubectl.x86_64
    #指定版本 一定要指定版本
    # yum install -y kubectl-1.18.6
    #查看版本
    kubectl version
    
    yum install -y kubelet kubeadm --disableexcludes=kubernetes
    #指定版本 一定要指定版本
    #yum install -y kubelet-1.18.6 kubeadm-1.18.6 --disableexcludes=kubernetes
    
    #如果安装错了,可以用以下命令移除
    #yum remove kubectl kubelet kubeadm
    
    #拉取所需要的镜像
    kubeadm config images pull --image-repository=registry.cn-hangzhou.aliyuncs.com/itcast --kubernetes-version=v1.18.6
    #如果拉取失败,尝试这个:kubeadm config images pull --image-repository=lank8s.cn --kubernetes-version=v1.18.6
    
    #开始初始化,如果使用lank8s.cn拉取的镜像,需要指定--image-repository=lank8s.cn
    kubeadm init --apiserver-advertise-address 192.168.31.106 --pod-network-cidr=10.244.0.0/16 --image-repository=registry.cn-hangzhou.aliyuncs.com/itcast  --kubernetes-version=v1.18.6
    
    #当看到 Your Kubernetes control-plane has initialized successfully! 说明初始化成功了!
    
    #拷贝admin.conf到home目录,否则出错:The connection to the server localhost:8080 was refused - did you specify the right host or port?
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    #设置网络 kube-flannel.yml 文件在资料中
    kubectl apply -f kube-flannel.yml
    
    #测试
    [root@node1 k8s]# kubectl get nodes
    NAME    STATUS   ROLES    AGE   VERSION
    node1   Ready    master   23m   v1.18.6
    
    #将node2、node3加入到集群,token要替换成自己的
    kubeadm join 192.168.31.106:6443 --token ekw4eu.cfi77sji1jyczhj6 --discovery-token-ca-cert-hash sha256:21de4177eaf76353dd060f2a783c9dafe17636437ade020bc40d60a8ab903483
    
    #测试
    [root@node1 k8s]# kubectl get nodes
    NAME    STATUS   ROLES    AGE     VERSION
    node1   Ready    master   31m     v1.18.6
    node2   Ready       6m46s   v1.18.6
    node3   Ready       2m21s   v1.18.6
    
    #说明集群组件成功了
    
    #如果需要删除集群,执行 kubeadm reset ,3台机器都需要执行
    
    #查看正在执行的pod
    kubectl get pod --all-namespaces -o wide

    查看正在执行的pod,kubectl get pod --all-namespaces -o wide

    注意:如果虚拟机重启导致k8s关闭,可以采用 systemctl status kubelet 查看状态,采用 systemctl start kubelet 启动k8s,无论是主节点还是工作节点,都需要执行。

    kubeadm join 192.168.211.151:6443 --token zkkd3y.iompmpb402kyvdq6 \
        --discovery-token-ca-cert-hash sha256:3c500a7df3a3e6857b50c31f9a9a209d57e669d7acd69905f040023094945c04

    registry.cn-hangzhou.aliyuncs.com/itcast/kube-proxy   v1.18.6
    registry.cn-hangzhou.aliyuncs.com/itcast/pause        3.2 
    
    
    registry.cn-hangzhou.aliyuncs.com/itcast/kube-proxy   v1.18.6
    quay.io/coreos/flannel                                v0.12.0-amd64
    registry.cn-hangzhou.aliyuncs.c
  • 相关阅读:
    (八)Python类和对象
    【杂烩】TeX Live+TeXStudio
    算法与数据结构(第一周)——线性查找法
    ts 之 定义 泛型( 泛型的定义、函数中又多个泛型的参数、接口、 类、泛型约束)
    iOS 关于UIProgressView、UIActivityIndicatorView常见使用方法
    【oj刷题记】【考研写法注意点】【1294】【多项式加法】【利用归并思想】【考研写法关于另外一个可能导致指针越界的问题】【以及遍历链表最保险的写法】
    无胁科技-TVD每日漏洞情报-2022-8-11
    数量关系(蒙题技巧)
    JavaScript中的箭头函数
    CSS---复合选择器
  • 原文地址:https://blog.csdn.net/lt_xiaodou/article/details/126666270