网站数据概况

3最近活跃访客

14今日访问人数

346今日访问量

11昨日访问人数

849昨日访问量

1,195本月访问量

1,195总访问量


公告

微信 👇

QR Code

全网最美博客-teek(知识库&博客二合一) --正在持续迭代,欢迎大家尝鲜及提出新需求,共同打造一个完美的作品。

Skip to content
1

1、Istio安装配置

Istio安装配置

本节实战

实战名称
🚩 实战:istioctl方式安装istio-2023.11.3(测试成功)
🚩 实战:手动注入 Envoy Sidecar-2023.11.3(测试成功)
🚩 实战:自动注入 Envoy Sidecar-2023.11.8(测试成功)
🚩 实战:BookInfo 示例应用-2023.11.5(测试成功)
🚩 实战:自定义一个端口访问应用-2023.11.6(测试成功)

目录

[toc]

前言

前面在服务网格基础章节我们和大家已经了解了 Istio 的基本概念以及架构,本章节我们将来快速了解 Istio 的基本使用方法,对 Istio 有一个最基本的认识。

img

1、安装

安装 Istio 之前,需要准备一个 Kubernetes 集群,我们可以使用任何支持的平台,例如 Minikube、Kind、Kubeadm 等,但是需要注意的是目前的 Istio 最新版本为 v1.19.3 版本,不同的版本支持的 Kubernetes 版本不同,可以参考下表进行对照:

img

我们这里选择最新的版本为 v1.19.3,Kubernetes 版本为 v1.27.6:

bash
$kubectlgetnodesNAMESTATUSROLESAGEVERSIONmaster1Readycontrol-plane43dv1.27.6node1Ready<none>43dv1.27.6node2Ready<none>43dv1.27.6

安装方式

在 Kubernetes 集群上安装 Istio 的方法有很多方式,可以根据自己的需求选择不同的安装方式,我们可以先对比下每种方式的优缺点。

1.使用 istioctl install

具有高安全性、简单的安装和管理方法,这也是社区推荐的安装方法。

  • 优点:

    • 完整的配置和运行状态的验证。

    • 使用提供了扩展的配置、自定义选项的 IstioOperatorAPI。

    • 不需要集群内的高权限 Pod,通过执行 istioctl命令修改。

  • 缺点:

    • 需要维护多个 Istio 版本的二进制文件。

    • istioctl命令可能根据你的运行环境设置诸如 JWT_POLICY之类的值,从而在不同的 Kubernetes 环境中产生不同的安装结果。

整体来说,这里的缺点对我们可能影响不大。

2.使用 istioctl manifest generate 安装

生成 Kubernetes 的配置清单,并通过 kubectl apply --prune命令应用到集群中。该方法适用于需要严格审查或者增加配置清单的情况。

  • 优点:

    • Chart 是由与 istioctl install和 Operator 里使用的相同的 IstioOperatorAPI 生成的。

    • 使用提供了扩展的配置、自定义选项的 IstioOperatorAPI。

  • 缺点:

    • 一些在 istioctl install和 Operator 中会进行的检查将不会执行。

    • istioctl install相比,UX 不够简洁。

    • 错误反馈没有 istioctl install的详细、全面。

3.使用 Helm 安装

使用 Helm 的 Chart 可以通过 Helm 的工作流轻松的完成,并在升级的过程中自动清理资源。

  • 优点:

    • 使用熟悉、常用的行业标准工具。

    • Helm 原生的版本、升级管理。

  • 缺点:

    • 相比于 istioctl install和 Operator 相比,检查较少。

    • 一些管理任务需要更多步骤,具有更高的复杂性。

4.使用 Istio Operator 安装

不建议在新安装时使用 Operator,虽然 Operator 将继续得到支持,但新的功能特性不会被优先考虑。

Istio Operator 提供了一种安装路径,无需使用 istioctl二进制文件。这可以用于简化升级工作流程,不必担心在集群中运行特权控制器的问题。此方法适用于不需要严格审计或增加输出清单的情况。

  • 优点:

    • istioctl install相同的 API,但通过集群中的控制器 Pod 进行操作,实现了完全声明式操作。

    • IstioOperator API提供了广泛的配置/定制选项。

    • 不需要管理多个 istioctl二进制文件。

  • 缺点:

    • 集群中运行的高权限控制器存在安全风险。

安装 Istio

==🚩 实战:istioctl方式安装istio-2023.11.3(测试成功)==

实验环境:

bash
k8sv1.25.4(containerd:[root@master1 ~]#istioctl versionclientversion:1.19.3controlplaneversion:1.19.3dataplaneversion:1.19.3(8 proxies)

实验软件:

链接:https:# Copyright Istio Authors## Licensed under the Apache License,Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at## http:## Unless required by applicable law or agreed to in writing,software# distributed under the License is distributed on an "AS IS"BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,either express or implied.# See the License for the specific language governing permissions and# limitations under the License.## This file will be fetched as:curl -L https:# so it should be pure bourne shell,not bash (and not reference other scripts)## The script fetches the latest Istio release candidate and untars it.# You can pass variables on the command line to download a specific version# or to override the processor architecture. For example,to download# Istio 1.6.8 for the x86_64 architecture and linux OS,# run curl -L https:set-e# Determines the operating system.OS="${TARGET_OS:-$(uname)}"if["${OS}"="Darwin"] ;thenOSEXT="osx"elseOSEXT="linux"fi# Determine the latest Istio version by version number ignoring alpha,beta,and rc versions.if["${ISTIO_VERSION}"=""] ;thenISTIO_VERSION="$(curl-sLhttps:grep-o'releases/[0-9]*.[0-9]*.[0-9]*/' |sort-V|\tail-1|awk-F'/' '{ print $2}')"ISTIO_VERSION="${ISTIO_VERSION##*/}"fiLOCAL_ARCH=$(uname-m)if["${TARGET_ARCH}"];thenLOCAL_ARCH=${TARGET_ARCH}ficase"${LOCAL_ARCH}"inx86_64|amd64)ISTIO_ARCH=amd64;;armv8*|aarch64*|arm64)ISTIO_ARCH=arm64;;armv*)ISTIO_ARCH=armv7;;*)echo"This system's architecture,${LOCAL_ARCH},isn't supported"exit1;;esacif["${ISTIO_VERSION}"=""] ;thenprintf"Unable to get latest Istio version. Set ISTIO_VERSION env var and re-run. For example:export ISTIO_VERSION=1.0.4"exit1;fiNAME="istio-$ISTIO_VERSION"URL="https:ARCH_URL="https:with_arch() {printf"\nDownloading %s from %s ...\n""$NAME""$ARCH_URL"if!curl-o/dev/null-sIf"$ARCH_URL";thenprintf"\n%s is not found,please specify a valid ISTIO_VERSION and TARGET_ARCH\n""$ARCH_URL"exit1ficurl-fsLO"$ARCH_URL"filename="istio-${ISTIO_VERSION}-${OSEXT}-${ISTIO_ARCH}.tar.gz"tar-xzf"${filename}"rm"${filename}"}without_arch() {printf"\nDownloading %s from %s ...""$NAME""$URL"if!curl-o/dev/null-sIf"$URL";thenprintf"\n%s is not found,please specify a valid ISTIO_VERSION\n""$URL"exit1ficurl-fsLO"$URL"filename="istio-${ISTIO_VERSION}-${OSEXT}.tar.gz"tar-xzf"${filename}"rm"${filename}"}# Istio 1.6 and above support arch# Istio 1.5 and below do not have arch supportARCH_SUPPORTED="1.6"# Istio 1.10 and above support arch for osx arm64ARCH_SUPPORTED_OSX="1.10"if["${OS}"="Linux"] ;then# This checks if ISTIO_VERSION is less than ARCH_SUPPORTED (version-sort's before it)if["$(printf'%s\n%s'"${ARCH_SUPPORTED}""${ISTIO_VERSION}"|sort-V|head-n1)"="${ISTIO_VERSION}"];thenwithout_archelsewith_archfielif["${OS}"="Darwin"] ;then# This checks if ISTIO_VERSION is less than ARCH_SUPPORTED_OSX (version-sort's before it) or ISTIO_ARCH not equal to arm64if["$(printf'%s\n%s'"${ARCH_SUPPORTED_OSX}""${ISTIO_VERSION}"|sort-V|head-n1)"="${ISTIO_VERSION}"] ||["${ISTIO_ARCH}"!="arm64"];thenwithout_archelsewith_archfielseprintf"\n\n"printf"Unable to download Istio %s at this moment!\n""$ISTIO_VERSION"printf"Please verify the version you are trying to download.\n\n"exit1fiprintf""printf"\nIstio %s Download Complete!\n""$ISTIO_VERSION"printf"\n"printf"Istio has been successfully downloaded into the %s folder on your system.\n""$NAME"printf"\n"BINDIR="$(cd"$NAME/bin" && pwd)"printf"Next Steps:\n"printf"See https:printf"\n"printf"To configure the istioctl client tool for your workstation,\n"printf"add the %s directory to your environment path variable with:\n""$BINDIR"printf"\t export PATH=\"\$PATH:%s\"\n""$BINDIR"printf"\n"printf"Begin the Istio pre-installation check by running:\n"printf"\t istioctl x precheck \n"printf"\n"printf"Need more information?Visit https:$wgethttps:$tar-xvfistio-1.19.3-linux-amd64.tar.gz$mvistio-1.19.3/bin/istioctl/usr/local/bin/$istioctlversionnoreadyIstiopodsin"istio-system"1.19.3

能执行 istioctl命令说明安装成功,但是提示 no ready Istio pods in "istio-system",这是因为我们还没有安装 Istio,接下来我们就来安装 Istio。

image-20231103121417840

istioctl工具中内置了一些安装配置文件,这些配置文件提供了对 Istio 控制平面和 Istio 数据平面 Sidecar 的定制内容。我们可以通过 istioctl profile list命令查看:

我们可以从其中一个 Istio 内置配置文件开始入手, 然后根据特定需求进一步自定义配置文件。

注意:这里的IstioOperator和我们之前k8s里Operator不一样,这里没有直接的控制器,它是通过istioctl命令来做的一些解析。

istioctl 能够识别的一个安装配置文件,只是这个配置文件采用了类似于K8s CRD的方式来声明而已,并没有对应的控制器Pod。

yaml
#istioctl profile dump default$ istioctl profile dumpapiVersion:install.istio.io/v1alpha1kind:IstioOperatorspec:components:base:enabled:truecni:enabled:falseegressGateways:- enabled:falsename:istio-egressgatewayingressGateways:- enabled:truename:istio-ingressgatewayistiodRemote:enabled:falsepilot:enabled:truehub:docker.io/istiomeshConfig:defaultConfig:proxyMetadata:{}enablePrometheusMerge:trueprofile:defaulttag:1.19.3values:base:enableCRDTemplates:falsevalidationURL:""defaultRevision:""gateways:istio-egressgateway:autoscaleEnabled:trueenv:{}name:istio-egressgatewaysecretVolumes:- mountPath:/etc/istio/egressgateway-certsname:egressgateway-certssecretName:istio-egressgateway-certs- mountPath:/etc/istio/egressgateway-ca-certsname:egressgateway-ca-certssecretName:istio-egressgateway-ca-certstype:ClusterIPistio-ingressgateway:autoscaleEnabled:trueenv:{}name:istio-ingressgatewaysecretVolumes:- mountPath:/etc/istio/ingressgateway-certsname:ingressgateway-certssecretName:istio-ingressgateway-certs- mountPath:/etc/istio/ingressgateway-ca-certsname:ingressgateway-ca-certssecretName:istio-ingressgateway-ca-certstype:LoadBalancerglobal:configValidation:truedefaultNodeSelector:{}defaultPodDisruptionBudget:enabled:truedefaultResources:requests:cpu:10mimagePullPolicy:""imagePullSecrets:[]istioNamespace:istio-systemistiod:enableAnalysis:falsejwtPolicy:third-party-jwtlogAsJson:falselogging:level:default:infomeshNetworks:{}mountMtlsCerts:falsemultiCluster:clusterName:""enabled:falsenetwork:""omitSidecarInjectorConfigMap:falseoneNamespace:falseoperatorManageWebhooks:falsepilotCertProvider:istiodpriorityClassName:""proxy:autoInject:enabledclusterDomain:cluster.localcomponentLogLevel:misc:errorenableCoreDump:falseexcludeIPRanges:""excludeInboundPorts:""excludeOutboundPorts:""image:proxyv2includeIPRanges:'*'logLevel:warningprivileged:falsereadinessFailureThreshold:30readinessInitialDelaySeconds:1readinessPeriodSeconds:2resources:limits:cpu:2000mmemory:1024Mirequests:cpu:100mmemory:128MistatusPort:15020tracer:zipkinproxy_init:image:proxyv2sds:token:aud:istio-casts:servicePort:0tracer:datadog:{}lightstep:{}stackdriver:{}zipkin:{}useMCP:falseistiodRemote:injectionURL:""pilot:autoscaleEnabled:trueautoscaleMax:5autoscaleMin:1configMap:truecpu:targetAverageUtilization:80env:{}image:pilotkeepaliveMaxServerConnectionAge:30mnodeSelector:{}podLabels:{}replicaCount:1traceSampling:1telemetry:enabled:truev2:enabled:truemetadataExchange:wasmEnabled:falseprometheus:enabled:truewasmEnabled:falsestackdriver:configOverride:{}enabled:falselogging:falsemonitoring:falsetopology:false

标注 的组件安装在每个配置文件中:

img

除了安装 Istio 内置的配置之外,istioctl install还提供了一套完整的用于定制配置的 API - IstioOperator API

此 API 中的配置参数可以使用命令行选项 --set进行独立设置,比如要在 default配置中启动 debug的日志特性,我们可以使用下面的命令:

bash
$istioctlinstall--setvalues.global.logging.level=debug

或者,可以在 YAML 文件中指定 IstioOperator的配置,然后用 -f选项传递给 istioctl即可:

bash
$istioctlinstall-fsamples/operator/pilot-k8s.yaml

IstioOperator API定义主要包括如下几个组件:

  • base
  • pilot
  • ingressGateways
  • egressGateways
  • cni
  • istiodRemote

针对每一个组件的配置内容通过 components.<component name>下的 API 中提供。例如,要用 API 更改 pilot组件的 enabled设置, 可以使用 --set components.pilot.enabled=false命令,或在 IstioOperator资源中设置:

yaml
apiVersion:install.istio.io/v1alpha1kind:IstioOperatorspec:components:pilot:enabled:false

这样安装后就不会启动 pilot组件了。

所有的组件共享一个通用 API,用来修改 Kubernetes 特定的设置,它在 components.<component name>.k8s路径下,它允许修改如下设置:

  • Resources
  • Readiness probes
  • Replica count
  • HorizontalPodAutoscaler
  • PodDisruptionBudget
  • Pod annotations
  • Service annotations
  • ImagePullPolicy
  • Priority class name
  • Node selector
  • Affinity and anti-affinity
  • Service
  • Toleration
  • Strategy
  • Env
  • Pod security context

所有这些 Kubernetes 设置也就是平时我们使用的 Kubernetes API 定义,配置方式完全一样。比如我们要调整 Pilot 组件的资源限制和 Pod 水平伸缩,可以用如下所示的配置:

yaml
apiVersion:install.istio.io/v1alpha1kind:IstioOperatorspec:components:pilot:k8s:resources:requests:cpu:1000m# 覆盖默认的 500mmemory:4096Mi# ... 默认 2048MihpaSpec:maxReplicas:10# ... 默认 5minReplicas:2# ... 默认 1

然后我们就可以直接使用 istioctl install把改变的设置应用到集群:

bash
$istioctlinstall-fsamples/operator/pilot-k8s.yaml

🍀

了解了 Istio 安装的基本概念之后,我们就可以开始安装 Istio 了,我们这里选择 demo配置文件进行安装,选择它是因为它包含了一组专为测试准备的功能集合,另外还有用于生产或性能测试的配置组合。

执行下面的命令即可:

bash
$istioctlinstall--setprofile=demo-yIstiocoreinstalledIstiodinstalledEgressgatewaysinstalledIngressgatewaysinstalledInstallationcompleteMadethisinstallationthedefaultforinjectionandvalidation.

可以看到上面的 demo配置应用后,启用了 Istio coreIstiodEgress gatewaysIngress gateways几个组件,这些组件都是通过 IstioOperatorAPI 进行配置的。

🍀

安装完成后会自动创建一个 istio-system命名空间,包含如下几个 Pod,分别对应上面的几个组件:

bash
[root@master1 ~]#kubectl get po -nistio-system

image-20231103183034166

这其实也和 Istio 架构中的组件是一一对应的,我们可以再看下 Istio 架构图:

img

  • istio-egressgateway:出口网关,用于处理出站流量。
  • istio-ingressgateway:入口网关,用于处理入站流量,接收传入的 HTTP/TCP 连接。
  • istiod:Istio 控制平面,用于管理和配置数据平面,提供服务网格的核心功能。

当然安装后并没有出现架构图上面的数据平面相关组件,这是因为数据平面的 Envoy Sidecar 代理是伴随应用 Pod 一起的,所以需要部署应用后才会出现。

安装成功。😘

2、注入 Envoy Sidecar

要为应用注入 Envoy Sidecar 代理有几种方法:

1.手动注入 Sidecar

==🚩 实战:手动注入 Envoy Sidecar-2023.11.3(测试成功)==

实验环境:

bash
k8sv1.25.4(containerd:[root@master1 ~]#istioctl versionclientversion:1.19.3controlplaneversion:1.19.3dataplaneversion:1.19.3(8 proxies)

实验软件:

链接:https:# Copyright Istio Authors## Licensed under the Apache License,Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at## http:## Unless required by applicable law or agreed to in writing,software# distributed under the License is distributed on an "AS IS"BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,either express or implied.# See the License for the specific language governing permissions and# limitations under the License.################################################################################################### Sleep service##################################################################################################apiVersion:v1kind:ServiceAccountmetadata:name:sleep---apiVersion:v1kind:Servicemetadata:name:sleeplabels:app:sleepservice:sleepspec:ports:- port:80name:httpselector:app:sleep---apiVersion:apps/v1kind:Deploymentmetadata:name:sleepspec:replicas:1selector:matchLabels:app:sleeptemplate:metadata:labels:app:sleepspec:terminationGracePeriodSeconds:0serviceAccountName:sleepcontainers:- name:sleepimage:curlimages/curlcommand:["/bin/sleep","infinity"]imagePullPolicy:IfNotPresentvolumeMounts:- mountPath:/etc/sleep/tlsname:secret-volumevolumes:- name:secret-volumesecret:secretName:sleep-secretoptional:true---[root@master1 ~]#

🍀

先来部署这个应用

这是一个正常应用的状态。

🍀

比如我们为一个 Deployment 手动注入 Sidecar,可以使用下面的方法:

image-20231103191345481

image-20231103191442827

默认情况下 Pod 的注入是基于 Sidecar 注入模板,在 istio-sidecar-injectorConfigmap 中配置,我们可以将配置导出到本地,然后手动指定注入也可以:

然后指定输入文件,运行 kube-inject并部署应用即可:

🍀

正常部署后我们的应用 Pod 中会多出一个 Sidecar 容器:

这个容器就是 Envoy Sidecar 代理。

image-20231103191947765

这个 Envoy Sidecar 代理,它会和应用 Pod 一起运行,用来代理整个应用的流量,当然整体控制都是由 Istio 控制平面来决定的。而 Istio 控制平面实现了 Envoy 的控制平面接口,可以动态下发修改 Envoy 的配置,这样我们就可以去操控这些 Envoy Sidecar 了,这是不是和我们前面讲解的 Envoy 基于 API 的动态配置部分就关联起来了,所以我们说需要先熟悉 Envoy,然后再来学习 Istio 效果会更好。

image-20231103193705213

🍀

image-20231103193003472

image-20231103193236133

测试完成。😘

2.自定义注入

上面我们了解到 Pod 的注入是基于 istio-sidecar-injector这个 Configmap 模板的,同样的我们也可以自行定义注入 Sidecar 代理。我们可以通过在 Pod 中手动添加一个 istio-proxy容器来完成,Sidecar 注入将会把自定义的任何配置视为默认注入模板的覆盖。

自定义这些设置时,需格外小心,因为允许完全自定义生成的 Pod,包括进行一些更改而导致 Sidecar 容器无法正常运行。

例如,以下配置可自定义各种设置,包括降低 CPU 请求,添加 Volume 挂载,和添加 preStop Hook:

yaml
apiVersion:v1kind:Podmetadata:name:examplespec:containers:- name:helloimage:alpine- name:istio-proxy# 这个容器名需要叫 istio-proxyimage:auto# 设置为 auto,自动选择要使用的 Imageresources:requests:cpu:"100m"volumeMounts:- mountPath:/etc/certsname:certslifecycle:preStop:exec:command:["sleep","10"]volumes:- name:certssecret:secretName:istio-certs

一般来说 Pod 中的任何字段我们都可以配置,但是必须注意某些字段:

  • Kubernetes 要求在注入运行之前配置 image,虽然可以可以设置一个指定的 Image 来覆盖默认的 image 配置,但建议将 image 设置为 auto,可使 Sidecar 注入自动选择要使用的 Image。
  • Pod 中一些字段取决于相关设置。例如,CPU 请求必须小于 CPU 限制。

3.自动注入 Sidecar

==🚩 实战:自动注入 Envoy Sidecar-2023.11.8(测试成功)==

实验环境:

bash
k8sv1.27.6(containerd:[root@master1 ~]#istioctl versionclientversion:1.19.3controlplaneversion:1.19.3dataplaneversion:1.19.3(8 proxies)

实验软件:

链接:https:[root@master1 istio-1.19.3]#kubectl apply -f samples/sleep/sleep.yamlserviceaccount/sleepunchangedservice/sleepunchangeddeployment.apps/sleepcreated[root@master1 istio-1.19.3]#kubectl get deployNAMEREADYUP-TO-DATEAVAILABLEAGEsleep1/11122sweb1/1116d4h[root@master1 istio-1.19.3]#kubectl get pod -l app=sleepNAMEREADYSTATUSRESTARTSAGEsleep-78ff5975c6-v62sv1/1Running031s

目前我们的 sleep 应用是没有注入 Sidecar 的,只有 1 个容器。

🍀

现在我们可以为 default命名空间打上 istio-injection=enabled标签:

🍀

现在我们为命名空间打上了自动注入标签,但是已经部署了的应用并不会主动注入,这是因为注入的动作发生着 Pod 创建时。我们可以杀掉正在运行的 Pod 来验证新创建的 Pod 是否注入 Sidecar。

可以看到现在我们的应用有 2 个容器了。查看已注入 Pod 的详细状态,应该可以看到被注入的 istio-proxy容器:

这样我们就实现了 Pod 应用自动注入 Envoy Sidecar 代理,以后 default命名空间中的应用部署后都会自动注入了。当然要取消自动注入功能,只需要将 istio-injection标签去掉即可:

当然除了在命名空间级别启用和禁用注入功能之外,注入也可以通过配置 Pod 上的 sidecar.istio.io/inject:"true"标签,在每个 Pod 的基础上进行控制。

自动注入 Envoy Sidecar 的原理其实很简单,如果你对 Kubernetes 比较熟悉的话,肯定听过准入控制器的,其中就有两个对象 validatingwebhookconfigurationsmutatingwebhookconfigurations,前面是用来校验资源是否合法的,后面是用来修改资源对象的,那么要实现自动注入功能,也就相当于去为 Pod 自动添加一个容器,所以就需要用到 mutate 功能了,我们可以查看下系统中是否包含一个 istio-sidecar-injector的准入控制器:

而实现准入控制器逻辑的也正是 istiod这个组件了。

image-20231103194848038


⚠️

==但是特别注意:我这里在做测试时出现了问题。。。排查了好多次,有点浪费时间。。。==

image-20231103220001099

bash
[root@master1 istio-1.19.3]#kubectl get rs sleep-78ff5975c6NAMEDESIREDCURRENTREADYAGEsleep-78ff5975c610010m[root@master1 istio-1.19.3]#kubectl describe rs sleep-78ff5975c6Name:sleep-78ff5975c6Namespace:defaultSelector:app=sleep,pod-template-hash=78ff5975c6Labels:app=sleeppod-template-hash=78ff5975c6Annotations:deployment.kubernetes.io/desired-replicas:1deployment.kubernetes.io/max-replicas:2deployment.kubernetes.io/revision:1ControlledBy:Deployment/sleepReplicas:0current/1desiredPodsStatus:0Running/0Waiting/0Succeeded/0FailedPodTemplate:Labels:app=sleeppod-template-hash=78ff5975c6ServiceAccount:sleepContainers:sleep:Image:curlimages/curlPort:<none>HostPort:<none>Command:/bin/sleepinfinityEnvironment:<none>Mounts:/etc/sleep/tlsfromsecret-volume(rw)Volumes:secret-volume:Type:Secret(a volumepopulatedbyaSecret)SecretName:sleep-secretOptional:trueConditions:TypeStatusReason----------------ReplicaFailureTrueFailedCreateEvents:TypeReasonAgeFromMessage-------------------------NormalSuccessfulCreate10mreplicaset-controllerCreatedpod:sleep-78ff5975c6-9tpmsWarningFailedCreate6m58s(x4 over8m58s) replicaset-controller Error creating:Internal error occurred:failed calling webhook "namespace.sidecar-injector.istio.io":failed to call webhook:Post "https:WarningFailedCreate101s(x13 over9m8s) replicaset-controller Error creating:Internal error occurred:failed calling webhook "namespace.sidecar-injector.istio.io":failed to call webhook:Post "https:[root@master1 istio-1.19.3]#

image-20231103220111397

提示:创建pod失败,内部错误发生,失败调用webhook……

image-20231103220207796

image-20231103220301942

image-20231103220503270

奇怪。。。。

老师的都没问题。。。

重启istio组件测试(失败)

重启k8s集群(失败)

image-20231103221342362

很大程度是这个问题导致的。。。

老师环境:

image-20231125084909818

自己环境:

image-20231104161014770

image-20231104161251139

重装完成k8s后,还是无法自动注入哇。。。。

image-20231107202156806

image-20231107202221241

istiod-644f5d55fc-gs96f日志

image-20231107202311255

api-server日志:

image-20231107202413251

kubelet信息:

image-20231107202504022

image-20231107202657228

再次测试:2023年11月8日,升级cni flanel版本

image-20231107202657228

image-20231108212637806

wget https:namespace "kube-flannel"deletedclusterrole.rbac.authorization.k8s.io "flannel"deletedclusterrolebinding.rbac.authorization.k8s.io "flannel"deletedserviceaccount "flannel"deletedconfigmap "kube-flannel-cfg"deleteddaemonset.apps "kube-flannel-ds"deleted

下载好后直接安装:

image-20231108213612352

image-20231108213627145

终于可以了:==。。。==

image-20231108214129991

结束。😘

3、BookInfo 示例应用

Bookinfo是一个非常经典的微服务示例项目,它由四个独立的微服务组成,每个微服务都是用不同的语言编写的,可以用于演示多种 Istio 特性的应用。这个应用模仿在线书店的一个分类,显示一本书的信息,页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本书的一些评论。

Bookinfo 应用分为以下四个单独的微服务:

  • productpage:这个微服务会调用 detailsreviews两个微服务,用来生成页面。
  • details:这个微服务中包含了书籍的信息。
  • reviews:这个微服务中包含了书籍相关的评论,它还会调用 ratings微服务。
  • ratings:这个微服务中包含了由书籍评价组成的评级信息。

reviews微服务有 3 个版本:

  • v1版本不会调用 ratings服务。
  • v2版本会调用 ratings服务,并使用 1 到 5 个黑色星形图标来显示评分信息。
  • v3版本会调用 ratings服务,并使用 1 到 5 个红色星形图标来显示评分信息。

下图展示了这个应用的端到端架构。

img

现在我们来为 Bookinfo 应用提供 Istio 支持,无需对应用自身做出任何改变。只要简单的在 Istio 环境中对服务进行配置和运行即可,其实就是把 Envoy Sidecar 注入到每个服务之中。最终的部署结果将如下图所示:

img

所有的微服务都和 Envoy Sidecar 集成在一起,服务所有的出入流量都被 Sidecar 所劫持,然后我们就可以利用 Istio 控制平面为应用提供服务路由、遥测数据收集以及策略实施等服务治理功能了。

==🚩 实战:BookInfo 示例应用-2023.11.5(测试成功)==

实验环境:

bash
k8sv1.25.4(containerd:[root@master1 ~]#istioctl versionclientversion:1.19.3controlplaneversion:1.19.3dataplaneversion:1.19.3(8 proxies)

实验软件:

链接:https:A[实战步骤] -->B(1️⃣ 部署示例应用)A[实战步骤] -->C(2️⃣ 对外暴露应用)A[实战步骤] -->D(3️⃣ 查看 Dashboard)

==1.部署示例应用==

🍀

我们首先进入 Istio 安装目录,该目录中的 samples目录中就包含了 Bookinfo 部署到 Kubernetes 集群中的配置文件,我们只需要为这些资源注入 Sidecar。这里我们为 default 命名空间打上标签 istio-injection=enabled,开启自动注入功能即可:

image-20231105072837083

🍀

然后只需要使用 kubectl 正常部署应用即可:

注意:

如果在安装过程中禁用了 Sidecar 自动注入功能而选择手动注入 Sidecar,可以使用 istioctl kube-inject命令来手动注入:

自己本次手动注入:(我的自动注入有点问题,这里使用手动注入方式)

🍀

上面的命令会启动全部的四个服务,其中也包括了 reviews服务的三个版本(v1、v2 以及 v3)。

隔一会儿,我们可以查看下 Pod 的状态:

当每个 Pod 准备就绪时,Istio Sidecar 将伴随应用一起部署。

🍀

要确认 Bookinfo 应用是否正在运行,我们可以在某个 Pod 中用 curl命令对应用发送请求来验证,例如 ratings

如果能够正常数据,说明应用已经部署成功了,而且已经被 Istio 管控起来了。

==2.对外暴露应用==

上面我们已经将 Bookinfo 应用部署成功了,但是还不能被外界访问,如果没有 Istio 的情况下我们可以直接通过 NodePort 或者 Ingress 的方式来对外进行暴露,但是现在我们使用了 Istio,需要创建 ==Istio 入站网关(Ingress Gateway)==来对外暴露应用了。

🍀

samples目录下面有一个 Bookinfo 对外暴露的配置文件 bookinfo-gateway.yaml,这个配置文件中定义了一个 Gateway和一个 VirtualService对象,Gateway定义了入站流量的端口和协议,VirtualService定义了流量的路由规则,内容如下所示:

这两个资源对象我们后面还会详细讲解的,现在我们只需要知道这两个资源对象是用来定义入站流量的端口和协议以及流量的路由规则的即可。如果你联想到前面我们讲解的 Envoy 配置,那么你就会发现这两个资源对象其实分别对应着 Envoy 配置中的 Listener 和 VirtualHosts(包括 Cluster),只不过这里是用我们更熟悉的 Kubernetes CRD 的方式来进行配置的,当我们创建了这两个资源对象后,Istio 控制平面会自动把这些配置下发到 Envoy Sidecar 中,然后 Envoy Sidecar 就会根据这些配置来进行流量的路由了。

🍀

接下来我们执行下面的命令来把应用关联到 Istio 网关:

🍀

然后我们就可以通过 istio-ingressgateway这个统一的入口来访问应用了,我们可以通过 kubectl get svc -n istio-system命令来查看下 istio-ingressgateway的地址:

由于我们这里没有负载均衡器,所以 EXTERNAL-IP的值一直是 <pending>状态,这种情况下我们可以用 NodePort 来访问网关。可以通过如下命令获取 HTTP 和 HTTPS 的访问端口:

然后获取集群中任意一个节点的 IP 地址:

设置环境变量 GATEWAY_URL:

确保 IP 地址和端口均成功地赋值给了环境变量:

这样我们就得到了 Istio 入口网关的访问地址,然后我们只需要在浏览器中通过 http:$kubectlrolloutstatusdeployment/kiali-nistio-systemWaitingfordeployment"kiali"rollouttofinish:0of1updatedreplicasareavailable...deployment"kiali"successfullyrolledout$kubectlgetpods-nistio-systemNAMEREADYSTATUSRESTARTSAGEgrafana-5f9b8c6c5d-jv65v1/1Running06m23sistio-egressgateway-556f6f58f4-hkzdd1/1Running0177mistio-ingressgateway-9c8b9b586-s6s481/1Running0177mistiod-644f5d55fc-zz2zh1/1Running0179mjaeger-db6bdfcb4-qpmmv1/1Running06m23skiali-7c9d5f9f96-cp4mb1/1Running06m23sprometheus-5d5d6d6fc-2gtxm2/2Running06m22s

如果在安装插件时出错,再运行一次命令。有一些和时间相关的问题,再次运行就能解决。

🍀

安装完成后我们可以使用 istioctl dashboard命令来开启访问 Kiali 面板。

bash
$istioctldashboardkiali--address0.0.0.0http:# http:AllIstioresourceswillbeprunedfromtheclusterProceed?(y/N) YRemovedIstioOperator:istio-system:installed-state.RemovedDeployment:istio-system:istio-egressgateway.RemovedDeployment:istio-system:istio-ingressgateway.RemovedDeployment:istio-system:istiod.RemovedService:istio-system:istio-egressgateway.RemovedService:istio-system:istio-ingressgateway.RemovedService:istio-system:istiod.RemovedConfigMap:istio-system:istio.RemovedConfigMap:istio-system:istio-sidecar-injector.RemovedPod:istio-system:istio-egressgateway-8477dd44c4-9q8d4.RemovedPod:istio-system:istio-ingressgateway-5c58fcb646-jk4fh.RemovedPod:istio-system:istiod-5d9595449c-b2pmc.RemovedServiceAccount:istio-system:istio-egressgateway-service-account.RemovedServiceAccount:istio-system:istio-ingressgateway-service-account.RemovedServiceAccount:istio-system:istio-reader-service-account.RemovedServiceAccount:istio-system:istiod.RemovedRoleBinding:istio-system:istio-egressgateway-sds.RemovedRoleBinding:istio-system:istio-ingressgateway-sds.RemovedRoleBinding:istio-system:istiod.RemovedRole:istio-system:istio-egressgateway-sds.RemovedRole:istio-system:istio-ingressgateway-sds.RemovedRole:istio-system:istiod.RemovedPodDisruptionBudget:istio-system:istio-egressgateway.RemovedPodDisruptionBudget:istio-system:istio-ingressgateway.RemovedPodDisruptionBudget:istio-system:istiod.RemovedMutatingWebhookConfiguration::istio-revision-tag-default.RemovedMutatingWebhookConfiguration::istio-sidecar-injector.RemovedValidatingWebhookConfiguration::istio-validator-istio-system.RemovedValidatingWebhookConfiguration::istiod-default-validator.RemovedClusterRole::istio-reader-clusterrole-istio-system.RemovedClusterRole::istiod-clusterrole-istio-system.RemovedClusterRole::istiod-gateway-controller-istio-system.RemovedClusterRoleBinding::istio-reader-clusterrole-istio-system.RemovedClusterRoleBinding::istiod-clusterrole-istio-system.RemovedClusterRoleBinding::istiod-gateway-controller-istio-system.RemovedCustomResourceDefinition::authorizationpolicies.security.istio.io.RemovedCustomResourceDefinition::destinationrules.networking.istio.io.RemovedCustomResourceDefinition::envoyfilters.networking.istio.io.RemovedCustomResourceDefinition::gateways.networking.istio.io.RemovedCustomResourceDefinition::istiooperators.install.istio.io.RemovedCustomResourceDefinition::peerauthentications.security.istio.io.RemovedCustomResourceDefinition::proxyconfigs.networking.istio.io.RemovedCustomResourceDefinition::requestauthentications.security.istio.io.RemovedCustomResourceDefinition::serviceentries.networking.istio.io.RemovedCustomResourceDefinition::sidecars.networking.istio.io.RemovedCustomResourceDefinition::telemetries.telemetry.istio.io.RemovedCustomResourceDefinition::virtualservices.networking.istio.io.RemovedCustomResourceDefinition::wasmplugins.extensions.istio.io.RemovedCustomResourceDefinition::workloadentries.networking.istio.io.RemovedCustomResourceDefinition::workloadgroups.networking.istio.io.?Uninstall complete [root@master1 ~]#[root@master1 ~]#kubectl get po -ANAMESPACENAMEREADYSTATUSRESTARTSAGEkube-flannelkube-flannel-ds-pjfww1/1Running1(22h ago) 7d4hkube-flannelkube-flannel-ds-pzt571/1Running1(22h ago) 7d4hkube-flannelkube-flannel-ds-slqjx1/1Running1(22h ago) 7d4hkube-systemcoredns-7b884d5cb7-nvg5b1/1Running1(22h ago) 7d4hkube-systemcoredns-7b884d5cb7-zg9x61/1Running1(22h ago) 7d4hkube-systemetcd-master11/1Running1(22h ago) 7d4hkube-systemkube-apiserver-master11/1Running1(22h ago) 7d4hkube-systemkube-controller-manager-master11/1Running1(22h ago) 7d4hkube-systemkube-proxy-dqzq41/1Running1(22h ago) 7d4hkube-systemkube-proxy-jf46d1/1Running1(22h ago) 7d4hkube-systemkube-proxy-xvmdd1/1Running1(22h ago) 7d4hkube-systemkube-scheduler-master11/1Running1(22h ago) 7d4hkubernetes-dashboarddashboard-metrics-scraper-64bcc67c9c-tm42j1/1Running1(22h ago) 7d4hkubernetes-dashboardkubernetes-dashboard-5c8bd6b59-stxgx1/1Running1(22h ago) 7d4h[root@master1 ~]#

可以看到istio相关的3个pod资源被清除掉了。

清除istio-system

1