k8s~istio的安装与核心组件

打印 上一主题 下一主题

主题 782|帖子 782|积分 2346

安装istio

  1. $ curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.20.2 TARGET_ARCH=x86_64 sh -
  2. $ cd istio-1.20.2
  3. $ export PATH=$PWD/bin:$PATH
  4. $ istioctl install --set profile=demo -y
  5. ✔ Istio core installed
  6. ✔ Istiod installed
  7. ✔ Egress gateways installed
  8. ✔ Ingress gateways installed
  9. ✔ Installation complete
复制代码
卸载
  1. istioctl x uninstall --purge
复制代码
开启pod自动注入sidecar
  1. $ kubectl label namespace default istio-injection=enabled --overwrite
  2. [root@elasticsearch02 istio]#  kubectl get namespace -L istio-injection
  3. NAME                          STATUS   AGE     ISTIO-INJECTION
  4. apisix                        Active   7d22h
  5. bigdata                       Active   343d
  6. cattle-impersonation-system   Active   674d
  7. cattle-pipeline               Active   356d
  8. cattle-prometheus             Active   568d
  9. cattle-prometheus-p-whn4g     Active   568d
  10. cattle-system                 Active   2y1d
  11. default                       Active   2y1d    enabled
复制代码
k8s和istio中的组件对比


查看istio的组件

查看pod
  1. kubectl get pods -n istio-system
  2. NAME                                   READY   STATUS    RESTARTS   AGE
  3. istio-egressgateway-67b78cc94c-rm8t5   1/1     Running   0          7m41s
  4. istio-ingressgateway-7d57fd4b-kn8nh    1/1     Running   0          7m41s
  5. istiod-5ddd75f545-kc4lm                1/1     Running   0          8m36s
复制代码
查看服务
  1. kubectl get svc -n istio-system
  2. NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                                      AGE
  3. istio-egressgateway    ClusterIP      10.43.208.79    <none>        80/TCP,443/TCP                                                               4d17h
  4. istio-ingressgateway   LoadBalancer   10.43.88.59     <pending>     15021:27218/TCP,80:25359/TCP,443:23532/TCP,31400:13324/TCP,15443:25647/TCP   4d18h
  5. istiod                 ClusterIP      10.43.130.158   <none>        15010/TCP,15012/TCP,443/TCP,15014/TCP      
复制代码
istio-ingressgateway 是 Istio 提供的一个组件,它作为 Kubernetes 集群的入口,接收从集群外部来的流量,并根据 Istio 的路由规则将流量转发到集群内部的服务。
在 Kubernetes 中,istio-ingressgateway 通常被部署为一个 LoadBalancer 类型的 Service。如果你的 Kubernetes 集群运行在支持自动创建负载均衡器的云平台上(如 AWS、GCP、Azure 等),那么当你部署 istio-ingressgateway 时,云平台会自动为它创建一个外部的 L4 层负载均衡器,并将该负载均衡器的 IP 地址或者域名设置到 Service 的 status.loadBalancer.ingress 字段。
然而,如果你的 Kubernetes 集群运行在不支持自动创建负载均衡器的环境中(如裸金属服务器、某些私有云环境等),那么 istio-ingressgateway 的状态就会一直是 Pending,因为 Kubernetes 无法为它创建外部的负载均衡器。这种情况下,你需要手动配置一个方式(如使用 NodePort、HostNetwork 或者使用外部的负载均衡器软件)来让外部流量能够访问到 istio-ingressgateway。
总的来说,istio-ingressgateway 的作用是接收并转发从集群外部来的流量。如果它的状态一直是 Pending,那么可能是因为你的环境不支持自动创建负载均衡器,你需要手动配置一个访问方式。
安装后组件的说明

k8s pod,istio service
在Kubernetes集群中安装 Istio 后,会创建一个名为 istio-system 的命名空间,并在其中部署一些核心的 Istio 组件。这些组件包括:

  • istio-egressgateway:Istio出口网关(Egress Gateway)负责管理服务对外部服务的访问,允许服务在网格之外访问外部服务。它可以配置和执行流量控制、安全策略、路由等功能,以便管理服务对外部服务的通信。
  • istio-ingressgateway:Istio入口网关(Ingress Gateway)用于接收来自外部流量并将其引导到网格内部的服务。它充当了整个服务网格的入口点,可以执行流量路由、负载均衡、TLS终止等功能。
  • istiod:istiod 是 Istio 服务网格的核心组件,负责实现服务发现、流量管理、安全性和遥测等功能。istiod 运行着Pilot、Mixer 和 Citadel 等子组件,它们共同协作来提供服务网格的各种功能。
在Kubernetes中使用 Istio,你可以通过以下方式进行操作:

  • 部署微服务应用:将你的微服务应用程序部署到Kubernetes集群中,并且通过Istio的流量管理功能实现服务之间的通信、负载均衡和故障恢复等。
  • 配置流量控制:利用Istio的流量管理功能,可以对服务之间的流量进行路由、限速、重试策略等灵活的控制。
  • 实现安全策略:通过Istio的安全功能,可以在服务之间实现强大的身份验证、安全通信、访问控制等。
  • 收集和展示遥测数据:Istio提供了丰富的遥测功能,可以帮助你收集并展示服务之间的流量、延迟、错误等数据,从而进行监控和故障排查。
总之,在Kubernetes中使用 Istio,你可以利用其丰富的功能来实现微服务架构中的流量管理、安全控制、遥测分析等需求,从而更好地管理和运维你的微服务应用程序。
实例体现

要配置 Istio 的流量管理功能,你需要使用 Istio 的资源对象(如 VirtualService、DestinationRule 等)来定义你的流量控制策略。下面是一些基本的步骤和示例,帮助你开始配置 Istio 的流量管理功能:
demo天气例子
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: frontend
  5.   labels:
  6.     app: frontend
  7.     service: frontend
  8. spec:
  9.   ports:
  10.   - port: 3000
  11.     name: http
  12.   selector:
  13.     app: frontend
  14. ---
  15. apiVersion: apps/v1
  16. kind: Deployment
  17. metadata:
  18.   name: frontend-v1
  19.   labels:
  20.     app: frontend
  21.     version: v1 # 注意,这块对应的是istio配置中的DestinationRule里的label,DestinationRule根据v1找到pod中version为v1的pod
  22. spec:
  23.   selector:
  24.     matchLabels:
  25.       app: frontend
  26.       version: v1
  27.   replicas: 1
  28.   template:
  29.     metadata:
  30.       labels:
  31.         app: frontend
  32.         version: v1
  33.     spec:
  34.       containers:
  35.       - name: frontend
  36.         image: istioweather/frontend:v1
  37.         imagePullPolicy: IfNotPresent
  38.         ports:
  39.         - containerPort: 3000
  40. ---
  41. apiVersion: v1
  42. kind: Service
  43. metadata:
  44.   name: advertisement
  45.   labels:
  46.     app: advertisement
  47.     service: advertisement
  48. spec:
  49.   ports:
  50.   - port: 3003
  51.     name: http
  52.   selector:
  53.     app: advertisement
  54. ---
  55. apiVersion: apps/v1
  56. kind: Deployment
  57. metadata:
  58.   name: advertisement-v1
  59.   labels:
  60.     app: advertisement
  61.     version: v1
  62. spec:
  63.   selector:
  64.     matchLabels:
  65.       app: advertisement
  66.       version: v1
  67.   replicas: 1
  68.   template:
  69.     metadata:
  70.       labels:
  71.         app: advertisement
  72.         version: v1
  73.     spec:
  74.       containers:
  75.       - name: advertisement
  76.         image: istioweather/advertisement:v1
  77.         imagePullPolicy: IfNotPresent
  78.         ports:
  79.         - containerPort: 3003
  80. ---
  81. apiVersion: v1
  82. kind: Service
  83. metadata:
  84.   name: forecast
  85.   labels:
  86.     app: forecast
  87.     service: forecast
  88. spec:
  89.   ports:
  90.   - port: 3002
  91.     name: http
  92.   selector:
  93.     app: forecast
  94. ---
  95. apiVersion: apps/v1
  96. kind: Deployment
  97. metadata:
  98.   name: forecast-v1
  99.   labels:
  100.     app: forecast
  101.     version: v1
  102. spec:
  103.   selector:
  104.     matchLabels:
  105.       app: forecast
  106.       version: v1
  107.   replicas: 1
  108.   template:
  109.     metadata:
  110.       labels:
  111.         app: forecast
  112.         version: v1
  113.     spec:
  114.       containers:
  115.       - name: forecast
  116.         image: istioweather/forecast:v1
  117.         imagePullPolicy: IfNotPresent
  118.         ports:
  119.         - containerPort: 3002
  120. ---
复制代码
部署istio服务

步骤一:创建Gateway
  1. apiVersion: networking.istio.io/v1alpha3
  2. kind: Gateway
  3. metadata:
  4.   name: weather-gateway
  5.   namespace: istio-system
  6. spec:
  7.   selector:
  8.     istio: ingressgateway # use istio default controller
  9.   servers:
  10.   - port:
  11.       number: 80
  12.       name: http
  13.       protocol: HTTP
  14.     hosts:
  15.     - "*" #对所有域名都生效
复制代码
步骤一:创建 VirtualService

VirtualService 定义了请求应该如何路由到目标服务。例如,你可以根据请求的路径、主机名等条件将请求路由到不同的服务版本。
  1. apiVersion: networking.istio.io/v1alpha3
  2. kind: VirtualService
  3. metadata:
  4.   name: my-service
  5. spec:
  6.   hosts:
  7.   - "vue.xip.com" #这里配置哪个域名走istio流量控制
  8.   http:
  9.   - route:
  10.     - destination:
  11.         host: frontend
  12.         port:
  13.           number: 8080
  14.         subset: v1
复制代码
步骤二:创建 DestinationRule

DestinationRule 定义了对特定服务的流量策略,包括负载均衡、TLS设置等。
  1. apiVersion: networking.istio.io/v1alpha3
  2. kind: DestinationRule
  3. metadata:
  4.   name: my-service
  5. spec:
  6.   host: frontend
  7.   subsets:
  8.   - name: v1
  9.     labels:
  10.       version: v1 # 转发到pod中标签有version的,并且值为v1的
  11.   - name: v2
  12.     labels:
  13.       version: v2
复制代码
查看已经创建的gateway,virtualService
  1. kubectl get gateway -n <namespace>
  2. kubectl describe gateway <gateway-name> -n <namespace>
  3. kubectl get virtualservice -n <namespace>
  4. kubectl describe virtualservice <virtualservice-name> -n <namespace>
复制代码
查看部署后的gateway和virutalservice

gateway
  1. [root@elasticsearch02 istio]# kubectl describe gateway weather-gateway  -n istio-system
  2. Name:         weather-gateway
  3. Namespace:    istio-system
  4. Labels:       <none>
  5. Annotations:  kubectl.kubernetes.io/last-applied-configuration:
  6.                 {"apiVersion":"networking.istio.io/v1alpha3","kind":"Gateway","metadata":{"annotations":{},"name":"weather-gateway","namespace":"istio-sys...
  7. API Version:  networking.istio.io/v1beta1
  8. Kind:         Gateway
  9. Metadata:
  10.   Creation Timestamp:  2024-01-24T03:08:34Z
  11.   Generation:          4
  12.   Managed Fields:
  13.     API Version:  networking.istio.io/v1alpha3
  14.     Fields Type:  FieldsV1
  15.     fieldsV1:
  16.       f:metadata:
  17.         f:annotations:
  18.           .:
  19.           f:kubectl.kubernetes.io/last-applied-configuration:
  20.       f:spec:
  21.         .:
  22.         f:selector:
  23.           .:
  24.           f:istio:
  25.         f:servers:
  26.     Manager:         kubectl
  27.     Operation:       Update
  28.     Time:            2024-01-24T03:08:34Z
  29.   Resource Version:  190297478
  30.   UID:               4e92bf14-dda0-468a-8c9f-00b3297b121e
  31. Spec:
  32.   Selector:
  33.     Istio:  ingressgateway
  34.   Servers:
  35.     Hosts:
  36.       *
  37.     Port:
  38.       Name:      http
  39.       Number:    80
  40.       Protocol:  HTTP
  41. Events:          <none>
复制代码
virtualservice
  1. [root@elasticsearch02 istio]# kubectl describe virtualservice frontend-route -n ic-test
  2. Name:         frontend-route
  3. Namespace:    ic-test
  4. Labels:       <none>
  5. Annotations:  kubectl.kubernetes.io/last-applied-configuration:
  6.                 {"apiVersion":"networking.istio.io/v1alpha3","kind":"VirtualService","metadata":{"annotations":{},"name":"frontend-route","namespace":"ic-...
  7. API Version:  networking.istio.io/v1beta1
  8. Kind:         VirtualService
  9. Metadata:
  10.   Creation Timestamp:  2024-01-24T03:08:55Z
  11.   Generation:          6
  12.   Managed Fields:
  13.     API Version:  networking.istio.io/v1alpha3
  14.     Fields Type:  FieldsV1
  15.     fieldsV1:
  16.       f:metadata:
  17.         f:annotations:
  18.           .:
  19.           f:kubectl.kubernetes.io/last-applied-configuration:
  20.       f:spec:
  21.         .:
  22.         f:gateways:
  23.         f:hosts:
  24.         f:http:
  25.     Manager:         kubectl
  26.     Operation:       Update
  27.     Time:            2024-01-24T03:08:55Z
  28.   Resource Version:  190328684
  29.   UID:               94c655d1-c48a-45b6-8f90-e0bf214702eb
  30. Spec:
  31.   Gateways:
  32.     istio-system/weather-gateway
  33.   Hosts:
  34.     vue.xip.com
  35.   Http:
  36.     Match:
  37.       Port:  80
  38.     Route:
  39.       Destination:
  40.         Host:  frontend
  41.         Port:
  42.           Number:  3000
  43.         Subset:    v1
  44. Events:            <none>
复制代码
在ingress中可视化体现,多个域名都通过istio ingress去管理入口流量


自动sidecar注入配置

要在 Istio 中开启自动的 sidecar 注入,你可以通过以下步骤来实现:

  • 安装 Istio:首先需要安装 Istio 到你的 Kubernetes 集群中。你可以使用 istioctl 或者 Helm 来进行安装,具体安装步骤可以参考 Istio 官方文档。
  • 开启自动 sidecar 注入:在安装 Istio 时,你可以选择开启自动 sidecar 注入功能。在 Istio 1.5 版本后,默认情况下自动 sidecar 注入功能是开启的,但在一些特定情况下可能需要手动确认是否已经开启。
  • 确认命名空间标签:确保你要启用自动 sidecar 注入的命名空间已经添加了 Istio 的注入标签。你可以通过以下命令来查看:
    1. kubectl get namespace your-namespace -o=jsonpath='{.metadata.labels}'
    复制代码
    如果没有 istio-injection 标签,你可以使用以下命令来为命名空间添加标签:
    1. kubectl label namespace your-namespace istio-injection=enabled
    复制代码
  • 部署新的 Pod:一旦确认自动 sidecar 注入功能已经开启,并且命名空间已经添加了 Istio 的注入标签,当你部署新的 Pod 时,Istio 将会自动为其注入 sidecar 容器。
通过以上步骤,你应该能够成功地开启 Istio 中的自动 sidecar 注入功能,并确保所有的服务都能够通过 Envoy 代理进行流量管理和控制。
istio中的对象汇总

在 Istio 中,ServiceEntry、DestinationRule 和 VirtualService 是用来定义和配置流量管理的重要概念。下面简要介绍它们的作用:

  • ServiceEntry

    • 作用:ServiceEntry 允许你将外部服务引入到 Istio 网格中,或者定义对外部服务的访问策略。
    • 场景:当你需要让 Istio 管理对外部服务的访问时,可以使用 ServiceEntry 将外部服务引入到 Istio 网格中,并对其进行流量控制和安全策略的定义。

  • DestinationRule

    • 作用:DestinationRule 定义了对特定服务的流量策略,包括负载均衡、TLS设置等。
    • 场景:在 Istio 中,你可以使用 DestinationRule 来定义对服务的流量策略,比如指定不同版本的服务之间的流量比例、超时设置、负载均衡策略等。

  • VirtualService

    • 作用:VirtualService 定义了请求应该如何路由到目标服务,以及对请求的修改和转发。
    • 场景:通过 VirtualService,你可以定义基于请求的流量路由规则,比如根据请求的路径、主机名等条件将请求路由到不同的服务版本,还可以定义请求的修改和转发。

这些概念一起构成了 Istio 中强大的流量管理功能,使得你能够灵活地定义和控制服务之间的通信和流量行为。通过合理使用这些概念,你可以实现诸如流量控制、故障恢复、A/B 测试、蓝绿部署等高级的流量管理策略。
除了 ServiceEntry、DestinationRule 和 VirtualService,Istio 还有一些其他重要的对象和资源,用于定义和配置服务网格中的各种功能和策略。以下是一些常见的 Istio 对象:

  • Gateway:用于定义 Istio 网格的入口点,允许流量进入网格并将其路由到适当的服务。
  • Sidecar:在 Istio 中,每个部署的应用程序都会有一个称为 sidecar 的边车代理,它负责处理应用程序的所有网络通信,并与 Istio 控制平面进行交互。
  • AuthorizationPolicy:用于定义对服务之间流量的访问控制策略,包括认证、授权和安全策略等。
  • PeerAuthentication:用于定义服务之间的双向 TLS 认证策略,确保服务之间的通信是安全的。
  • RequestAuthentication:用于定义对服务端点的请求认证策略,可以限制来自客户端的请求必须满足特定的认证条件。
  • EnvoyFilter:允许你为 Envoy 代理定义自定义的过滤器和配置,以实现更灵活的流量控制和处理。
  • ServiceRoleServiceRoleBinding:用于定义对服务的角色和权限控制,可以限制哪些服务具有对其他服务的访问权限。
这些对象一起构成了 Istio 的配置模型,通过对这些对象的定义和配置,你可以实现对服务网格中流量管理、安全性、可观察性等方面的精细控制。因此,熟悉并理解这些对象是使用 Istio 进行微服务架构管理的关键。
在istio中,Gateway,DestinationRule和VirtualService三者之间的关系可以用以下文字图示表示:
  1.          +-------------------+
  2.          |      Gateway      |
  3.          +---------+---------+
  4.                    |
  5.                    v
  6.          +---------+---------+
  7.          |  VirtualService  |
  8.          +---------+---------+
  9.                    |
  10.                    v
  11.          +---------+---------+
  12.          |  DestinationRule |
  13.          +-------------------+
复制代码
在这个示意图中,Gateway负责接收外部流量,并将其转发到内部服务。VirtualService定义了流量的路由规则,指定了如何将接收到的流量发送到不同的目标服务或版本。而DestinationRule定义了服务之间的通信策略,包括负载均衡、故障恢复等。因此,这三者之间存在一定的依赖关系,Gateway接收流量并将其传递给VirtualService,而VirtualService再根据定义的规则将流量分发给后端服务,同时DestinationRule定义了这些后端服务之间的通信策略。
Envoy Sidecar模式

当你将Istio部署到Kubernetes集群中时,它在外部流量转发的过程中起到了以下作用:

  • 流量管理:Istio通过Envoy sidecar代理来管理流量,可以实现流量控制、负载均衡、故障恢复和A/B测试等功能。
  • 安全:Istio提供了服务间的认证、加密通信和访问控制,确保了服务之间的安全通信。
  • 监控:Istio收集并展示了整个服务网格的指标、日志和跟踪数据,帮助你更好地监控和调试服务。
  • 策略执行:Istio可以通过定义网络策略来限制流量,例如路由规则、重试策略、超时设置等。
下面是一个简单的图示,描述了在Kubernetes集群中使用Istio的流量管理过程:
  1. 外部流量 -> Ingress -> Istio Ingress Gateway -> Envoy Sidecar -> 后端服务
复制代码
在这个示意图中,外部流量首先经过Kubernetes的Ingress,然后被Istio Ingress Gateway接管,并通过Envoy sidecar代理进行流量管理,最终到达后端服务。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我爱普洱茶

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表