Kubernetes 服务接入 Istio

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Kubernetes 服务接入 Istio

Kubernetes 服务接入 Istio

网络异常,图片无法展示
|

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,执行以下操作:

apiVersion: networking.istio.io/v1alpha3kind: WorkloadEntrymetadata:  name: vm1  namespace: ns1spec:  address: 1.1.1.1  labels:    app: foo    instance-id: vm-78ad2    class: vm---apiVersion: networking.istio.io/v1alpha3kind: ServiceEntrymetadata:  name: svc1  namespace: ns1spec:  hosts:  - svc1.internal.com  ports:  - number: 80    name: http    protocol: HTTP  resolution: STATIC  workloadSelector:    labels:      app: foo

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


网络异常,图片无法展示
|


请注意,ServiceEntry 可以使用相同的选择器引用 Pod 和 WorkloadEntries。现在,Istio 可以对 VM 和 Pod 进行相同的处理,而不必将它们分开。

VM 自动注册

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

如何实现自动注册那?

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

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

然后我们创建如下的 WorkloadGroup:

apiVersion: networking.istio.io/v1alpha3kind: WorkloadGroupmetadata:  name: python-http  namespace: vmspec:  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 服务进行访问。

apiVersion: networking.istio.io/v1beta1kind: ServiceEntrymetadata:  name: vm-workload-svc  namespace: vmspec:  hosts:  - vmservice.example.com  location: MESH_INTERNAL  ports:  - number: 80    name: http    protocol: HTTP    targetPort: 9090  resolution: STATIC  workloadSelector:    labels:      app: python-http


网络异常,图片无法展示
|


关于 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 的时候,可以通过如下参数启用该功能:

--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 名称由代理解析,并通过“东西方网关”路由到网格中的适当服务。


网络异常,图片无法展示
|



相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1月前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
120 60
|
1月前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
204 62
|
4天前
|
存储 Kubernetes 网络协议
k8s的无头服务
Headless Service 是一种特殊的 Kubernetes 服务,其 `spec:clusterIP` 设置为 `None`,不会分配 ClusterIP,通过 DNS 解析提供服务发现。与普通服务不同,Headless Service 不提供负载均衡功能,每个 Pod 都有唯一的 DNS 记录,直接映射到其 IP 地址,适用于有状态应用的场景,如与 StatefulSet 一起部署数据库。示例中通过创建 Nginx 的 StatefulSet 和 Headless Service,展示了如何直接访问单个 Pod 并进行内容修改。
15 3
|
1月前
|
Prometheus Kubernetes 监控
k8s学习--kubernetes服务自动伸缩之水平伸缩(pod副本伸缩)HPA详细解释与案例应用
k8s学习--kubernetes服务自动伸缩之水平伸缩(pod副本伸缩)HPA详细解释与案例应用
k8s学习--kubernetes服务自动伸缩之水平伸缩(pod副本伸缩)HPA详细解释与案例应用
|
1月前
|
负载均衡 Kubernetes 区块链
随机密码生成器+阿里k8s负载均衡型服务加证书方法+移动终端设计+ico生成器等
随机密码生成器+阿里k8s负载均衡型服务加证书方法+移动终端设计+ico生成器等
50 1
|
1月前
|
Kubernetes 应用服务中间件 nginx
k8s学习--kubernetes服务自动伸缩之水平收缩(pod副本收缩)VPA策略应用案例
k8s学习--kubernetes服务自动伸缩之水平收缩(pod副本收缩)VPA策略应用案例
|
1月前
|
Kubernetes 监控 调度
k8s学习--kubernetes服务自动伸缩之垂直伸缩(资源伸缩)VPA详细解释与安装
k8s学习--kubernetes服务自动伸缩之垂直伸缩(资源伸缩)VPA详细解释与安装
|
1月前
|
Kubernetes 应用服务中间件 nginx
k8s基础使用--使用k8s部署nginx服务
本文介绍了Kubernetes中核心概念Deployment、Pod与Service的基本原理及应用。Pod作为最小调度单元,用于管理容器及其共享资源;Deployment则负责控制Pod副本数量,确保其符合预期状态;Service通过标签选择器实现Pod服务的负载均衡与暴露。此外,还提供了具体操作步骤,如通过`kubectl`命令创建Deployment和Service,以及如何验证其功能。实验环境包括一台master节点和两台worker节点,均已部署k8s-1.27。
156 1
|
3月前
|
运维 Kubernetes 容器
【Azure K8S】演示修复因AKS密钥过期而导致创建服务不成功的问题(The provided client secret keys for app ****** are expired)
【Azure K8S】演示修复因AKS密钥过期而导致创建服务不成功的问题(The provided client secret keys for app ****** are expired)
【Azure K8S】演示修复因AKS密钥过期而导致创建服务不成功的问题(The provided client secret keys for app ****** are expired)
|
3月前
|
Kubernetes 安全 Docker
在K8S中,在服务上线的时候Pod起不来怎么进行排查?
在K8S中,在服务上线的时候Pod起不来怎么进行排查?