Service Mesh-Istio安裝與使用

Service Mesh-Istio安裝與使用

本文根據官網的文檔整理而成,步驟包括安裝istio 0.5.1並建立一個bookinfo的微服務來測試istio的功能。html

文中使用的yaml文件能夠在kubernetes-handbookmanifests/istio目錄中找到,若是鏡像pull失敗,請根據官網的鏡像自行修改。node

安裝環境

  • CentOS 7.4.1708
  • Docker 17.12.0-ce
  • Kubernetes 1.8.5

安裝

1.下載安裝包linux

下載地址:https://github.com/istio/istio/releasesgit

下載Linux版本的當前最新版安裝包:github

wget https://github.com/istio/istio/releases/download/0.5.1/istio-0.5.1-linux.tar.gz

目前,最新的是0.8版本(http://www.javashuo.com/article/p-wrjvrvsv-x.html)。web

wget https://github.com/istio/istio/releases/download/0.8/istio-0.8-linux.tar.gz

2.解壓docker

解壓後,獲得的目錄結構以下:json

├── bin
│   └── istioctl
├── install
│   ├── ansible
│   ├── consul
│   ├── eureka
│   ├── gcp
│   ├── kubernetes
│   ├── README.md
│   └── tools
├── istio.VERSION
├── LICENSE
├── README.md
├── samples
│   ├── bookinfo
│   ├── CONFIG-MIGRATION.md
│   ├── helloworld
│   ├── httpbin
│   ├── kubernetes-blog
│   ├── rawvm
│   ├── README.md
│   └── sleep
└── tools
    ├── cache_buster.yaml
    ├── deb
    ├── githubContrib
    ├── minikube.md
    ├── perf_istio_rules.yaml
    ├── perf_k8svcs.yaml
    ├── README.md
    ├── rules.yml
    ├── setup_perf_cluster.sh
    ├── setup_run
    ├── update_all
    └── vagrant

從文件裏表中能夠看到,安裝包中包括了kubernetes的yaml文件,示例應用和安裝模板。瀏覽器

3.先決條件安全

如下說明要求您能夠訪問啓用了RBAC(基於角色的訪問控制)的Kubernetes1.7.3或更新的羣集。您還須要安裝1.7.3或更高版本。若是您但願啓用automatic sidecar injection,則須要Kubernetes 1.9或更高版本。kubectl

注意:若是您安裝了Istio 0.1.x,請在安裝新版本以前完全卸載它(包括適用於全部啓用Istio的應用程序窗口的Istio支架)。 安裝或升級Kubernetes CLIkubectl以匹配羣集支持的版本(CRD支持版本爲1.7或更高版本)。

根據您的Kubernetes提供者:

要在本地安裝Istio,請安裝最新版本的Minikube(版本0.22.1或更高版本)。

4.安裝步驟

從0.2版本開始,Istio安裝在它本身的istio-system命名空間中,而且能夠管理來自全部其餘命名空間的服務。

轉至Istio發佈頁面如下載與您的操做系統相對應的安裝文件。若是您使用的是MacOS或Linux系統,如下命令自動下載並提取最新版本:

curl -L https://git.io/getLatestIstio | sh -

解壓縮安裝文件並將目錄更改成文件位置。

安裝目錄包含

Installation .yaml Kubernetes的安裝文件
Sample/ 示例應用程序
bin/istioctl 二進制bin/文件 在手動注入Envoy做爲附屬代理並建立路由規則和策略時使用.
istio.VERSION配置文件

例如,若是包是istio-0.5(初步)

cd istio-0.5 (preliminary)

將istioctl客戶端添加到您的PATH。例如,在MacOS或Linux系統上運行如下命令:

export PATH=$PWD/bin:$PATH

安裝Istio的核心組件。從下面兩個互相排斥的選項中選擇一個,或者用Helm Chart交替安裝: a)安裝Istio而不啓用側車間的相互TLS認證。爲具備現有應用程序的羣集,使用Istio輔助車的服務須要可以與其餘非Istio Kubernetes服務以及使用活動性和準備就緒探測器,無頭服務或StatefulSets的應用程序通訊的應用程序選擇此選項。

kubectl apply -f install/kubernetes/istio.yaml

要麼

b)安裝Istio並啓用側櫃之間的相互TLS認證:

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

這兩個選項都會建立istio-system命名空間以及所需的RBAC權限,並部署Istio-Pilot,Istio-Mixer,Istio-Ingress和Istio-CA(證書頒發機構)。

可選:若是您的羣集的Kubernetes版本是1.9或更高,而且您但願啓用自動代理注入,請安裝sidecar injector webhook。 驗證安裝 請確保如下Kubernetes服務部署:istio-pilot,istio-mixer,istio-ingress。

kubectl get svc -n istio-system
NAME            CLUSTER-IP      EXTERNAL-IP       PORT(S)                       AGE
istio-ingress   10.83.245.171   35.184.245.62     80:32730/TCP,443:30574/TCP    5h
istio-pilot     10.83.251.173   <none>            8080/TCP,8081/TCP             5h
istio-mixer     10.83.244.253   <none>            9091/TCP,9094/TCP,42422/TCP   5h

注意:若是您的集羣中不支持外部負載平衡(例如,Minikube)的環境中運行,該external-ip的istio-ingress會顯示。您必須使用NodePort訪問應用程序,或使用端口轉發。

修改istio.yaml中的istio-ingress service的type爲ClusterIP,並設置nodePort,默認爲32000。

確保相應Kubernetes容器都運行起來:istio-pilot-*istio-mixer-*istio-ingress-*istio-ca-*,和可選的istio-sidecar-injector-*

kubectl get pods -n istio-system
istio-ca-3657790228-j21b9                1/1       Running   0          5h
istio-ingress-1842462111-j3vcs           1/1       Running   0          5h
istio-sidecar-injector-184129454-zdgf5   1/1       Running   0          5h
istio-pilot-2275554717-93c43             1/1       Running   0          5h
istio-mixer-2104784889-20rm8             2/2       Running   0          5h

部署您的應用程序

您如今能夠部署您本身的應用程序或者像Bookinfo同樣隨安裝提供的示例應用程序之一。注意:應用程序必須對全部HTTP通訊使用HTTP/1.1或HTTP/2.0協議,由於HTTP/1.0不受支持。

若是您啓動了Istio-sidecar-injector,如上所示,您能夠直接使用應用程序部署應用程序kubectl create。

Istio Sidecar注入器會自動將Envoy容器注入到您的應用程序窗格中,假設運行在標有名稱空間的名稱空間中istio-injection=enabled

kubectl label namespace <namespace> istio-injection=enabled
kubectl create -n <namspace> -f <your-app-spec>.yaml

若是您沒有安裝Istio-sidecar-injector,則在部署它們以前,必須使用istioctl kube-inject將Envoy容器手動注入應用程序窗格中:

kubectl create -f <(istioctl kube-inject -f <your-app-spec>.yaml)

卸載

卸載Istio sidecar進樣器:

若是您啓用Istio-sidecar-injector,請將其卸載:

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

卸載Istio核心組件。對於0.6(初始)發行版,卸載將刪除RBAC權限,istio-system命名空間和分層下的全部資源。忽略不存在資源的錯誤是安全的,由於它們可能已被分層刪除。

a)若是您在禁用相互TLS身份驗證的狀況下安裝了Istio:

kubectl delete -f install/kubernetes/istio.yaml

要麼

b)若是您在啓用相互TLS身份驗證的狀況下安裝了Istio:

kubectl delete -f install/kubernetes/istio-auth.yaml

7.安裝監控插件

安裝插件

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

在traefik ingress中增長增長以上幾個服務的配置,同時增長istio-ingress配置。

- host: grafana.istio.io
      http:
        paths:
        - path: /
          backend:
            serviceName: grafana
            servicePort: 3000
    - host: servicegraph.istio.io
      http:
        paths:
        - path: /
          backend:
            serviceName: servicegraph
            servicePort: 8088
    - host: prometheus.istio.io
      http:
        paths:
        - path: /
          backend:
            serviceName: prometheus
            servicePort: 9090
    - host: zipkin.istio.io
      http:
        paths:
        - path: /
          backend:
            serviceName: zipkin
            servicePort: 9411
    - host: ingress.istio.io
      http:
        paths:
        - path: /
          backend:
            serviceName: istio-ingress
            servicePort: 80

測試

咱們使用Istio提供的測試應用bookinfo微服務來進行測試。

該微服務用到的鏡像有:

istio/examples-bookinfo-details-v1
istio/examples-bookinfo-ratings-v1
istio/examples-bookinfo-reviews-v1
istio/examples-bookinfo-reviews-v2
istio/examples-bookinfo-reviews-v3
istio/examples-bookinfo-productpage-v1

該應用架構圖以下:

BookInfo Sample應用架構圖

圖片 - BookInfo Sample應用架構圖

部署應用

kubectl create -f <(istioctl kube-inject -f samples/apps/bookinfo/bookinfo.yaml)

Istio kube-inject命令會在bookinfo.yaml文件中增長Envoy sidecar信息。參考:https://istio.io/docs/reference/commands/istioctl.html#istioctl-kube-inject

在本機的/etc/hosts下增長VIP節點和ingress.istio.io的對應信息,具體步驟參考:邊緣節點配置,或者使用gateway ingress來訪問服務,

若是將productpage配置在了ingress裏了,那麼在瀏覽器中訪問http://ingress.istio.io/productpage,若是使用了istio默認的gateway ingress配置的話,ingress service使用nodePort方式暴露的默認使用32000端口,那麼可使用http://任意節點的IP:32000/productpage來訪問。

BookInfo Sample頁面

圖片 - BookInfo Sample頁面

屢次刷新頁面,你會發現有的頁面上的評論裏有星級打分,有的頁面就沒有,這是由於咱們部署了三個版本的應用,有的應用裏包含了評分,有的沒有。Istio根據默認策略隨機將流量分配到三個版本的應用上。

查看部署的bookinfo應用中的productpage-v1 service和deployment,查看productpage-v1的pod的詳細json信息能夠看到這樣的結構:

$ kubectl get pod productpage-v1-944450470-bd530 -o json

productpage-v1-istio.json文件。從詳細輸出中能夠看到這個Pod中實際有兩個容器,這裏麪包括了initContainer,做爲istio植入到kubernetes deployment中的sidecar。

"initContainers": [
            {
                "args": [
                    "-p",
                    "15001",
                    "-u",
                    "1337"
                ],
                "image": "docker.io/istio/init:0.1",
                "imagePullPolicy": "Always",
                "name": "init",
                "resources": {},
                "securityContext": {
                    "capabilities": {
                        "add": [
                            "NET_ADMIN"
                        ]
                    }
                },
                "terminationMessagePath": "/dev/termination-log",
                "terminationMessagePolicy": "File",
                "volumeMounts": [
                    {
                        "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
                        "name": "default-token-3l9f0",
                        "readOnly": true
                    }
                ]
            },
            {
                "args": [
                    "-c",
                    "sysctl -w kernel.core_pattern=/tmp/core.%e.%p.%t \u0026\u0026 ulimit -c unlimited"
                ],
                "command": [
                    "/bin/sh"
                ],
                "image": "alpine",
                "imagePullPolicy": "Always",
                "name": "enable-core-dump",
                "resources": {},
                "securityContext": {
                    "privileged": true
                },
                "terminationMessagePath": "/dev/termination-log",
                "terminationMessagePolicy": "File",
                "volumeMounts": [
                    {
                        "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
                        "name": "default-token-3l9f0",
                        "readOnly": true
                    }
                ]
            }
        ],

監控

不斷刷新productpage頁面,將能夠在如下幾個監控中看到以下界面。

Grafana頁面

http://grafana.istio.io

Istio Grafana界面

圖片 - Istio Grafana界面

Prometheus頁面

http://prometheus.istio.io

Prometheus頁面

圖片 - Prometheus頁面

Zipkin頁面

http://zipkin.istio.io

Zipkin頁面

圖片 - Zipkin頁面

ServiceGraph頁面

http://servicegraph.istio.io/dotviz

能夠用來查看服務間的依賴關係。

訪問 http://servicegraph.istio.io/graph 能夠得到json格式的返回結果。

ServiceGraph頁面

圖片 - ServiceGraph頁面

更進一步

BookInfo示例中有三個版本的reviews,可使用istio來配置路由請求,將流量分發到不一樣版本的應用上。參考Configuring Request Routing

還有一些更高級的功能,咱們後續將進一步探索。

參考

相關文章
相關標籤/搜索