Istio快速入门

官方教程:Getting Started

 

准备工作:

安装istio之前,需要先将kubernetes集群跑起来。我们可以使用服务商提供的云服务k8s集群,对于如何准备这些Kubernetes 平台,官网也提供了文档,可以参考平台安装,其中还包含了阿里云。

当然,我们也可以使用minikube来搭建本地k8s集群,这也是我在这里使用的方式,整个搭建步骤可以参考我之前写的博客:使用minikube创建k8s本地单节点集群

一、安装istio

1.下载istio

可以去Istio发布页面去直接下载,或者使用下面的命令来下载和自动解压缩。

#下载
curl -L https://istio.io/downloadIstio | sh -
#下载,指定版本、平台架构
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.6.8 TARGET_ARCH=x86_64 sh -

#将istioctl客户端添加到环境变量 (这里下载的版本是1.9.5)
cd istio-1.9.5
export PATH=$PWD/bin:$PATH

2.安装istio

为了学习和测试的目的,这里的profile配置文件使用的demo。还有一些其他的profile配置文件用于生产环境和性能测试。

$ istioctl install --set profile=demo -y
✔ Istio core installed
✔ Istiod installed
✔ Egress gateways installed
✔ Ingress gateways installed
✔ Installation complete

注意: 安装时选择不同的profile安装的组件与插件不一样。生产上因为性能原因建议安装default profile,一般熟练的老手都会使用empty profile,然后根据需求开启组件与插件, 不同profile安装组件与插件列表(其中x代表安装):

Istio快速入门

3.为default命名空间打上标签istio-injection=enabled。Istio 默认自动注入边车。

$ kubectl label namespace default istio-injection=enabled
namespace/default labeled

二、部署应用

官方文档:Istio / Bookinfo 应用

1.启动应用服务

istio安装包中提供了sample案例。

1)使用 kubectl 部署应用

$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
service/details created
serviceaccount/bookinfo-details created
deployment.apps/details-v1 created
service/ratings created
serviceaccount/bookinfo-ratings created
deployment.apps/ratings-v1 created
service/reviews created
serviceaccount/bookinfo-reviews created
deployment.apps/reviews-v1 created
deployment.apps/reviews-v2 created
deployment.apps/reviews-v3 created
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created

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

2)确认所有的服务和 Pod 都已经正确的定义和启动:

$ kubectl get services
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
details       ClusterIP   10.104.222.167   <none>        9080/TCP   2m21s
kubernetes    ClusterIP   10.96.0.1        <none>        443/TCP    5h20m
productpage   ClusterIP   10.102.235.10    <none>        9080/TCP   2m20s
ratings       ClusterIP   10.107.206.19    <none>        9080/TCP   2m21s
reviews       ClusterIP   10.109.70.255    <none>        9080/TCP   2m20s

还有:

$ kubectl get pods
NAME                              READY   STATUS            RESTARTS   AGE
details-v1-79f774bdb9-m7k57       0/2     PodInitializing   0          2m44s
productpage-v1-6b746f74dc-v9zbn   0/2     PodInitializing   0          2m42s
ratings-v1-b6994bb9-s4ln5         0/2     PodInitializing   0          2m44s
reviews-v1-545db77b95-hqrj6       0/2     PodInitializing   0          2m44s
reviews-v2-7bf8c9648f-pnf6f       0/2     PodInitializing   0          2m44s
reviews-v3-84779c7bbc-zkhpx       0/2     PodInitializing   0          2m43s

3)要确认 Bookinfo 应用是否正在运行,请在某个 Pod 中用 curl 命令对应用发送请求,例如 ratings

$ kubectl exec -it $(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}') -c ratings -- curl productpage:9080/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>

2.确定 Ingress 的 IP 和端口

现在 Bookinfo 服务启动并运行中,您需要使应用程序可以从外部访问 Kubernetes 集群,例如使用浏览器。可以用 Istio Gateway 来实现这个目标。

1)为应用程序定义 Ingress 网关:

kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml

2)确认网关创建完成:

$ kubectl get gateway
NAME               AGE
bookinfo-gateway   72s

3)根据文档设置访问网关的 INGRESS_HOST 和 INGRESS_PORT 变量。确认并设置。

这里要根据文档按照文档的说明来操作。由于我使用的mibikube方式启动集群,所以根据文档执行的是下面这个命令。

#设置INGRESS_PORT
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}') #设置INGRESS_HOST export INGRESS_HOST=$(minikube ip)

4)设置 GATEWAY_URL

export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT

3.确认可以从集群外部访问应用

可以用 curl 命令来确认是否能够从集群外部访问 Bookinfo 应用程序:

$ curl -s http://${GATEWAY_URL}/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>

还可以用浏览器打开网址 http://$GATEWAY_URL/productpage,来浏览应用的 Web 页面。如果刷新几次应用的页面,就会看到 productpage 页面中会随机展示 reviews 服务的不同版本的效果(红色、黑色的星形或者没有显示)。reviews 服务出现这种情况是因为我们还没有使用 Istio 来控制版本的路由。

三、应用默认目标规则

在使用 Istio 控制 Bookinfo 版本路由之前,需要在目标规则中定义好可用的版本,命名为 subsets 。

运行以下命令为 Bookinfo 服务创建的默认的目标规则:

  • 如果没有启用双向 TLS,请执行以下命令
$ kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
destinationrule.networking.istio.io/productpage created
destinationrule.networking.istio.io/reviews created
destinationrule.networking.istio.io/ratings created
destinationrule.networking.istio.io/details created
  • 如果启用了双向 TLS,请执行以下命令:
kubectl apply -f samples/bookinfo/networking/destination-rule-all-mtls.yaml

等待几秒钟,以使目标规则生效。

 

可以使用以下命令查看目标规则:

kubectl get destinationrules -o yaml

 

上一篇:Istio系列学习(八)----Istio的目标规则:DestinationRule


下一篇:linux12企业实战 -- 11服务条目