kubernetes中文手册
  • 前言
    • 序言
  • 云原生
    • 云原生(Cloud Native)的定义
    • 云原生的设计哲学
    • Kubernetes 的诞生
    • Kubernetes 与云原生应用概览
    • 云原生应用之路 —— 从 Kubernetes 到云原生
    • 定义云原生应用
      • OAM
        • Workload
        • Component
        • Trait
        • Application Scope
        • Application Configuration
      • Crossplane
    • 云原生编程语言
      • 云原生编程语言 Ballerina
      • 云原生编程语言 Pulumi
    • 云原生的未来
  • 快速入门
    • 云原生新手入门指南
    • Play with Kubernetes
    • 快速部署一个云原生本地实验环境
    • 使用 Rancher 在阿里云上部署 Kubenretes 集群
  • 概念与原理
    • Kubernetes 架构
      • 设计理念
      • Etcd 解析
      • 开放接口
        • CRI - Container Runtime Interface(容器运行时接口)
        • CNI - Container Network Interface(容器网络接口)
        • CSI - Container Storage Interface(容器存储接口)
      • 资源对象与基本概念解析
    • Pod 状态与生命周期管理
      • Pod 概览
      • Pod 解析
      • Init 容器
      • Pause 容器
      • Pod 安全策略
      • Pod 的生命周期
      • Pod Hook
      • Pod Preset
      • Pod 中断与 PDB(Pod 中断预算)
    • 集群资源管理
      • Node
      • Namespace
      • Label
      • Annotation
      • Taint 和 Toleration(污点和容忍)
      • 垃圾收集
    • 控制器
      • Deployment
      • StatefulSet
      • DaemonSet
      • ReplicationController 和 ReplicaSet
      • Job
      • CronJob
      • Horizontal Pod Autoscaling
        • 自定义指标 HPA
      • 准入控制器(Admission Controller)
    • 服务发现与路由
      • Service
      • 拓扑感知路由
      • Ingress
        • Traefik Ingress Controller
      • Kubernetes Service API
        • Service API 简介
    • 身份与权限控制
      • ServiceAccount
      • 基于角色的访问控制(RBAC)
      • NetworkPolicy
    • 网络
      • Kubernetes 中的网络解析 —— 以 flannel 为例
      • Kubernetes 中的网络解析 —— 以 calico 为例
      • 具备 API 感知的网络和安全性管理开源软件 Cilium
        • Cilium 架构设计与概念解析
    • 存储
      • Secret
      • ConfigMap
        • ConfigMap 的热更新
      • Volume
      • 持久化卷(Persistent Volume)
      • Storage Class
      • 本地持久化存储
    • 集群扩展
      • 使用自定义资源扩展 API
      • 使用 CRD 扩展 Kubernetes API
      • Aggregated API Server
      • APIService
      • Service Catalog
    • 多集群管理
      • 多集群服务 API(Multi-Cluster Services API)
      • 集群联邦(Cluster Federation)
    • 资源调度
      • 服务质量等级(QoS)
  • 用户指南
    • 用户指南概览
    • 资源对象配置
      • 配置 Pod 的 liveness 和 readiness 探针
      • 配置 Pod 的 Service Account
      • Secret 配置
      • 管理 namespace 中的资源配额
    • 命令使用
      • Docker 用户过渡到 kubectl 命令行指南
      • kubectl 命令概览
      • kubectl 命令技巧大全
      • 使用 etcdctl 访问 Kubernetes 数据
    • 集群安全性管理
      • 管理集群中的 TLS
      • kubelet 的认证授权
      • TLS Bootstrap
      • 创建用户认证授权的 kubeconfig 文件
      • IP 伪装代理
      • 使用 kubeconfig 或 token 进行用户身份认证
      • Kubernetes 中的用户与身份认证授权
      • Kubernetes 集群安全性配置最佳实践
    • 访问 Kubernetes 集群
      • 访问集群
      • 使用 kubeconfig 文件配置跨集群认证
      • 通过端口转发访问集群中的应用程序
      • 使用 service 访问群集中的应用程序
      • 从外部访问 Kubernetes 中的 Pod
      • Cabin - Kubernetes 手机客户端
      • Lens - Kubernetes IDE/桌面客户端
      • Kubernator - 更底层的 Kubernetes UI
    • 在 Kubernetes 中开发部署应用
      • 适用于 Kubernetes 的应用开发部署流程
      • 迁移传统应用到 Kubernetes 中 —— 以 Hadoop YARN 为例
      • 使用 StatefulSet 部署用状态应用
  • 最佳实践
    • 最佳实践概览
    • 在 CentOS 上部署 Kubernetes 集群
      • 创建 TLS 证书和秘钥
      • 创建 kubeconfig 文件
      • 创建高可用 etcd 集群
      • 安装 kubectl 命令行工具
      • 部署 master 节点
      • 安装 flannel 网络插件
      • 部署 node 节点
      • 安装 kubedns 插件
      • 安装 dashboard 插件
      • 安装 heapster 插件
      • 安装 EFK 插件
    • 生产级的 Kubernetes 简化管理工具 kubeadm
      • 使用 kubeadm 在 Ubuntu Server 16.04 上快速构建测试集群
    • 服务发现与负载均衡
      • 安装 Traefik ingress
      • 分布式负载测试
      • 网络和集群性能测试
      • 边缘节点配置
      • 安装 Nginx ingress
      • 安装配置 DNS
        • 安装配置 Kube-dns
        • 安装配置 CoreDNS
    • 运维管理
      • Master 节点高可用
      • 服务滚动升级
      • 应用日志收集
      • 配置最佳实践
      • 集群及应用监控
      • 数据持久化问题
      • 管理容器的计算资源
    • 存储管理
      • GlusterFS
        • 使用 GlusterFS 做持久化存储
        • 使用 Heketi 作为 Kubernetes 的持久存储 GlusterFS 的 external provisioner
        • 在 OpenShift 中使用 GlusterFS 做持久化存储
      • GlusterD-2.0
      • Ceph
        • 用 Helm 托管安装 Ceph 集群并提供后端存储
        • 使用 Ceph 做持久化存储
        • 使用 rbd-provisioner 提供 rbd 持久化存储
      • OpenEBS
        • 使用 OpenEBS 做持久化存储
      • Rook
      • NFS
        • 利用 NFS 动态提供 Kubernetes 后端存储卷
    • 集群与应用监控
      • Heapster
        • 使用 Heapster 获取集群和对象的 metric 数据
      • Prometheus
        • 使用 Prometheus 监控 Kubernetes 集群
        • Prometheus 查询语言 PromQL 使用说明
      • 使用 Vistio 监控 Istio 服务网格中的流量
    • 分布式追踪
      • OpenTracing
    • 服务编排管理
      • 使用 Helm 管理 Kubernetes 应用
      • 构建私有 Chart 仓库
    • 持续集成与发布
      • 使用 Jenkins 进行持续集成与发布
      • 使用 Drone 进行持续集成与发布
    • 更新与升级
      • 手动升级 Kubernetes 集群
      • 升级 dashboard
    • 扩展控制器
      • OpenKruise
        • 原地升级
    • 安全策略
      • 开放策略代理(OPA)
      • 云原生安全
  • 服务网格
    • 服务网格(Service Mesh)
    • 企业级服务网格架构
      • 服务网格基础
      • 服务网格技术对比
      • 服务网格对比 API 网关
      • 采纳和演进
      • 定制和集成
      • 总结
    • Istio
      • 使用 Istio 前需要考虑的问题
      • Istio 中 sidecar 的注入规范及示例
      • 如何参与 Istio 社区及注意事项
      • Istio 免费学习资源汇总
      • Sidecar 的注入与流量劫持
      • Envoy Sidecar 代理的路由转发
      • Istio 如何支持虚拟机
      • Istio 支持虚拟机的历史
    • Envoy
      • Envoy 的架构与基本术语
      • Envoy 作为前端代理
      • Envoy mesh 教程
  • 领域应用
    • 领域应用概览
    • 微服务架构
      • 微服务中的服务发现
      • 使用 Java 构建微服务并发布到 Kubernetes 平台
        • Spring Boot 快速开始指南
    • 大数据
      • Spark 与 Kubernetes
        • Spark standalone on Kubernetes
        • 运行支持 Kubernetes 原生调度的 Spark 程序
    • Serverless 架构
      • 理解 Serverless
      • FaaS(函数即服务)
        • OpenFaaS 快速入门指南
      • Knative
    • 边缘计算
    • 人工智能
    • 可观察性
  • 开发指南
    • 开发指南概览
    • SIG 和工作组
    • 开发环境搭建
      • 本地分布式开发环境搭建(使用 Vagrant 和 Virtualbox)
    • 单元测试和集成测试
    • client-go 示例
      • client-go 中的 informer 源码分析
    • Operator
      • operator-sdk
    • kubebuilder
      • 使用 kubebuilder 创建 operator 示例
    • 高级开发指南
    • 社区贡献
    • Minikube
  • 社区及生态
    • 云原生计算基金会(CNCF)
      • CNCF 章程
      • CNCF 特别兴趣小组(SIG)说明
      • 开源项目加入 CNCF Sandbox 的要求
      • CNCF 中的项目治理
      • CNCF Ambassador
    • 认证及培训
      • 认证 Kubernetes 服务提供商(KCSP)说明
      • 认证 Kubernetes 管理员(CKA)说明
  • 附录
    • 附录说明
    • Kubernetes 中的应用故障排查
    • Kubernetes 相关资讯和情报链接
    • Docker 最佳实践
    • Kubernetes 使用技巧
    • Kubernetes 相关问题记录
    • Kubernetes 及云原生年度总结及展望
      • Kubernetes 与云原生 2017 年年终总结及 2018 年展望
      • Kubernetes 与云原生 2018 年年终总结及 2019 年展望
    • CNCF 年度报告解读
      • CNCF 2018 年年度报告解读
      • CNCF 2020 年年度报告解读
由 GitBook 提供支持
在本页
  • Istio 为什么要支持虚拟机?
  • 将虚拟机引入到网格中需要具备什么条件?
  • Istio 如何支持虚拟机?
  • Demo
  • 安装流程
  • 未来方向
  • 参考阅读
  1. 服务网格
  2. Istio

Istio 如何支持虚拟机

上一页Envoy Sidecar 代理的路由转发下一页Istio 支持虚拟机的历史

最后更新于3年前

注:本文基于 Istio 1.7 版本撰写。

Istio 是目前最流行的服务网格,用于连接、保护、控制和观察服务。当其 2017 年开源时,Kubernetes 已赢得容器编排之战,Istio 为了满足组织转向微服务的需求。虽然 Istio 声称支持异构环境,如 Nomad、Consul、Eureka、Cloud Foundry、Mesos 等,但实际上,它一直与 Kubernetes 合作得最好——它的服务发现就是基于 Kubernetes。

Istio 在发展初期就因为一些问题而饱受诟病,比如组件数量多、安装和维护复杂、调试困难、由于引入了太多的新概念和对象(多达 50 个 CRD)而导致学习曲线陡峭,以及 Mixer 组件对性能的影响。但这些问题正在被 Istio 团队逐渐克服。从 2020 年初发布的中可以看出,Istio 已经取得了长足的进步。

将基于虚拟机的工作负载更好地集成到服务网格中,是 Istio 团队今年的一大重点。Tetrate 还通过其产品 提供了无缝的多云连接、安全性和可观察性,包括针对虚拟机的。本文将带您了解为什么 Istio 需要与虚拟机整合,以及如何整合。

Istio 为什么要支持虚拟机?

虽然现在容器和 Kubernetes 已经被广泛使用,但仍然有很多部署在虚拟机上的服务和 Kubernetes 集群之外的 API 需要由 Istio mesh 来管理。如何将棕地环境与绿地环境统一管理,这是一个巨大的挑战。

将虚拟机引入到网格中需要具备什么条件?

在介绍如何集成虚拟机之前,我先介绍一下将虚拟机添加到 Mesh 中需要什么条件。在支持虚拟机流量时,Istio 必须知道几件事:哪些虚拟机的服务要添加到 Mesh 中,以及如何访问虚拟机。每个虚拟机还需要一个身份,以便与服务网格的其他部分安全地通信。这些需求可以和 Kubernetes CRD 一起工作,也可以和 Consul 这样的完整的服务注册表一起工作。而基于服务账户的身份引导机制,为没有平台身份的虚拟机分配工作负载身份。对于有平台身份的虚拟机(如 EC2、GCP、Azure 等),Istio 正在进行这方面的工作,将平台身份与 Kubernetes 身份进行交换,方便设置 mTLS 通信。

Istio 如何支持虚拟机?

Istio 对虚拟机的支持始于其服务注册表机制。Istio mesh 中的服务和实例信息来自 Istio 的服务注册表,到目前为止,Istio 的服务注册表只关注或跟踪 pod。在新的版本中,Istio 现在有资源类型来跟踪和观察虚拟机。网格内的 sidecar 无法观察和控制网格外服务的流量,因为它们没有任何信息。

Istio 社区和 在 Istio 对虚拟机的支持上做了。1.6 版本中增加了 WorkloadEntry,它允许你像描述 Kubernetes 中运行的主机一样描述虚拟机。在 1.7 版本中,该版本开始增加了通过令牌将虚拟机自动引导到 service mesh 中的基础,Istio 做了大量的工作。Istio 1.8 首次推出另一个名为 的抽象,它类似于 Kubernetes Deployment 对象 —— 但适用于虚拟机。

下图显示了 Istio 如何在网格中对服务进行建模。最主要的信息来源来自于 Kubernetes 这样的平台服务注册表,或者 Consul 这样的系统。此外,ServiceEntry 作为用户定义的服务注册表,对虚拟机上的服务或组织外部的服务进行建模。

Istio 中的服务注册发现模型

为什么不直接使用 ServiceEntry 引入虚拟机中的服务,却还要大费周折在虚拟机中安装 Istio?

使用 ServiceEntry,你可以让网格内部的服务发现和访问外部服务;此外,还可以管理这些外部服务的流量。结合 VirtualService,你还可以为相应的外部服务配置访问规则,比如请求超时、故障注入等,从而实现对指定外部服务的控制访问。 即便如此,它也只能控制客户端的流量,而不能控制引入的外部服务对其他服务的访问。也就是说,它不能控制作为调用发起者的服务的行为。在虚拟机中部署 sidecar,通过工作负载选择器引入虚拟机工作负载,可以像 Kubernetes 中的 pod 一样,对虚拟机进行无差别管理。

Demo

安装流程

下面是示例的安装步骤:

  1. 在 Google Cloud 中部署 Kubernetes 集群,Kubernetes 版本是 1.16.13;

  2. 在 GKE 中安装 Istio 1.7.1;

  3. 在 Google Cloud 中启动一台虚拟机并配置 Istio,将其加入到 Istio Mesh 中,这一步需要很多手动操作,生成证书、创建 token、配置 hosts 等;

  4. 在 Istio Mesh 中部署 bookinfo 示例;

  5. 在虚拟机中安装 MySQL;

  6. 为虚拟机设置 VPC 防火箱规则;

  7. 将虚拟机中的 MySQL 服务作为 ServiceEntry 引入到 Mesh 中并作为 rating 服务的后端;

  8. 修改 MySQL 表中的数据,验证 bookinfo 中的 rating 相应的行为符合预期;

未来方向

参考阅读

在下面这个 demo 中我们将使在 GKE 中部署 Istio 并运行 bookinfo 示例,其中 ratings 服务的后端使用的是部署在虚拟机上的 MySQL,该示例可以在 中找到,我作出了部分改动,最终的流量路由如下图所示。

从 的演示中可以看出,在这个过程中涉及到的人工工作太多,很容易出错。在未来,Istio 会改进虚拟机测试的可操作性,根据平台身份自动引导,改进 DNS 支持和 istioctl 调试等。大家可以关注 ,了解更多关于虚拟机支持的细节。

Istio 官方文档
bookinfo
Istio 环境工作组
Virtual Machine Installation - istio.io
Virtual Machines in Single-Network Meshes - istio.io
Istio: Bringing VMs into the Mesh (with Cynthia Coan) - tetrate.io
Bridging Traditional and Modern Workloads - tetrate.io
路线图
Tetrate Service Bridge
Tetrate
很多工作
WorkloadGroup
Bookinfo 示例中的流量示意图