專一於大數據及容器雲核心技術解密,若有任何學術交流,可隨時聯繫。更多內容請關注《數據雲技術社區》公衆號,或請轉發郵件至1120746959@qq.com。node
pilot-discovery 爲數據面(運行在 sidecar 中的 Envoy 等 proxy 組件)提供控制信息服務,也就是所謂的 discovery service 或者 xds 服務。這裏的 x 是一個代詞,相似雲計算裏的 XaaS 能夠指代 IaaS、PaaS、SaaS 等。nginx
在 Istio 中,xds 包括 cds(cluster discovery service)、docker
lds(listener discovery service)、json
rds(route discovery service)、api
eds(endpoint discovery service),markdown
而 ads(aggregated discovery service) 是對這些服務的一個統一封裝。網絡
獲取 ingress IP 地址:
$ 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}')
服務網關設置:
kubectl get configmap istio -n istio-system -o yaml | sed 's/mode: ALLOW_ANY/mode: REGISTRY_ONLY/g'|kubectl replace -n istio-system -f -
kubectl get configmap istio -n istio-system -o yaml | sed 's/mode: REGISTRY_ONLY/mode: ALLOW_ANY/g'|kubectl replace -n istio-system -f -
手動注入代理:
istioctl kube-inject -f nginx-istio-test.yaml | kubectl apply -f - -n jiuxi
hub配置:
{
"registry-mirrors": ["http://10.180.210.37","http://10.180.210.196","https://docker.mirrors.ustc.edu.cn"],
"insecure-registries": ["10.180.210.37","10.180.210.196","docker.mirrors.ustc.edu.cn"]
}
sudo systemctl daemon-reload
sudo systemctl restart docker
Envoy 是 Istio 數據面的核心組件,已Sidecar的模式同應用部署在一個Pod中。
下圖展現了Envoy配置流程:
Pilot-agent負責Envoy生命週期管理。它根據啓動參數和K8S API Server中的配置信息生成Envoy的初始配置文件envoy-rev0.json,該文件告訴Envoy從xDS server中獲取動態配置信息,並配置了xDS server的地址信息,即控制面的Pilot。
Pilot-agent使用envoy-rev0.json啓動Envoy進程。
Envoy根據初始配置得到Pilot地址,採用xDS接口從Pilot獲取到Listener,Cluster,Route等動態配置信息。
Envoy根據獲取到的動態配置啓動Listener,並根據Listener的配置,結合Route和Cluster對攔截到的流量進行處理。
Envoy經過xDS API進行動態配置。xDS是一類發現服務的總稱,包含LDS、RDS、CDS、EDS及SDS。
LDS:Listener發現服務。Listener監聽器控制Envoy啓動端口監聽(目前只支持TCP),並配置 L3或L4層過濾器,在網絡鏈接到達後,由網絡過濾器堆棧開始處理。
RDS:Route發現服務,用於Envoy HTTP鏈接管理器動態獲取路由配置。路由配置包含HTTP頭修改(增長、刪除HTTP頭鍵值)、Virtual Hosts(虛擬主機)及Virtual Hosts定義的各個路由條目。
CDS:Cluster發現服務,用於動態獲取Cluster信息。Envoy Cluster管理器管理着全部的上游Cluster。Envoy從Listener(針對TCP協議)或Route(針對HTTP)中抽象出上遊Cluster,做爲流量轉發目標。
EDS:Endpoint發現服務。對於每一個Cluster,Envoy經過EDS API動態獲取Endpoint。
SDS:Secret發現服務,用於在運行時動態獲取TLS證書。
複製代碼
配置了一個 envoy實例,監聽 127.0.0.1:10000,支持 http 協議訪問,http 訪問域名爲:http://example.com。接收到的全部http流量,
轉發給 127.0.0.2:1234 的服務。這個例子中 some_service 這個cluster中 hosts 是固定的(127.0.0.2:1234),不利於擴展。
admin:
access_log_path: /tmp/admin_access.log
address:
socket_address: { address: 127.0.0.1, port_value: 9901 }
static_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 127.0.0.1, port_value: 10000 }
filter_chains:
- filters:
- name: envoy.http_connection_manager
config:
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["example.com"]
routes:
- match: { prefix: "/" }
route: { cluster: some_service }
http_filters:
- name: envoy.router
clusters:
- name: some_service
connect_timeout: 0.25s
type: STATIC
lb_policy: ROUND_ROBIN
hosts: [{ socket_address: { address: 127.0.0.2, port_value: 1234 }}]
複製代碼
admin:
access_log_path: /tmp/admin_access.log
address:
socket_address: { address: 127.0.0.1, port_value: 9901 }
dynamic_resources:
lds_config:
api_config_source:
api_type: GRPC
cluster_names: [xds_cluster]
cds_config:
api_config_source:
api_type: GRPC
cluster_names: [xds_cluster]
static_resources:
clusters:
- name: xds_cluster
connect_timeout: 0.25s
type: STATIC
lb_policy: ROUND_ROBIN
http2_protocol_options: {}
hosts: [{ socket_address: { address: 127.0.0.3, port_value: 5678 }}]
LDS服務的響應格式以下:
version_info: "0"
resources:
- "@type": type.googleapis.com/envoy.api.v2.Listener
name: listener_0
address:
socket_address:
address: 127.0.0.1
port_value: 10000
filter_chains:
- filters:
- name: envoy.http_connection_manager
config:
stat_prefix: ingress_http
codec_type: AUTO
rds:
route_config_name: local_route
config_source:
api_config_source:
api_type: GRPC
cluster_names: [xds_cluster]
http_filters:
- name: envoy.router
RDS 服務的響應格式以下:
version_info: "0"
resources:
- "@type": type.googleapis.com/envoy.api.v2.RouteConfiguration
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match: { prefix: "/" }
route: { cluster: some_service }
CDS 服務的響應以下:
version_info: "0"
resources:
- "@type": type.googleapis.com/envoy.api.v2.Cluster
name: some_service
connect_timeout: 0.25s
lb_policy: ROUND_ROBIN
type: EDS
eds_cluster_config:
eds_config:
api_config_source:
api_type: GRPC
cluster_names: [xds_cluster]
EDS 服務的響應以下:
version_info: "0"
resources:
- "@type": type.googleapis.com/envoy.api.v2.ClusterLoadAssignment
cluster_name: some_service
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 127.0.0.2
port_value: 1234
https://www.jianshu.com/p/73b8ba769274 Envoy 學習筆記之建立 EDS 動態配置
https://www.jianshu.com/p/90f9ee98ce70 Envoy 實踐
https://www.jianshu.com/p/ac9b99b37cd1
複製代碼
專一於大數據及容器雲核心技術解密,若有任何學術交流,可隨時聯繫。更多內容請關注《數據雲技術社區》公衆號,或請轉發郵件至1120746959@qq.com。app