全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Aktifkan TLS pass-through pada gateway ingress

更新时间:Jul 02, 2025

Semua data antara gateway ingress dan proxy sidecar ditransmisikan melalui terowongan Mutual Transport Layer Security (mTLS). Jika proxy sidecar disuntikkan ke dalam aplikasi, konfigurasikan terminasi TLS di gateway ingress untuk memastikan enkripsi ujung-ke-ujung. Jika proxy sidecar tidak disuntikkan atau kondisi khusus lainnya terjadi, gunakan dukungan TLS pass-through di gateway ingress. Topik ini menjelaskan cara mengaktifkan TLS pass-through pada gateway ingress untuk memastikan akses aman ke layanan HTTPS dalam kluster.

Prasyarat

Langkah 1: Siapkan sertifikat server dan kunci privat

Jika Anda memiliki sertifikat server dan kunci privat untuk nama domain sample.aliyun.com, ubah nama kunci privat menjadi sample.aliyun.com.key dan sertifikat server menjadi sample.aliyun.com.crt. Sebagai alternatif, jalankan perintah openssl berikut untuk membuat sertifikat server dan kunci privat untuk sample.aliyun.com.

  1. Jalankan perintah berikut untuk membuat sertifikat root dan kunci privat:

    openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -subj '/O=mynginx Inc./CN=aliyun.com' -keyout aliyun.root.key -out aliyun.root.crt 
  2. Jalankan perintah berikut untuk menghasilkan sertifikat server dan kunci privat untuk server sample.aliyun.com:

    openssl req -out sample.aliyun.com.csr -newkey rsa:2048 -nodes -keyout sample.aliyun.com.key -subj "/CN=sample.aliyun.com/O=mynginx sample organization"
    openssl x509 -req -days 365 -CA aliyun.root.crt -CAkey aliyun.root.key -set_serial 0 -in sample.aliyun.com.csr -out sample.aliyun.com.crt

Langkah 2: Definisikan layanan internal

Layanan internal dalam contoh ini diimplementasikan menggunakan NGINX. Buat file konfigurasi untuk server NGINX terlebih dahulu. Dalam contoh ini, layanan internal untuk nama domain aliyun.com digunakan. Tentukan path root permintaan untuk langsung mengembalikan kalimat Selamat datang di aliyun.com tanpa TLS Termination! dan kode status 200. Contoh kode berikut menunjukkan file mynginx.conf:

events {
}
http {
  log_format main '$remote_addr - $remote_user [$time_local]  $status '
  '"$request" $body_bytes_sent "$http_referer" '
  '"$http_user_agent" "$http_x_forwarded_for"';
  access_log /var/log/nginx/access.log main;
  error_log  /var/log/nginx/error.log;
  server {
    listen 443 ssl;
    location / {
        return 200 'Selamat datang di aliyun.com tanpa TLS Termination!';
        add_header Content-Type text/plain;
    }
    server_name www.aliyun.com;
    ssl_certificate /etc/nginx-server-certs/tls.crt;
    ssl_certificate_key /etc/nginx-server-certs/tls.key;
  }
}
  1. Gunakan kubectl untuk terhubung ke kluster tempat pod gateway ingress berada berdasarkan informasi dalam file kubeconfig. Kemudian, jalankan perintah berikut untuk membuat ConfigMap yang menyimpan konfigurasi server NGINX:

    kubectl create configmap mynginx-configmap --from-file=nginx.conf=./mynginx.conf​
  2. Gunakan kubectl untuk terhubung ke kluster tempat pod gateway ingress berada berdasarkan informasi dalam file kubeconfig. Kemudian, jalankan perintah berikut untuk membuat rahasia yang berisi sertifikat server dan kunci privat di namespace default:

    kubectl create secret tls nginx-server-certs --key sample.aliyun.com.key --cert sample.aliyun.com.crt​
  3. Aktifkan injeksi proxy sidecar otomatis untuk namespace default. Untuk informasi lebih lanjut tentang prosedurnya, lihat Aktifkan injeksi proxy sidecar otomatis.

  4. Buat file mynginxapp.yaml dengan konten berikut. Kemudian, jalankan perintah kubectl apply -f mynginxapp.yaml untuk membuat layanan internal untuk nama domain aliyun.com.

    Kembangkan untuk melihat file mynginxapp.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: mynginxapp
      labels:
        app: mynginxapp
    spec:
      ports:
      - port: 443
        protocol: TCP
      selector:
        app: mynginxapp
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mynginxapp
    spec:
      selector:
        matchLabels:
          app: mynginxapp
      replicas: 1
      template:
        metadata:
          labels:
            app: mynginxapp
        spec:
          containers:
          - name: nginx
            image: nginx:1.15
            ports:
            - containerPort: 443
            volumeMounts:
            - name: nginx-config
              mountPath: /etc/nginx
              readOnly: true
            - name: nginx-server-certs
              mountPath: /etc/nginx-server-certs
              readOnly: true  
          volumes:
          - name: nginx-config
            configMap:
              name: mynginx-configmap
          - name: nginx-server-certs
            secret:
              secretName: nginx-server-certs    
  5. Jalankan perintah berikut untuk mengirim permintaan dari proxy sidecar ke server NGINX untuk memeriksa apakah server NGINX telah diterapkan:

    kubectl exec -it $(kubectl get pod  -l app=mynginxapp -o jsonpath={.items..metadata.name}) -c istio-proxy -- curl -v -k --resolve sample.aliyun.com:443:127.0.0.1 https://sample.aliyun.com

Langkah 3: Buat gateway Istio

  1. Masuk ke Konsol ASM.

  2. Di panel navigasi sisi kiri, pilih Service Mesh > Mesh Management.

  3. Di halaman Mesh Management, temukan instance ASM yang ingin dikonfigurasi. Klik nama instance tersebut atau klik Manage di kolom Actions.

  4. Di halaman detail instance ASM, pilih ASM Gateways > Gateway di panel navigasi sisi kiri. Di halaman yang muncul, klik Create from YAML.

  5. Di halaman Buat, lakukan langkah-langkah berikut untuk mendefinisikan gateway Istio. Kemudian, klik Create.

    1. Pilih namespace sesuai kebutuhan. Dalam contoh ini, namespace default dipilih.

    2. Di editor kode, definisikan gateway Istio menggunakan kode YAML berikut:

      apiVersion: networking.istio.io/v1alpha3
      kind: Gateway
      metadata:
        name: istio-mynginx-customingressgateway
      spec:
        selector:
          istio: ingressgateway
        servers:
        - hosts:
          - 'sample.aliyun.com'
          port:
            name: https
            number: 443
            protocol: HTTPS
          tls:
            mode: PASSTHROUGH

    Di halaman Gateway, Anda dapat melihat gateway Istio yang telah dibuat.

Langkah 4: Buat layanan virtual

  1. Masuk ke Konsol ASM.

  2. Di panel navigasi sisi kiri, pilih Service Mesh > Mesh Management.

  3. Di halaman Mesh Management, temukan instance ASM yang ingin dikonfigurasi. Klik nama instance tersebut atau klik Manage di kolom Actions.

  4. Di halaman detail instance ASM, pilih Traffic Management Center > VirtualService di panel navigasi sisi kiri. Di halaman yang muncul, klik Create from YAML.

  5. Di halaman Buat, lakukan langkah-langkah berikut untuk mendefinisikan layanan virtual. Kemudian, klik Create.

    1. Pilih namespace sesuai kebutuhan. Dalam contoh ini, namespace default dipilih.

    2. Di editor kode, definisikan layanan virtual menggunakan kode YAML berikut:

      apiVersion: networking.istio.io/v1alpha3
      kind: VirtualService
      metadata:
        name: istio-mynginx-customvirtualservice
      spec:
        hosts:
        - "sample.aliyun.com"
        gateways:
        - istio-mynginx-customingressgateway
        tls:
        - match:
          - port: 443
            sniHosts:
            - sample.aliyun.com
          route:
          - destination:
              host: mynginxapp.default.svc.cluster.local
              port:
                number: 443

    Di halaman VirtualService, Anda dapat melihat layanan virtual yang telah dibuat.

Lihat hasilnya

  1. Gunakan salah satu metode berikut untuk mendapatkan alamat IP gateway ingress:

    1. Metode 1: menggunakan Konsol ASM. Untuk informasi lebih lanjut, lihat Sublangkah 1 dari Langkah 3 dalam topik Gunakan sumber daya Istio untuk merutekan trafik ke versi layanan yang berbeda.

    2. Metode 2: dengan menjalankan perintah kubectl.

      Gunakan kubectl untuk terhubung ke kluster tempat pod gateway ingress berada berdasarkan informasi dalam file kubeconfig. Kemudian, jalankan perintah berikut untuk mendapatkan alamat IP gateway ingress:

      kubectl get svc -n istio-system -l istio=ingressgateway
  2. Jalankan perintah berikut untuk mengakses nama domain aliyun.com melalui HTTPS:

    curl -v --cacert aliyun.root.crt --resolve sample.aliyun.com:443:xx.xx.xx.xx   https://sample.aliyun.com

    Output yang diharapkan:

    Selamat datang di aliyun.com tanpa TLS Termination!%