购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

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的度量指标收集。 l78iBxPs5+MiHGcL7lvfh/qms6GU+dkeirA/gV1ZFvaxmVRQKBROJgGglVvDjMdz

点击中间区域
呼出菜单
上一章
目录
下一章
×