前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >涨姿势!将部署在虚拟机里的服务接入 Istio

涨姿势!将部署在虚拟机里的服务接入 Istio

作者头像
DevOps时代
发布2021-07-09 11:12:41
1.3K0
发布2021-07-09 11:12:41
举报
文章被收录于专栏:DevOps时代的专栏

Istio 在设计之初,主要面向 Kubernetes 当中的服务。但是在实际场景中,依旧有不少服务部署在 VM 上,Istio 想成为 Service Mesh 事实上的标准,毫无疑问需要支持 VM 部署的服务。

Istio1.6 新增了 WorkloadEntry 自定义资源,通过该资源为 VM 提供了一流的支持。

Istio1.7 增加了安全引导 VM 中运行的服务的身份的功能。最后,Istio 1.7 增加了Sidecar 的安装包,以支持 CentOS/Red Hat 和现有的 Debian/Ubuntu。

Istio1.8 新增了智能 DNS 代理,它是由 Go 编写的 Istio sidecar 代理,sidecar 上的 Istio agent 将附带一个由 Istiod 动态编程的缓存 DNS 代理。来自应用程序的 DNS 查询会被 pod 或 VM 中的 Istio 代理透明地拦截和服务,该代理会智能地响应 DNS 查询请求,可以实现虚拟机到服务网格的无缝多集群访问。

并且 Istio1.8 新增了 WorkloadGroup 自定义资源,该资源是描述部署在 VM 上的服务实例的集合,旨在模仿现有的用于 Kubernetes 工作负载的 Sidecar 注入和 Deployment 规范模型,以引导 Istio 代理。

通过 WorkloadGroup 方式, 实现 VM 实例自动注册的功能目前处于 pre-alpha 状态

WorkloadEntry

WorkloadEntry 用来描述非 Pod 的端点,将 VM 纳入 mesh 中。此时 VM 成为像 Pod 一样的一等公民,可以配置 MUTUAL_TLS。

要创建一个 WorkloadEntry 并将其附加到 ServiceEntry,执行以下操作:

代码语言:javascript
复制
apiVersion: networking.istio.io/v1alpha3
kind: WorkloadEntry
metadata:
  name: vm1
  namespace: ns1
spec:
  address: 1.1.1.1
  labels:
    app: foo
    instance-id: vm-78ad2
    class: vm
---
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: svc1
  namespace: ns1
spec:
  hosts:
  - svc1.internal.com
  ports:
  - number: 80
    name: http
    protocol: HTTP
  resolution: STATIC
  workloadSelector:
    labels:
      app: foo

这将创建一个包含一组标签和地址的新 WorkloadEntry,以及一个使用 WorkloadSelector 选择带有所需标签的所有端点的 ServiceEntry,在这种情况下,包括为 VM 创建的 WorkloadEntry。

VM自动注册

WorkloadGroup 主要用于 WorkloadEntry 自动注册,该功能在实际场景中比较实用。事实上我们部署在VM当中的服务,一般都会配置自动伸缩,这就要求我们的服务必须可以自动注册到 mesh 中。

如何实现自动注册那?

首先我们需要做一些准备工作:

  • 在安装istiod的时候,启用自动注册的功能。
代码语言:javascript
复制
$ istioctl install --set values.pilot.env.PILOT_ENABLE_WORKLOAD_ENTRY_AUTOREGISTRATION=true
  • 部署一个east-west gateway。用于暴露istiod服务,从而可以让VM上的Sidecar 可以和istiod 通信。

然后我们创建如下的 WorkloadGroup:

代码语言:javascript
复制
apiVersion: networking.istio.io/v1alpha3
kind: WorkloadGroup
metadata:
  name: python-http
  namespace: vm
spec:
  metadata:
    annotations: {}
    labels:
      app: python-http
  template:
    ports: {}
    serviceAccount: my-vm

这样我们在每个 vm 上 python-http 实例启动后,都会自动在 mesh 中创建一个WorkloadEntry。而创建的 WorkloadEntry,包含了 VM 实例的 ip 和元数据。此时我们就可以创建一个ServiceEntry,通过标签选择器选择我们的 WorkloadEntry。然后 mesh中的其他服务就可以通过 ServiceEntry 中的 hosts, 对我们的 python-http 服务进行访问。

代码语言:javascript
复制
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: vm-workload-svc
  namespace: vm
spec:
  hosts:
  - vmservice.example.com
  location: MESH_INTERNAL
  ports:
  - number: 80
    name: http
    protocol: HTTP
    targetPort: 9090
  resolution: STATIC
  workloadSelector:
    labels:
      app: python-http
代码语言:javascript
复制

关于VM详细的安装步骤,参考官方文档。

智能 DNS

其实完成 VM 自动注册,并不能通过主机名实现虚拟机到服务网格的无缝访问。例如,如果我们在 VM 上部署 Istio sidecar 代理,我们将无法通过主机名(例如httpbin.default.svc.cluster.local)访问网格和 Kubernetes 集群中服务。此时我们需要智能 DNS。

在 Istio 1.8 中,Sidecar 现在具有一个 DNS 代理,该代理缓存网格中的端点和ServiceEntry 资源创建的端点。通过 Iptables 规则,拦截 dns 请求到 sidecar 本地 dns server,在缓存中可以解析的主机名,则直接返回解析结果,如果找不到,它将作为普通 DNS 代理委派给系统 DNS。这样 vm 上的服务可以通过主机名访问 mesh 中的服务。

智能DNS 默认没有启用,我们在安装istio的时候,可以通过如下参数启用该功能:

代码语言:javascript
复制
--set meshConfig.defaultConfig.proxyMetadata.ISTIO_META_DNS_CAPTURE=true

总结

当 VM 连接到 Istio 控制平面时,它通过“东西向网关”进行连接。该网关实际上只是一个专门为网格内部流量指定的Istio网关,现在,东西向网关已经是 Istio 1.8 中的推荐部署。

一旦从VM Sidecar到Istio控制平面建立了连接,便会创建适当的WorkloadEntry资源,并使VM Sidecar可以解析集群中的所有服务。从VM上部署服务可以直接访问httpbin.default.svc.cluster.local。DNS名称由代理解析,并通过“东西方网关”路由到网格中的适当服务。

来源:https://segmentfault.com/a/1190000038799970

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DevOps时代 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • WorkloadEntry
  • VM自动注册
  • 智能 DNS
  • 总结
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档