全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Gunakan kebijakan trafik egress untuk mengelola trafik egress

更新时间:Jun 28, 2025

Instans ASM versi 1.16.4 dan yang lebih baru memungkinkan Anda menggunakan bidang CustomResourceDefinition (CRD) untuk mendefinisikan kebijakan trafik egress. Topik ini menjelaskan cara menggunakan kebijakan trafik egress untuk mengelola trafik egress.

Latar Belakang

Prinsip

ASM mendukung pengelolaan trafik egress dengan membuat beberapa sumber daya seperti ServiceEntry, VirtualService, Gateway, dan Destination, serta memastikan bahwa sumber daya tersebut saling terhubung. Setelah konfigurasi selesai, hal ini mencapai pengalihan trafik transparan ke gateway egress, yang kemudian meneruskannya ke layanan eksternal.

Konfigurasi ini kompleks dan memerlukan pemahaman mendalam tentang bidang-bidang terkait, sehingga rentan terhadap kesalahan. Untuk menurunkan ambang batas konfigurasi trafik egress, ASM memperkenalkan sumber daya ASMEgressTrafficPolicy.

ASMEgressTrafficPolicy mengabstraksi dan menyederhanakan konfigurasi trafik egress. Alih-alih secara manual mengonfigurasi sumber daya seperti ServiceEntry, VirtualService, Gateway, dan Destination, Anda hanya perlu menambahkan beberapa konfigurasi yang diperlukan untuk mencapai pengalihan trafik transparan ke gateway egress dan mengirimkannya ke layanan eksternal melalui protokol HTTP/HTTPS.

Karena ASMEgressTrafficPolicy menyederhanakan sumber daya asli ASM, mungkin tidak dapat memenuhi beberapa kebutuhan lanjutan Anda (seperti rute proporsional trafik egress, memulai mTLS dari gateway egress, dan lainnya). Jika Anda memerlukan fitur lanjutan, seperti menambahkan konfigurasi kustom, lihat Konfigurasikan Gateway Egress untuk Merutekan Semua Trafik Keluar di ASM.

Fitur

ASM menyediakan cara yang seragam untuk menghubungkan, mengelola, dan melindungi komunikasi antar aplikasi. Tidak seperti metode berbasis IP, ASM menggunakan pendekatan berbasis aplikasi tanpa memerlukan modifikasi pada kode aplikasi yang ada. ASMEgressTrafficPolicy mendefinisikan cara mengelola dan mengakses trafik eksternal melalui gateway egress. Dengan menggabungkan gateway egress ASM dan AuthorizationPolicy, Anda dapat mengontrol trafik egress secara lebih fleksibel. Dingtalk_20230411112608

Jalur trafik dalam contoh ini dapat dikategorikan menjadi dua jenis:

1. Komunikasi antara proxy sidecar dan antara proxy sidecar dan gateway: Secara default, mutual Transport Layer Security (mTLS) diaktifkan untuk komunikasi tersebut, dan sertifikat dikelola oleh ASM.

2. Komunikasi antara aplikasi dan proxy sidecar dan antara gateway dan layanan eksternal:

a. Untuk memastikan bahwa kemampuan tingkat lanjut Lapisan 7 ASM dapat berfungsi dengan baik, aplikasi dan proxy sidecar berkomunikasi dalam teks biasa sebanyak mungkin. Dengan cara ini, proxy sidecar dapat memperoleh informasi Lapisan 7 dari trafik dan mendukung fitur-fitur tingkat lanjut. Karena alasan khusus tertentu, jika aplikasi harus mengirim Permintaan HTTPS secara langsung, hanya kemampuan Lapisan 4 ASM yang dapat digunakan.

b. Anda dapat mengonfigurasi protokol komunikasi antara gateway egress dan layanan eksternal, baik teks biasa maupun HTTPS.

Prasyarat

  • Sebuah instans ASM edisi komersial (Enterprise Edition atau Ultimate Edition) telah dibuat. Versi instans tersebut adalah 1.16.4 atau yang lebih baru. Untuk informasi lebih lanjut, lihat Buat Instans ASM. Untuk informasi tentang peningkatan instans, lihat Tingkatkan Instans ASM.

  • Injeksi sidecar otomatis diaktifkan untuk namespace default. Untuk informasi lebih lanjut, lihat Aktifkan Injeksi Proxy Sidecar Otomatis.

Persiapan

Tetapkan kebijakan trafik egress untuk instans ASM

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

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

  3. Di tab global, klik Outbound Traffic Policy, klik REGISTRY_ONLY di sebelah kanan External Access Policy, dan klik Update Settings.

Buat namespace

  1. Buat namespace istio-egress. Untuk informasi lebih lanjut, lihat Kelola Namespace Global.

  2. Di halaman Global namespace, klik Sync Automatic Sidecar Injection to Kubernetes Cluster untuk menyinkronkan namespace ke kluster ACK yang dikelola oleh instans ASM.

Buat gateway egress

Buat gateway egress bernama egressgateway-a di ASM, atur Port Mapping ke HTTP 80, HTTPS 443, dan HTTPS 444, dan aktifkan Support two-way TLS authentication. Untuk informasi lebih lanjut, lihat Buat Gateway Egress.

Pastikan bahwa bidang spec dalam file YAML yang dihasilkan berisi konten berikut. Jika tidak, tambahkan konten tersebut:

spec:
  podLabels:
    security.istio.io/tlsMode: istio

Buat layanan

  1. Buat namespace bernama mytest untuk instans ASM dan aktifkan injeksi proxy sidecar otomatis. Untuk informasi lebih lanjut, lihat Kelola Namespace Global.

  2. Di kluster ACK, deploy layanan sleep-a di namespace mytest dan deploy layanan NGINX di namespace default.

    1. Buat file bernama test.yaml dan salin konten berikut ke file tersebut:

      Perluas untuk Melihat File YAML

      apiVersion: v1
      kind: Service
      metadata:
        name: sleep-a
        namespace: mytest
        labels:
          app: sleep-a
          service: sleep-a
      spec:
        ports:
        - port: 80
          name: http
        selector:
          app: sleep-a
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: sleep-a
        namespace: mytest
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: sleep-a
        template:
          metadata:
            labels:
              app: sleep-a
          spec:
            terminationGracePeriodSeconds: 0
            containers:
            - name: sleep
              image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/curl:asm-sleep
              command: ["/bin/sleep", "infinity"]
              imagePullPolicy: IfNotPresent
              volumeMounts:
              - mountPath: /etc/sleep/tls
                name: secret-volume
            volumes:
            - name: secret-volume
              secret:
                secretName: sleep-secret
                optional: true
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        labels:
          app: nginx
        name: nginx
        namespace: default
      spec:
        progressDeadlineSeconds: 600
        replicas: 1
        revisionHistoryLimit: 10
        selector:
          matchLabels:
            app: nginx
        strategy:
          rollingUpdate:
            maxSurge: 25%
            maxUnavailable: 25%
          type: RollingUpdate
        template:
          metadata:
            creationTimestamp: null
            labels:
              app: nginx
          spec:
            containers:
            - image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/nginx:1.27.0
              imagePullPolicy: Always
              name: nginx
              resources: {}
              terminationMessagePath: /dev/termination-log
              terminationMessagePolicy: File
            dnsPolicy: ClusterFirst
            restartPolicy: Always
            schedulerName: default-scheduler
            securityContext: {}
            terminationGracePeriodSeconds: 30
    2. Di kluster ACK, jalankan perintah berikut untuk menerapkan layanan sleep-a dan NGINX:

      kubectl apply -f test.yaml
  3. Jalankan perintah berikut untuk mengakses http://www.httpbin.org melalui layanan sleep-a dan NGINX:

    kubectl -n mytest exec deployment/sleep-a -- curl -s -o /dev/null -w "%{http_code}\n" http://www.httpbin.org
    kubectl -n default exec deployment/nginx -- curl -s -o /dev/null -w "%{http_code}\n" http://www.httpbin.org

    Output mengembalikan 502, menunjukkan kegagalan akses.

Gunakan layanan sleep-a untuk mengakses layanan eksternal melalui HTTP

Solusi 1: Gunakan teks biasa HTTP untuk komunikasi antara proxy sidecar dan gateway egress

Solusi ini tidak masuk akal dalam lingkungan nyata. Komunikasi antara kontainer sidecar dan gateway egress melalui teks biasa HTTP dapat menyebabkan otentikasi klien tidak tersedia. Saat ini, ASMEgressTrafficPolicy tidak mendukung penggunaan teks biasa HTTP untuk mengakses gateway egress.

  • Pengelolaan trafik dilakukan di proxy sidecar di sisi klien dan tidak memerlukan gateway egress.

  • Keterlihatan tidak bergantung pada gateway egress.

  • Kemampuan keamanan bergantung pada gateway egress. Namun, tanpa mTLS, semua kemampuan otorisasi berdasarkan identitas klien tidak tersedia. Dalam kasus ini, gateway egress hanya dapat menolak semua permintaan secara tidak pandang bulu.

(Direkomendasikan) Solusi 2: Gunakan mTLS untuk komunikasi antara proxy sidecar dan gateway egress

  1. Buat kebijakan trafik egress.

    Konfigurasikan melalui konsol

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

    2. Di halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih ASM Gateways > Egress Gateway.

    3. Klik nama gateway untuk masuk ke halaman Gateway overview. Klik Outbound Traffic Policy di sebelah kiri. Konfigurasikan parameter seperti yang ditunjukkan pada gambar berikut.

      image

    Konfigurasikan melalui kubectl

    1. Buat file egress-by-egressgateway.yaml yang berisi konten berikut:

      Untuk informasi lebih lanjut tentang bidang-bidang, lihat Deskripsi CRD ASMEgressTrafficPolicy.

      apiVersion: istio.alibabacloud.com/v1
      kind: ASMEgressTrafficPolicy
      metadata:
        name: egress-by-egressgateway  # Format nilai ini adalah egress-by-{Nama gateway egress}. Nilai ini sesuai dengan nama gateway egress.
        namespace: istio-egress         # Nilai ini tetap istio-egress.
      spec:
        byEgressGateway:
          name: egressgateway
        egressRules:
        - from:
          - namespace: mytest
            workloadSelector:
              app: sleep-a
          to:
          - name: httpbin-service-http
            hosts:
            - www.httpbin.org  # Alamat IP dari beberapa nama domain setelah resolusi DNS harus sama.
            - httpbin.org      # Alamat IP dari beberapa nama domain setelah resolusi DNS harus sama.
            port:
              name: http
              number: 80
              protocol: HTTP
            byEgressGateway:
              port: 80        # Sidecar → 80 Gateway → 80 Layanan (httpbin.org)
    2. Di kluster ACK, jalankan perintah berikut untuk membuat sumber daya ASMEgressTrafficPolicy:

      kubectl apply -f egress-by-egressgateway.yaml
  2. Verifikasi apakah konfigurasi ASMEgressTrafficPolicy berlaku.

    1. Jalankan perintah berikut untuk mengakses http://www.httpbin.org melalui layanan NGINX di namespace default.

      kubectl -n default exec deployment/nginx -- curl -s -o /dev/null -w "%{http_code}\n" http://www.httpbin.org

      Output mengembalikan 502, menunjukkan bahwa akses ke http://www.httpbin.org melalui layanan NGINX gagal.

    2. Jalankan perintah berikut untuk mengakses http://www.httpbin.org melalui layanan sleep-a di namespace mytest:

      kubectl -n mytest exec deployment/sleep-a -- curl  -s -o /dev/null -w "%{http_code}\n"  http://www.httpbin.org

      Output mengembalikan 200 sesuai harapan.

    3. Jalankan perintah berikut untuk menghapus egress-by-egressgateway, dan akses http://www.httpbin.org lagi melalui layanan sleep-a di namespace mytest.

      kubectl -n istio-egress delete ASMEgressTrafficPolicy  egress-by-egressgateway
      kubectl -n mytest exec deployment/sleep-a -- curl -s -o /dev/null -w "%{http_code}\n" http://www.httpbin.org

      Output mengembalikan 502, menunjukkan bahwa akses ke http://www.httpbin.org melalui layanan sleep-a gagal setelah konfigurasi ASMEgressTrafficPolicy dihapus.

    Output menunjukkan bahwa kebijakan trafik egress berlaku.

Gunakan layanan sleep-a untuk mengakses layanan eksternal melalui HTTPS

(Direkomendasikan) Solusi 1: Gunakan mTLS untuk komunikasi antara proxy sidecar dan gateway egress

  1. Buat kebijakan trafik egress.

    Konfigurasikan melalui konsol

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

    2. Di halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih ASM Gateways > Egress Gateway.

    3. Klik nama gateway untuk masuk ke halaman Gateway overview dan klik Outbound Traffic Policy di sebelah kiri. Konfigurasikan parameter seperti yang ditunjukkan pada gambar berikut.

      image

    Konfigurasikan melalui kubectl

    1. Perbarui file egress-by-egressgateway.yaml dengan konten berikut:

      Bidang spec diperbarui untuk menyertakan bidang httpsUpgrade dan definisi untuk akses langsung ke https://www.httpbin.org. Untuk informasi lebih lanjut tentang bidang-bidang, lihat Deskripsi CRD ASMEgressTrafficPolicy.

      apiVersion: istio.alibabacloud.com/v1
      kind: ASMEgressTrafficPolicy
      metadata:
        name: egress-by-egressgateway  # Format nilai ini adalah egress-by-{Nama gateway egress}. Nilai ini sesuai dengan nama gateway egress.
        namespace: istio-egress          # Nilai ini tetap istio-egress.
      spec:
        byEgressGateway:
          name: egressgateway
        egressRules:
        - from:
           - namespace: mytest
             workloadSelector:
                app: sleep-a
          to:
          - name: httpbin-service-http
            hosts:
            - www.httpbin.org  # Alamat IP dari beberapa nama domain setelah resolusi DNS harus sama.
            - httpbin.org      # Alamat IP dari beberapa nama domain setelah resolusi DNS harus sama.
            port:
              name: http
              number: 80
              protocol: HTTP
            byEgressGateway:
              port: 80        # Sidecar → 80 Gateway → 80 Layanan (httpbin.org)
            httpsUpgrade:
              enabled: true   # Jika nilai ini disetel ke false, nilai parameter port di bawah httpsUpgrade tidak berlaku.
              port: 443       # Sidecar → 80 Gateway → 443 Layanan (httpbin.org)
    2. Di kluster ACK, jalankan perintah berikut untuk membuat sumber daya ASMEgressTrafficPolicy:

      kubectl apply -f egress-by-egressgateway.yaml
  2. Verifikasi apakah konfigurasi ASMEgressTrafficPolicy berlaku.

    1. Verifikasi layanan sleep-a di namespace mytest.

      1. Jalankan perintah berikut untuk mengakses http://www.httpbin.org melalui layanan sleep-a.

        kubectl -n mytest exec deployment/sleep-a -- curl -s -o /dev/null -w "%{http_code}\n" http://httpbin.org

        Output mengembalikan 200, menunjukkan akses berhasil ke http://www.httpbin.org melalui layanan sleep-a.

      2. Jalankan perintah berikut untuk meminta API anything dari httpbin.org untuk memverifikasi apakah gateway egress meningkatkan Permintaan HTTP menjadi Permintaan HTTPS:

        kubectl -n mytest exec deployment/sleep-a -- sh -c "curl -s  http://httpbin.org/anything |grep url"

        Output yang diharapkan:

        "url": "https://httpbin.org/anything"

        Anda dapat melihat bahwa informasi bidang url dimulai dengan https, menunjukkan bahwa gateway egress berhasil meningkatkan permintaan menjadi https dan kemudian meneruskannya ke httpbin.org.

      3. Jalankan perintah berikut untuk mengakses https://www.httpbin.org melalui layanan sleep-a di namespace mytest:

        kubectl -n mytest exec deployment/sleep-a -- curl  -s -o /dev/null -w "%{http_code}\n"  https://www.httpbin.org

        Output mengembalikan 200, menunjukkan akses berhasil ke https://www.httpbin.org melalui layanan sleep-a.

    2. Verifikasi layanan NGINX di namespace default.

      1. Jalankan perintah berikut untuk mengakses http://www.httpbin.org melalui layanan NGINX.

        kubectl -n default exec deployment/nginx -- curl -s -o /dev/null -w "%{http_code}\n" http://www.httpbin.org

        Output mengembalikan 502, menunjukkan bahwa akses ke http://www.httpbin.org melalui layanan NGINX gagal.

      2. Jalankan perintah berikut untuk mengakses https://www.httpbin.org melalui layanan NGINX:

        kubectl -n default exec deployment/nginx -- curl -s -o /dev/null -w "%{http_code}\n" https://www.httpbin.org

        Output menunjukkan bahwa koneksi permintaan ditolak, menunjukkan bahwa akses ke https://www.httpbin.org melalui layanan NGINX gagal.

      3. Jalankan perintah berikut untuk melihat log akses proxy sidecar dalam workload layanan NGINX dan memperoleh alasan penolakan:

         kubectl -n default  logs -f deployment/nginx -c istio-proxy   --tail=1 

        Output yang diharapkan:

        {"authority":"-","bytes_received":"0","bytes_sent":"0","downstream_local_address":"52.86.XX.XX:443","downstream_remote_address":"172.16.0.199:56748","duration":"0","istio_policy_status":"-","method":"-","path":"-","protocol":"-","request_id":"-","requested_server_name":"-","response_code":"0","response_flags":"UH","route_name":"-","start_time":"2023-04-11T02:00:07.409Z","trace_id":"-","upstream_cluster":"BlackHoleCluster","upstream_host":"-","upstream_local_address":"-","upstream_service_time":"-","upstream_transport_failure_reason":"-","user_agent":"-","x_forwarded_for":"-"}

        Output yang diharapkan menunjukkan bahwa permintaan diteruskan ke BlackHoleCluster, sehingga menyebabkan koneksi ditolak.

    3. Jalankan perintah berikut untuk menghapus egress-by-egressgateway, dan akses http://www.httpbin.org lagi melalui layanan sleep-a di namespace mytest.

      kubectl -n istio-egress delete ASMEgressTrafficPolicy  egress-by-egressgateway
      kubectl -n mytest exec deployment/sleep-a -- curl -s -o /dev/null -w "%{http_code}\n"  http://www.httpbin.org
      kubectl -n mytest exec deployment/sleep-a -- curl -s -o /dev/null -w "%{http_code}\n"  https://www.httpbin.org

      Saat mengakses http://www.httpbin.org, 502 dikembalikan. Saat mengakses https://www.httpbin.org, koneksi permintaan ditolak. Setelah konfigurasi ASMEgressTrafficPolicy dihapus, akses ke http://www.httpbin.org dan https://www.httpbin.org melalui layanan sleep-a gagal.

    Output menunjukkan bahwa kebijakan trafik egress berlaku.

Solusi 2: Gunakan HTTPS untuk komunikasi antara proxy sidecar dan gateway egress
  1. Buat kebijakan trafik egress.

    Konfigurasikan melalui antarmuka konsol

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

    2. Di halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih ASM Gateways > Egress Gateway.

    3. Klik nama gateway untuk masuk ke halaman Gateway overview dan klik Outbound Traffic Policy di sebelah kiri. Konfigurasikan parameter seperti yang ditunjukkan pada gambar berikut.

      image

    Konfigurasikan melalui kubectl

    1. Perbarui file egress-by-egressgateway.yaml dengan konten berikut:

      Bidang spec diperbarui untuk menyertakan bidang httpsUpgrade dan definisi untuk akses langsung ke https://www.httpbin.org. Untuk informasi lebih lanjut tentang bidang-bidang, lihat Deskripsi CRD ASMEgressTrafficPolicy.

      apiVersion: istio.alibabacloud.com/v1
      kind: ASMEgressTrafficPolicy
      metadata:
        name: egress-by-egressgateway  # Format nilai ini adalah egress-by-{Nama gateway egress}. Nilai ini sesuai dengan nama gateway egress.
        namespace: istio-egress          # Nilai ini tetap istio-egress.
      spec:
        byEgressGateway:
          name: egressgateway
        egressRules:
        - from:
           - namespace: mytest
             workloadSelector:
                app: sleep-a
          to:
          - name: httpbin-service-https
            hosts:
            - www.httpbin.org
            - httpbin.org
            port:
              name: https
              number: 443
              protocol: HTTPS
            byEgressGateway:
              port: 444   # Port HTTPS 444 yang didefinisikan di langkah 3 Persiapan.
    2. Di kluster ACK, jalankan perintah berikut untuk membuat sumber daya ASMEgressTrafficPolicy:

      kubectl apply -f egress-by-egressgateway.yaml
  2. Verifikasi apakah konfigurasi ASMEgressTrafficPolicy berlaku.

    1. Verifikasi layanan sleep-a di namespace mytest.

      1. Jalankan perintah berikut untuk mengakses http://www.httpbin.org melalui layanan sleep-a.

        kubectl -n mytest exec deployment/sleep-a -- curl -s -o /dev/null -w "%{http_code}\n" http://httpbin.org

        Output mengembalikan 200, menunjukkan akses berhasil ke http://www.httpbin.org melalui layanan sleep-a.

      2. Jalankan perintah berikut untuk meminta API anything dari httpbin.org untuk memverifikasi apakah gateway egress meningkatkan Permintaan HTTP menjadi Permintaan HTTPS:

        kubectl -n mytest exec deployment/sleep-a -- sh -c "curl -s  http://httpbin.org/anything |grep url"

        Output yang diharapkan:

        "url": "https://httpbin.org/anything"

        Anda dapat melihat bahwa informasi bidang url dimulai dengan https, menunjukkan bahwa gateway egress berhasil meningkatkan permintaan menjadi https dan kemudian meneruskannya ke httpbin.org.

      3. Jalankan perintah berikut untuk mengakses https://www.httpbin.org melalui layanan sleep-a di namespace mytest:

        kubectl -n mytest exec deployment/sleep-a -- curl  -s -o /dev/null -w "%{http_code}\n"  https://www.httpbin.org

        Output mengembalikan 200, menunjukkan akses berhasil ke https://www.httpbin.org melalui layanan sleep-a.

    2. Verifikasi layanan NGINX di namespace default.

      1. Jalankan perintah berikut untuk mengakses http://www.httpbin.org melalui layanan NGINX:

        kubectl -n default exec deployment/nginx -- curl -s -o /dev/null -w "%{http_code}\n" http://www.httpbin.org

        Output mengembalikan 502, menunjukkan bahwa akses ke http://www.httpbin.org melalui layanan NGINX gagal.

      2. Jalankan perintah berikut untuk mengakses https://www.httpbin.org menggunakan layanan NGINX:

        kubectl -n default exec deployment/nginx -- curl -s -o /dev/null -w "%{http_code}\n" https://www.httpbin.org

        Output menunjukkan bahwa koneksi permintaan ditolak, yang berarti akses ke https://www.httpbin.org melalui layanan NGINX gagal.

      3. Jalankan perintah berikut untuk melihat log akses proxy sidecar dalam workload layanan NGINX dan memperoleh alasan penolakan:

         kubectl -n default  logs -f deployment/nginx -c istio-proxy   --tail=1 

        Output yang diharapkan:

        {"authority":"-","bytes_received":"0","bytes_sent":"0","downstream_local_address":"52.86.XX.XX:443","downstream_remote_address":"172.16.0.199:56748","duration":"0","istio_policy_status":"-","method":"-","path":"-","protocol":"-","request_id":"-","requested_server_name":"-","response_code":"0","response_flags":"UH","route_name":"-","start_time":"2023-04-11T02:00:07.409Z","trace_id":"-","upstream_cluster":"BlackHoleCluster","upstream_host":"-","upstream_local_address":"-","upstream_service_time":"-","upstream_transport_failure_reason":"-","user_agent":"-","x_forwarded_for":"-"}

        Output yang diharapkan menunjukkan bahwa permintaan diteruskan ke BlackHoleCluster, sehingga menyebabkan koneksi ditolak.

    3. Jalankan perintah berikut untuk menghapus egress-by-egressgateway, lalu akses <span data-tag="ph" id="9c666e92d8e4i"><code code-type="xCode" data-tag="code">http://www.httpbin.org dan <span data-tag="ph" id="9c666e93d8r7p"><code code-type="xCode" data-tag="code">https://www.httpbin.org lagi melalui layanan sleep-a di namespace mytest:

      kubectl -n istio-egress delete ASMEgressTrafficPolicy  egress-by-egressgateway
      kubectl -n mytest exec deployment/sleep-a -- curl -s -o /dev/null -w "%{http_code}\n"  http://www.httpbin.org
      kubectl -n mytest exec deployment/sleep-a -- curl -s -o /dev/null -w "%{http_code}\n"  https://www.httpbin.org

      Saat mengakses http://www.httpbin.org, 502 dikembalikan. Saat mengakses https://www.httpbin.org, koneksi permintaan ditolak. Setelah konfigurasi ASMEgressTrafficPolicy dihapus, akses ke http://www.httpbin.org dan https://www.httpbin.org melalui layanan sleep-a gagal.

    Output menunjukkan bahwa kebijakan trafik egress berlaku.

Gunakan layanan sleep-a untuk mengakses layanan eksternal melalui TCP

  1. Buat kebijakan trafik egress.

    Konfigurasikan melalui konsol

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

    2. Di halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih ASM Gateways > Egress Gateway.

    3. Klik nama gateway untuk masuk ke halaman Gateway overview dan klik Outbound Traffic Policy di sebelah kiri. Konfigurasikan parameter seperti yang ditunjukkan pada gambar berikut.

      image

    Konfigurasikan melalui kubectl

    1. Buat file egress-by-egressgateway.yaml dengan konten berikut:

      apiVersion: istio.alibabacloud.com/v1
      kind: ASMEgressTrafficPolicy
      metadata:
        name: egress-by-egressgateway
        namespace: istio-egress
      spec:
        byEgressGateway:
          name: egressgateway
        egressRules:
        - from:
          - namespace: mytest
            workloadSelector:
              app: sleep-a
          to:
          - byEgressGateway: {}
            hosts:
            - www.alibabacloud.com
            name: aliyun-service-tcp
            port:
              name: tcp
              number: 443
              protocol: TCP
    2. Di kluster ACK, jalankan perintah berikut untuk membuat sumber daya ASMEgressTrafficPolicy:

      kubectl apply -f egress-by-egressgateway.yaml
  2. Verifikasi apakah konfigurasi ASMEgressTrafficPolicy berlaku.

    1. Verifikasi layanan sleep-a di namespace mytest.

      1. Jalankan perintah berikut untuk mengakses www.alibabacloud.com melalui layanan sleep-a.

        kubectl -n mytest exec deployment/sleep-a -- curl -s -o /dev/null -w "%{http_code}\n" http://www.alibabacloud.com

        Output mengembalikan 502, menunjukkan bahwa akses ke http://www.alibabacloud.com melalui layanan sleep-a gagal.

      2. Jalankan perintah berikut untuk mengakses https://www.alibabacloud.com melalui layanan sleep-a di namespace mytest.

        kubectl -n mytest exec deployment/sleep-a -- curl  -s -o /dev/null -w "%{http_code}\n"  https://www.alibabacloud.com

        Output mengembalikan 200, menunjukkan akses berhasil ke https://www.alibabacloud.com melalui layanan sleep-a.

    2. Verifikasi layanan NGINX di namespace default.

      1. Jalankan perintah berikut untuk mengakses http://www.alibabacloud.com melalui layanan NGINX:

        kubectl -n default exec deployment/nginx -- curl -s -o /dev/null -w "%{http_code}\n" http://www.alibabacloud.com

        Output mengembalikan 502, menunjukkan bahwa akses ke http://www.alibabacloud.com melalui layanan NGINX gagal.

      2. Jalankan perintah berikut untuk mengakses https://www.alibabacloud.com melalui layanan NGINX:

        kubectl -n default exec deployment/nginx -- curl -s -o /dev/null -w "%{http_code}\n" https://www.alibabacloud.com

        Output menunjukkan bahwa koneksi permintaan ditolak, menunjukkan bahwa akses ke https://www.alibabacloud.com melalui layanan NGINX gagal.

      3. Jalankan perintah berikut untuk melihat log akses proxy sidecar dalam workload layanan NGINX dan memperoleh alasan penolakan:

         kubectl -n default  logs -f deployment/nginx -c istio-proxy --tail=1

        Output yang diharapkan:

        {"authority":"-","bytes_received":"0","bytes_sent":"0","downstream_local_address":"52.86.XX.XX:443","downstream_remote_address":"172.16.0.199:56748","duration":"0","istio_policy_status":"-","method":"-","path":"-","protocol":"-","request_id":"-","requested_server_name":"-","response_code":"0","response_flags":"UH","route_name":"-","start_time":"2023-04-11T02:00:07.409Z","trace_id":"-","upstream_cluster":"BlackHoleCluster","upstream_host":"-","upstream_local_address":"-","upstream_service_time":"-","upstream_transport_failure_reason":"-","user_agent":"-","x_forwarded_for":"-"}

        Output yang diharapkan menunjukkan bahwa permintaan diteruskan ke BlackHoleCluster, sehingga menyebabkan koneksi ditolak.

    3. Jalankan perintah berikut untuk menghapus egress-by-egressgateway, lalu akses http://www.alibabacloud.com dan https://www.alibabacloud.com lagi melalui layanan sleep-a di namespace mytest:

      kubectl -n istio-egress delete ASMEgressTrafficPolicy  egress-by-egressgateway
      kubectl -n mytest exec deployment/sleep-a -- curl -s -o /dev/null -w "%{http_code}\n"  http://www.alibabacloud.com
      kubectl -n mytest exec deployment/sleep-a -- curl -s -o /dev/null -w "%{http_code}\n"  https://www.alibabacloud.com

      Saat mengakses http://www.alibabacloud.com, 502 dikembalikan. Saat mengakses https://www.alibabacloud.com, koneksi permintaan ditolak. Setelah konfigurasi ASMEgressTrafficPolicy dihapus, akses ke http://www.alibabacloud.com dan https://www.alibabacloud.com melalui layanan sleep-a gagal.

      Output menunjukkan bahwa kebijakan trafik egress berlaku.

Operasi terkait

Tolak permintaan POST dari namespace tertentu

Dengan menggunakan gateway egress dan kebijakan trafik egress, Anda dapat secara fleksibel mengontrol trafik keluar di kluster. Dalam kombinasi dengan kebijakan otorisasi, Anda dapat menerapkan kontrol akses yang lebih rinci. Sebagai contoh, Anda dapat menggunakan kebijakan berikut untuk menolak permintaan POST dari namespace mytest:

kind: AuthorizationPolicy
apiVersion: security.istio.io/v1beta1
metadata:
  name: sleep-a-egress-www-httpbin-org
  namespace: istio-system
spec:
  action: DENY
  rules:
    - to:
        - operation:
            hosts:
            - www.httpbin.org
            - httpbin.org
            methods:
              - POST
      from:
        - source:
            namespaces: ["mytest"]
  selector:
    matchLabels:
      istio: egressgateway-a

Setelah menerapkan konfigurasi di atas, saat mengakses www.httpbin.org melalui layanan sleep-a menggunakan permintaan POST, RBAC: access dikembalikan. Permintaan GET ke www.httpbin.org tidak akan terpengaruh.