Istio 的運維-診斷工具

2021-03-02 51reboot運維開發


在參考官方文檔的時候發現環境偶爾會出現問題,因此插入一章與調試有關的內容,便於簡單問題的定位。涵蓋官方文檔的診斷工具(http://dwz.date/b5EZ)章節

調試 Envoy 和 istiod

獲取網格概況

檢索 Envoy 和 istiod 的差異

深入探究 Envoy 配置

檢查 bootstrap 配置

校驗到 istiod 的連通性

通過 istioctl 的輸出理解網格

使用 istioctl analyse 診斷配置

組件內省

組件日誌

首先可以通過日誌或 Introspection 檢查各個組件,如果不足以支持問題定位,可以參考如下操作:istioctl 是一個可以用於調試和診斷 istio 服務網格的工具。Istio 項目為 Bash 和 ZSH 運行下的 istioctl 提供了自動補全功能。建議安裝對應 istio 版本的 istioctl。將如下內容添加到 ~/.bash_profile 文件中

[[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . "/usr/local/etc/profile.d/bash_completion.sh"

使用 bash 時,將在 tools 命令中的 istioctl.bash 文件拷貝到 $HOME 目錄下,然後執行如下操作即可可以使用 istioctl proxy-status 或 istioctl ps 命令查看網格的狀態。如果輸出結果中缺少某個代理,說明該代理當前沒有連接到 Pilot 實例,因而無法接收到任何配置。如果狀態為 stale,表示當前存在網絡故障,或 Pilot 需要擴容。可以使用 istioctl proxy-config 或 istioctl pc 檢索代理配置信息。例如,使用如下方式可以檢索特定 pod 中的 Envoy 實例的集群配置信息。

$ istioctl proxy-config cluster <pod-name> [flags]

使用如下方式可以檢索特定 pod 中的 Envoy 實例的 bootstrap 配置信息。

$ istioctl proxy-config bootstrap <pod-name> [flags]


使用如下方式可以檢索特定 pod 中的 Envoy 實例的 listener (監聽器)配置信息。

$ istioctl proxy-config listener <pod-name> [flags]


使用如下方式可以檢索特定 pod 中的 Envoy 實例的 route (路由)配置信息。

$ istioctl proxy-config route <pod-name> [flags]


使用如下方式可以檢索特定 pod 中的 Envoy 實例的 endpoint (後端)配置信息。

$ istioctl proxy-config endpoints <pod-name> [flags]


提供了兩個非常有用的命令來診斷流量管理配置問題:proxy-status 和proxy-config。proxy-status 可以獲取網格的概述並確定導致問題的代理。proxy-config 可以檢查 Envoy 配置並診斷該問題。

安裝 Bookinfo 

使用 kubernetes 集群中部署類似應用

通過 proxy-status 命令可以查看網格的概況,了解是否有 sidecar 無法接收配置或無法保持同步。如果某個代理沒有出現在輸出列表中,則說明該代理沒有連接到 istiod 實例,因此也無法接收任何配置信息。狀態信息如下:

SYNCED:表示 Envoy 確認了 istiod 發過來的配置

NOT SENT:表示 istiod 還沒有發送配置到 Envoy。通常時因為 istiod 當前沒有需要發送的配置信息

STALE:表示 istiod 發送了一個更新到 Envoy,但沒有接收到確認。通常表示 Envoy和 istiod 之間的網絡出現了問題,或 istio 本身出現了 bug。

$ istioctl ps
NAME CDS LDS EDS RDS PILOT VERSION
details-v1-78d78fbddf-psnmk.default                   SYNCED SYNCED SYNCED SYNCED istiod-788cf6c878-4pq5g 1.6.0
istio-ingressgateway-569669bb67-dsd5h.istio-system SYNCED SYNCED SYNCED NOT SENT istiod-788cf6c878-4pq5g 1.6.0
productpage-v1-85b9bf9cd7-d8hm8.default               SYNCED SYNCED SYNCED SYNCED istiod-788cf6c878-4pq5g 1.6.0
prometheus-79878ff5fd-tjdxx.istio-system SYNCED SYNCED SYNCED SYNCED istiod-788cf6c878-4pq5g 1.6.0
ratings-v1-6c9dbf6b45-xlf2q.default                   SYNCED SYNCED SYNCED SYNCED istiod-788cf6c878-4pq5g 1.6.0
reviews-v1-564b97f875-q5l9r.default                   SYNCED SYNCED SYNCED SYNCED istiod-788cf6c878-4pq5g 1.6.0
reviews-v2-568c7c9d8f-vcd94.default                   SYNCED SYNCED SYNCED SYNCED istiod-788cf6c878-4pq5g 1.6.0
reviews-v3-67b4988599-psllq.default                   SYNCED SYNCED SYNCED SYNCED istiod-788cf6c878-4pq5g 1.6.0
sleep-78484c89dd-fmxbc.default                        SYNCED SYNCED SYNCED SYNCED istiod-788cf6c878-4pq5g 1.6.0


proxy-status 加上 proxy ID 可以檢索 Envoy 加載的配置和 istiod 發送的配置之間的差異,通過這種方式可以確定哪部分內容沒有被同步,並確定可能存在的問題。下面的例子可以看到 ingressgateway 的 listeners 和routers配置都與istiod發過來的配置匹配,但clusters不匹配。

$ istioctl proxy-status details-v1-6dcc6fbb9d-wsjz4.default
--- Istiod Clusters
+++ Envoy Clusters
@@ -374,36 +374,14 @@
             "edsClusterConfig": {
                "edsConfig": {
                   "ads": {

                   }
                },
                "serviceName": "outbound|443||public-cr0bdc785ce3f14722918080a97e1f26be-alb1.kube-system.svc.cluster.local"
- },
- "connectTimeout": "1.000s",
- "circuitBreakers": {
- "thresholds": [
- {
-
- }
- ]
- }
- }
- },
- {
- "cluster": {
- "name": "outbound|53||kube-dns.kube-system.svc.cluster.local",
- "type": "EDS",
- "edsClusterConfig": {
- "edsConfig": {
- "ads": {
-
- }
- },
- "serviceName": "outbound|53||kube-dns.kube-system.svc.cluster.local"
             },
             "connectTimeout": "1.000s",
             "circuitBreakers": {
                "thresholds": [
                   {

                   }

Listeners Match
Routes Match

proxy-config 命令可以查看一個 Envoy 實例的配置,用於定位無法通過查看 istio 配置和用戶資源發現的問題。例如,使用如下命令可以獲取特定 pod 的 clusters,  listeners 或 routes 概要。註:首先通過 istioctl ps 查看出不匹配的代理,然後使用 istioctl pc 查看具體的不匹配的信息。

$ istioctl proxy-config cluster -n istio-system istio-ingressgateway-7d6874b48f-qxhn5
SERVICE FQDN PORT SUBSET DIRECTION TYPE
BlackHoleCluster - - - STATIC
agent - - - STATIC
details.default.svc.cluster.local 9080    - outbound EDS
istio-ingressgateway.istio-system.svc.cluster.local 80      - outbound EDS
istio-ingressgateway.istio-system.svc.cluster.local 443     - outbound EDS
istio-ingressgateway.istio-system.svc.cluster.local 15021   - outbound EDS
istio-ingressgateway.istio-system.svc.cluster.local 15443   - outbound EDS
istiod.istio-system.svc.cluster.local 443     - outbound EDS
istiod.istio-system.svc.cluster.local 853     - outbound EDS
istiod.istio-system.svc.cluster.local 15010   - outbound EDS
istiod.istio-system.svc.cluster.local 15012   - outbound EDS
istiod.istio-system.svc.cluster.local 15014   - outbound EDS
kube-dns.kube-system.svc.cluster.local 53      - outbound EDS
kube-dns.kube-system.svc.cluster.local 9153    - outbound EDS
kubernetes.default.svc.cluster.local 443     - outbound EDS
...
productpage.default.svc.cluster.local 9080    - outbound EDS
prometheus.istio-system.svc.cluster.local 9090    - outbound EDS
prometheus_stats - - - STATIC
ratings.default.svc.cluster.local 9080    - outbound EDS
reviews.default.svc.cluster.local 9080    - outbound EDS
sds-grpc - - - STATIC
xds-grpc - - - STRICT_DNS
zipkin - - - STRICT_DNS

為了調試 Envoy,首先需要理解 Envoy 的 clusters/listeners/routes/endpoints,以及它們之間是如何交互的。下面將使用帶有 -o json 和篩選標誌的 proxy config 命令來跟蹤 Envoy,因為它決定在哪裡將請求從 productpage pod 發送到 reviews pod 的 reviews:9080 1、如果請求了一個 pod 的 listener 概要,可以看到 istio 生成了如下 listeners:

一個0.0.0.0:15006 的 listener,用於接收到 pod 的入站流量;以及一個 0.0.0.0:15001的 listener,用於接收所有到 pod 的出站流量,然後將請求交給一個 virtual listener。

每個 kubernetes service IP 都對應一個 virtual listener,非 HTTP 的 listener 用於出站的 TCP/HTTPS 流量

pod IP 中的 virtual listener 暴露了接收入站流量的埠

0.0.0.0 的 HTTP 類型的 virtual listener,用於出站的 HTTP 流量

可以看到 TYPE 欄位是沒有 HTTPS 的,HTTPS 作為 TCP 類型。下面是  productpage 的 listeners,刪減了部分信息。10.84 開頭的是各個 kubernetes service 的 CLUSTER-IP,以 172.20 開頭的是 kubernetes 的 node IP,以  nodePort 方式暴露服務。

$ istioctl proxy-config listeners productpage-v1-85b9bf9cd7-d8hm8.default
ADDRESS PORT TYPE
0.0.0.0          443      TCP <--+
10.84.71.37      443      TCP |
10.84.223.189 443 TCP |
10.84.100.226    15443    TCP |
10.84.121.154 443 TCP |
10.84.142.44     443      TCP | #從0.0.0.0_15001相關IP:PORT上接收出站的non-HTTP流量
10.84.155.219 443 TCP |
172.20.127.212   9100     TCP |
10.84.205.103 443 TCP | 
10.84.167.116    443      TCP |
172.20.127.211 9100 TCP <--+
10.84.113.197 9979 HTTP+TCP<--+
0.0.0.0 9091 HTTP+TCP |
10.84.30.227     9092     HTTP+TCP |
10.84.108.37 8080 HTTP+TCP |
10.84.158.64     8443     HTTP+TCP |
10.84.202.185 8080 HTTP+TCP |
10.84.21.252     8443     HTTP+TCP |
10.84.215.56 8443 HTTP+TCP |
0.0.0.0          60000    HTTP+TCP | # 從0.0.0.0_15001的相關埠上接收出站的HTTP+TCP流量
10.84.126.74 8778 HTTP+TCP |
10.84.126.74     8080     HTTP+TCP |
10.84.123.207 8080 HTTP+TCP |
10.84.30.227     9091     HTTP+TCP |
10.84.229.5 8080 HTTP+TCP<--+
0.0.0.0 9080 HTTP+TCP # 從 0.0.0.0_15006 上接收所有到9080的入站流量
0.0.0.0 15001 TCP # 從IP tables接收pod的所有出站流量,並移交給虛擬偵聽器
0.0.0.0 15006 HTTP+TCP # Envoy 入站
0.0.0.0 15090 HTTP # Envoy Prometheus 遙測
0.0.0.0 15021 HTTP # 健康檢查

下面是 productpage Pod 中實際監聽的埠信息,與上述對應。

$ ss -ntpl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0             128                 0.0.0.0:15090              0.0.0.0:*
LISTEN 0             128               127.0.0.1:15000              0.0.0.0:*
LISTEN 0             128                 0.0.0.0:9080               0.0.0.0:*
LISTEN 0             128                 0.0.0.0:15001              0.0.0.0:*
LISTEN 0             128                 0.0.0.0:15006              0.0.0.0:*
LISTEN 0             128                 0.0.0.0:15021              0.0.0.0:*
LISTEN 0             128                       *:15020                    *:*

2、從上述輸出概要中可以看到每個 sidecar 都有一個綁定到 0.0.0.0:15006 的listener,IP tables 會將所有入站的Pod流量導入該 listener;以及一個綁定到 0.0.0.0:15001 的 listener,IP tables 會將所有出站流量導入該 listener,該listener 有一個欄位 useOriginalDst 設置為 true,表示會使用最佳匹配原始目的地的方式將請求分發到 virtual listener,如果沒有找到任何 virtual listener,將會直接發送到連接目的地的 PassthroughCluster。

$ istioctl pc listener productpage-v1-85b9bf9cd7-d8hm8.default --port 15001 -o json
[
    {
        "name": "virtualOutbound",
        "address": {
            "socketAddress": {
                "address": "0.0.0.0",
                "portValue": 15001
            }
        },
        "filterChains": [
            {
                "filters": [
                    {
                        "name": "istio.stats",
                        "typedConfig": {
                            "@type": "type.googleapis.com/udpa.type.v1.TypedStruct",
                            "typeUrl": "type.googleapis.com/envoy.extensions.filters.network.wasm.v3.Wasm",
                            "value": {
                                "config": {
                                    "configuration": "{\n \"debug\": \"false\",\n \"stat_prefix\": \"istio\"\n}\n",
                                    "root_id": "stats_outbound",
                                    "vm_config": {
                                        "code": {
                                            "local": {
                                                "inline_string": "envoy.wasm.stats"
                                            }
                                        },
                                        "runtime": "envoy.wasm.runtime.null",
                                        "vm_id": "tcp_stats_outbound"
                                    }
                                }
                            }
                        }
                    },
                    {
                        "name": "envoy.tcp_proxy",
                        "typedConfig": {
                            "@type": "type.googleapis.com/envoy.config.filter.network.tcp_proxy.v2.TcpProxy",
                            "statPrefix": "PassthroughCluster",
                            "cluster": "PassthroughCluster",
                            "accessLog": [
                                {
                                    "name": "envoy.file_access_log",
                                    "typedConfig": {
                                        "@type": "type.googleapis.com/envoy.config.accesslog.v2.FileAccessLog",
                                        "path": "/dev/stdout",
                                        "format": "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% \"%DYNAMIC_METADATA(istio.mixer:status)%\" \"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME% %ROUTE_NAME%\n"
                                    }
                                }
                            ]
                        }
                    }
                ],
                "name": "virtualOutbound-catchall-tcp"
            }
        ],
        "useOriginalDst": true,
        "trafficDirection": "OUTBOUND"
    }
]

3、應用的請求為一個出站 HTTP 請求,會到達9080埠,這意味著請求將傳遞給0.0.0.0:9080 virtual listener。該 listener 會查看其 RDS 中配置的路由。這種情況下會查找 istiod 配置的 RDS 的 9080 路由

istioctl pc listener productpage-v1-85b9bf9cd7-d8hm8.default  -o json --address 0.0.0.0 --port 9080
[
    {
        "name": "0.0.0.0_9080",
        "address": {
            "socketAddress": {
                "address": "0.0.0.0",
                "portValue": 9080
            }
        },
        "filterChains": [
            {
                "filterChainMatch": {
                    "applicationProtocols": [
                        "http/1.0",
                        "http/1.1",
                        "h2c"
                    ]
                },
                "filters": [
                    {
                        "name": "envoy.http_connection_manager",
                        "typedConfig": {
                            "@type": "type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager",
                            "statPrefix": "outbound_0.0.0.0_9080",
                            "rds": {
                                "configSource": {
                                    "ads": {}
                                },
                                "routeConfigName": "9080"
                            },
...
]

4、9080 的路由配置中每個服務只有一個 virtual host。由於應用的請求會傳遞到 reviews 服務,因此 Envoy 會選擇請求與域相匹配的 virtual host。一旦匹配到域,Envoy 會查看匹配請求的第一個路由。下面場景中,由於沒有配置任何高級路由,因此只有一條可以匹配的路由,該路由告訴 Envoy將請求發送到 outbound|9080||reviews.default.svc.cluster.local 集群。

$ istioctl proxy-config routes productpage-v1-85b9bf9cd7-d8hm8.default  --name 9080 -o json
[
    {
        "name": "9080",
        "virtualHosts": [
...
            {
                "name": "reviews.default.svc.cluster.local:9080",
                "domains": [
                    "reviews.default.svc.cluster.local",
                    "reviews.default.svc.cluster.local:9080",
                    "reviews",
                    "reviews:9080",
                    "reviews.default.svc.cluster",
                    "reviews.default.svc.cluster:9080",
                    "reviews.default.svc",
                    "reviews.default.svc:9080",
                    "reviews.default",
                    "reviews.default:9080",
                    "10.84.110.152",
                    "10.84.110.152:9080"
                ],
                "routes": [
                    {
                        "name": "default",
                        "match": {
                            "prefix": "/"
                        },
                        "route": {
                            "cluster": "outbound|9080||reviews.default.svc.cluster.local",
                            "timeout": "0s",
                            "retryPolicy": {
                                "retryOn": "connect-failure,refused-stream,unavailable,cancelled,retriable-status-codes",
                                "numRetries": 2,
                                "retryHostPredicate": [
                                    {
                                        "name": "envoy.retry_host_predicates.previous_hosts"
                                    }
                                ],
                                "hostSelectionRetryMaxAttempts": "5",
                                "retriableStatusCodes": [
                                    503
                                ]
                            },
                            "maxGrpcTimeout": "0s"
                        },
                        "decorator": {
                            "operation": "reviews.default.svc.cluster.local:9080/*"
                        }
                    }
                ],
                "includeRequestAttemptCount": true
            }
        ],
        "validateClusters": false
    }
]


5、cluster 的配置用於從 istiod 中檢索後端。Envoy 會使用 serviceName 作為 key 在Endpoints 列表中進行查找,並將請求傳遞到這些後端

$ istioctl pc cluster productpage-v1-85b9bf9cd7-d8hm8.default  --fqdn reviews.default.svc.cluster.local -o json
[
    {
       ...
        "name": "outbound|9080||reviews.default.svc.cluster.local",
        "type": "EDS",
        "edsClusterConfig": {
            "edsConfig": {
                "ads": {}
            },
            "serviceName": "outbound|9080||reviews.default.svc.cluster.local"
        },
        "connectTimeout": "10s",
        "circuitBreakers": {
            "thresholds": [
                {
                    "maxConnections": 4294967295,
                    "maxPendingRequests": 4294967295,
                    "maxRequests": 4294967295,
                    "maxRetries": 4294967295
                }
            ]
        },
        "filters": [
            {
                "name": "istio.metadata_exchange",
                "typedConfig": {
                    "@type": "type.googleapis.com/udpa.type.v1.TypedStruct",
                    "typeUrl": "type.googleapis.com/envoy.tcp.metadataexchange.config.MetadataExchange",
                    "value": {
                        "protocol": "istio-peer-exchange"
                    }
                }
            }
        ]
    }
]

6、使用 proxy-config endpoint 命令查看本集群中當前可用的後端

$ istioctl pc endpoint productpage-v1-85b9bf9cd7-d8hm8.default --cluster "outbound|9080||reviews.default.svc.cluster.local"
ENDPOINT STATUS OUTLIER CHECK CLUSTER
10.80.3.55:9080     HEALTHY OK outbound|9080||reviews.default.svc.cluster.local
10.80.3.56:9080 HEALTHY OK outbound|9080||reviews.default.svc.cluster.local
10.80.3.58:9080     HEALTHY OK outbound|9080||reviews.default.svc.cluster.local

流量方向為:listener(應用出站port)->route(routeConfigName)->cluster(domain)->endpoint(serviceName)到目前為止已經查看了 istiod 的大部分配置,然而,Envoy 需要一些如哪裡可以發現istiod 的 bootstrap 配置,使用如下方式查看:

$ istioctl proxy-config bootstrap -n istio-system istio-ingressgateway-569669bb67-dsd5h.istio-system
{
    "bootstrap": {
        "node": {
            "id": "router~10.83.0.14~istio-ingressgateway-569669bb67-dsd5h.istio-system~istio-system.svc.cluster.local",
            "cluster": "istio-ingressgateway",
            "metadata": {
                    "CLUSTER_ID": "Kubernetes",
                    "CONFIG_NAMESPACE": "istio-system",
                    "EXCHANGE_KEYS": "NAME,NAMESPACE,INSTANCE_IPS,LABELS,OWNER,PLATFORM_METADATA,WORKLOAD_NAME,MESH_ID,SERVICE_ACCOUNT,CLUSTER_ID",
                    "INSTANCE_IPS": "10.83.0.14,fe80::6871:95ff:fe5b:9e3e",
                    "ISTIO_PROXY_SHA": "istio-proxy:12cfbda324320f99e0e39d7c393109fcd824591f",
                    "ISTIO_VERSION": "1.6.0",
                    "LABELS": {
                                "app": "istio-ingressgateway",
                                "chart": "gateways",
                                "heritage": "Tiller",
                                "istio": "ingressgateway",
                                "pod-template-hash": "569669bb67",
                                "release": "istio",
                                "service.istio.io/canonical-name": "istio-ingressgateway",
                                "service.istio.io/canonical-revision": "latest"
                            },
                    "MESH_ID": "cluster.local",
                    "NAME": "istio-ingressgateway-569669bb67-dsd5h",
                    "NAMESPACE": "istio-system",
                    "OWNER": "kubernetes://apis/apps/v1/namespaces/istio-system/deployments/istio-ingressgateway",
...
                    "ROUTER_MODE": "sni-dnat",
                    "SDS": "true",
                    "SERVICE_ACCOUNT": "istio-ingressgateway-service-account",
                    "TRUSTJWT": "true",
                    "WORKLOAD_NAME": "istio-ingressgateway"
                },
...
}

服務網格中的所有 Envoy 代理容器都應該連接到 istiod,使用如下步驟測試:

$ kubectl create namespace foo
$ kubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml) -n foo

2、使用 curl 測試到 istiod 的連通性。下面調用 v1 註冊 API,使用默認的 istiod 配置參數,並啟用雙向 TLS 認證

$ kubectl exec $(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name}) -c sleep -n foo -- curl -sS istiod.istio-system:15014/debug/endpointz

如下內容是一個實驗特性,僅用於評估 istio 1.3 中包含一個 istioctl experimental describe 命令。該 CLI 命令提供了解影響 pod 的配置所需的信息。本節展示如何使用該 experimental 子命令查看一個 pod 是否在網格中,以及檢查該 pod 的配置。該命令的基本使用方式為:

$ istioctl experimental describe pod <pod-name>[.<namespace>] #或
$ istioctl experimental describe pod <pod-name> -n <namespace>

如果一個 pod 不在網格中,istioctl describe 會顯示一個告警信息,此外,如果 pod 缺少 istio 需要的配置時也會給出告警信息。

$ istioctl experimental describe pod mutatepodimages-7575797d95-qn7p5
Pod: mutatepodimages-7575797d95-qn7p5
   Pod does not expose ports
WARNING: mutatepodimages-7575797d95-qn7p5 is not part of mesh; no Istio sidecar

Error: failed to execute command on sidecar: error 'execing into mutatepodimages-7575797d95-qn7p5/default istio-proxy container: container istio-proxy is not valid for pod mutatepodimages-7575797d95-qn7p5

$ istioctl x describe pod ratings-v1-6c9dbf6b45-xlf2q
Pod: ratings-v1-6c9dbf6b45-xlf2q
   Pod Ports: 9080 (details), 15090 (istio-proxy)

Service: details
   Port: http 9080/HTTP targets pod port 9080
Pilot reports that pod enforces HTTP/mTLS and clients speak HTTP

pod 的服務容器埠,上述為 ratings 的 9080 埠 

pod 中的 istio-proxy埠,15090

pod 服務使用的協議,9080 埠的 http 協議 

pod 設置的 mutual TLS 

可以使用 istioctl describe 檢查應用到一個 pod 的 destination rule。例如執行如下命令部署 destination rule

$ kubectl apply -f samples/bookinfo/networking/destination-rule-all-mtls.yaml

$ export RATINGS_POD=$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')
$ istioctl x describe pod $RATINGS_POD
Pod: ratings-v1-6c9dbf6b45-xlf2q
   Pod Ports: 9080 (ratings), 15090 (istio-proxy)

Service: ratings
   Port: http 9080/HTTP targets pod port 9080
DestinationRule: ratings for "ratings"
   Matching subsets: v1
      (Non-matching subsets v2,v2-mysql,v2-mysql-vm)
   Traffic Policy TLS Mode: ISTIO_MUTUAL
Pilot reports that pod enforces HTTP/mTLS and clients speak mTLS


應用到 ratings 服務的 ratings destination rule

匹配 pod 的 ratings destination rule,上述為 v1

destination rule 定義的其他 subset

pod 接收 HTTP 或 mutual TLS,但客戶端使用mutual TLS

$ kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml

$ export REVIEWS_V1_POD=$(kubectl get pod -l app=reviews,version=v1 -o jsonpath='{.items[0].metadata.name}')
istioctl x describe pod $REVIEWS_V1_POD
$ istioctl x describe pod $REVIEWS_V1_POD
Pod: reviews-v1-564b97f875-q5l9r
   Pod Ports: 9080 (reviews), 15090 (istio-proxy)

Service: reviews
   Port: http 9080/HTTP targets pod port 9080
DestinationRule: reviews for "reviews"
   Matching subsets: v1
      (Non-matching subsets v2,v3)
   Traffic Policy TLS Mode: ISTIO_MUTUAL
VirtualService: reviews
   1 HTTP route(s)


輸出結果與前面的 ratings pod 類型,但多了到 pod 的 virtual service 路由。istioctl describe 命令不僅僅顯示了影響 pod 的 virtual service。如果一個 virtual service 配置的 host 為一個 pod,但流量不可達,會輸出告警信息,這種請求可能發生在當一個 virtual service 如果沒有可達的 pod subset 時。例如:

$ export REVIEWS_V2_POD=$(kubectl get pod -l app=reviews,version=v2 -o jsonpath='{.items[0].metadata.name}')
istioctl x describe pod $REVIEWS_V2_POD
[root@bastion istio-1.6.0]# istioctl x describe pod $REVIEWS_V2_POD
Pod: reviews-v2-568c7c9d8f-vcd94
...
VirtualService: reviews
   WARNING: No destinations match pod subsets (checked 1 HTTP routes)
      Route to non-matching subset v1 for (everything)

告警信息給出導致問題的原因,檢查的路由數目,以及其他路由信息。例如,由於 virtual service 將所有的流量到導入了 v1 subset,因此 v2 pod 無法接收到任何流量。如果刪除如下destination rule:

$ kubectl delete -f samples/bookinfo/networking/destination-rule-all-mtls.yaml

$ istioctl x describe pod $REVIEWS_V1_POD
Pod: reviews-v1-564b97f875-q5l9r
   Pod Ports: 9080 (reviews), 15090 (istio-proxy)

Service: reviews
   Port: http 9080/HTTP targets pod port 9080
VirtualService: reviews
   WARNING: No destinations match pod subsets (checked 1 HTTP routes)
      Warning: Route to subset v1 but NO DESTINATION RULE defining subsets!


輸出展示了已刪除 destination rule,但沒有刪除依賴它的 virtual service。該virtual service 將流量路由到 v1 subset,但沒有定義 v1 subset 的 destination rule。因此流量無法分發到 v1 版本的 pod。

$ kubectl apply -f samples/bookinfo/networking/destination-rule-all-mtls.yaml

istioctl describe 也可以展示流量權重。如理如下命令會將 90% 的流量導入 reviews 服務的 v1 subset,將 10% 的流量導入 reviews 服務的v2 subset。

$ kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-90-10.yaml

$ istioctl x describe pod $REVIEWS_V1_POD
...
VirtualService: reviews
   Weight 90%


輸出顯示 90% 的 reviews 服務的流量導入到了 v1 subset 中。部署其他類型的路由,如部署指定 HTTP 首部的路由:

$ kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-jason-v2-v3.yaml

$ istioctl x describe pod $REVIEWS_V1_POD
...
VirtualService: reviews
   WARNING: No destinations match pod subsets (checked 2 HTTP routes)
      Route to non-matching subset v2 for (when headers are end-user=jason)
      Route to non-matching subset v3 for (everything)


由於查看了位於 v1 subset 的 pod,而 virtual service 將包含 end-user=jason 的流量分發給 v2 subset,其他流量分發給 v3 subset,v1 subset 沒有任何流量導入,此時會輸出告警信息。
檢查 strict mutual TLS(官方文檔待更新) 根據 mutual TLS 遷移指南,可以給 ratings 服務啟用 strict mutual TLS。

$ kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: ratings-strict
spec:
  selector:
    matchLabels:
      app: ratings
  mtls:
    mode: STRICT
EOF

執行如下命令查看 ratings pod,輸出顯示 ratings pod 已經使用 mutual TLS 防護。

$ istioctl x describe pod $RATINGS_POD
Pilot reports that pod enforces mTLS and clients speak mTLS

有時,將 mutual TLS 切換位 STRICT 模式時會對部署的組件造成影響,通常是因為destination rule 不匹配新配置造成的。例如,如果配置  Bookinfo 客戶端不使用mutualTLS,而使用明文的 HTTP destination rules:

$ kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml

如果在瀏覽器傻瓜打開Bookinfo,會顯示 Ratings service is currently unavailable,使用如下命令查看原因:

$ istioctl x describe pod $RATINGS_POD
...
WARNING Pilot predicts TLS Conflict on ratings-v1-f745cf57b-qrxl2 port 9080 (pod enforces mTLS, clients speak HTTP)
  Check DestinationRule ratings/default and AuthenticationPolicy ratings-strict/default

輸出中有一個描述 destination rule 和 authentication policy 衝突的告警信息。使用如下方式恢復:

$ kubectl apply -f samples/bookinfo/networking/destination-rule-all-mtls.yaml

$ kubectl delete -f samples/bookinfo/platform/kube/bookinfo.yaml
$ kubectl delete -f samples/bookinfo/networking/bookinfo-gateway.yaml
$ kubectl delete -f samples/bookinfo/networking/destination-rule-all-mtls.yaml
$ kubectl delete -f samples/bookinfo/networking/virtual-service-all-v1.yaml


istioctl analyze 是一個可以探測 istio 配置中潛在錯誤的診斷工具,它可以診斷現有的集群或一組本地配置文件,會同時診斷這兩者。可以使用如下方式診斷當前的kubernetes:

$ istioctl analyze --all-namespaces

例如,如果某些命名空間沒有啟用 istiod 注入,會列印如下告警信息:

Warn [IST0102] (Namespace openshift) The namespace is not enabled for Istio injection. Run 'kubectl label namespace openshift istio-injection=enabled' to enable it, or 'kubectl label namespace openshift istio-injection=disabled' to explicitly mark it as not needing injection

上述的例子用於分析一個存在的集群,但該工具也可以支持分析本地 kubernetes yaml 的配置文件集,或同時分析本地文件和集群。當分析一個本地文件集時,這些文件集應該是完全自包含的。通常用於分析需要部署到集群的一個完整的配置文件集。分析特定的本地 kubernetes yaml 文件集:

$ istioctl analyze --use-kube=false a.yaml b.yaml

$ istioctl analyze --use-kube=false *.yaml

模擬將當前目錄中的 files 部署到當前集群中:

$ istioctl analyze *.yaml

使用 istioctl analyze --help 命令查看完整的選項。更多 analyse 的使用參見 Q&A.

 

Istio 組件是用一個靈活的內省框架構建的,它使檢查和操作運行組件的內部狀態變得簡單。組件會開放一個埠,用於通過 web 瀏覽器的交互式視圖獲取組件的狀態,或使用外部工具通過 REST 訪問。Mixer, Pilot 和 Galley 都實現了 ControlZ 功能(1.6版本可以查看 istiod)。當啟用這些組件時將記錄一條消息,指示要連接的 IP  地址和埠,以便與 ControlZ 交互。

2018-07-26T23:28:48.889370Z     info    ControlZ available at 100.76.122.230:9876

可以使用如下命令進行埠轉發,類似 kubectl 的 port-forward,用於遠程訪問。

$ istioctl dashboard controlz <podname> -n <namespaces>


組件的日誌按照作用域進行分類。取決於組件提供的功能,不同的組件有不同的作用域。所有的組件都有一個 default 的作用域,用於未分類的日誌消息。各個組件的日誌作用域參見: reference documentation。

none

error

warning

info

debug 

其中 none 表示沒有劃分作用域的輸出,debug 會最大化輸出。默認的作用域為 info,用於在一般情況下為 istio 提供何時的日誌輸出。可以使用 --log_output_level 控制輸出級別:日誌信息通常會發送到組件的標準輸出流中。--log_target 選項可以將輸出重定向到任意(數量的)位置,可以通過逗號分割的列表給出文件系統的路徑。stdout 和 stderr 分別表示標準輸出和標準錯誤輸出流。
istio 組件能夠自動管理日誌滾動,將大的日誌切分為小的日誌文件。--log_rotate 選項允許指定用於滾動的基本文件名。派生的名稱將用於單個日誌文件。--log_rotate_max_age 選項指定文件發生滾動前的最大時間(天為單位),--log_rotate_max_size 選項用於指定文件滾動發生前的最大文件大小(MB為單位), --log_rotate_max_backups 選項控制保存的滾動文件的最大數量,超過該值的老文件會被自動刪除。--log_caller 和--log_stacktrace_level 選項可以控制日誌信息是否包含程式設計師級別的信息。在跟蹤組件 bug 時很有用,但日常用不到。

相關焦點

  • Istio Service Mesh中的流量管理概念解析
    通過將 Envoy 代理部署在服務之前,運維人員可以針對面向用戶的服務進行 A/B 測試、部署金絲雀服務等。類似地,通過使用 Envoy 將流量路由到外部 Web 服務(例如,訪問 Maps API 或視頻服務 API)的方式,運維人員可以為這些服務添加超時控制、重試、斷路器等功能,同時還能從服務連接中獲取各種細節指標。
  • Istio全部功能,知否知否?
    作者:宋淨超(Jimmy Song)           Kubernetes、Cloud Native布道者、開源愛好者,個人博客https://jimmysong.io轉自:雲原生應用架構公眾號本文是 Istio 管理 Java 微服務的案例教程,使用的所有工具和軟體全部基於開源方案,替換了 redhat-developer-demos
  • OneCenter 視頻診斷及運維在平安城市中的應用
    平安城市對於視頻系統運維工具的要求勤智OneCenter視頻監控智能運維系統,將先進的智能技術應用於視頻監控運維管理與服務中,優化繁複耗時的視頻監控運維工作環節,滿足視頻監控運維領域不斷發展的需要,真正實現視頻監控的智能化運維與管理,幫助用戶實時掌控設備運行情況,便捷維護大型視頻監控系統。
  • 《蹲坑學K8S》之23-1:安裝部署Istio
    (3)安裝獨立 Operator [實驗](4)多集群安裝使用Istioctl 安裝部署Istio步驟如下:一、下載Istio[root@k8s-master ~]# curl -L https://istio.io
  • 推薦|目前最完整的Istio Service Mesh示例教程匯總
    GitHub地址:https://github.com/IBM/microservices-traffic-management-using-istio/其他推薦指數:⭑⭑⭑推薦原因:個人演示項目,方便定製和修改代碼。
  • 使用 Istio 的十個技巧
    同樣,如果要使用 istio-ingressgateway 集群鏡像在邊緣實現請求鏡像,要在 mesh 虛擬服務中添加本地服務名稱和關鍵字。使用 Open Policy Agent 之類的工具可以在工作負載上強制使用必需的標籤,以確保所有 service 上都帶有身份驗證標籤。GRPC JSON 轉碼器可以幫助工程師將程序代碼從 JSON 轉碼為 GRPC。不過,將部署更改到 proto descriptor 的過程有些笨重。
  • 浙江《農村生活汙水處理設施運維常見問題診斷與處理導則(徵求意見...
    浙江省《農村生活汙水處理設施運維常見問題診斷與處理導則(徵求意見稿)》公布,本導則適用於浙江省內運行維護單位對農村生活汙水處理設施運維常見問題的診斷與處理。要求,我廳委託浙江雙良商達環保有限公司編制《農村生活汙水處理設施運維常見問題診斷與處理導則》(徵求意見稿),現徵求各地意見建議。
  • 10大HBase常見運維工具整理
    摘要:HBase自帶許多運維工具,為用戶提供管理、分析、修復和調試功能。
  • 解放運維工程師 你需要伺服器智能運維
    早期的運維工作,大部分是由運維工程師手工完成,這被稱作人肉運維。伺服器運行狀態,全靠運維工程師每日肉眼查看,進行問題定位與解決。從伺服器運維的角度來分析伺服器智能運維,目標就是通過對帶外信息(配置信息、狀態信息、性能信息、日誌等)和帶內信息(配置參數、性能信息、日誌信息)進行採集,通過機器學習的方式來解決運維問題,提高系統預警能力和穩定性,降低運維成本,提高運維效率。
  • 談AIOps基礎-從自動化運維到智能化運維
    右側是運維大數據,一共分為 5層:即數據分析處理層,數據資產層,數據服務能力層,大數據應用服務層,包括了業務監控、日誌檢索、異常檢測、故障診斷等都是這層的能力。從這個圖可以看到,整體AIOps架構和我們經常說的大數據平臺架構相當類似,我們完全可以理解為是基於自動化運維和智能化運維場景來構建的一個大數據平臺。
  • 智能運維 | 解放程式設計師,一個工具就能鎖定程序故障(下)
    在上一篇《智能運維 | 解放程式設計師,一個工具就能鎖定程序故障》文章中我們主要介紹了一種在服務發生故障時自動排查監控指標的算法。
  • 不懂Istio 架構原理,我被同事Diss了.
    微服務就是一個典型的例子,微服務的開發和運維對程式設計師來說是一個挑戰。分而治之的思想使得業務本身的規模和複雜度不降反增。在分布式系統中,網絡可靠性、通信安全、網絡時延、網絡拓撲變化等都成了關注的焦點,同時服務註冊、服務發現、負載均衡、服務間通訊、分布式調用鏈追蹤都是要解決的問題。為了解決這個問題,把服務治理部分抽象成公共庫,讓所有微服務都使用這個公共庫。
  • AlOps:自動化運維的下一站
    AIOps為何被認可在談AIOps之前,還是先看看IT運維的現狀。如前所說,近些年來,隨著IT應用的日益普及,IT應用越來越複雜,涉及面越來越廣,一旦出現故障,診斷越來越困難,導致人才緊缺。為了高效運維,此前人們提出自動化運維的理念,希望通過各種軟體工具,特別是一些開源產品(如Ansible、Chef)來自動化流程,通過減少人力來提高效率。但這只是解決執行問題,沒有解決診斷和歸因的問題。實際上,在故障發生和面對各個各樣報警信息時如何快速準確找到問題所在,這是解決故障的關鍵。而AI和大數據技術的出現,讓我們看到了解決這個問題的希望。
  • 詳解十三款運維監控工具
    有效的運行監測體系,最終離不開相關技術平臺的支撐,而我們需要了解監測技術平臺詳解十三款運維監控工具一、開源工具介紹Zabbix360網站服務監控阿里雲監控百度雲觀測一、開源工具介紹因為這款工具除了繪圖比較好看,其他的功能不如我們的zabbix。我們這裡就簡單的說一下,以後會有相關文檔,請繼續關注abcdocker!
  • 遠程運維是什麼?運維是什麼?運維工程師是幹嘛的?
    大家眼中的運維工程師是這樣的:修電腦、裝網線、背鍋的。然而實際的運維除了包攬上面這些活之外,開發項目正式上線後,後續的所有工作都是運維的。運維,顧名思義負責運行、維護。可這才有了"兩窟",想湊齊"三窟",這裡推薦一個工具——向日葵遠程控制。向日葵遠程控制支持多種作業系統的客戶端,支持跨系統控制,Windows、Mac OS、Android互相之間都可以控制,以實際場景給大家介紹一番:場景一:在公司外收到故障告警,通過電腦或者手機的向日葵軟體遠程控制公司電腦,直接通過公司電腦處理故障。
  • 運維流程管理:保障運維管理效能的推手
    任何的管理活動中都有流程,IT運維管理也是。而在企業中流程管理的工具很多,常見的有OA、BPM、專用工作流平臺,以及一些管理系統中也會自帶流程模塊(如:HR系統、ITSM系統)。隨著企業信息化的發展,IT環境日益複雜,對IT運維管理的要求也就越來越高,那麼IT運維中的管理流程應該如何考慮?
  • IT運維沒做好這一點,恭喜你,這個鍋你背定了
    IT運維沒做好這一點,恭喜你,這個鍋你背定了 一提到 IT 運維,大多數的同學腦海中浮現的都是:背鍋、填坑、7*24小時待命、救火..,問道運維工程師背鍋是怎樣的體驗?
  • WebHook 自動化部署和運維工具 git-webhook
    WebHook 自動化部署和運維工具 git-webhook 一個使用 Python Flask + SQLAchemy + Celery + Redis + React 開發的用於迅速搭建並使用 WebHook 進行自動化部署和運維系統,支持:Github / GitLab / GitOsc。
  • 運維雜談|IT運維工程師的價值
    每當我們聊到運維工程師時,人們想到的可能就是「修電腦的」 、」打雜的」,如果你這樣想說明你對運維工程師這個職業有很大的誤解,那運維工程師都起到了哪些作用呢。日常維護:不管你的架構多優化安全性做得多好,這都需要運維工程師的日常維護,下面是一個運維工程師貼出的工作日常,大家可以了解一下:1、負責現場的技術支持,及時解決出現的各類技術故障;2、負責資料庫管理,及相關系統測試;3、負責制定各伺服器的數據備份
  • 海上風電運維的四大挑戰和八項建議
    3、風力發電機組遠程故障診斷和預警能力不健全,檢修環境差,檢修難度大。 (1) 當前,海上風力發電機組的維護模式仍以定期維護和故障檢修的「被動式運維」為主。雖然風電場開發商、風力發電機組廠商以及風力發電機組部分關鍵大部件生產商都逐步開始建立故障診斷和遠程預警能力,但受限於海上風力發電機組運行、故障數據積累匱乏等原因,當前的故障診斷和遠程預警體系和水平尚不足以支撐海上風力發電機組運維成本的大幅降低。