تخطَّ إلى المحتوى

دليل Envoy Proxy المختصر

منصةأمر
Ubuntu/Debian`curl -sL ‘https://deb.dl.getenvoy.io/public/gpg.8115BA8E629CC074.key’ \
macOSbrew install envoy
Dockerdocker pull envoyproxy/envoy:v1.28-latest
Binary (Linux)curl -L https://github.com/envoyproxy/envoy/releases/download/v1.28.0/envoy-1.28.0-linux-x86_64 -o envoy && chmod +x envoy && sudo mv envoy /usr/local/bin/
RHEL/CentOS`curl -sL ‘https://rpm.dl.getenvoy.io/public/gpg.CF716AF503183491.key’ \
Kubernetes (Helm)helm repo add bitnami https://charts.bitnami.com/bitnami && helm install my-envoy bitnami/envoy
Verify Installationenvoy --version

دليل Envoy Proxy المختصر

التثبيت

أمروصف
envoy -c envoy.yamlابدأ Envoy باستخدام ملف التكوين المحدد
envoy --versionعرض معلومات إصدار Envoy
envoy --helpاعرض جميع خيارات سطر الأوامر المتاحة
envoy --mode validate -c envoy.yamlتحقق من ملف التكوين دون بدء التشغيل
envoy -c envoy.yaml --log-level infoابدأ بمستوى سجل محدد (trace, debug, info, warn, error, critical)
envoy -c envoy.yaml --component-log-level upstream:debugتعيين مستوى السجل للمكون المحدد
envoy -c envoy.yaml --service-cluster my-clusterابدأ بمعرّف عنقود الخدمة
envoy -c envoy.yaml --service-node node-1ابدأ بمعرّف عقدة الخدمة
envoy -c envoy.yaml --base-id 0تعيين معرف أساسي لوظيفة إعادة التشغيل السريع
envoy -c envoy.yaml --restart-epoch 1قم بإعادة التشغيل الساخن مع رقم الحقبة
envoy -c envoy.yaml --drain-time-s 60حدد وقت التصريف للإغلاق السلس (ثواني)
envoy -c envoy.yaml --parent-shutdown-time-s 90ضبط وقت إيقاف تشغيل الأصل أثناء إعادة التشغيل الساخن
envoy -c envoy.yaml --concurrency 4تعيين عدد مؤشرات العمال
envoy -c envoy.yaml --disable-hot-restartتعطيل وظيفة إعادة التشغيل السريع
envoy --help-hiddenعرض خيارات سطر الأوامر المخفية/المتقدمة

الأوامر الأساسية

أمروصف
curl http://localhost:9901/server_infoاحصل على معلومات الخادم والحالة الحالية
curl http://localhost:9901/statsاسترجاع جميع الإحصائيات بتنسيق النص العادي
curl http://localhost:9901/stats/prometheusإحصائيات التصدير بتنسيق Prometheus
curl http://localhost:9901/stats?format=jsonاحصل على إحصائيات بتنسيق JSON
curl http://localhost:9901/stats?filter=cluster.outboundتصفية الإحصائيات حسب البادئة
curl http://localhost:9901/stats?usedonlyاعرض الإحصائيات ذات القيم غير الصفرية فقط
curl http://localhost:9901/config_dumpتفريغ التكوين الحالي الكامل
curl http://localhost:9901/config_dump?resource=bootstrapقم بإلقاء تكوين bootstrap فقط
curl http://localhost:9901/config_dump?resource=dynamic_listenersقم بإلقاء تكوين المستمع الديناميكي
curl http://localhost:9901/config_dump?resource=dynamic_clustersقم بإلقاء تكوين العنقود الديناميكي
curl http://localhost:9901/clustersاحصل على معلومات مفصلة عن العنقود وحالة الصحة
curl http://localhost:9901/listenersاحصل على معلومات مفصلة عن المستمع
curl http://localhost:9901/readyتحقق مما إذا كان Envoy جاهزًا لخدمة حركة المرور
curl -X POST http://localhost:9901/healthcheck/failعلّم الخادم كفاشل للفحوصات الصحية
curl -X POST http://localhost:9901/healthcheck/okعلّم الخادم كصحي للفحوصات الصحية
curl -X POST http://localhost:9901/reset_countersإعادة تعيين جميع عدادات الإحصائيات إلى الصفر
curl -X POST http://localhost:9901/drain_listenersاستمعي للإشارات لإيقاف تشغيل أنيق
curl -X POST http://localhost:9901/logging?level=debugتغيير المستوى العام للسجل أثناء التشغيل
curl -X POST http://localhost:9901/logging?upstream=debugتغيير مستوى التسجيل الخاص بالمكون
curl -X POST http://localhost:9901/runtime_modify?key=valueتعديل قيم التكوين في وقت التشغيل

أوامر واجهة المسؤول

أمروصف
`curl http://localhost:9901/stats \grep circuit_breakers`
`curl http://localhost:9901/stats \grep outlier_detection`
`curl http://localhost:9901/stats \grep ratelimit`
`curl http://localhost:9901/stats \grep upstream_rq_retry`
`curl http://localhost:9901/stats \grep ssl`
`curl http://localhost:9901/stats \grep http.ingress.downstream_rq`
`curl http://localhost:9901/clusters \grep health_flags`
`curl http://localhost:9901/config_dump \jq ‘.configs[].bootstrap.tracing’`
`curl http://localhost:9901/config_dump \jq ‘.configs[].dynamic_active_clusters’`
`curl http://localhost:9901/stats?format=json \jq ‘.stats[] \
`curl http://localhost:9901/listeners \grep -A 5 “address”`
`curl http://localhost:9901/stats/prometheus \grep envoy_cluster_upstream_rq_total`
docker run -d -v $(pwd)/envoy.yaml:/etc/envoy/envoy.yaml -p 9901:9901 -p 10000:10000 envoyproxy/envoy:v1.28-latestقم بتشغيل Envoy في Docker مع تكوين مثبت
kubectl create configmap envoy-config --from-file=envoy.yamlأنشئ ConfigMap الخاص بـ Kubernetes لتكوين Envoy
kubectl logs -f deployment/envoyتتبع سجلات Envoy في Kubernetes
envoy -c envoy.yaml --log-format '[%Y-%m-%d %T.%e][%t][%l] %v'ابدأ بتنسيق سجل مخصص
curl http://localhost:9901/certsعرض معلومات شهادات TLS المحملة
curl http://localhost:9901/memoryعرض إحصائيات تخصيص الذاكرة
curl http://localhost:9901/contentionعرض إحصائيات التنافس على mutex (إذا كان مُمكّنًا)
curl -X POST http://localhost:9901/cpuprofiler?enable=yتمكين التحليل الشخصي للمعالج (إذا تم تجميعه مع التحليل الشخصي)

الاستخدام المتقدم

# envoy.yaml - Minimal configuration
static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address:
        address: 0.0.0.0
        port_value: 10000
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains: ["*"]
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: service_backend
          http_filters:
          - name: envoy.filters.http.router
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router

  clusters:
  - name: service_backend
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: service_backend
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: backend-service
                port_value: 8080

admin:
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 9901

التكوين

هيكل التكوين الأساسي

# envoy-dynamic.yaml - Control plane configuration
node:
  cluster: my-cluster
  id: node-1

dynamic_resources:
  lds_config:
    resource_api_version: V3
    api_config_source:
      api_type: GRPC
      transport_api_version: V3
      grpc_services:
      - envoy_grpc:
          cluster_name: xds_cluster
  cds_config:
    resource_api_version: V3
    api_config_source:
      api_type: GRPC
      transport_api_version: V3
      grpc_services:
      - envoy_grpc:
          cluster_name: xds_cluster

static_resources:
  clusters:
  - name: xds_cluster
    connect_timeout: 1s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    http2_protocol_options: {}
    load_assignment:
      cluster_name: xds_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: control-plane
                port_value: 18000

admin:
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 9901

التكوين الديناميكي (xDS)

# Circuit breaker and outlier detection
clusters:
- name: backend_service
  connect_timeout: 0.25s
  type: STRICT_DNS
  lb_policy: ROUND_ROBIN
  circuit_breakers:
    thresholds:
    - priority: DEFAULT
      max_connections: 1024
      max_pending_requests: 1024
      max_requests: 1024
      max_retries: 3
  outlier_detection:
    consecutive_5xx: 5
    interval: 30s
    base_ejection_time: 30s
    max_ejection_percent: 50
    enforcing_consecutive_5xx: 100
  load_assignment:
    cluster_name: backend_service
    endpoints:
    - lb_endpoints:
      - endpoint:
          address:
            socket_address:
              address: backend
              port_value: 8080
          health_check_config:
            port_value: 8081

تكوين الميزات المتقدمة

# TLS termination
listeners:
- name: https_listener
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 443
  filter_chains:
  - filters:
    - name: envoy.filters.network.http_connection_manager
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
        stat_prefix: ingress_https
        route_config:
          name: local_route
          virtual_hosts:
          - name: backend
            domains: ["*"]
            routes:
            - match:
                prefix: "/"
              route:
                cluster: backend_service
        http_filters:
        - name: envoy.filters.http.router
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context:
          tls_certificates:
          - certificate_chain:
              filename: /etc/ssl/certs/server.crt
            private_key:
              filename: /etc/ssl/private/server.key

تكوين TLS

# Create configuration file
cat > envoy.yaml << EOF
static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address:
        address: 0.0.0.0
        port_value: 8080
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains: ["*"]
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: backend_cluster
          http_filters:
          - name: envoy.filters.http.router
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
  clusters:
  - name: backend_cluster
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: backend_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: localhost
                port_value: 3000
admin:
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 9901
EOF

# Start Envoy
envoy -c envoy.yaml

# Test the proxy
curl http://localhost:8080

# Monitor statistics
curl http://localhost:9901/stats | grep http

الحالات الاستخدامية الشائعة

حالة الاستخدام: وكيل HTTP الأساسي

إعداد Envoy كوكيل HTTP بسيط لتوجيه حركة المرور إلى الخدمات الخلفية.

# Create load balancing configuration
cat > envoy-lb.yaml << EOF
static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address:
        address: 0.0.0.0
        port_value: 8080
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains: ["*"]
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: backend_cluster
          http_filters:
          - name: envoy.filters.http.router
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
  clusters:
  - name: backend_cluster
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    health_checks:
    - timeout: 1s
      interval: 10s
      unhealthy_threshold: 2
      healthy_threshold: 2
      http_health_check:
        path: /health
    load_assignment:
      cluster_name: backend_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: backend1.example.com
                port_value: 8080
        - endpoint:
            address:
              socket_address:
                address: backend2.example.com
                port_value: 8080
        - endpoint:
            address:
              socket_address:
                address: backend3.example.com
                port_value: 8080
admin:
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 9901
EOF

# Start Envoy with load balancing
envoy -c envoy-lb.yaml

# Check cluster health status
curl http://localhost:9901/clusters

# Monitor load distribution
watch -n 1 'curl -s http://localhost:9901/stats | grep backend_cluster.upstream_rq_total'

حالة الاستخدام: توزيع الحمل على عدة مخدمات خلفية

تكوين Envoy لتوزيع الحمل عبر عدة نسخ من المخدمات الخلفية مع فحص الصحة.

# Generate self-signed certificates for testing
openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days 365 -nodes -subj "/CN=localhost"

# Create TLS configuration
cat > envoy-tls.yaml << EOF
static_resources:
  listeners:
  - name: https_listener
    address:
      socket_address:
        address: 0.0.0.0
        port_value: 443
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_https
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains: ["*"]
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: secure_backend
          http_filters:
          - name: envoy.filters.http.router
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
      transport_socket:
        name: envoy.transport_sockets.tls
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
          common_tls_context:
            tls_certificates:
            - certificate_chain:
                filename: server.crt
              private_key:
                filename: server.key
  clusters:
  - name: secure_backend
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext
    load_assignment:
      cluster_name: secure_backend
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: backend.example.com
                port_value: 443
admin:
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 9901
EOF

# Start Envoy with TLS
envoy -c envoy-tls.yaml

# Test TLS connection
curl -k https://localhost

# Check TLS statistics
curl http://localhost:9901/stats | grep ssl

حالة الاستخدام: إنهاء TLS وإعادة التشفير

تكوين Envoy لإنهاء TLS من العملاء وإعادة التشفير إلى المخدمات الخلفية.

# Create resilience configuration
cat > envoy-resilience.yaml << EOF
static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address:
        address: 0.0.0.0
        port_value: 8080
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains: ["*"]
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: protected_backend
                  retry_policy:
                    retry_on: "5xx"
                    num_retries: 3
                    per_try_timeout: 1s
          http_filters:
          - name: envoy.filters.http.router
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
  clusters:
  - name: protected_backend
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    circuit_breakers:
      thresholds:
      - priority: DEFAULT
        max_connections: 100
        max_pending_requests: 100
        max_requests: 100
        max_retries: 3
    outlier_detection:
      consecutive_5xx: 5
      interval: 10s
      base_ejection_time: 30s
      max_ejection_percent: 50
    load_assignment:
      cluster_name: protected_backend
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: backend.example.com
                port_value: 8080
admin:
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 9901
EOF

# Start Envoy with resilience features
envoy -c envoy-resilience.yaml

# Monitor circuit breaker status
curl http://localhost:9901/stats | grep circuit_breakers

# Check outlier detection events
curl http://localhost:9901/stats | grep outlier_detection

# View retry statistics
curl http://localhost:9901/stats | grep retry

حالة الاستخدام: تحديد المعدل وقطع الدائرة

تنفيذ تحديد المعدل وقطع الدائرة للتواصل المرن بين الخدمات.

حالة الاستخدام: قابلية المراقبة مع التتبع الموزع

تكوين Envoy مع التتبع الموزع لقابلية مراقبة الخدمات الدقيقة.

# إنشاء تكوين التتبع
cat > envoy-tracing.yaml << EOF
static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address:
        address: 0.0.0.0
        port_value: 8080
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix