全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Konfigurasikan egress gateway untuk mengarahkan semua trafik keluar di ASM

更新时间:Jun 28, 2025

Ketika aplikasi dalam instance ASM perlu berkomunikasi dengan layanan eksternal, Anda dapat menggunakan egress gateway untuk mengelola secara terpusat semua trafik keluar. Setelah mengonfigurasi egress gateway, Anda dapat menerapkan kontrol keamanan dan pengarahan trafik guna meningkatkan keamanan serta observabilitas aplikasi dalam instance ASM.

Penting

Sebelum membaca topik ini, pastikan Anda memahami konten dalam Gunakan ASMEgressTrafficPolicy untuk Mengelola Trafik Keluar. Topik ini menggunakan sumber daya ASM untuk mengalihkan permintaan secara transparan guna mengakses layanan eksternal melalui egress gateway, di mana kebijakan keamanan diterapkan sebelum dikirimkan ke layanan eksternal. Konfigurasi ini relatif kompleks. Jika konten dalam Gunakan ASMEgressTrafficPolicy untuk Mengelola Trafik Keluar tidak memenuhi kebutuhan Anda, lihat topik ini.

Prasyarat

Proses konfigurasi

Proses konfigurasi

Langkah 1: Terapkan aplikasi sampel

  1. Terapkan aplikasi sleep.

    1. Gunakan konten berikut untuk membuat sleep.yaml:

      Perluas untuk Melihat sleep.yaml

      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: sleep
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: sleep
        labels:
          app: sleep
          service: sleep
      spec:
        ports:
        - port: 80
          name: http
        selector:
          app: sleep
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: sleep
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: sleep
        template:
          metadata:
            labels:
              app: sleep
          spec:
            terminationGracePeriodSeconds: 0
            serviceAccountName: sleep
            containers:
            - name: sleep
              image: curlimages/curl
              command: ["/bin/sleep", "infinity"]
              imagePullPolicy: IfNotPresent
              volumeMounts:
              - mountPath: /etc/sleep/tls
                name: secret-volume
            volumes:
            - name: secret-volume
              secret:
                secretName: sleep-secret
                optional: true
      ---
    2. Di lingkungan KubeConfig cluster ACK, jalankan perintah berikut untuk menerapkan aplikasi sleep:

      Untuk informasi lebih lanjut tentang cara menggunakan kubectl untuk mengelola cluster, lihat Dapatkan File kubeconfig Cluster dan Gunakan kubectl untuk Terhubung ke Cluster.

      kubectl apply -f sleep.yaml
  2. Jalankan perintah berikut untuk mengakses layanan eksternal dari pod tempat aplikasi sleep berada:

    Anda dapat menjalankan perintah kubectl get pod -n default untuk melihat nama pod aplikasi sleep.

    kubectl exec -it ${sleep pod name} -- /bin/sh
    curl aliyun.com -I

    Berikut adalah contoh output:

    HTTP/1.1 301 Moved Permanently
    server: envoy
    date: Thu, 14 Dec 2023 03:05:41 GMT
    content-type: text/html
    content-length: 239
    location: https://aliyun.com/
    eagleeye-traceid: 0b57ff8717025231418255220e****
    timing-allow-origin: *
    x-envoy-upstream-service-time: 69

    Jika 301 dikembalikan, itu menunjukkan bahwa aplikasi dalam instance ASM dapat mengakses layanan eksternal. Dalam hal ini, permintaan akses HTTP dilakukan secara default. Server web mengembalikan respons 301 untuk mengarahkan ulang permintaan.

    Catatan

    Secara default, ASM menggunakan kebijakan ALLOW_ANY untuk mengizinkan aplikasi dalam instance ASM mengakses semua layanan eksternal. Dalam hal ini, Anda tidak dapat menerapkan kontrol izin atau menggunakan kemampuan observabilitas yang disediakan oleh ASM. Kami merekomendasikan Anda mengubah kebijakan menjadi REGISTRY_ONLY untuk mengizinkan aplikasi dalam instance ASM mengakses hanya layanan eksternal tertentu, dan menggunakan egress gateway untuk mengarahkan semua trafik keluar.

(Opsional) Langkah 2: Atur kebijakan untuk mengakses layanan eksternal ke REGISTRY_ONLY

Secara default, ASM menggunakan kebijakan ALLOW_ANY untuk mengakses layanan eksternal. Kami merekomendasikan Anda mengubah kebijakan menjadi REGISTRY_ONLY. Setelah mengubah kebijakan menjadi REGISTRY_ONLY, proxy sidecar akan menolak akses ke host eksternal yang tidak memiliki entri layanan yang didefinisikan dalam instance ASM. Ini menjamin keamanan aplikasi dalam instance ASM.

Catatan
  • Jika Anda telah mengaktifkan REGISTRY_ONLY tetapi belum membuat entri layanan, akses ke layanan eksternal akan ditolak.

  • Jika Anda belum mengaktifkan REGISTRY_ONLY dan belum membuat entri layanan, Anda dapat mengakses layanan, tetapi egress gateway yang dikonfigurasi tidak akan berlaku.

  1. Masuk ke Konsol ASM. Di panel navigasi kiri, pilih Service Mesh > Mesh Management.

  2. Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi kiri, pilih Data Plane Component Management > Sidecar Proxy Setting.

  3. Di halaman Sidecar Proxy Setting, klik tab global, klik Outbound Traffic Policy, atur External Access Policy ke REGISTRY_ONLY, lalu klik Update Settings.

  4. Jalankan perintah berikut untuk mengakses layanan eksternal dari pod tempat aplikasi sleep berada:

    kubectl exec -it ${sleep pod name} -- /bin/sh
    curl aliyun.com -I

    Berikut adalah contoh output:

    HTTP/1.1 502 Bad Gateway
    date: Thu, 14 Dec 2023 03:08:46 GMT
    server: envoy
    transfer-encoding: chunked

    Kode kesalahan 502 dikembalikan, menunjukkan bahwa aplikasi dalam instance ASM tidak dapat mengakses layanan eksternal yang tidak didefinisikan dalam registri layanan instance ASM.

Langkah 3: Buat entri layanan untuk mendefinisikan layanan eksternal

Anda perlu membuat entri layanan untuk mendefinisikan layanan eksternal sehingga aplikasi dalam instance ASM dapat mengakses layanan eksternal menggunakan egress gateway.

  1. Masuk ke Konsol ASM. Di panel navigasi kiri, pilih Service Mesh > Mesh Management.

  2. Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi kiri, pilih Cluster & Workload Management > External Service(ServiceEntry). Di halaman yang muncul, klik Create from YAML.

  3. Di halaman Create, pilih namespace tempat aplikasi sleep berada, pilih Access mesh external services untuk Template, konfigurasikan contoh YAML, lalu klik Create. File YAML berikut memberikan contoh.

    apiVersion: networking.istio.io/v1beta1
    kind: ServiceEntry
    metadata:
      name: external-svc-http
    spec:
      hosts:
      - aliyun.com
      location: MESH_EXTERNAL
      ports:
      - number: 80
        name: http
        protocol: HTTP
      resolution: DNS
  4. Jalankan perintah berikut untuk mengakses layanan eksternal dari pod tempat aplikasi sleep berada:

    kubectl exec -it ${sleep pod name} -- /bin/sh
    curl aliyun.com -I

    Jika 301 dikembalikan, itu menunjukkan bahwa aplikasi dalam instance ASM dapat mengakses layanan eksternal. Nama domain aliyun.com didefinisikan dalam registri layanan instance ASM, sehingga aplikasi dalam instance ASM dapat mengakses layanan eksternal ini. Dalam hal ini, pod tempat aplikasi sleep berada langsung mengirim permintaan akses ke layanan eksternal dan permintaan tersebut tidak melewati egress gateway.

Langkah 4: Gunakan egress gateway untuk mengarahkan semua permintaan untuk mengakses layanan eksternal

Anda telah mendefinisikan nama domain aliyun.com dalam entri layanan instance ASM. Oleh karena itu, Anda dapat mengonfigurasi layanan virtual dan Istio gateway untuk mengelola trafik ke aliyun.com.

  1. Buat egress gateway dan konfigurasikan untuk mengizinkan trafik HTTP pada port 80. Untuk informasi lebih lanjut, lihat Buat Egress Gateway.

  2. Buat Istio gateway dan konfigurasikan parameter terkait sesuai instruksi pada gambar berikut. Untuk informasi lebih lanjut, lihat Kelola Istio Gateways.

    Buat aturan gateway

  3. Gunakan kode YAML berikut untuk membuat layanan virtual. Untuk informasi lebih lanjut, lihat Kelola Layanan Virtual.

    Perluas untuk Melihat File YAML Layanan Virtual

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: egressgateway-vs
    spec:
      hosts:
      - aliyun.com
      gateways:
      - egress-gw  # Nama Istio gateway yang Anda buat.
      - mesh
      http:
      - match:
        - gateways:
          - mesh
          port: 80
        route:
        - destination:
            host: istio-egressgateway.istio-system.svc.cluster.local
            port:
              number: 80
          weight: 100
      - match:
        - gateways:
          - egress-gw
          port: 80
        route:
        - destination:
            host: aliyun.com
            port:
              number: 80
          weight: 100
  4. Akses layanan eksternal untuk memverifikasi konfigurasi.

    1. Jalankan perintah berikut untuk mengakses layanan eksternal dari pod tempat aplikasi sleep berada:

      kubectl exec -it ${sleep pod name} -- /bin/sh
      curl aliyun.com -I

      Jika 301 dikembalikan, itu menunjukkan bahwa aplikasi dalam instance ASM dapat mengakses layanan eksternal. Dalam hal ini, aplikasi dalam instance ASM tidak langsung mengakses layanan eksternal dari pod tempat aplikasi berada. Sebagai gantinya, aplikasi mengakses layanan eksternal melalui egress gateway.

    2. Jalankan perintah berikut untuk melihat log akses di pod gateway:

      Catatan
      • Jika pod gateway egress Anda memiliki beberapa replika, log akses dihasilkan di salah satunya. Anda harus menjalankan perintah ini pada replika pod satu per satu untuk menemukan log akses.

      • Jika Anda telah mengaktifkan fitur log akses untuk egress gateway, Anda dapat masuk ke Konsol Simple Log Service untuk melihat catatan akses.

      kubectl -n istio-system logs ${egress gateway pod name}  -c istio-proxy | grep aliyun.com | tail -n 1

      Berikut adalah contoh output:

      {"trace_id":null,"upstream_host":"106.11.XXX.XX:80","downstream_remote_address":"10.34.0.140:47942","requested_server_name":null,"response_code":301,"upstream_service_time":"24","user_agent":"curl/7.86.0-DEV","path":"/","route_name":null,"bytes_sent":0,"response_flags":"-","upstream_local_address":"10.34.0.141:60388","duration":24,"upstream_cluster":"outbound|80||aliyun.com","upstream_transport_failure_reason":null,"authority":"aliyun.com","request_id":"55789d59-9b81-4e39-b64a-66baf44e****","protocol":"HTTP/1.1","bytes_received":0,"method":"HEAD","downstream_local_address":"10.34.0.141:80","start_time":"2022-11-30T08:03:01.315Z","istio_policy_status":null,"x_forwarded_for":"10.34.0.140"}

      downstream_remote_address menunjukkan alamat IP pod tempat aplikasi sleep berada.

      Setelah menyelesaikan konfigurasi, permintaan akses ke layanan eksternal yang ditentukan melewati egress gateway. Anda dapat menggunakan kemampuan observabilitas dan keamanan yang disediakan oleh ASM untuk mengelola trafik keluar di egress gateway secara efisien.

Referensi