lstio 快速摆设与简单使用

源码 2024-10-3 14:19:08 42 0 来自 中国
本篇文章将会用一个例子来展示 Istio 在流量管理方面的本领
流程如下:
1、使用官方的 istioctl 以默认设置来完成 Istio 的安装;
2、使用 Deployment 将一个应用的两个版本作为测试服务摆设到网格中;
3、将一个客户端服务摆设到网格中举行测试;
4、为我们的目标服务编写计谋文件,对目标服务的流量举行管理
情况简介:

这里给出对 Kubernetes 情况的要求:

  • Kubernetes 1.9或以上版本;
  • 具备管理权限的 kubectl 及其设置文件,可以或许操纵测试集群;
  • Kubernetes 集群要有获取互联网镜像的本领;
  • 要支持 lstio 的主动注入功能,须要查抄 Kubernetes APIServer 的启动参数,包管此中的 admissioncontrol 部门按序次启用 MutatingAdmissionWebhook 和 ValidatingAdmissionWebhook
我这里预备了一个版本为 v1.20.11 的 Kubernetes 集群来做测试,检察版本如下:
[root@k8s-master01 istio-yaml]# kubectl version --shortClient Version: v1.20.11Server Version: v1.20.11快速摆设 Istio

Istio 的 Github 发布地点为:https://github.com/istio/istio/releases
此中包罗各个客户端平台下的 Istio 的各个版本,以在我们常用的 Linux AMD 平台下摆设为例,直接下载对应的版本的 tar 包即可:
wget https://github.com/istio/istio/releases/download/1.10.1/istioctl-1.10.1-linux-amd64.tar.gz改 tar 包中仅包罗一个 istioctl 可实验文件,我们就直接将它解压到 $PATH 包罗的路径下:
tar xf istioctl-1.10.1-linux-amd64.tar.gz -C /usr/local/bin/然后就可以直接实验 istioctl 来举行安装操纵,但在这之前你要查抄一下你的 Kubernetes Node 中是否安装了 socat,我这里 Node 节点的体系发行版为 CentOS 7,以是直接 yum 检察即可:
yum list installed | grep socatsocat.x86_64                            1.7.3.2-2.el7                  @base假如没有安装,则可以使用 yum 安装:
yum install socat -y然后我们就可以实验下面下令开始在 Kubernetes 集群中注册和安装 Istio 相干组件了:
$ istioctl installDetected that your cluster does not support third party JWT authentication. Falling back to less secure first party JWT. See https://istio.io/v1.10/docs/ops/best-practices/security/#configure-third-party-service-account-tokens for details.! values.global.jwtPolicy is deprecated; use Values.global.jwtPolicy=third-party-jwt. See http://istio.io/latest/docs/ops/best-practices/security/#configure-third-party-service-account-tokens for more information insteadThis will install the Istio 1.10.1  profile with ["Istio core" "Istiod" "Ingress gateways"] components into the cluster. Proceed? (y/N) y✔ Istio core installed                                                                                                                                                                                                                                          ✔ Istiod installed                                                                                                                                                                                                                                              ✔ Ingress gateways installed                                                                                                                                                                                                                                    ✔ Installation complete                                                                                                                                                                                                                                         Thank you for installing Istio 1.10.  Please take a few minutes to tell us about your install/upgrade experience!  https://forms.gle/KjkrDnMPByq7akrYA安装完成后可以实验下面下令来验证是否实验乐成:
$ istioctl verify-install1 Istio control planes detected, checking --revision "default" onlyDetected that your cluster does not support third party JWT authentication. Falling back to less secure first party JWT. See https://istio.io/v1.10/docs/ops/best-practices/security/#configure-third-party-service-account-tokens for details.! values.global.jwtPolicy is deprecated; use Values.global.jwtPolicy=third-party-jwt. See http://istio.io/latest/docs/ops/best-practices/security/#configure-third-party-service-account-tokens for more information instead✔ ClusterRole: istiod-istio-system.istio-system checked successfully✔ ClusterRole: istio-reader-istio-system.istio-system checked successfully✔ ClusterRoleBinding: istio-reader-istio-system.istio-system checked successfully✔ ClusterRoleBinding: istiod-istio-system.istio-system checked successfully✔ Role: istiod-istio-system.istio-system checked successfully✔ RoleBinding: istiod-istio-system.istio-system checked successfully✔ ServiceAccount: istio-reader-service-account.istio-system checked successfully✔ ServiceAccount: istiod-service-account.istio-system checked successfully✔ ValidatingWebhookConfiguration: istiod-istio-system.istio-system checked successfully✔ CustomResourceDefinition: destinationrules.networking.istio.io.istio-system checked successfully✔ CustomResourceDefinition: envoyfilters.networking.istio.io.istio-system checked successfully✔ CustomResourceDefinition: gateways.networking.istio.io.istio-system checked successfully✔ CustomResourceDefinition: serviceentries.networking.istio.io.istio-system checked successfully✔ CustomResourceDefinition: sidecars.networking.istio.io.istio-system checked successfully✔ CustomResourceDefinition: virtualservices.networking.istio.io.istio-system checked successfully✔ CustomResourceDefinition: workloadentries.networking.istio.io.istio-system checked successfully✔ CustomResourceDefinition: workloadgroups.networking.istio.io.istio-system checked successfully✔ CustomResourceDefinition: authorizationpolicies.security.istio.io.istio-system checked successfully✔ CustomResourceDefinition: peerauthentications.security.istio.io.istio-system checked successfully✔ CustomResourceDefinition: requestauthentications.security.istio.io.istio-system checked successfully✔ CustomResourceDefinition: telemetries.telemetry.istio.io.istio-system checked successfully✔ CustomResourceDefinition: istiooperators.install.istio.io.istio-system checked successfully✔ HorizontalPodAutoscaler: istiod.istio-system checked successfully✔ ConfigMap: istio.istio-system checked successfully✔ Deployment: istiod.istio-system checked successfully✔ ConfigMap: istio-sidecar-injector.istio-system checked successfully✔ MutatingWebhookConfiguration: istio-sidecar-injector.istio-system checked successfully✔ PodDisruptionBudget: istiod.istio-system checked successfully✔ Service: istiod.istio-system checked successfully✔ EnvoyFilter: metadata-exchange-1.10.istio-system checked successfully✔ EnvoyFilter: tcp-metadata-exchange-1.10.istio-system checked successfully✔ EnvoyFilter: stats-filter-1.10.istio-system checked successfully✔ EnvoyFilter: tcp-stats-filter-1.10.istio-system checked successfully✔ EnvoyFilter: metadata-exchange-1.9.istio-system checked successfully✔ EnvoyFilter: tcp-metadata-exchange-1.9.istio-system checked successfully✔ EnvoyFilter: stats-filter-1.9.istio-system checked successfully✔ EnvoyFilter: tcp-stats-filter-1.9.istio-system checked successfully✔ HorizontalPodAutoscaler: istio-ingressgateway.istio-system checked successfully✔ Deployment: istio-ingressgateway.istio-system checked successfully✔ PodDisruptionBudget: istio-ingressgateway.istio-system checked successfully✔ Role: istio-ingressgateway-sds.istio-system checked successfully✔ RoleBinding: istio-ingressgateway-sds.istio-system checked successfully✔ Service: istio-ingressgateway.istio-system checked successfully✔ ServiceAccount: istio-ingressgateway-service-account.istio-system checked successfullyChecked 13 custom resource definitionsChecked 2 Istio Deployments✔ Istio is installed and verified successfully安装完成后会在 Kubernetes 集群的 istio-system 命名空间下创建如下两个 Deployment 资源:
[root@k8s-master01 istio-yaml]# kubectl get deploy -n istio-systemNAME                   READY   UP-TO-DATE   AVAILABLE   AGEistio-ingressgateway   1/1     1            1           3h13mistiod                 1/1     1            1           3h13m至此我们在 Kubernetes 集群中安装 Istio 就乐成啦~
摆设两个版本的服务

这里将使用一个简单的提供 HTTP 服务的步调作为服务端,以及另有一个包罗 curl 下令的镜像用作客户端举行测试,相干镜像已经在 Dockerhub 公开,以是下面的 manifests 都可以直接使用。
创建两个 Deployment 将其分别命名为 app-v1 和 app-v2,同时创建一个 Service 将其命名为 app,将下面内容生存为 app-istio.yaml:
---apiVersion: v1kind: Servicemetadata:  name: appspec:  ports:  - name: http    port: 80    protocol: TCP    targetPort: 80  selector:    app: app---apiVersion: apps/v1kind: Deploymentmetadata:  name: app-v1spec:  replicas: 1  selector:    matchLabels:      app: app      version: v1  template:    metadata:      labels:        app: app        version: v1    spec:      containers:      - image: dustise/flaskapp        name: app        env:         - name: version          value: v1---apiVersion: apps/v1kind: Deploymentmetadata:  name: app-v2spec:  replicas: 1  selector:    matchLabels:      app: app      version: v2  template:    metadata:      labels:        app: app        version: v2    spec:      containers:      - image: dustise/flaskapp        name: app        env:        - name: version          value: v2在上面的 YAML 源码中有以下须要留意的地方。

  • 两个版本的 Deployment 的镜像是划一的,但使用了差别的 version 标签举行区分,分别是 v1 和 v2;
  • 在两个版本的 Deployment 容器中都注册了一个被命名为 version 的情况变量,取值分别为 v1 和 v2;
  • 两个 Deployment 都使用了 app 和 version 标签,在 Istio 网格应用中通常会使用这两个标签作为应用和版本的标识;
  • Service 中的 Selector 仅使用了一个 app 标签,这意味着该 Service 对两个 Deployment 都是有效的;
  • 将在 Service 中界说的端口根据 Istio 规范命名为 http
接下来使用 istioctl 举行注入。之后会不停用到 istioctl 下令,它的根本作用就是修改 Kubernetes Deployment,在 Pod 中注入在前面提到的 Sidecar 容器,通常为了方便,我们会使用一个管道下令,在将 YAML 文件通过 istioctl 处理惩罚之后,通过下令行管道输出给 kubectl,终极提交到 Kubernetes 集群。
下令如下:
istioctl kube-inject -f app-istio.yaml | kubectl apply -f - -n 下令空间service/app createddeployment.apps/app-v1 createddeployment.apps/app-v2 created检察创建出来的 Pod:
[root@k8s-master01 istio-yaml]# kubectl get podNAME                          READY   STATUS    RESTARTS   AGEapp-v1-7bcd4ffdcb-pxnjd       2/2     Running   0          88mapp-v2-5d5d4cb79c-sxlpt       2/2     Running   0          88m可以看到,每个 Pod 都变成了两个容器,这也就是 Istio 注入 Sidecar 的结果。
检察 Pod 的容器:
[root@k8s-master01 istio-yaml]# kubectl describe pod/app-v1-7bcd4ffdcb-pxnjd |grep -i -B2 'image'  istio-init:    Container ID:  docker://ea57437ba11c2a7394b419a9ea87b43f33f7b2e4049e88fa777db2448cbb57ad    Image:         docker.io/istio/proxyv2:1.9.0    Image ID:      docker-pullable://istio/proxyv2@sha256:286b821197d7a9233d1d889119f090cd9a9394468d3a312f66ea24f6e16b2294--  app:    Container ID:   docker://cd3073485c98267fa8fad40e1ab2e088aa73dfc0abc73aaaeacbf0489a1a3a41    Image:          dustise/flaskapp    Image ID:       docker-pullable://dustise/flaskapp@sha256:c7177273f87e42754fe8786f839abf4ef870a697c2998c7f3ba818661cf4e960--  istio-proxy:    Container ID:  docker://c1ccdfa35923fe9deec7270b879544abadd65b5a7bb05f2410b0265eb036a03e    Image:         docker.io/istio/proxyv2:1.9.0    Image ID:      docker-pullable://istio/proxyv2@sha256:286b821197d7a9233d1d889119f090cd9a9394468d3a312f66ea24f6e16b2294然后,我们发如今这个 Pod 中多了一个容器,名称为 istio-proxy,这就是注入的结果。别的,前面另有一个名称为 istio-init 的初始化容器,这个容器是用于初始化挟制流量的。
摆设客户端服务

客户端服务很简单,只是使用了一个已安装好各种测试工具的镜像,具体的测试可以在其内部的 Shell 中完成。同样,编写一个 YAML 文件,将其命名为 test-client.yaml:
---apiVersion: v1kind: Servicemetadata:  labels:    app: testclient  name: testclientspec:  ports:  - name: ssh    port: 22    protocol: TCP    targetPort: 22  selector:    app: testclient    version: v1---apiVersion: apps/v1kind: Deploymentmetadata:  creationTimestamp: null  labels:    app: testclient  name: testclientspec:  replicas: 1  selector:    matchLabels:      app: testclient      version: v1  strategy: {}  template:    metadata:      creationTimestamp: null      labels:        app: testclient        version: v1    spec:      containers:      - image: zze326/test-tools        command: ['init']        name: test-tools大概你会留意到,这个应用并没有提供对外服务的本领,我只是给它创建了一个 Service 对象,同样是 Istio 的注入要求:没有 Service 的 Deployment 是无法被 Istio 发现并举行操纵的。
同样,对该文件举行注入,并提交到 Kubernetes 上运行:
istioctl kube-inject -f testclient-deploy.yaml | kubectl apply -f -service/testclient createddeployment.apps/testclient created等候 Pod 乐成进入 Running 状态:
[root@k8s-master01 istio-yaml]# kubectl get pod -lapp=testclient NAME                          READY   STATUS    RESTARTS   AGEtestclient-7fbb8ddf94-qfn54   2/2     Running   0          81m可以看到 testclient 应用的 Pod 已经开始运行
验证服务

接下来,我们可以通过 kubectl exec -it 下令进入客户端 Pod,来测试 app 服务的具体表现。
使用一个简单的 for 循环,重复获取 http://flaskapp/env/version 的内容,也就是调用 app 服务,检察其返回结果:
$ kubectl exec -it testclient-7fbb8ddf94-qfn54 -- bashDefaulting container name to test-tools.Use 'kubectl describe pod/testclient-7fbb8ddf94-qfn54 -n default' to see all of the containers in this pod.bash-5.1# for i in `seq 10`;do curl http://app/env/version;echo; done;v1v1v2v2v1v2v1v1v2v2从上面的运行结果中可以看到,v1 和 v2 这两种结果随机出现,大约各占一半。这很容易明确,由于我们的 app 服务的选择器被界说为只根据 app 标签举行选择,两个版本的服务 Pod 数目雷同,因此会出现轮替输出的结果。
创建目标规则和路由

接下来使用 Istio 来管理这两个服务的流量。起首创建 app 应用的目标规则,输入以下内容井将其生存为 app-destinationrule.yaml:
apiVersion: networking.istio.io/v1beta1kind:  DestinationRulemetadata:   name: appspec:  host: app  subsets:  - name: v1    labels:      version: v1  - name: v2    labels:      version: v2这里界说了一个名称为 app 的 DestinationRule,它使用 Pod 标签把 app 服务分成两个 subset,将其分别命名为 v1 和 v2。下面将 app-destinationrule.yaml 提交到集群上:
kubectl apply -f app-destinationrule.yaml destinationrule.networking.istio.io/app created接下来就须要为 app 服务创建默认的路由规则了,岂论是否举行进一步的流量控制,都发起为网格中的服务创建默认的路由规则,以防发生料想之外的访问结果。
使用下面的内容创建文本文件 app-default-vs-v2.yaml:
apiVersion: networking.istio.io/v1beta1kind: VirtualServicemetadata:  name: app-default-v2spec:  hosts:   - app  http:  - route:    - destination:        host: app        subset: v2在该文本文件中,我们界说了一个 VirtualService 对象,将其命名为 app-default-v2,它负责担当对 app 这一主机名的访问,会将全部流量都转发到 DestinationRule 界说的 v2 subset 上。
再次实验 kubectl 将 VirtualService 提交到集群上:
kubectl apply -f app-default-vs-v2.yaml virtualservice.networking.istio.io/app-default-v2 created在创建乐成后,可以再次进入客户端 Pod,看看新界说的流量管理规则是否收效:
[root@k8s-master01 istio-yaml]# kubectl exec -it testclient-7fbb8ddf94-qfn54 -- bashDefaulting container name to test-tools.Use 'kubectl describe pod/testclient-7fbb8ddf94-qfn54 -n default' to see all of the containers in this pod.bash-5.1# for i in `seq 10`;do curl http://app/env/version;echo;done;v2v2v2v2v2v2v2v2v2v2默认的路由已经收效,如今重复多次访问,返回的内容来自情况变量 version 被设置为 v2 的版本,也就是 v2 版本
总结一下

本篇实践了一个较为范例的 Istio 服务上线流程:注入→摆设→创建目标规则→创建默认路由。绝大多数 lstio 网格应用都会依照这一流程举行上线。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 16:54, Processed in 0.156018 second(s), 32 queries.© 2003-2025 cbk Team.

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