Istio的運維-診斷工具(istio 系列五)

Istio的運維-診斷工具

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

目錄

  • Istio的運維-診斷工具
    • 使用istioctl命令行工具
      • istioctl自動補全
      • 查看網格的狀態
      • 獲取代理配置
    • 調試Envoy和istiod
      • 獲取網格概況
      • 檢索Envoy和istiod的差異
      • 深入探究Envoy配置
      • 檢查bootstrap配置
      • 校驗到istiod的連通性
    • 通過istioctl的輸出理解網格
      • 校驗pod是否在網格中
      • 校驗destination rule配置
      • 校驗virtual service配置
      • 校驗流量路由
      • 檢查strict mutual TLS(官方文檔待更新)
      • 卸載
    • 使用istioctl analyse診斷配置
      • 分析現有的集群/本地文件或二者
    • 組件內省
    • 組件日誌
      • 日誌作用域
      • 控制輸出
      • 日誌滾動
      • 組件調試

使用istioctl命令行工具

首先可以通過日誌或Introspection檢查各個組件,如果不足以支持問題定位,可以參考如下操作:

istioctl是一個可以用於調試和診斷istio服務網格的工具。Istio項目為Bash和ZSH運行下的istioctl提供了自動補全功能。

建議安裝對應istio版本的istioctl。

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目錄下,然後執行如下操作即可

    $ source ~/istioctl.bash
    

查看網格的狀態

可以使用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]

更多參見下一節調試Envoy和istiod

調試Envoy和istiod

istio提供了兩個非常有用的命令來診斷流量管理配置問題: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

檢索Envoy和istiod的差異

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

深入探究Envoy配置

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流量

    Istio使用的端口信息如下:

    Port Protocol Used by Description
    15000 TCP Envoy Envoy admin port (commands/diagnostics)
    15001 TCP Envoy √ Envoy Outbound
    15006 TCP Envoy √ Envoy Inbound
    15020 HTTP Envoy Istio agent Prometheus telemetry
    15021 HTTP Envoy Health checks
    15090 HTTP Envoy Envoy Prometheus telemetry
    15010 GRPC Istiod XDS and CA services (plaintext)
    15012 GRPC Istiod XDS and CA services (TLS)
    8080 HTTP Istiod Debug interface
    443 HTTPS Istiod Webhooks
    15014 HTTP Mixer, Istiod Control plane monitoring
    15443 TLS Ingress and Egress Gateways SNI
    9090 HTTP Prometheus Prometheus
    42422 TCP Mixer Telemetry – Prometheus
    15004 HTTP Mixer, Pilot Policy/Telemetry – mTLS
    9091 HTTP Mixer Policy/Telemetry

    可以看到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)

檢查bootstrap配置

到目前為止已經查看了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"
                },
...
}

校驗到istiod的連通性

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

  1. 創建一個sleep pod

    $ 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
    

通過istioctl的輸出理解網格

如下內容是一個實驗特性,僅用於評估

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是否在網格中

如果一個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

如果一個pod在網格中,則不會產生告警。

$ 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

校驗destination rule配置

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

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

查看ratings pod

$ 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

校驗virtual service配置

部署如下virtual service

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

查看v1版本的reviews服務:

$ 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

查看reviews v1` pod:

$ 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

再次查看pod:

$ 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 analyse診斷配置

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

分析當前目錄中的所有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。

每個作用域對應一個唯一的日誌級別:

  1. none
  2. error
  3. warning
  4. info
  5. 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時很有用,但日常用不到。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※網頁設計最專業,超強功能平台可客製化

「我們無法在生病的地球上種植草藥」 英國Pukka草本茶的科學減碳六大心法

轉載自B Lab Taiwan;文:B Lab Taiwan(B型企業協會)

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

※別再煩惱如何寫文案,掌握八大原則!

疫後新常態? 日本「遠端工作日」受矚: 減緩塞車、商辦節電最高18%

文:宋瑞文

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

※網頁設計最專業,超強功能平台可客製化

※別再煩惱如何寫文案,掌握八大原則!

神仙也難救! Segway 7月15日停產

摘錄自2020年6月24日自由財經報導

曾經風靡一時、被視為會改變人類社會的創新科技Segway(賽格威)電動平衡車,將於今年7月15日起終止開發。

根據統計,在Segway推出近20年期間,總共只賣出14萬台,產品大多被用作安全人員的巡邏和遊客遊覽的代步工具。

因 Segway的設計獨特,使它看起來極具科技感,各國交通監理單位卻無法給予它明確定位。在美國有將近一半的地區,禁止Segway行駛於人行道上;在歐洲則被視為動力車輛,許多國家禁止它在公共道路上行駛。台灣對於 Segway則沒有分類,但基本上是不允許在道路上行駛。

生活環境
能源轉型
國際新聞
電動概念車
交通運輸

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※網頁設計最專業,超強功能平台可客製化

※回頭車貨運收費標準

香港環團呼籲 支援回收廢棄塑膠

摘錄自2020年6月22日蘋果日報香港報導

香港政府近年力倡回收減廢,惟廢塑膠回收率每況愈下。垃圾徵費遲未通過,有環保團體促加快落實中央回收廢棄塑膠、加強社區回收網,同時加快推出「飲品塑膠瓶生產者責任計劃」,提高回收率。

香港環保廢料再造業總會會長劉耀成,在大埔工業邨設廠回收、再造塑膠瓶,年底投入運作,劉批評政府沒提供經濟誘因,吸引前線人員回收廢棄塑膠。

他指出,香港2018年PET塑膠瓶每日平均棄置量達139噸,若被棄置的塑膠瓶得以回收,可讓至少五間塑膠廠房生存。香港環保署回覆指,政府今年下半年將就塑膠飲料容器推展生產者責任計劃進行公眾諮詢,並會視「塑膠可回收物料回收服務先導計劃」成效,考慮長遠將服務擴展至全港。

公害污染
污染治理
國際新聞
香港
一次性塑膠製品
回收
廢棄物

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※南投搬家公司費用需注意的眉眉角角,別等搬了再說!

※教你寫出一流的銷售文案?

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

優惠末班車!回家過年的抓緊入手熱門SUV的最後機會!

6-31。90萬購置稅優惠(元):12222-13632寶馬X1定位於一款緊湊型SUV,在外觀方面,寶馬X1保留了海外車型的設計風格,但是軸距卻比海外版本加長了110mm,經典的雙腎格柵搭配天使眼造型的大燈組霸氣十足。相比與同級別的對手來說,寶馬X1擁有一個更大的車型尺寸,看起來更為大氣。

告訴你們一個喜悅但是有暗含悲傷的好消息,16年已經進入尾聲而且春節又來得特別早,不少朋友都開始計劃搶回家的車票了。除此以外,不少消費者還會選擇在春節前購買一輛心儀的座駕自駕回家!這樣還能在親戚朋友面前倍有面子!

買車是個好消息,但是為什麼要悲傷呢?原因很簡單,因為國家頒布的1.6L及以下排量購置稅優惠減半的優惠政策在31日就已經正式結束了。至於明年是否還有減半的優惠,在這兒可以明確地告訴你是“沒有的!”這個消息夠傷心了吧。

經計算

10萬的車能省4274元

20萬的車能省8547元

30萬的車能省12821元

近日國家有發布了一項購車優惠政策,雖然5折是沒希望了,但是在購置稅方面則給你打了個7.5折,雖然有打折,但是年後買車你依舊需要多付一定的費用。16年所剩的日子不多了,想要買車更便宜、想要見親戚朋友倍有面子,買一台高端大氣上檔次的SUV就是最佳選擇!

別克昂科威20T

售價:20.99-25.99萬

購置稅優惠(元):8970-11107

作為合資SUV榜單上的冠軍車型,別克昂科威是一輛為中國消費者打造的神級SUV,一副高端大氣的外觀設計是吸引消費者最重要的利器!無論是在設計上還是整車的高級感方面,昂科威這台車都做得相當好。

除了一副高能吸睛的外觀,別克昂科威的內心也是十分強大。高檔的內飾設計、極為豐富的配置水平以及寬敞的車內空間都能很好地滿足眾多消費者的購車需求,另外最值得點贊的是昂科威的隔音降噪水平和搭載Onstar 車載4G LTE,絕對是領先同級的存在。

在動力方面,1.5T+7速DCG 智能啟停雙離合變速箱這套動力總成推動這樣一台中型SUV完全夠用,而且在油耗方面也是值得點贊。雖然別克昂科威還有2.0T的車型,但是為了符合購置稅優惠減半的政策,今天推薦的主要是1.5T的車型,這也是目前走量的車型,而且目前昂科威整體的優惠幅度普遍比較大,所以入門版的車型在終端售價方面已經能下探到20萬以內,所以競爭力是相當大的。

寶馬X1 18Li

售價:28.6-31.90萬

購置稅優惠(元):12222-13632

寶馬X1定位於一款緊湊型SUV,在外觀方面,寶馬X1保留了海外車型的設計風格,但是軸距卻比海外版本加長了110mm,經典的雙腎格柵搭配天使眼造型的大燈組霸氣十足。相比與同級別的對手來說,寶馬X1擁有一個更大的車型尺寸,看起來更為大氣!

在內飾方面儘管X1在用料方面有所提升,但是整體的設計依舊是眾多消費者的槽點,而在空間方面是X1最大的亮點,堪比中型SUV的空間也是同級罕有,這也是眾多消費者選擇X1的最主要因素之一。

在動力方面,18Li實則是一台1.5T三缸渦輪增壓發動機,搭配上愛信的6AT變速箱,這套動力總成是可以滿足我們的日常駕駛所需。寶馬一直以操控見長,雖然新X1採用了前驅平台,對比上一代車型確實是有所下降,但是對於同級別的競爭對手來說,X1營造出來的運動感依舊存在。

奧迪Q3 30TFSI

售價:23.42-28.38萬

購置稅優惠(元):10008-12128

奧迪Q3屬於一台緊湊型SUV,在外觀方面依舊延續了奧迪的經典風格,在整體設計比較平庸,但是這樣的設計也能吸引到不少消費者的關注,奧迪就給到你一種高端豪華的感覺。

在內飾方面,內飾整體設計依舊平庸,中控台中央部分偏向主駕駛位一側,副駕駛座前方大面積銀色飾板等設計是Q3問世之後一直保持至今的元素之一,但整體的做工水平均屬上乘。

在動力上,EA211+6DSG整體表現中規中矩,最大馬力150匹,最大扭矩250牛米的水平對於家用車來說也算夠用。而奧迪Q3最吸引消費者的要數它的優惠幅度,豪華車卻能賣出堪比合資車型的價格,而且奧迪的車標也是眾多消費者所喜愛的。

標緻4008 350THp

售價:18.57-23.07萬

購置稅優惠(元):7936-9858

在前段時間,標緻4008終於換代了,新車的外觀設計無疑是讓人眼前一亮,時尚前衛、大膽有活力,極為個性的外觀讓它一舉成為顏值極高的個性选手,當然這樣過於“前衛”也並不是所有消費者能夠接受的。

環抱式的內飾設計,狂拽炫酷吊炸天是對它內飾的評價,科技感十足的設計逼格滿滿,這樣的設計跟其它同級別的选手壓根就不在同一個維度上,標緻就是這樣不走尋常路。

在動力方面1.6T+6AT的動力總成足夠日常使用,如果想要更爽快的動力,4008還提供1.8T的車型。4008採用的是麥弗遜式前懸架以及扭力梁式后懸架,但法系車一直以底盤調校見長,而4008也是如此,整車開起來底盤沉穩紮實。

2016已經走到了尾聲,17年就沒有減半優惠了,過了這個村就沒這個店了,在購車時又得多給錢了,抓緊最後的步伐吧。值得提醒的一點是就目前的時間來看,最好就是買現車,現在訂車的話時間相當緊促。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※回頭車貨運收費標準

誰說國產SUV都是樣子貨?這款SUV開去哪裡都不怕!

與我換手的教練兼拉力賽賽車手,僅憑着車燈照探着鋪滿冰渣的路面。儘管開得再小心、再緩慢,但無數的暗坑或是前車遺留的巨大冰碴還是讓我們難以躲避。幸好瑞虎7前麥弗遜后多連桿的懸挂結構加上偏向於運動的底盤調校風格,讓顛起的車身被迅速拉住,車身的晃動被有效地控制,這才讓我們這群處於黑暗的趕路人不顯狼狽。

我對東北的印象,最早建立於08年在央視播出的電視劇《闖關東》。在19世紀的特殊歷史條件下,劇中的主角朱家一眾從山東舉家搬遷至東北的元寶鎮。在廣袤荒涼的土地上,面對極寒、土匪、日軍侵略者等磨難,朱家不屈不撓地用雙手在這片東北土地紮下了根。而闖關東這個詞,既成為東北地區最為顯著的民俗文化,也成為對東北人拼搏精神最深刻的刻畫。

這次,隨着瑞虎7“虎眼看中國”第二站的步伐,從長春到長白山,我得以通過自駕瑞虎7的方式,更深入地遊走東北。雖然出發的意義沒有了過去歷史背景的沉甸,但對於極少在寒冬自駕東北的人以及瑞虎7這款奇瑞最新的旗艦SUV來說,這也是對闖關東的一次探究。

消失的“北國春城”

因為高達41.5%的城區綠化覆蓋,長城也被譽為“北國春城“。但在12月低至零下-16℃的背景下,北國春城的愜意怡人變得不復存在。唯一能夠讓人產生浪漫情緒的,大概也就只剩被積雪裹覆的路邊盆栽以及平房屋頂紅磚煙窗上飄着的白煙。所以冬天的長春街頭並不熱鬧,長春人更喜歡待在熱氣瀰漫的室內。反倒是長春的龍嘉機場人頭涌動,因為各地直飛長白山的機票早已售罄,這個距離長白山最近的機場成為了那些奔赴長白山的旅遊者最理想的中轉點。

內在比外在更豐富的瑞虎7

我們由長春驅車前往長白山,全程大概500餘公里。儘管去年通車的松江河高速已經使得兩地的直線距離大大縮短,但飄雪以及光滑的冰面道路仍然使這趟旅程顯得異常險峻。而奇瑞希望這一段旅程能夠給旗下的旗艦SUV—瑞虎7添加更多高性能、高品質的註腳。在此之前,瑞虎7的原型車—TX概念車已經在第83屆的日內瓦車展上榮獲年度最佳概念車獎而走紅。這款誕生自奇瑞2.0時代的產品,其實有更多內在的亮點可以說道。

在整段的松江河高速路段,始終是較為狹窄的三車道,而連日的降雪又讓原本的三車道實際只剩下兩車道。加之覆蓋在路面上的大面積冰塊,提前制動以及不斷修正跑偏的方向是冰雪駕駛時需要學會的技巧。不過全系配備ABS防抱死、ESp車身穩定控制系統、EBA剎車輔助的瑞虎7在整段的行程里都更讓人放心。我不用擔心車輛的側滑,更不用擔心車輪的抱死。除此以外,2.0L自然吸氣發動機+CVT無級變速箱的動力組合也提供了順滑、理想的動力輸出,動力的響應程度要比那些半路出家的小排量增壓發動機+雙離合讓人滿意太多了。這讓我更快、更安全地達到長白山。

盛產刨花板的“烏托邦小鎮”

從松江河高速轉下的第一個小鎮是位於撫松縣的露水河鎮,實際上這也是我在達到長白山之前少有的具有規模的居民區。比起長春的街頭,這裏的街頭行人要明顯更多一些,露天的市集里是熙熙攘攘前來購買日用百貨品的當地百姓。根據百度百科的資料显示,截至2003年,全鎮區的總人口數為41692人,由漢、滿、錫伯、朝、回等多個民族構成。

因為地理上的邊緣化,這裏居民的生活已經完全實現了自給自足。而木材業則成為了露水河鎮與外界打通的交流途徑,經濟產業的單一化甚至造就了“露水河”牌刨花板這樣的 “中國馳名商標”,其代表性完全不亞於我們常說的“茅台酒”。在整個東北地區,大大小小分佈着與露水河鎮這樣民族結構、經濟條件相類似的集中居民區,依靠生活物質上的自給自足以及單一的經濟產業,繁榮而又不受外界打擾,儼然有着烏托邦小鎮的味道。而這些類似露水河鎮的小鎮,也最能體現闖關東的精髓所在。

一個更具生命力的奇瑞

1999年12月18日,第一輛奇瑞轎車下線。而隨後2007年,憑藉奇瑞QQ的熱銷,奇瑞迅速成為自主品牌為數不多產銷規模達到百萬輛的中國車企。在鮮花與掌聲中,奇瑞開啟了多品牌戰略的時代,但這也成為奇瑞多年發展里的一次波折。而讓人高興的是,在這次的波折以後,有了一個更具生命力的奇瑞出現。標志著奇瑞2.0時代到來的奇瑞T1X模塊化平台讓奇瑞成為第一個應用模塊化平台生產的自主品牌。“未來五年,奇瑞將形成全新三大產品平台,開發10款全新產品。”奇瑞掌門人尹同躍在某次公開場合上如此表示,有了模塊化平台的基礎,奇瑞的產品規模有了更豐富的可能性,正向研發的自給自足將成為奇瑞的標誌之一。而瑞虎7,則是奇瑞闖關東所收穫的第一顆果實。

運動懸挂所帶來的安心

吉林的入夜時間遠比我們想象中的要早,大概是4點,天色就已經大有被黑色吞沒之勢。在露水河到長白山的百餘公里縣道,路燈成了稀缺的物品。與我換手的教練兼拉力賽賽車手,僅憑着車燈照探着鋪滿冰渣的路面。儘管開得再小心、再緩慢,但無數的暗坑或是前車遺留的巨大冰碴還是讓我們難以躲避。幸好瑞虎7前麥弗遜后多連桿的懸挂結構加上偏向於運動的底盤調校風格,讓顛起的車身被迅速拉住,車身的晃動被有效地控制,這才讓我們這群處於黑暗的趕路人不顯狼狽。甚至那不錯的隔音、密封工程,還讓瑞虎7凸顯出了不俗的德系車的高級感。

在睡意將近佔據頭腦全部的時候,我們終於走完了將近500公里的冰雪路,並且在長白山腳的酒店落了腳。雖然長白山的美名遠揚,但商業化的氣息並不過分濃郁。除了長白山萬達國際度假區以外,在夜晚幾乎難以找到能夠提供夜宵的餐館。在某家特色東北餐館囫圇大吃以後,我便早早入睡,為明早登頂長白山蓄力。

長白山的“色彩”

長白山的稱呼來源,源於山上的常年積雪,年均的氣溫-7℃至3℃之間。在朝鮮以及韓國,長白山又被稱呼為白頭山。從最初的汪洋,到後來地殼上升,再經歷前後數次的火山爆發,最終形成了如今的長白山山脈。

歷來居住在長白山周邊的民眾相信長白山的形成是天意使然,長白山是德高望重的山神的化身。因此,祭拜長白山山神成了當地民眾的一種精神寄託。明清時期,長白山的人蔘為朝庭貢品所用,普通民眾嚴禁進山採挖。但仍然有不少山東以及河北地區闖關東的农民出於生活所迫,在官兵的緝拿以及零下數十度的嚴寒中偷采人蔘。為了採挖順利,逐漸衍生出了拜山神的民俗。“三月十六,山神之壽。祭祀山神,把頭保佑。放山快當,棒槌拿夠。風調雨順,年豐人壽。”這樣表達敬重山神的歌謠一直在長白山地區長久傳唱。如今長白山的人蔘產業已經成為當地的一大經濟支柱,甚至還有了“不買長白山人蔘,枉到長白山”一說。所以,闖關東也或多或少地對長白山人蔘這種名貴藥材的興起貢獻良多。

而在朝鮮人的眼中,長白山則充滿了政治的味道,是共產主義勝利的標誌。在第二次世界大戰的1936年至1943年期間,朝鮮共產黨領導人金日成曾率領數萬名朝鮮共產主義戰士與侵朝日軍進行抗爭。在長白山上,修建了後方聯絡站、修械所、出版所、醫院等設施。長白山中一座高1791米的山峰為朝鮮人稱為“正日峰”,以彰顯朝鮮的氣概。在金正日五十壽辰的時候,金日成曾寫下這樣的一首詩:“白頭山頂,正日峰。小白水河,碧溪流。光明星誕,五十周。皆贊文武,忠孝備。萬民稱頌,齊同心。歡呼聲高,震天地,白頭山密營舊居。”

當然,歷史上的長白山全境一直屬中國所有,直到上世紀60年代,才以長白山頂峰的天池為界,把部分山脈劃分給朝鮮,由此長白山成為中朝兩國界山。這種出於兩國友誼而無償劃分國土的行為並不多見,而大多數的中國人也對長白山領土的出讓頗具爭議。但無論如何,至此中國與朝鮮一直是社會主義陣營里關係最堅實的一對。

登上長白山山頂的過程有些艱巨,先是乘觀光大巴爬一小時的山路,爾後再轉乘雪地摩托穿越陡峭的雪峰,最後踩着那些能把小腿陷大半的雪走上數十分鐘。我在即將達到山峰的位置停下了腳步,因為身後那些被夕陽的餘暉所染紅的雪峰、那些繚繞在半山腰的滾滾霧氣已經足夠讓我徹底拋去親近天池的慾望。拿起手機拍照記下這些畫面,然後向著天池的方向虔誠地許上一個願,我認為這是比登頂更具有意義的事。

闖關東就是闖

當然,對於奇瑞來說,攀登自主品牌頂峰才是它最終的目標。不過在登頂之前,瑞虎7產品本身所展現出的自信已經足夠讓我相信:奇瑞能夠造出一台媲美合資品牌的SUV。在《闖關東》里,朱開山說:“闖關東就是闖,這不行,咱到別出去,哪能活我就到哪去。”之於瑞虎7,我想是闖出中國SUV的名堂了。

本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※別再煩惱如何寫文案,掌握八大原則!

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※超省錢租車方案

※教你寫出一流的銷售文案?

※網頁設計最專業,超強功能平台可客製化

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

從10萬的SUV到70萬的豪華轎車,分析銷量最好的熱門車!

緊湊型車中大型車緊湊型SUV總結:金無赤足,人無完人。汽車是個綜合體商品,在一輛車定型之前,工程師要對外觀設計、空間造型、材質用料以及功能配置等綜合起來進行考量,以取得消費者體驗的最佳平衡點,這一切還須建立在產品成本不超標的前提下。

發現十有八九的朋友都是買車以後才開始去了解車,其中對選購的車感到後悔的不知凡幾,你是否其中一員呢?

這些朋友普遍對汽車市場一知半解,不多加體驗,就單憑一款車的外觀、汽車銷量榜和別人片面的評價就為它買賬,一意孤行、不聽勸阻,也甚是無奈。

今年1-10月的汽車總銷量榜單出爐,銷量能否成為購車的參考?告訴你,銷量最好的車未必是產品力最強的車,但一定是最迎合消費者口味的車,對這些公司在營銷方面的造詣深感佩服。下面為你簡單點評幾款熱度相當高的車型。

緊湊型車

中大型車

緊湊型SUV

總結:金無赤足,人無完人。汽車是個綜合體商品,在一輛車定型之前,工程師要對外觀設計、空間造型、材質用料以及功能配置等綜合起來進行考量,以取得消費者體驗的最佳平衡點,這一切還須建立在產品成本不超標的前提下。所以沒有最好的車,只有最適合自己的車。明確個人用車需求、預算,平時多看的推文,總能找到最適合你的車。對了,別吝嗇你的贊!本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※教你寫出一流的銷售文案?

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

※超省錢租車方案

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※推薦台中搬家公司優質服務,可到府估價

月銷3萬多輛,這款實力出眾的車型即將趕超英朗!

編者先賣個關子,一會再詳細解讀。國人買車最在意的就是性價比,都想花最少的錢,獲得最大的享受。和英朗pK中可以發現,福睿斯標配6氣囊、天窗、真皮坐椅、定速巡航、駐車雷達、皮質座椅等,這些都是消費者特別重視的配置。

在這個社會上,事物的結果都有一定的衡量標準。對於考生而言,試卷上的分數決定他是否能上一所更好的大學;對於公司職員來講,能否提高業績,是他升職加薪的主要原因;同樣,對於一台車來說,銷量的多寡,可以直接看出來他是否得到消費者的滿意和肯定。

銷量是判定這款車是否成功的重要標準。所以在銷量榜上面,你可以發現那些很有價值的信息。尤其是福特福睿斯,這款如此低調的車,但是銷量卻能達到三萬台。

看到福睿斯的銷量如此之高,大家一定會感到意外吧!在這個級別,我們比較熟悉的車型,比如科魯茲,寶來,K3,朗動等,都被福睿斯無情的壓在腳下。至於呼聲更高的別克英朗,銷量和福睿斯也只是“一個車身”的差距。

是騾子是馬拉出來溜溜就知道了,解析一下福睿斯就知道為什麼他可以取得高銷量了。我們就拿同為美系,銷量和福睿斯比較接近的英朗作對比,看看孰優孰劣(至於為什麼不和科魯茲比,是因為他和福睿斯不是一個銷量級別的)。

福睿斯1.5L 自動時尚型(11.98萬元)

VS

英朗 15N 自動進取型(11.99萬元)

既然要對比肯定要選擇同價位的車型,同時兩車的優惠程度要非常接近,這樣可以更公平的進行pK。

兩者車長竟然都是4587mm,這僅僅只是巧合?還是冥冥之中註定必然是對手?當然狹路相逢“大”者勝,福睿斯的每一項尺寸幾乎都要領先英朗,在國內這個以大為美的市場裏面,較大的車身可以更好的俘獲國內消費者的芳心,從這一點來看,福睿斯已經領先第一步了。

英朗採用了別克的家族式設計,直瀑式的前進氣格柵辨識度很高,整體看起來比較中庸、柔和。當然福睿斯也不例外,也是採用了福特的家族式設計,福特家族的標誌性前臉-馬丁臉自然是必不可少的,霸氣的前臉、立體的車身線條,使得福睿斯看起來更加時尚。不過外觀沒有統一的評判標準,主要是消費者喜歡就好。

兩者的乘坐空間較為接近,滿足家用沒問題。有一點需要着重指出來,英朗的底盤雖貴為多連桿獨立懸架,但是日常駕駛並不能感覺出來它是獨立懸架,底盤感覺比較單薄,慮震較差,這是為什麼呢?編者先賣個關子,一會再詳細解讀。

國人買車最在意的就是性價比,都想花最少的錢,獲得最大的享受。和英朗pK中可以發現,福睿斯標配6氣囊、天窗、真皮坐椅、定速巡航、駐車雷達、皮質座椅等,這些都是消費者特別重視的配置。所以就性價比來說,毫無疑問,福睿斯完勝。

對於底盤,有必要細究一下,從圖中可以看出來,現款英朗和已經停產的凱越的底盤結構是一樣的。這時候你就明白為什麼福睿斯在底盤調教上的造詣更高一層,底盤非常紮實厚重,韌性十足,無論是慮震、隔音還是底盤行駛的厚重感,福睿斯都會給你一個不小的驚喜。

隨後我們又發現,英朗和凱越的發動機也是一樣的。目前凱越已經停產,停產原因是車型過於老舊,其實我看未必吧,這很明顯是為英朗讓步罷了,英朗和凱越的底盤、發動機都極其相似,不禁讓我想入非非…這樣的“凱越”,怎麼和福睿斯競爭。

乘坐過這兩個車子的人都會發現和英朗比起來,福睿斯很關注乘客的舒適性,比如座椅的坐墊很厚實,填充物軟硬適中,有一種美式大沙發的感覺,而英朗就相形見絀了,座椅比較單薄包裹性較差,又比如在隔音方面,福睿斯的用料更實在…畢竟福睿斯要比英朗重將近100斤,所以可以理解福睿斯在車身用料方面“更下本”了。

有對比才有傷害。福睿斯在2014年12月30日上市,車型歷史只有1年多的時間,但是卻能在今年10月份斬獲三萬多的銷量。而英朗作為老牌的合資家轎,有着多年的歷史,卻被一個新秀追着打。不過,群眾的眼睛是雪亮的,性價比高的車型,消費者會用手裡的現金去投票的。

福睿斯的銷量,頗有點“扮豬吃老虎”的特點,因為福睿斯平時“話不多”,比較低調,廣告宣傳什麼的也很少見。但是英朗就不一樣了,在很多地方都可以看到關於英朗的宣傳,高銷量也被各種讚譽,比起福睿斯要高調太多了,但是真到了銷量上面,兩者只有微乎其微的差距。

福睿斯最大程度的滿足國內人民的用車需求—以家用為主,但是眾口難調,有些消費者就是想要純粹的駕駛激情,那這個時候,他通常會把關注點轉向福克斯,因為在這個價位的車型裏面,福克斯的操控無出其右,幾乎被當作標杆來看待。福特在這個級別緊密布局了兩個車型,看來確實是仔細研究過國內的用車環境。

追求純粹操控的消費者可以選擇福克斯,想要操控又想要大空間的消費者就會鍾情於福睿斯。因為雙福車型精準的市場定位和強大的產品競爭力,使得它們取得了極大的勝利,雙福在9月份的銷量為51163輛,10月份的銷量為52806輛,取得了驕人的成績。

本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※網頁設計最專業,超強功能平台可客製化

心有 netty 一點通!

一、標準的netty線程模型

雙池合璧:

1、連接線程池:

連接線程池專門負責監聽客戶端連接請求,並完成連接的建立(包括諸如握手、安全認證等過程)。

連接的建立本身是一個極其複雜、損耗性能的過程,此處使用線程池,能夠極大的增加處理客戶端連接的能力。

2、I/O線程池:

連接線程池會將成功建立的連接註冊到後端I/O線程池,由I/O線程池負責對相應連接的網絡數據進行讀寫、編解碼處理。

在實際應用中,我們通常會定義相應的業務消息協議,並選擇合適的序列化機制,netty I/O線程池部分根據預設的規則進行數據的編解碼。

二、延伸的業務線程池

 

其實我們這裏說的業務線程池不在網絡層處理邏輯里。處理到I/O線程池部分,所需要的請求數據已經處理完畢,涉及具體的業務處理邏輯,比較複雜的,或者時間、性能消耗特別大的,通常我們會單獨設置相應的線程池來處理。

三、netty的極致性能設計

1、無鎖化設計

I/O線程的內部串行化:

局部無鎖化串行處理,避免多線程切換帶來的複雜性及性能損耗(鎖競爭、CPU資源分配)。至於對於處理能力的考慮,可以通過調整I/O線程池容量來平衡。

盡量避免I/O線程和業務線程混淆及切換。

2、直接內存使用

TCP接收和發送使用直接內存代替堆內存,避免了數據在堆內存和主內存之間的複製消耗,提升了I/O讀取和寫入的性能。

 3、transferTo

依賴於操作系統零拷貝特性直接將緩衝區數據發送到相應的通道。

傳統的方式,先將源文件拷貝到內存,然後由內存寫到目的文件。

netty 利用 NIO FileChannel transferTo方法,通道對通道寫數據。

4、CompositeByteBuf

組合緩存使用可以像操作單個緩存一樣操作多個緩存,避免了傳統的操作方式帶來的內存複製性能消耗。

5、內存池使用

netty支持通過內存池的方式循環利用ByteBuf,避免了頻繁的創建,銷毀ByteBuf帶來的資源及性能損耗。

ByteBuf byte數據緩衝區,是NIO編程的主要對象。高負載情景下,ByteBuf內存池使用,可以有效降低GC頻率。

PoolArena netty的內存池實現類。PoolArena 是由多個Chunk組成的大塊內存區域,每個Chunk由一個多個Page組成。

Chunk:組織管理Page的內存分配和釋放,Page被構建為二叉樹形式:

PoolSubpage:對於小於Page的內存使用,直接在Page中完成分配,每個Page切分為大小相同的多個存儲塊兒,存儲塊兒的大小由第一次申請的內存塊兒大小決定。

回收:netty使用狀態位標識Chunk及Page內存可用性,Chunk標識二叉樹Page節點使用狀態;Page標識內部內存塊兒的使用狀態。

6、線程安全優化

合理的使用線程安全容器、原子類等,提升系統的併發處理能力,

7、引用計數器

通過引用計數器及時的申請釋放不再引用的對象,細粒度的內存管理降低了GC的頻率,減少GC帶來的時延增大和CPU損耗。

Netty 4中 ByteBuf 和 ByteBufHolder 引入引用計數器功能(實現ReferenceCounted接口),在特定的對象上跟蹤引用的數目。

引用計數器初始為1。如果對象活動的引用計數器大於0,則不會被釋放。當引用計數減少到0,實例將會被釋放。這也是 PooledByteBufAllocator 內存池應用的核心特性。

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

※別再煩惱如何寫文案,掌握八大原則!