All Products
Search
Document Center

Alibaba Cloud Service Mesh:Mengelola lalu lintas keluar dengan ASMEgressTrafficPolicy

Last Updated:Jun 21, 2026

Mulai versi 1.16.4, Alibaba Cloud Service Mesh mendukung CustomResourceDefinition (CRD) ASMEgressTrafficPolicy. Artikel ini menjelaskan cara menggunakan CRD tersebut untuk mengelola lalu lintas keluar.

Latar Belakang

Cara Kerja

Service mesh mendukung pengelolaan lalu lintas keluar dengan membuat dan menghubungkan berbagai resource seperti ServiceEntry, VirtualService, Gateway, dan Destination. Setelah resource tersebut dikonfigurasi, lalu lintas secara transparan diintersepsi dan diarahkan ke egress gateway, yang kemudian meneruskan lalu lintas tersebut ke layanan eksternal.

Proses konfigurasi ini kompleks, rentan kesalahan, dan memerlukan pemahaman mendalam tentang berbagai bidang. Untuk menyederhanakan konfigurasi lalu lintas keluar, ASM memperkenalkan resource ASMEgressTrafficPolicy.

Resource ASMEgressTrafficPolicy mengabstraksi dan menyederhanakan konfigurasi lalu lintas keluar. Alih-alih membuat dan mengelola resource seperti ServiceEntry, VirtualService, Gateway, dan Destination secara manual, Anda hanya perlu menentukan beberapa pengaturan penting. Service mesh kemudian secara transparan mengintersepsi lalu lintas, mengarahkannya ke egress gateway, dan meneruskannya ke layanan eksternal melalui HTTP atau HTTPS.

Karena ASMEgressTrafficPolicy merupakan abstraksi yang disederhanakan dari resource native service mesh, fitur ini mungkin tidak mendukung kasus penggunaan lanjutan, seperti routing lalu lintas berbasis persentase atau inisiasi mTLS dari egress gateway. Jika Anda memerlukan fitur lanjutan atau konfigurasi kustom, lihat Konfigurasi gerbang keluar terpadu untuk lalu lintas dalam mesh.

Fitur

ASM menyediakan cara terpadu untuk menghubungkan, mengelola, dan mengamankan komunikasi antar aplikasi. Berbeda dengan metode berbasis IP jaringan, ASM menggunakan pendekatan berbasis aplikasi yang tidak memerlukan perubahan pada kode aplikasi yang ada. Resource ASMEgressTrafficPolicy mendefinisikan cara mengelola lalu lintas keluar melalui egress gateway. Dengan menggabungkan egress gateway ASM dan AuthorizationPolicy, Anda dapat mengontrol lalu lintas keluar secara lebih fleksibel.Dingtalk_20230411112608

Contoh ini mencakup aliran lalu lintas berikut:

1. Komunikasi antara proxy mesh dan antara proxy dengan gateway: Secara default, ASM mengamankan komunikasi ini dengan mTLS dan mengelola sertifikatnya.

2. Komunikasi antara aplikasi dengan proxy mesh-nya, serta antara gateway dengan layanan eksternal:

a. Untuk menggunakan fitur L7 lanjutan dari service mesh, aplikasi sebaiknya berkomunikasi dengan proxy mesh-nya menggunakan plaintext bila memungkinkan. Hal ini memungkinkan proxy mesh mengakses informasi lalu lintas L7 dan mendukung fitur yang lebih canggih. Jika aplikasi harus langsung menginisiasi lalu lintas HTTPS, service mesh hanya dapat menyediakan kemampuan L4.

b. Anda dapat mengonfigurasi protokol komunikasi antara egress gateway dan layanan eksternal. Plaintext maupun HTTPS didukung.

Prasyarat

  • Anda harus memiliki instans ASM komersial (Edisi Perusahaan atau Edisi Ultimate) yang menjalankan versi 1.16.4 atau lebih baru. Untuk informasi selengkapnya, lihat Buat instans ASM dan Perbarui instans ASM.

  • Injeksi otomatis diaktifkan untuk namespace default. Untuk informasi selengkapnya, lihat Aktifkan injeksi otomatis.

Prasyarat

Tetapkan kebijakan lalu lintas keluar

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

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

  3. Pada tab global, klik Outbound Traffic Policy. Lalu, di sebelah kanan Outbound Traffic Policy, klik REGISTRY_ONLY, kemudian klik Update Settings.

Buat namespace

  1. Buat namespace istio-egress. Untuk informasi selengkapnya, lihat Kelola namespace global.

  2. Pada halaman Global Namespace, klik Sync Automatic Sidecar Injection to Kubernetes Cluster untuk menyinkronkan namespace dengan kluster ACK yang dikelola oleh instance ASM.

Buat egress gateway

Di ASM, buat egress gateway bernama egressgateway-a. Pada bagian Port Mapping, konfigurasikan HTTP pada port 80 serta HTTPS pada port 443 dan 444. Kemudian, aktifkan opsi Support two-way TLS authentication. Untuk informasi selengkapnya, lihat Buat layanan egress gateway.

Pastikan file YAML yang dihasilkan mencakup konten berikut di bidang spec:

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

Buat aplikasi contoh

  1. Di instans ASM, buat namespace bernama mytest dan aktifkan injeksi sidecar otomatis. Untuk informasi selengkapnya, lihat Kelola namespace global.

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

    1. Buat file bernama test.yaml dengan konten berikut:

      test.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 deploy layanan sleep-a dan nginx:

      kubectl apply -f test.yaml
  3. Jalankan perintah berikut untuk mengakses http://www.httpbin.org dari 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 kedua perintah adalah 502, yang menunjukkan bahwa akses gagal.

Izinkan sleep-a mengakses layanan HTTP eksternal

Opsi 1: HTTP plaintext antara sidecar dan egress gateway

Opsi ini tidak praktis di lingkungan produksi. Komunikasi plaintext antara kontainer aplikasi dan egress gateway mencegah otorisasi berbasis identitas klien. ASMEgressTrafficPolicy tidak mendukung akses ke egress gateway melalui HTTP plaintext.

  • Pengelolaan lalu lintas terutama diterapkan di sidecar klien dan tidak memerlukan egress gateway.

  • Kemampuan observabilitas tidak bergantung pada egress gateway.

  • Fitur keamanan bergantung pada egress gateway. Namun, tanpa mTLS, semua kemampuan otorisasi berbasis identitas klien dinonaktifkan. Egress gateway hanya dapat menolak semua permintaan.

Opsi 2: mTLS antara sidecar dan egress gateway (direkomendasikan)

  1. Buat ASMEgressTrafficPolicy.

    Konsol

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

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

    3. Klik nama gateway untuk membuka halaman gateway overview. Di panel navigasi sebelah kiri, klik Outbound Traffic Policy.

      Konfigurasikan aturan kebijakan lalu lintas keluar. Tetapkan Egress Gateway ke egressgateway. Di area In-cluster Service, tetapkan Namespace ke mytest, Workload Label Name ke app, dan Label Value ke sleep-a. Di area External Service, tetapkan External Service Name ke httpbin-service-http, tambahkan www.httpbin.org dan httpbin.org ke Domain List. Untuk Service Port, tetapkan Port ke 80, Nama Port ke http, dan Protokol ke HTTP. Di area How to Access, pilih port egress gateway 80, dan untuk Upgrade to HTTPS, pilih No.

    kubectl

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

      Untuk deskripsi bidang, lihat Referensi CRD ASMEgressTrafficPolicy.

      apiVersion: istio.alibabacloud.com/v1
      kind: ASMEgressTrafficPolicy
      metadata:
        name: egress-by-egressgateway  # Konvensi: egress-by-{nama-egress-gateway}.
        namespace: istio-egress         # Konvensi: Tetap di namespace istio-egress.
      spec:
        byEgressGateway:
          name: egressgateway
        egressRules:
        - from:
          - namespace: mytest
            workloadSelector:
              app: sleep-a
          to:
          - name: httpbin-service-http
            hosts:
            - www.httpbin.org  # Semua host harus mengarah ke alamat IP yang sama.
            - httpbin.org      # Semua host harus mengarah ke alamat IP yang sama.
            port:
              name: http
              number: 80
              protocol: HTTP
            byEgressGateway:
              port: 80        # Jalur lalu lintas: sidecar -> Gateway (port 80) -> Layanan (httpbin.org, port 80)
    2. Di kluster ACK Anda, jalankan perintah berikut untuk membuat resource ASMEgressTrafficPolicy.

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

    1. Jalankan perintah berikut untuk menguji akses dari layanan nginx di namespace default ke http://www.httpbin.org.

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

      Perintah mengembalikan 502, yang menunjukkan bahwa akses dari layanan nginx ke http://www.httpbin.org diblokir sebagaimana diharapkan.

    2. Jalankan perintah berikut untuk menguji akses dari layanan sleep-a di namespace mytest ke http://www.httpbin.org.

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

      Perintah mengembalikan 200, yang menunjukkan bahwa akses diizinkan sebagaimana diharapkan.

    3. Jalankan perintah berikut untuk menghapus kebijakan egress-by-egressgateway, lalu uji kembali akses dari layanan sleep-a di namespace mytest ke http://www.httpbin.org.

      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

      Perintah mengembalikan 502, yang menunjukkan bahwa setelah ASMEgressTrafficPolicy dihapus, layanan sleep-a tidak dapat mengakses http://www.httpbin.org.

    Hasil ini mengonfirmasi bahwa ASMEgressTrafficPolicy bekerja dengan benar.

Akses layanan HTTPS eksternal dari sleep-a

Opsi 1: mTLS antara sidecar dan egress gateway (direkomendasikan)

  1. Buat ASMEgressTrafficPolicy.

    Konsol

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

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

    3. Klik nama gateway untuk membuka halaman gateway overview. Di panel navigasi sebelah kiri, klik Outbound Traffic Policy.

      Konfigurasikan aturan lalu lintas keluar. Di bagian in-cluster service, tetapkan Namespace ke mytest, Label Name ke app, dan Label Value ke sleep-a. Di bagian external service, tetapkan External Service Name ke httpbin-service-http, tambahkan www.httpbin.org dan httpbin.org ke Domain List, dan konfigurasikan Service Port dengan Port: 80, Port Name: http, dan Protocol: HTTP. Di bagian How to Access, tetapkan Egress Gateway Port ke 80, Upgrade to HTTPS ke Yes, dan HTTPS Port ke 443.

    Kubectl

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

      Bidang httpsUpgrade dan definisi terkait untuk mengakses https://www.httpbin.org ditambahkan ke bidang spec. Untuk deskripsi bidang, lihat referensi CRD ASMEgressTrafficPolicy.

      apiVersion: istio.alibabacloud.com/v1
      kind: ASMEgressTrafficPolicy
      metadata:
        name: egress-by-egressgateway  # Konvensi: egress-by-{nama-egress-gateway}.
        namespace: istio-egress          # Konvensi: Tetap di namespace 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 tempat beberapa nama domain tersebut mengarah harus sama.
            - httpbin.org      # Alamat IP tempat beberapa nama domain tersebut mengarah harus sama.
            port:
              name: http
              number: 80
              protocol: HTTP
            byEgressGateway:
              port: 80        # Sidecar -> Port 80 Gateway -> Port 80 Layanan (httpbin.org)
            httpsUpgrade:
              enabled: true   # Jika enabled diatur ke false, pengaturan port untuk httpsUpgrade tidak berpengaruh.
              port: 443       # Sidecar -> Port 80 Gateway -> Port 443 Layanan (httpbin.org)
    2. Di kluster ACK, jalankan perintah berikut untuk membuat resource ASMEgressTrafficPolicy:

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

    1. Verifikasi layanan sleep-a di namespace mytest.

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

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

        Kode status 200 menunjukkan bahwa layanan sleep-a dapat mengakses http://www.httpbin.org.

      2. Jalankan perintah berikut untuk meminta endpoint anything dari httpbin.org dan verifikasi bahwa egress gateway 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"

        Nilai bidang url diawali dengan https, yang mengonfirmasi bahwa egress gateway meningkatkan permintaan menjadi https sebelum meneruskannya ke httpbin.org.

      3. Jalankan perintah berikut untuk mengakses https://www.httpbin.org dari 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

        Kode status 200 menunjukkan bahwa layanan sleep-a dapat mengakses https://www.httpbin.org.

    2. Verifikasi layanan Nginx di namespace default.

      1. Jalankan perintah berikut untuk mengakses http://www.httpbin.org dari layanan Nginx.

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

        Kode status 502 menunjukkan bahwa layanan Nginx gagal mengakses http://www.httpbin.org.

      2. Jalankan perintah berikut untuk mengakses https://www.httpbin.org dari layanan Nginx.

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

        Terjadi error connection refused, yang menunjukkan bahwa layanan Nginx gagal mengakses https://www.httpbin.org.

      3. Jalankan perintah berikut untuk melihat log akses sidecar untuk workload Nginx guna mengidentifikasi penyebab koneksi ditolak.

         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 menunjukkan bahwa permintaan diteruskan ke BlackHoleCluster, yang menolak koneksi.

    3. Jalankan perintah berikut untuk menghapus egress-by-egressgateway, lalu akses kembali http://www.httpbin.org dan https://www.httpbin.org dari 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

      Permintaan ke http://www.httpbin.org mengembalikan 502, dan permintaan ke https://www.httpbin.org ditolak. Setelah konfigurasi ASMEgressTrafficPolicy dihapus, layanan sleep-a tidak dapat lagi mengakses http://www.httpbin.org atau https://www.httpbin.org.

    Hasil ini mengonfirmasi bahwa ASMEgressTrafficPolicy bekerja sebagaimana diharapkan.

Opsi 2: HTTPS antara sidecar dan egress gateway

  1. Buat ASMEgressTrafficPolicy.

    Konsol

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

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

    3. Klik nama gateway untuk membuka halaman gateway overview. Di panel navigasi sebelah kiri, klik Outbound Traffic Policy.

      Pada halaman aturan lalu lintas keluar, klik Add Rule dan konfigurasikan parameter aturan. Tetapkan Namespace ke mytest. Untuk Workload Labels, tetapkan nama label ke app dan nilai label ke sleep-a. Tetapkan External Service Name ke httpbin-service-https. Tambahkan www.httpbin.org dan httpbin.org ke Domain List. Untuk Service Port, tetapkan port ke 443, nama port ke https, dan Protocol ke HTTPS. Untuk How to Access, pilih Via egress gateway port dan tetapkan port ke 444.

    Kubectl

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

      Bidang httpsUpgrade dan definisi untuk mengakses langsung https://www.httpbin.org ditambahkan ke bidang spec. Untuk deskripsi bidang, lihat CRD ASMEgressTrafficPolicy.

      apiVersion: istio.alibabacloud.com/v1
      kind: ASMEgressTrafficPolicy
      metadata:
        name: egress-by-egressgateway  # Konvensi: egress-by-{nama-egress-gateway}.
        namespace: istio-egress          # Konvensi: Tetap di namespace 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 untuk egress gateway di prasyarat.
    2. Di kluster ACK, jalankan perintah berikut untuk membuat resource ASMEgressTrafficPolicy:

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

    1. Verifikasi layanan sleep-a di namespace mytest.

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

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

        Kode status 502 menunjukkan bahwa layanan sleep-a gagal mengakses http://www.httpbin.org.

      2. Jalankan perintah berikut untuk mengakses https://www.httpbin.org dari 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

        Kode status 200 menunjukkan bahwa layanan sleep-a dapat mengakses https://www.httpbin.org.

    2. Verifikasi layanan Nginx di namespace default.

      1. Jalankan perintah berikut untuk mengakses http://www.httpbin.org dari layanan Nginx.

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

        Kode status 502 menunjukkan bahwa layanan Nginx gagal mengakses http://www.httpbin.org.

      2. Jalankan perintah berikut untuk mengakses https://www.httpbin.org dari layanan Nginx.

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

        Terjadi error connection refused, yang menunjukkan bahwa layanan Nginx gagal mengakses https://www.httpbin.org.

      3. Jalankan perintah berikut untuk melihat log akses sidecar untuk workload Nginx guna mengidentifikasi penyebab koneksi ditolak.

         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 menunjukkan bahwa permintaan diteruskan ke BlackHoleCluster, yang menolak koneksi.

    3. Jalankan perintah berikut untuk menghapus egress-by-egressgateway, lalu akses kembali http://www.httpbin.org dan https://www.httpbin.org dari 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

      Permintaan ke http://www.httpbin.org mengembalikan 502, dan permintaan ke https://www.httpbin.org ditolak. Setelah konfigurasi ASMEgressTrafficPolicy dihapus, layanan sleep-a tidak dapat lagi mengakses http://www.httpbin.org atau https://www.httpbin.org.

      Hasil ini mengonfirmasi bahwa ASMEgressTrafficPolicy bekerja sebagaimana diharapkan.

Akses layanan TCP eksternal dari layanan sleep-a

  1. Buat ASMEgressTrafficPolicy.

    Konsol

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

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

    3. Klik nama gateway. Pada halaman Gateway overview, klik Outbound Traffic Policy di panel navigasi sebelah kiri. Konfigurasikan kebijakan seperti yang ditunjukkan pada gambar berikut.

      image

    kubectl

    1. Buat file bernama 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 resource ASMEgressTrafficPolicy.

      kubectl apply -f egress-by-egressgateway.yaml
  2. Verifikasi bahwa konfigurasi ASMEgressTrafficPolicy diterapkan.

    1. Verifikasi layanan sleep-a di namespace mytest.

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

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

        Output adalah 502, yang menunjukkan bahwa layanan sleep-a gagal mengakses http://www.alibabacloud.com.

      2. Jalankan perintah berikut untuk mengakses https://www.alibabacloud.com dari 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 adalah 200, yang menunjukkan bahwa layanan sleep-a berhasil mengakses https://www.alibabacloud.com.

    2. Verifikasi layanan Nginx di namespace default.

      1. Jalankan perintah berikut untuk mengakses http://www.alibabacloud.com dari layanan Nginx.

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

        Output adalah 502, yang menunjukkan bahwa layanan Nginx gagal mengakses http://www.alibabacloud.com.

      2. Jalankan perintah berikut untuk mengakses https://www.alibabacloud.com dari 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 ditolak, yang menunjukkan bahwa layanan Nginx gagal mengakses https://www.alibabacloud.com.

      3. Jalankan perintah berikut untuk memeriksa log akses sidecar untuk workload Nginx guna memahami penyebab koneksi ditolak.

         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 menunjukkan bahwa permintaan diarahkan ke BlackHoleCluster, sehingga koneksi ditolak.

    3. Jalankan perintah berikut untuk menghapus egress-by-egressgateway, lalu coba akses kembali http://www.alibabacloud.com dan https://www.alibabacloud.com dari 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

      Permintaan ke http://www.alibabacloud.com mengembalikan error 502, dan permintaan ke https://www.alibabacloud.com ditolak. Hal ini menunjukkan bahwa penghapusan konfigurasi ASMEgressTrafficPolicy mencegah layanan sleep-a mengakses http://www.alibabacloud.com atau https://www.alibabacloud.com.

      Hasil ini mengonfirmasi bahwa konfigurasi ASMEgressTrafficPolicy bekerja sebagaimana diharapkan.

Operasi Terkait

Tolak permintaan POST dari namespace tertentu

Gunakan egress gateway ASM dengan ASMEgressTrafficPolicy untuk mengontrol lalu lintas keluar dari kluster Anda. Untuk kontrol akses yang lebih granular, terapkan AuthorizationPolicy. Sebagai contoh, konfigurasi berikut 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 ini, permintaan POST dari layanan sleep-a ke www.httpbin.org mengembalikan RBAC: access. Permintaan GET dari layanan sleep-a ke www.httpbin.org tidak terpengaruh.