5.1 部署Istio |
|
本节主要介绍部署Istio的方法,包括使用官方示例的方式来部署Istio,定制最小化部署Istio。后续的大部分实验都选择定制最小化部署Istio的方式,使用官方示例的部署方式时会有特殊说明。
1.下载安装Istio
到Istio的发布页面 https://github.com/istio/istio/releases ,查找当前可用版本的对应操作系统的包,由于这个压缩包在国外服务器上,可能由于网络问题不能顺利下载,可以自己先在网络正常的机器上下载完成后,再上传到实验环境的虚拟机。具体步骤如下。
下载Istio包:
$ sudo yum install -y wget $ wget https://github.com/istio/istio/releases/download/1.0.3/istio-1.0.3- linux.tar.gz
解压安装:
$ tar xf istio-1.0.3-linux.tar.gz $ sudo mv istio-1.0.3 /usr/local $ sudo ln -sv /usr/local/istio-1.0.3/ /usr/local/istio
添加到PATH路径中:
$ echo 'export PATH=/usr/local/istio/bin:$PATH' | sudo tee /etc/profile.d/ istio.sh
验证安装:
$ source /etc/profile.d/istio.sh $ istioctl version Version: 1.0.3 GitRevision: a44d4c8bcb427db16ca4a439adfbd8d9361b8ed3 User: root@0ead81bba27d Hub: docker.io/istio GolangVersion: go1.10.4 BuildStatus: Clean
2.最小化部署Istio
由于实验环境机器资源不足,如果部署全部组件,可能导致实验失败,无法完成实验目标。最小化部署由于没有开启监控数据收集和调用链追踪等功能,可以节省部分资源。因此实验时推荐使用本小节介绍的最小化部署Istio,如果没有特殊说明,本书中的实验均在此种方式部署的基础上进行的。
1)安装Helm。
到Helm的发布页面 https://github.com/helm/helm/releases ,查找当前可用的版本的包地址,由于这个压缩包也在国外服务器上,可能由于网络问题不能顺利下载,可以自己先在网络正常的机器上下载完成后,再上传到实验环境的虚拟机。
下载Helm包:
$ wget https://storage.googleapis.com/kubernetes-helm/helm-v2.12.2-linux- amd64.tar.gz
安装并验证Helm:
$ tar xf helm-v2.12.2-linux-amd64.tar.gz $ sudo mv linux-amd64/ /usr/local/helm-2.12.2 $ sudo ln -sv /usr/local/helm-2.12.2 /usr/local/helm $ echo 'export PATH=/usr/local/helm:$PATH' | sudo tee /etc/profile.d/helm.sh $ source /etc/profile.d/helm.sh $ helm version Client: &version.Version{SemVer:"v2.12.2", GitCommit:"7d2b0c73d734f6586ed222a5 67c5d103fed435be", GitTreeState:"clean"} Error: could not find tiller
2)生成Istio部署文件。
根据配置生成Istio的定制最小化部署文件:
$ helm template /usr/local/istio/install/kubernetes/helm/istio \ --name istio --namespace istio-system \ --set global.hyperkube.hub=registry.cn-shanghai.aliyuncs.com/gcr-k8s \ --set pilot.resources.requests.memory=500Mi \ --set gateways.istio-ingressgateway.enabled=true \ --set gateways.istio-egressgateway.enabled=true \ --set galley.enabled=true \ --set sidecarInjectorWebhook.enabled=true \ --set global.mtls.enabled=false \ --set prometheus.enabled=false \ --set grafana.enabled=false \ --set tracing.enabled=false \ --set global.proxy.envoyStatsd.enabled=false \ --set servicegraph.enabled=false > istio-mini.yaml
3)部署Istio。
创建istio-system命名空间:
$ kubectl create ns istio-system
创建Istio CRD:
$ kubectl apply -f /usr/local/istio/install/kubernetes/helm/istio/templates/ crds.yaml
查看Istio CRD:
$ kubectl get crd NAME CREATED AT ... meshpolicies.authentication.istio.io 2019-01-13T05:37:28Z metrics.config.istio.io 2019-01-13T05:37:29Z noops.config.istio.io 2019-01-13T05:37:29Z opas.config.istio.io 2019-01-13T05:37:29Z policies.authentication.istio.io 2019-01-13T05:37:28Z prometheuses.config.istio.io 2019-01-13T05:37:29Z quotas.config.istio.io 2019-01-13T05:37:29Z quotaspecbindings.config.istio.io 2019-01-13T05:37:28Z quotaspecs.config.istio.io 2019-01-13T05:37:29Z ... virtualservices.networking.istio.io 2019-01-13T05:53:28Z
部署Istio相关组件:
$ kubectl apply -f istio-mini.yaml
查看Istio组件状态,当组件全部处于Running或者Completed时再进行之后的实验,由于需要拉取较多镜像,如果网速较慢,可能需要等待很长一段时间。如果没有跟着之前的步骤配置镜像进行加速拉取,会更缓慢,强烈建议配置镜像加速。使用如下命令查看Istio组件的部署状态:
$ kubectl get deploy -n istio-system NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE istio-citadel 1 1 1 0 12s istio-egressgateway 1 1 1 0 13s istio-galley 1 1 1 0 13s istio-ingressgateway 1 1 1 0 12s istio-pilot 1 1 1 0 12s istio-policy 1 1 1 0 12s istio-sidecar-injector 1 1 1 0 12s istio-telemetry 1 1 1 0 12s $ kubectl get job -n istio-system NAME COMPLETIONS DURATION AGE istio-cleanup-secrets 0/1 37s 37s istio-security-post-install 0/1 37s 37s $ kubectl get pod -n istio-system NAME READY STATUS RESTARTS AGE istio-citadel-6955bc9cb7-wg4jt 1/1 Running 0 5m32s istio-cleanup-secrets-7hbxh 0/1 Completed 0 5m35s istio-egressgateway-7dc5cbbc56-4vx9g 1/1 Running 0 5m33s istio-galley-545b6b8f5b-zbn8w 1/1 Running 0 5m33s istio-ingressgateway-7958d776b5-w6ptc 1/1 Running 0 5m32s istio-pilot-5fb59666cb-75lw5 2/2 Running 0 5m32s istio-policy-5c689f446f-x9njr 2/2 Running 0 5m32s istio-security-post-install-xsgkm 0/1 Completed 0 5m35s istio-sidecar-injector-99b476b7b-zj7b7 1/1 Running 0 5m32s istio-telemetry-55d68b5dfb-z4pkn 2/2 Running 0 5m32s $ kubectl get svc -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ... istio-galley ClusterIP 10.97.150.161 <none> 443/TCP,9093/TCP 5m56s istio-ingressgateway LoadBalancer 10.99.91.255 <pending> 80:31380/TCP,443:31390/TCP,31400:31400/TCP,15011:32193/TCP,8060:32090/TCP,853:30692/TCP,15030:30730/TCP,15031:32677/TCP 5m55s istio-pilot ClusterIP 10.101.237.88 <none> 15010/TCP,15011/TCP,8080/TCP,9093/TCP 5m55s ...
3.官方示例部署Istio
使用官方示例的方式部署Istio将部署较多的组件,占用资源多但是功能全,会包含Prometheus、Grafana、Jaeger、ServiceGraph等组件。本书后面介绍服务监控观测时,需要使用此种部署方式。
1)配置Istio。
复制部署源文件,便于出错时恢复:
$ cp /usr/local/istio/install/kubernetes/istio-demo.yaml /usr/local/istio/install/kubernetes/istio-demo.yaml.ori
由于实验使用的虚拟机每台只有2G内存,默认情况下pilot的deployment请求2G内存,为了使实验顺利进行。把13 573行左右关于istio-pilot的内存配置修改成如下内容:
containers: - name: discovery image: "docker.io/istio/pilot:1.0.3" imagePullPolicy: IfNotPresent args: - "discovery" ports: - containerPort: 8080 - containerPort: 15010 ... - name: PILOT_PUSH_THROTTLE_COUNT value: "100" - name: PILOT_TRACE_SAMPLING value: "100" resources: requests: cpu: 500m memory: 500Mi
修改镜像使用国内镜像,加速部署,执行以下命令修改镜像:
$ sed -i 's@quay.io/coreos/hyperkube:v1.7.6_coreos.0@registry.cn-shanghai.aliyuncs.com/gcr-k8s/hyperkube:v1.7.6_coreos.0@g' /usr/local/istio/install/kubernetes/istio-demo.yaml
2)部署Istio。
创建Istio CRD:
$ kubectl apply -f /usr/local/istio/install/kubernetes/helm/istio/templates/ crds.yaml
查看Istio CRD:
$ kubectl get crd NAME CREATED AT ... meshpolicies.authentication.istio.io 2019-01-13T05:57:28Z metrics.config.istio.io 2019-01-13T05:57:29Z noops.config.istio.io 2019-01-13T05:57:29Z opas.config.istio.io 2019-01-13T05:57:29Z policies.authentication.istio.io 2019-01-13T05:57:28Z prometheuses.config.istio.io 2019-01-13T05:57:29Z quotas.config.istio.io 2019-01-13T05:57:29Z quotaspecbindings.config.istio.io 2019-01-13T05:57:28Z quotaspecs.config.istio.io 2019-01-13T05:57:29Z ... virtualservices.networking.istio.io 2019-01-13T05:57:28Z
3)部署Istio相关组件:
$ kubectl apply -f /usr/local/istio/install/kubernetes/istio-demo.yaml
4)查看Istio组件状态,当组件pod全部处于Running或者Completed状态时再进行之后的实验步骤,由于需要拉取较多镜像,如果网速较慢,可能需要等待较长一段时间。强烈建议配置镜像加速。Istio组件状态如下:
$ kubectl get pod -n istio-system NAME READY STATUS RESTARTS AGE grafana-546d9997bb-bq5n9 1/1 Running 0 5m15s istio-citadel-6955bc9cb7-x65tz 1/1 Running 0 5m13s istio-cleanup-secrets-khzc5 0/1 Completed 0 5m22s istio-egressgateway-7dc5cbbc56-w85fr 1/1 Running 0 5m16s istio-galley-545b6b8f5b-khmck 1/1 Running 0 5m16s istio-grafana-post-install-vf27h 0/1 Completed 0 5m22s istio-ingressgateway-7958d776b5-tlnmj 1/1 Running 0 5m16s istio-pilot-64958c46fc-q46t4 2/2 Running 0 5m14s istio-policy-5c689f446f-rxbh7 2/2 Running 0 5m14s istio-security-post-install-6wr8m 0/1 Completed 0 5m22s istio-sidecar-injector-99b476b7b-m689h 1/1 Running 0 5m13s istio-telemetry-55d68b5dfb-rrnh8 2/2 Running 0 5m14s istio-tracing-6445d6dbbf-8vrjf 1/1 Running 0 5m13s prometheus-65d6f6b6c-gn9rl 1/1 Running 0 5m14s servicegraph-57c8cbc56f-2bc85 1/1 Running 1 5m13s $ kubectl get svc -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE grafana ClusterIP 10.108.59.160 <none> 3000/TCP 5m46s istio-citadel ClusterIP 10.109.55.113 <none> 8060/TCP,9093/TCP 5m45s istio-egressgateway ClusterIP 10.108.104.70 <none> 80/TCP,443/TCP 5m47s istio-galley ClusterIP 10.105.229.22 <none> 443/TCP,9093/TCP 5m47s istio-ingressgateway LoadBalancer 10.105.236.32 <pending> 80:31380/TCP,443:31390/TCP,31400:31400/TCP,15011:32075/TCP,8060:32147/TCP,853:32496/TCP,15030:30157/TCP,15031:30711/TCP 5m46s istio-pilot ClusterIP 10.104.117.192 <none> 15010/TCP,15011/TCP,8080/TCP,9093/TCP 5m46s istio-policy ClusterIP 10.99.130.214 <none> 9091/TCP,15004/TCP,9093/TCP 5m46s istio-sidecar-injector ClusterIP 10.99.223.75 <none> 443/TCP 5m45s istio-telemetry ClusterIP 10.107.87.105 <none> 9091/TCP,15004/TCP, 9093/TCP,42422/TCP 5m46s jaeger-agent ClusterIP None <none> 5775/UDP,6831/UDP,6832/UDP 5m39s jaeger-collector ClusterIP 10.110.145.202 <none> 14267/TCP,14268/TCP 5m39s jaeger-query ClusterIP 10.107.254.90 <none> 16686/TCP 5m39s prometheus ClusterIP 10.108.119.47 <none> 9090/TCP 5m45s servicegraph ClusterIP 10.104.167.142 <none> 8088/TCP 5m45s tracing ClusterIP 10.111.8.183 <none> 80/TCP 5m39s zipkin ClusterIP 10.101.31.65 <none> 9411/TCP 5m39s
此时Istio已经安装完成,可以对虚拟机环境进行快照保存,方便后续Istio实验环境快速创建。快照保存方法可以参考本章后面5.5节“注意事项与技巧”。
4.部署官方bookinfo示例
1)开启default命名空间的Istio自动注入功能:
$ kubectl label namespace default istio-injection=enabled namespace/default labeled
2)部署bookinfo:
$ kubectl apply -f /usr/local/istio/samples/bookinfo/platform/kube/bookinfo.yaml service/details created deployment.extensions/details-v1 created service/ratings created deployment.extensions/ratings-v1 created service/reviews created deployment.extensions/reviews-v1 created deployment.extensions/reviews-v2 created deployment.extensions/reviews-v3 created service/productpage created deployment.extensions/productpage-v1 created
3)查看部署状态。
使用如下命令查看部署状态:
$ kubectl get pod NAME READY STATUS RESTARTS AGE details-v1-876bf485f-tpwr8 2/2 Running 0 6m45s productpage-v1-8d69b45c-dxttl 2/2 Running 0 6m44s ratings-v1-7c9949d479-nbl58 2/2 Running 0 6m45s reviews-v1-85b7d84c56-svwp2 2/2 Running 0 6m45s reviews-v2-cbd94c99b-249rj 2/2 Running 0 6m45s reviews-v3-748456d47b-bx6v2 2/2 Running 0 6m45s $ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE details ClusterIP 10.100.86.70 <none> 9080/TCP 7m kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 95m productpage ClusterIP 10.98.228.136 <none> 9080/TCP 6m59s ratings ClusterIP 10.108.237.160 <none> 9080/TCP 7m reviews ClusterIP 10.109.71.86 <none> 9080/TCP 7m
当pod全部处于Running状态时再进行这些步骤,由于需要拉取较多镜像,如果网速较慢,可能需要等待较长一段时间。
4)使用Gateway创建访问入口:
$ kubectl apply -f /usr/local/istio/samples/bookinfo/networking/bookinfo-gateway.yaml gateway.networking.istio.io/bookinfo-gateway created virtualservice.networking.istio.io/bookinfo created
5)查看Gateway:
$ kubectl get gateway NAME AGE bookinfo-gateway 18s
6)获取访问地址。使用如下的命令获取访问入口地址:
$ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}') $ export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}') $ export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o 'jsonpath={.items[0].status.hostIP}') $ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT $ echo http://$GATEWAY_URL/productpage $ curl -I http://$GATEWAY_URL/productpage HTTP/1.1 200 OK content-type: text/html; charset=utf-8 content-length: 4415 server: envoy Date: Sun, 13 Jan 2019 06:24:23 GMT x-envoy-upstream-service-time: 1865
如果没有成功,可以稍等片刻重试,这是由于机器性能不够,导致的Istio配置生效会稍慢。根据机器性能,有时可能需要等待更久的时间,此步骤实验失败并不会影响我们后续其他实验。
7)使用浏览器访问。使用浏览器访问 http://11.11.11.111:31380/productpage ,多次刷新将可以看到如图5-1所示的不同的评价界面。
图5-1 部署官方bookinfo示例结果
5.服务使用Istio的要求
为了让服务成为服务网格的一部分,部署在Kubernetes中的Service和Pod资源必须要满足如下一些要求。
(1)使用命名端口
必须给Service的端口命名,而且命令的格式必须以协议开头,之后可以接连字符和其他字符,例如:http2-foo、http都是合法的命名方式,而http2foo不合法。协议支持http、http2、grpc、mongo、redis。如果端口命名不符合上述规则或者没有使用命名端口,该端口上的流量将会被视为TCP流量,除非Service里指明了协议是UDP。命名端口形式如下:
kind: Service apiVersion: v1 metadata: name: service-go labels: app: service-go spec: selector: app: service-go ports: - name: http port: 80
(2)服务关联问题
如果一个Pod属于多个Service,多个Service将不能使用同一个端口,并设置多个不同的协议,例如:两个Service选择了相同的后端Pod实例,但是分别使用了HTTP和TCP协议,如图5-2所示。
图5-2 服务关联问题示例
(3)部署使用app和version标签
使用Kubernetes的Deployment时,指定明确的app和version标签是非常推荐的。每个Deployment都应该有一个有意义的唯一的app标签,并指定一个version标签用于指定应用的版本。app标签用于分布式调用链追踪,app和version标签也会用于Istio的度量指标收集。