开箱即用:在Kubernetes安装Istio使微服务变得更容易

本文记录了作者在Azure Kubernetes集群上安装istio的过程,以及对应用示例的操作。


除非你是与世隔绝,否则你可能已经知道微服务架构模式在过去几年中迅速普及。这是由两方面来推动的,一方面是云部署服务越来越便利,另一方面是小团队首先期望专注于构建简单好用的子服务,然后才是构建应用程序。

总的来说,这样很好,但也导致了其他一些问题:

1、增加了API层面的安全问题。使用较小的服务,以及服务之间的许多依赖关系,必须有更多的端点以确保安全。复合(Compounding)是一种 “不信任”(“trust nothing”)安全模型的举措,包括内部网络,因此devops团队需要建立一种机制来验证正在与我交流的微服务是真实的。

2、需要监控更多的服务。监控是必须的,但是微服务架构模型又需要添加另一层监控。例如,当发现一个性能问题时,您现在不能判断是服务应用还是后端存储的问题。也可能,是由它所使用的任何依赖服务引起的。对服务延迟进行简单的监控是不够的,您还需要对服务使用的每个依赖关系进行度量。

3、流量管理问题。在多个团队不断发展的服务之间的互连的数量,意味着我们需要以多种方式管理它们之间的流量:在应用程序的不同版本之间切换流量、速率限制、回路阻断等,以防止依赖服务的级联故障。

Istio是CNCF赞助的一个项目,旨在解决这些问题。这篇博客文章将帮助您安装Istio,并演示如何对示例应用程序进行操作。

我将使用Azure做演示,但在本教程中所需的全部内容是RBAC启用的Kubernetes 1.9集群和MutatingAdmissionWebhook Admission Controller插件。如果您使用其他的云创建您的群集,可以跳过下一节。

Azure Kubernetes集群创建记录

对于ACS引擎(ACS Engine)的当前缺省值,必须重写默认的包含MutatingAdmissionWebhook的Admission Controllers插件,以便以后可以自动为服务注入sidecar容器。您可以在ACS引擎cluster.json中通过指定实现(参考Kubernetes1.9项目的部署建议):

{

"apiVersion": "vlabs",

"properties": {

    "orchestratorProfile": {

        "orchestratorType": "Kubernetes",

        "orchestratorRelease": "1.9",

        "kubernetesConfig": {

            "apiServerConfig": {

                "--admission-control":        "NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"

            }

        }

    },

    ....

}

在Kubernetes集群上安装Istio

假设已有一个配置了RBAC的Kubernetes1.9集群。首先,获取最新版本的Istio,并添加其CLI工具istioctl到安装目录,可以参照网站上 安装步骤 的前四个步骤执行。

在写这篇文章时,helm chart还不能正常工作,所以不要走这条路。而是将项目解压后,用kubectl apply安装到项目的根目录:

$ kubectl apply -f install/kubernetes/istio-auth.yaml

你能看到istio的核心组件启动起来,最后得到一组pod,如下:

$ kubectl get pods -n istio-system

NAME                                      READY     STATUS    RESTARTS   AGE

istio-ca-797dfb66c5-5dc6f                 1/1       Running   0          2h

istio-ingress-84f75844c4-g666n            1/1       Running   0          2h

istio-mixer-9bf85fc68-l54vm               3/3       Running   0          2h

istio-pilot-575679c565-rkm82              2/2       Running   0          2h

安装自动的sidecar 注入

Istio的核心功能之一是代理服务间的所有流量。这使得它能够做非常有用的事情,比如端点之间的相互认证,在服务的当前/下一版本之间进行业务拆分,并度量请求的等待时间。

Istio在每一个服务pod中创建一个sidecar容器,通过拦截pod创建及执行这种注入来代理流量。

在 Istio项目页面上记录了如何自动注入。为了简洁,下面是用Istio root执行的一组命令来配置这个。首先为Kubernetes CA创建一组证书:

$ ./install/kubernetes/webhook-create-signed-cert.sh \    

  --service istio-sidecar-injector \    

  --namespace istio-system \    

  --secret sidecar-injector-certs

接下来,安装sidecar注入配置图:
$ kubectl apply -f install/kubernetes/istio-sidecar-injector-configmap-release.yaml

然后,建立caBundle YAML文件,用于Kubernetes API服务器调用WebHook:


$ cat install/kubernetes/istio-sidecar-injector.yaml | \

    ./install/kubernetes/webhook-patch-ca-bundle.sh> \

    install/kubernetes/istio-sidecar-injector-with-ca-bundle.yaml

最后,安装sidecar injector webhook。
$ kubectl apply -f install/kubernetes/istio-sidecar-injector-with-ca-bundle.yaml

sidecar injector webhook现在可以运行了:

$ kubectl -n istio-system get deployment -listio=sidecar-injector

NAME                     DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE istio-sidecar-injector   1         1         1            1           1d
 

安装已绑定的工具

默认情况下,Istio不会将其sidecar代理注入到应用程序pod中,而是需要引导它对特定的命名空间注入sidecar。现在我们为默认命名空间执行以下操作:
$ kubectl label namespace default istio-injection**=**enabled

Istio包括一个叫做BookInfo的应用程序示例,我们可以使用它来观察这种注入,以及Istio的其他功能。可以通过上面的链接了解这个应用程序的体系结构,然后安装它:
$ kubectl apply -f samples/bookinfo/kube/bookinfo.yaml

一旦创建了pod,你会发现它们不是通常的1/1,而是2/2:

$kubectl get pods

NAME                              READY     STATUS    RESTARTS   AGE

details-v1-64b86cd49-8tn9p        2/2       Running   0          15s

productpage-v1-84f77f8747-6dh6l   2/2       Running   0          13s

ratings-v1-5f46655b57-bpwkb       2/2       Running   0          14s

reviews-v1-ff6bdb95b-m8f6f        2/2       Running   0          14s

reviews-v2-5799558d68-8t7h8       2/2       Running   0          14s

reviews-v3-58ff7d665b-2hfx2       2/2       Running   0          13s

这表明Istio已经将一个sidecar容器注入到它们中的每一个,它们将对我们前面提到的流量进行代理。执行describe可以查看一个pod的描述(你的pod id可能有所不同):

$ kubectl describe pod reviews-v1-ff6bdb95b-m8f6f

输出包括两个容器,reviews容器和istio-proxy容器。

可以通过查找Istio的入口控制器的公共IP来查看该应用程序的运行情况:

$ kubectl get services -n istio-system | grep istio-ingress 
istio-ingress            LoadBalancer   10.0.58.79     13.68.135.154   80:32552/TCP,443:31324/TCP                                         3h

打开http://13.68.135.154/productpage(需要换成自己的ip)并刷新,会发现有三个版本的应用程序(没有星、红星和黑星)正在负载均衡。

Istio可视化工具

Istio还捆绑了一些非常有用的工具,用于服务网格的管理、调试和可视化。其中第一个是Grafana和Prometheus,它们是用Istio仪表板预先配置的。

在0.5.1版本中,在yaml定义中有一个Prometheus命名空间的bug。编辑install/kubernetes/addons/prometheus.yaml,查找ServiceAccount。确保它的定义开始部分如下,如果缺少命名空间就加上它(这在主机中是固定的。该问题在最近的版本中已被解决,所以如果它看起来像下面的话就可以忽略)

apiVersion: v1

kind: ServiceAccount

metadata:

name: prometheus

namespace: istio-system

这样,您就可以安装所有这些工具了:


$ kubectl apply -f install/kubernetes/addons/prometheus.yaml

$ kubectl apply -f install/kubernetes/addons/grafana.yaml

$ kubectl apply -f install/kubernetes/addons/servicegraph.yaml

$ kubectl apply -f install/kubernetes/addons/zipkin.yaml

一旦启动起来,就应该让这些pod在集群中运行:


$kubectl get pods -n istio-system

NAME                                      READY     STATUS    RESTARTS   AGE

grafana-648859cf87-gpjmw                  1/1       Running   0          2h

istio-ca-797dfb66c5-5dc6f                 1/1       Running   0          3h

istio-ingress-84f75844c4-g666n            1/1       Running   0          3h

istio-mixer-9bf85fc68-l54vm               3/3       Running   0          3h

istio-pilot-575679c565-rkm82              2/2       Running   0          3h

istio-sidecar-injector-7b559f7f6f-btzr9   1/1       Running   0          2h

prometheus-cf8456855-f2q2r                1/1       Running   0          2h

servicegraph-7ff6c499cc-wm7r2             1/1       Running   0          2h

zipkin-7988c559b7-hsw7x                   1/1       Running   0          2h

然后,我们可以通过端口的port-forward命令连接到Grafana前端:

$ exportGRAFANAPOD=$(kubectl get pods -n istio-system | grep "grafana" | awk '{print $1}')
$ kubectl port-forward $GRAFANAPOD -n istio-system 3000:3000

通过浏览器打开http://localhost:3000。

Grafana预先配置了多个仪表板,下面这个用来监视Mixer,Istio的组件之一。

图1

如果您最近点击了图书信息应用程序,您会在输入请求图中看到您的请求。还可以通过可视化看到应用程序的服务如何使用Service Graph进行通信。

$ export SERVICEGRAPHPOD=$(kubectl get pods -n istio-system | grep "servicegraph" | awk '{print $1}')
$ kubectl port-forward $SERVICEGRAPHPOD -n istio-system 8088:8088

在点击多个图书信息页面后,打开http://localhost:8088/dotviz可以看到服务之间的所有互连:

图2

您还可以使用Zipkin查看延迟分解图:

$ export ZIPKINPOD=$(kubectl get pods -n istio-system | grep "zipkin" | awk '{print $1}') 
$ kubectl port-forward $ZIPKINPOD -n istio-system 9411:9411  

打开http://localhost:9411,您可以点击一个产品页面请求,看看哪些服务组件导致整个延迟:

图3

有关这些工具的详细信息可以参考Istio项目文档https://istio.io/docs/tasks/telemetry/。

Istio流量管理工具

Istio工具的核心在于其流量管理功能。请参照链接,这些文档能够非常清楚地描述如何使用这些工具,并通过这些工具来管理集群中服务之间的通信来解决诸如回路阻断、请求路由、入口和错误注入等。

希望这个演练很有用。如果你有任何反馈或者喜欢这样的内容,请在Twitter上联系或关注我。

原文链接

你可能感兴趣的:(开箱即用:在Kubernetes安装Istio使微服务变得更容易)