全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Konfigurasikan pengalihan permintaan pemeriksaan kesehatan HTTP atau TCP untuk aplikasi dalam instance ASM

更新时间:Jun 28, 2025

Setelah menambahkan aplikasi ke instance Service Mesh (ASM), proxy sidecar disuntikkan ke dalam pod aplikasi. Proxy ini mengintersep semua permintaan yang dikirim ke aplikasi. Jika Anda mengaktifkan pemeriksaan kesehatan HTTP atau TCP, pemeriksaan tersebut mungkin tidak berfungsi sebagaimana mestinya, misalnya selalu gagal. Topik ini menjelaskan cara mengonfigurasi pengalihan permintaan pemeriksaan kesehatan HTTP atau TCP untuk aplikasi dalam instance ASM.

Informasi latar belakang

Pemeriksaan kesehatan TCP atau HTTP untuk aplikasi dalam instance ASM dapat mengalami masalah tertentu. Untuk menyelesaikan masalah ini, Anda perlu mengonfigurasi pengalihan permintaan pemeriksaan kesehatan menggunakan anotasi.

Tipe

Deskripsi

Permintaan pemeriksaan kesehatan HTTP

Layanan kubelet mengirimkan permintaan pemeriksaan kesehatan ke pod dalam kluster Kubernetes. Jika Anda mengaktifkan keamanan transport layer mutual (mTLS) untuk instance ASM, aplikasi dalam instance ASM harus menggunakan TLS untuk berkomunikasi satu sama lain. Layanan kubelet bukan bagian dari instance ASM. Akibatnya, layanan kubelet tidak dapat menyediakan sertifikat TLS yang diterbitkan oleh ASM. Dalam kasus ini, semua permintaan pemeriksaan kesehatan HTTP ditolak oleh aplikasi, dan pemeriksaan kesehatan selalu gagal.

Catatan

Jika Anda tidak mengaktifkan mTLS untuk instance ASM, pemeriksaan kesehatan HTTP dapat berhasil dilakukan pada pod aplikasi. Dalam kasus ini, Anda dapat mengaktifkan pemeriksaan kesehatan HTTP untuk aplikasi tanpa perlu mengonfigurasi pengalihan permintaan pemeriksaan kesehatan.

Permintaan pemeriksaan kesehatan TCP

Proxy sidecar mendengarkan semua port pod dalam instance ASM untuk mengintersep permintaan. Jika Anda mengaktifkan pemeriksaan kesehatan TCP untuk aplikasi, layanan kubelet memeriksa apakah port tertentu dari pod didengarkan oleh aplikasi. Jika ya, pemeriksaan kesehatan berhasil.

Jika proxy sidecar disuntikkan ke dalam pod dan bekerja seperti yang diharapkan, pemeriksaan kesehatan selalu berhasil terlepas dari apakah aplikasi sehat. Sebagai contoh, jika Anda mengonfigurasi port yang tidak valid untuk aplikasi, pemeriksaan kesehatan seharusnya gagal, dan pod seharusnya tidak siap. Namun, pemeriksaan kesehatan selalu berhasil untuk pod tersebut.

Secara default, panggilan permintaan pemeriksaan kesehatan untuk aplikasi dalam instance ASM ditampilkan dalam topologi mesh. Namun, jika pemeriksaan kesehatan tidak berfungsi dengan benar, statistik lalu lintas dapat menjadi tidak akurat. Untuk memastikan statistik lalu lintas tetap akurat, konfigurasikan pengalihan permintaan pemeriksaan kesehatan.

Konfigurasikan pengalihan permintaan pemeriksaan kesehatan HTTP

Dalam contoh ini, aplikasi NGINX digunakan. Setelah mengaktifkan mTLS untuk instance ASM tempat aplikasi NGINX berada, pemeriksaan kesehatan HTTP untuk aplikasi NGINX selalu gagal. Dalam kasus ini, Anda dapat mengonfigurasi pengalihan permintaan pemeriksaan kesehatan untuk aplikasi NGINX. Kemudian, periksa peristiwa pod aplikasi NGINX. Jika tidak ada peristiwa yang menunjukkan pemeriksaan kesehatan gagal dan pod siap, pengalihan permintaan pemeriksaan kesehatan berhasil diterapkan.

Langkah 1: Aktifkan mode mTLS global untuk instance ASM

  1. Masuk ke Konsol ASM.

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

  3. Pada halaman Mesh Management, temukan instance ASM yang ingin dikonfigurasi. Klik nama instance ASM atau pilih Manage di kolom Actions.

  4. Pada halaman detail instance ASM, pilih Mesh Security Center > PeerAuthentication di panel navigasi di sebelah kiri.

  5. Di bagian atas halaman PeerAuthentication, pilih namespace dari daftar drop-down Namespace dan klik Configure Global mTLS Mode.

  6. Pada halaman Configure Global mTLS Mode, pilih STRICT -Strictly Enforce mTLS untuk parameter mTLS Mode (Namespace-wide) dan klik Create.

Langkah 2: Deploy aplikasi NGINX

  1. Dapatkan file kubeconfig kluster dan gunakan kubectl untuk terhubung ke kluster. Untuk informasi lebih lanjut, lihat Dapatkan File kubeconfig Kluster dan Gunakan kubectl untuk Terhubung ke Kluster.

  2. Deploy aplikasi NGINX.

    1. Buat file http-liveness.yaml dengan konten berikut:

      Tampilkan File http-liveness.yaml

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nginx-deployment
        labels:
          app: nginx
      spec:
        selector:
          matchLabels:
            app: nginx
        replicas: 1
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: nginx
              imagePullPolicy: IfNotPresent
              ports:
              - containerPort: 80
              readinessProbe:
                httpGet:
                  path: /index.html
                  port: 80
                  httpHeaders:
                  - name: X-Custom-Header
                    value: hello
                initialDelaySeconds: 5
                periodSeconds: 3

      Bidang httpGet dalam bidang readinessProbe ditentukan untuk mengaktifkan pemeriksaan kesehatan HTTP untuk aplikasi NGINX.

    2. Jalankan perintah berikut untuk mendeploy aplikasi NGINX:

      kubectl apply -f http-liveness.yaml
  3. Lihat hasil pemeriksaan kesehatan aplikasi NGINX.

    1. Jalankan perintah berikut untuk melihat nama pod yang menjalankan aplikasi NGINX:

      kubectl get pod| grep nginx
    2. Jalankan perintah berikut untuk melihat peristiwa pod:

      kubectl describe pod <Nama Pod>

      Output yang Diharapkan:

      Warning  Unhealthy  45s               kubelet            Readiness probe failed: Get "http://172.23.64.22:80/index.html": read tcp 172.23.64.1:54130->172.23.64.22:80: read: connection reset by peer

      Output tersebut menunjukkan bahwa pemeriksaan kesehatan HTTP untuk pod gagal. Dalam kasus ini, pod tidak siap.

Langkah 3: Konfigurasikan pengalihan permintaan pemeriksaan kesehatan untuk aplikasi NGINX

  1. Jalankan perintah berikut untuk membuka file http-liveness.yaml:

    vim http-liveness.yaml

    Tambahkan konten berikut ke bidang template:

    annotations:
      sidecar.istio.io/rewriteAppHTTPProbers: "true"

    Kode berikut menunjukkan contoh file http-liveness.yaml setelah menambahkan anotasi:

    Tampilkan file http-liveness.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      selector:
        matchLabels:
          app: nginx
      replicas: 1
      template:
        metadata:
          labels:
            app: nginx
          annotations:
            sidecar.istio.io/rewriteAppHTTPProbers: "true"
        spec:
          containers:
          - name: nginx
            image: nginx
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 80
            readinessProbe:
              httpGet:
                path: /index.html
                port: 80
                httpHeaders:
                - name: X-Custom-Header
                  value: hello
              initialDelaySeconds: 5
              periodSeconds: 3
  2. Jalankan perintah berikut untuk mendeploy aplikasi NGINX:

    kubectl apply -f http-liveness.yaml

Langkah 4: Verifikasi bahwa hasil pemeriksaan kesehatan sesuai dengan harapan Anda

  1. Lihat hasil pemeriksaan kesehatan pod.

    1. Jalankan perintah berikut untuk melihat nama pod yang menjalankan aplikasi NGINX:

      kubectl get pod| grep nginx
    2. Jalankan perintah berikut untuk melihat peristiwa pod:

      kubectl describe pod <Nama Pod>

      Dalam output perintah, tidak ada peristiwa yang menunjukkan pemeriksaan kesehatan gagal untuk pod. Pod siap, menunjukkan bahwa pengalihan permintaan pemeriksaan kesehatan HTTP berhasil diterapkan.

  2. Jalankan perintah berikut untuk melihat file YAML pod setelah mengonfigurasi pengalihan permintaan pemeriksaan kesehatan:

    kubectl get pod nginx-deployment-676f85f66b-7vxct -o yaml

    Tampilkan Output yang Diharapkan

    apiVersion: v1
    kind: Pod
    metadata:
      ...
      name: nginx-deployment-676f85f66b-cbzsx
      namespace: default
      ...
    spec:
      containers:
        - args:
            - proxy
            - sidecar
            - '--domain'
            - $(POD_NAMESPACE).svc.cluster.local
            - '--proxyLogLevel=warning'
            - '--proxyComponentLogLevel=misc:error'
            - '--log_output_level=default:info'
            - '--concurrency'
            - '2'
          env:
            ...
            - name: ISTIO_KUBE_APP_PROBERS
              value: >-
                {"/app-health/nginx/readyz":{"httpGet":{"path":"/index.html","port":80,"scheme":"HTTP","httpHeaders":[{"name":"X-Custom-Header","value":"hello"}]},"timeoutSeconds":1}}
          ...
        - image: nginx
          imagePullPolicy: IfNotPresent
          name: nginx
          ports:
            - containerPort: 80
              protocol: TCP
          readinessProbe:
            failureThreshold: 3
            httpGet:
              httpHeaders:
                - name: X-Custom-Header
                  value: hello
              path: /app-health/nginx/readyz
              port: 15020
              scheme: HTTP
            initialDelaySeconds: 5
            periodSeconds: 3
            successThreshold: 1
            timeoutSeconds: 1

    Setelah mengonfigurasi pengalihan permintaan pemeriksaan kesehatan, port pemeriksaan kesehatan diubah dari port 80 menjadi port 15020, dan jalur pemeriksaan kesehatan diubah dari /index.html menjadi /app-health/nginx/readyz. Selain itu, variabel lingkungan bernama ISTIO_KUBE_APP_PROBERS ditambahkan ke kontainer sidecar pod. Nilai variabel lingkungan ini diserialisasi dari konfigurasi pemeriksaan kesehatan asli dalam format JSON.

    Untuk aplikasi yang diterapkan dalam ASM, port 15020 digunakan secara eksklusif untuk observabilitas ASM. Permintaan yang dikirim ke port 15020 tidak diintersep oleh proxy sidecar. Oleh karena itu, permintaan pemeriksaan kesehatan tidak terpengaruh oleh persyaratan mode mTLS. Setelah mengonfigurasi pengalihan permintaan pemeriksaan kesehatan, layanan pilot-agent yang berjalan di kontainer sidecar mendengarkan port 15020. Layanan pilot-agent menerima permintaan pemeriksaan kesehatan dari layanan kubelet dan mengarahkan ulang permintaan ini ke kontainer aplikasi berdasarkan nilai variabel lingkungan ISTIO_KUBE_APP_PROBERS. Ini memastikan bahwa pemeriksaan kesehatan HTTP berfungsi sesuai harapan.

Konfigurasikan pengalihan permintaan pemeriksaan kesehatan TCP

Dalam contoh ini, aplikasi NGINX digunakan, dan port yang tidak valid dikonfigurasi untuk aplikasi NGINX. Jika Anda mengaktifkan pemeriksaan kesehatan TCP untuk aplikasi NGINX, pemeriksaan kesehatan TCP yang seharusnya gagal selalu berhasil untuk aplikasi. Setelah mengonfigurasi pengalihan permintaan pemeriksaan kesehatan, pemeriksaan kesehatan TCP untuk pod gagal. Ini menunjukkan bahwa pengalihan permintaan pemeriksaan kesehatan TCP berhasil diterapkan untuk aplikasi NGINX.

Langkah 1: Deploy aplikasi NGINX

  1. Dapatkan file kubeconfig kluster dan gunakan kubectl untuk terhubung ke kluster. Untuk informasi lebih lanjut, lihat Dapatkan File kubeconfig Kluster dan Gunakan kubectl untuk Terhubung ke Kluster.

  2. Deploy aplikasi NGINX.

    1. Buat file tcp-liveness.yaml dengan konten berikut:

      Port 2940 dikonfigurasi sebagai port pemeriksaan kesehatan untuk aplikasi NGINX. Namun, aplikasi NGINX tidak mendengarkan port 2940. Dalam kondisi normal, pemeriksaan kesehatan gagal untuk aplikasi NGINX, dan pod tidak siap.

      Tampilkan File tcp-liveness.yaml

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nginx-deployment
        labels:
          app: nginx
      spec:
        selector:
          matchLabels:
            app: nginx
        replicas: 1
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: nginx
              imagePullPolicy: IfNotPresent
              ports:
              - containerPort: 80
              readinessProbe:
                tcpSocket:
                  port: 2940
                initialDelaySeconds: 5
                periodSeconds: 3

      Bidang tcpSocket dalam bidang readinessProbe ditentukan untuk mengaktifkan pemeriksaan kesehatan TCP untuk aplikasi NGINX.

    2. Jalankan perintah berikut untuk mendeploy aplikasi NGINX:

      kubectl apply -f tcp-liveness.yaml
  3. Lihat hasil pemeriksaan kesehatan aplikasi NGINX.

    1. Jalankan perintah berikut untuk melihat nama pod yang menjalankan aplikasi NGINX:

      kubectl get pod| grep nginx
    2. Jalankan perintah berikut untuk melihat peristiwa pod:

      kubectl describe pod <Nama Pod>

      Dalam output perintah, tidak ada peristiwa yang menunjukkan pemeriksaan kesehatan gagal. Dalam kasus ini, pod siap. Ini tidak sesuai dengan harapan Anda.

Langkah 2: Konfigurasikan pengalihan permintaan pemeriksaan kesehatan untuk aplikasi NGINX

  1. Jalankan perintah berikut untuk mengedit file tcp-liveness.yaml:

    vim tcp-liveness.yaml

    Tambahkan konten berikut ke bidang template dalam file tcp-liveness.yaml:

    annotations:
      sidecar.istio.io/rewriteAppHTTPProbers: "true"

    Kode berikut menunjukkan contoh file tcp-liveness.yaml setelah menambahkan anotasi:

    Tampilkan File tcp-liveness.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      selector:
        matchLabels:
          app: nginx
      replicas: 1
      template:
        metadata:
          labels:
            app: nginx
          annotations:
            sidecar.istio.io/rewriteAppHTTPProbers: "true"
        spec:
          containers:
          - name: nginx
            image: nginx
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 80
            readinessProbe:
              tcpSocket:
                port: 2940
              initialDelaySeconds: 5
              periodSeconds: 3
  2. Jalankan perintah berikut untuk mendeploy aplikasi NGINX:

    kubectl apply -f tcp-liveness.yaml

Langkah 3: Verifikasi bahwa hasil pemeriksaan kesehatan sesuai dengan harapan Anda

  1. Lihat hasil pemeriksaan kesehatan aplikasi NGINX.

    1. Jalankan perintah berikut untuk melihat nama pod yang menjalankan aplikasi NGINX:

      kubectl get pod| grep nginx
    2. Jalankan perintah berikut untuk melihat peristiwa pod:

      kubectl describe pod <Nama Pod>

      Output yang Diharapkan:

      Warning  Unhealthy  45s               kubelet            Readiness probe failed: HTTP probe failed with statuscode: 500

      Output tersebut menunjukkan bahwa pemeriksaan kesehatan TCP untuk pod gagal. Ini sesuai dengan harapan Anda.

  2. Jalankan perintah berikut untuk melihat file YAML pod setelah mengonfigurasi pengalihan permintaan pemeriksaan kesehatan:

    kubectl get pod nginx-deployment-746458cdc9-m9t9q -o yaml

    Tampilkan Output yang Diharapkan

    apiVersion: v1
    kind: Pod
    metadata:
      ...
      name: nginx-deployment-746458cdc9-m9t9q
      namespace: default
      ...
    spec:
      containers:
        - args:
            - proxy
            - sidecar
            - '--domain'
            - $(POD_NAMESPACE).svc.cluster.local
            - '--proxyLogLevel=warning'
            - '--proxyComponentLogLevel=misc:error'
            - '--log_output_level=default:info'
            - '--concurrency'
            - '2'
          env:
            ...
            - name: ISTIO_KUBE_APP_PROBERS
              value: >-
                {"/app-health/nginx/readyz":{"tcpSocket":{"port":2940},"timeoutSeconds":1}}
          ...
        - image: nginx
          imagePullPolicy: IfNotPresent
          name: nginx
          ports:
            - containerPort: 80
              protocol: TCP
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /app-health/nginx/readyz
              port: 15020
              scheme: HTTP
            initialDelaySeconds: 5
            periodSeconds: 3
            successThreshold: 1
            timeoutSeconds: 1
          ...

    Setelah mengonfigurasi pengalihan permintaan pemeriksaan kesehatan, permintaan TCP asli diubah menjadi permintaan HTTP. Port pemeriksaan kesehatan juga diubah dari port 80 menjadi port 15020, serta jalur /app-health/nginx/readyz secara otomatis ditambahkan untuk pemeriksaan kesehatan HTTP. Variabel lingkungan bernama ISTIO_KUBE_APP_PROBERS ditambahkan ke kontainer sidecar pod, dengan nilainya diserialisasi dari konfigurasi pemeriksaan kesehatan TCP asli dalam format JSON.

    Port 15020 digunakan untuk menerima permintaan pemeriksaan kesehatan HTTP yang telah dikonversi, serupa dengan konfigurasi pengalihan untuk permintaan tersebut. Setelah mengonfigurasi pengalihan permintaan pemeriksaan kesehatan, layanan pilot-agent yang berjalan di kontainer sidecar akan mendengarkan port 15020. Layanan ini menerima permintaan pemeriksaan kesehatan dari layanan kubelet dan memeriksa status port pemeriksaan kesehatan TCP yang dikonfigurasikan untuk kontainer aplikasi berdasarkan nilai variabel lingkungan ISTIO_KUBE_APP_PROBERS. Jika pemeriksaan kesehatan TCP gagal, layanan pilot-agent akan mengembalikan kode status 500, yang menunjukkan bahwa pemeriksaan kesehatan tidak berhasil.