全部产品
Search
文档中心

Elastic Container Instance:Menyebarkan aplikasi Bookinfo di Istio

更新时间:Jun 29, 2025

Istio adalah service mesh sumber terbuka yang menyediakan manajemen lalu lintas, observabilitas, keamanan, dan kemampuan kebijakan. Dengan integrasi Istio dan Kubernetes, Anda dapat mengelola serta mengontrol aplikasi kontainer dengan lebih baik, meningkatkan performa, keamanan, dan keandalannya. Panduan ini menjelaskan cara menggunakan Istio untuk menyebarkan aplikasi Bookinfo di kluster Kubernetes yang dikelola sendiri dan terhubung ke Elastic Container Instance melalui VNode.

Informasi latar belakang

Istio adalah platform service mesh sumber terbuka yang digunakan untuk mengelola lalu lintas antar layanan mikro, menangani komunikasi jaringan, dan mitigasi risiko keamanan. Istio dapat diintegrasikan dengan Kubernetes untuk menyediakan manajemen lalu lintas yang standar dan aman, serta menyederhanakan penyebaran dan operasi pemeliharaan (O&M).

Bookinfo meniru entri katalog tunggal dari toko buku online, menampilkan informasi seperti deskripsi buku, detail ISBN, jumlah halaman, dan ulasan. Aplikasi ini bersifat heterogen, terdiri dari empat layanan mikro yang ditulis dalam berbagai bahasa untuk mendemonstrasikan fitur-fitur Istio. Arsitektur ujung-ke-ujung Bookinfo:

bookinfo

  • Productpage: Layanan mikro Python yang memanggil layanan Details dan Reviews untuk menghasilkan halaman. Productpage juga menyediakan fitur logon dan logoff.

  • Details: Layanan mikro Ruby yang menyediakan informasi buku.

  • Reviews: Layanan mikro Java yang menyediakan ulasan buku. Terdapat tiga versi layanan ini:

    • Versi 1, tidak memanggil layanan Ratings.

    • Versi 2, memanggil layanan Ratings dan memberi peringkat buku menggunakan satu hingga lima bintang hitam.

    • Versi 3, memanggil layanan Ratings dan memberi peringkat buku menggunakan satu hingga lima bintang merah.

  • Ratings: Layanan mikro Node.js yang menyediakan peringkat berdasarkan ulasan buku.

Untuk informasi lebih lanjut, kunjungi Istio.

Prasyarat

Panduan ini berlaku untuk kluster Kubernetes yang dikelola sendiri. Pastikan kluster Anda memenuhi kondisi berikut:

  • VNode telah diterapkan di kluster Kubernetes yang dikelola sendiri.

  • Jika kluster Kubernetes yang dikelola sendiri diterapkan di pusat data, pastikan pusat data tersebut terhubung ke Alibaba Cloud.

  • Jika kluster Kubernetes yang dikelola sendiri diterapkan pada instance Elastic Compute Service (ECS) dan plug-in jaringan adalah Flannel, pastikan cloud control manager (CCM) Kubernetes telah diterapkan di kluster. Hal ini memastikan bahwa Elastic Container Instance saling terhubung dengan pod pada node nyata. Untuk informasi lebih lanjut, lihat Menyebarkan CCM.

Persiapan

  1. Instal Istio. Untuk informasi lebih lanjut, lihat Memulai.

  2. Buat namespace dan konfigurasikan label untuk namespace tersebut.

    kubectl create namespace istio-test
    kubectl label namespace istio-test istio-injection=enabled

Prosedur

Menyebarkan aplikasi Bookinfo

  1. Buat file bernama bookinfo.yaml dan salin template berikut ke dalam file:

    Catatan

    Dalam contoh kode YAML berikut, nodeSelectors ditambahkan untuk menjadwalkan pod ke VNode. Anda juga dapat mengonfigurasi eci-profile untuk menjadwalkan pod ke VNode. Untuk informasi lebih lanjut, lihat Jadwalkan Pod ke VNode dan Gunakan eci-profile untuk Menjadwalkan Pod ke VNode.

    Buka File bookinfo.yaml

    # Hak Cipta Istio Authors
    #
    #   Berlisensi di bawah Apache License, Versi 2.0 (the "License");
    #   Anda tidak dapat menggunakan file ini kecuali sesuai dengan Lisensi.
    #   Anda dapat memperoleh salinan Lisensi di
    #
    #       http://www.apache.org/licenses/LICENSE-2.0
    #
    #   Kecuali diwajibkan oleh hukum yang berlaku atau disepakati secara tertulis, perangkat lunak
    #   yang didistribusikan di bawah Lisensi ini didistribusikan pada basis "SEBAGAIMANA ADANYA",
    #   TANPA JAMINAN ATAU KONDISI APA PUN, baik tersurat maupun tersirat.
    #   Lihat Lisensi untuk bahasa spesifik yang mengatur izin dan
    #   batasan di bawah Lisensi.
    
    ##################################################################################################
    # File ini mendefinisikan layanan, akun layanan, dan penyebaran untuk sampel Bookinfo.
    #
    # Untuk menerapkan semua 4 layanan Bookinfo, akun layanan mereka yang sesuai, dan penyebaran:
    #
    #   kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
    #
    # Sebagai alternatif, Anda dapat menyebarkan sumber daya apa pun secara terpisah:
    #
    #   kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -l service=reviews # reviews Service
    #   kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -l account=reviews # reviews ServiceAccount
    #   kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -l app=reviews,version=v3 # reviews-v3 Deployment
    ##################################################################################################
    
    ##################################################################################################
    # Layanan Details
    ##################################################################################################
    apiVersion: v1
    kind: Service
    metadata:
      name: details
      labels:
        app: details
        service: details
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: details
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: bookinfo-details
      labels:
        account: details
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: details-v1
      labels:
        app: details
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: details
          version: v1
      template:
        metadata:
          labels:
            app: details
            version: v1
        spec:
          nodeSelector:     # Konfigurasikan nodeSelector.
            k8s.aliyun.com/vnode: "true"
          tolerations:      # Konfigurasikan toleration.
          - key: k8s.aliyun.com/vnode
            operator: "Equal"
            value: "true"
            effect: "NoSchedule"
          serviceAccountName: bookinfo-details
          containers:
          - name: details
            image: docker.io/istio/examples-bookinfo-details-v1:1.16.4
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080
            securityContext:
              runAsUser: 1000
    ---
    ##################################################################################################
    # Layanan Ratings
    ##################################################################################################
    apiVersion: v1
    kind: Service
    metadata:
      name: ratings
      labels:
        app: ratings
        service: ratings
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: ratings
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: bookinfo-ratings
      labels:
        account: ratings
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ratings-v1
      labels:
        app: ratings
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ratings
          version: v1
      template:
        metadata:
          labels:
            app: ratings
            version: v1
        spec:
          nodeSelector:     # Konfigurasikan nodeSelector.
            k8s.aliyun.com/vnode: "true"
          tolerations:      # Konfigurasikan toleration.
          - key: k8s.aliyun.com/vnode
            operator: "Equal"
            value: "true"
            effect: "NoSchedule"
          serviceAccountName: bookinfo-ratings
          containers:
          - name: ratings
            image: docker.io/istio/examples-bookinfo-ratings-v1:1.16.4
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080
            securityContext:
              runAsUser: 1000
    ---
    ##################################################################################################
    # Layanan Reviews
    ##################################################################################################
    apiVersion: v1
    kind: Service
    metadata:
      name: reviews
      labels:
        app: reviews
        service: reviews
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: reviews
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: bookinfo-reviews
      labels:
        account: reviews
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: reviews-v1
      labels:
        app: reviews
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: reviews
          version: v1
      template:
        metadata:
          labels:
            app: reviews
            version: v1
        spec:
          nodeSelector:     # Konfigurasikan nodeSelector.
            k8s.aliyun.com/vnode: "true"
          tolerations:      # Konfigurasikan toleration.
          - key: k8s.aliyun.com/vnode
            operator: "Equal"
            value: "true"
            effect: "NoSchedule"
          serviceAccountName: bookinfo-reviews
          containers:
          - name: reviews
            image: docker.io/istio/examples-bookinfo-reviews-v1:1.16.4
            imagePullPolicy: IfNotPresent
            env:
            - name: LOG_DIR
              value: "/tmp/logs"
            ports:
            - containerPort: 9080
            volumeMounts:
            - name: tmp
              mountPath: /tmp
            - name: wlp-output
              mountPath: /opt/ibm/wlp/output
            securityContext:
              runAsUser: 1000
          volumes:
          - name: wlp-output
            emptyDir: {}
          - name: tmp
            emptyDir: {}
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: reviews-v2
      labels:
        app: reviews
        version: v2
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: reviews
          version: v2
      template:
        metadata:
          labels:
            app: reviews
            version: v2
        spec:
          nodeSelector:     # Konfigurasikan nodeSelector.
            k8s.aliyun.com/vnode: "true"
          tolerations:      # Konfigurasikan toleration.
          - key: k8s.aliyun.com/vnode
            operator: "Equal"
            value: "true"
            effect: "NoSchedule"
          serviceAccountName: bookinfo-reviews
          containers:
          - name: reviews
            image: docker.io/istio/examples-bookinfo-reviews-v2:1.16.4
            imagePullPolicy: IfNotPresent
            env:
            - name: LOG_DIR
              value: "/tmp/logs"
            ports:
            - containerPort: 9080
            volumeMounts:
            - name: tmp
              mountPath: /tmp
            - name: wlp-output
              mountPath: /opt/ibm/wlp/output
            securityContext:
              runAsUser: 1000
          volumes:
          - name: wlp-output
            emptyDir: {}
          - name: tmp
            emptyDir: {}
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: reviews-v3
      labels:
        app: reviews
        version: v3
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: reviews
          version: v3
      template:
        metadata:
          labels:
            app: reviews
            version: v3
        spec:
          nodeSelector:     # Konfigurasikan nodeSelector.
            k8s.aliyun.com/vnode: "true"
          tolerations:      # Konfigurasikan toleration.
          - key: k8s.aliyun.com/vnode
            operator: "Equal"
            value: "true"
            effect: "NoSchedule"
          serviceAccountName: bookinfo-reviews
          containers:
          - name: reviews
            image: docker.io/istio/examples-bookinfo-reviews-v3:1.16.4
            imagePullPolicy: IfNotPresent
            env:
            - name: LOG_DIR
              value: "/tmp/logs"
            ports:
            - containerPort: 9080
            volumeMounts:
            - name: tmp
              mountPath: /tmp
            - name: wlp-output
              mountPath: /opt/ibm/wlp/output
            securityContext:
              runAsUser: 1000
          volumes:
          - name: wlp-output
            emptyDir: {}
          - name: tmp
            emptyDir: {}
    ---
    ##################################################################################################
    # Layanan Productpage
    ##################################################################################################
    apiVersion: v1
    kind: Service
    metadata:
      name: productpage
      labels:
        app: productpage
        service: productpage
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: productpage
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: bookinfo-productpage
      labels:
        account: productpage
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: productpage-v1
      labels:
        app: productpage
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: productpage
          version: v1
      template:
        metadata:
          labels:
            app: productpage
            version: v1
        spec:
          nodeSelector:     # Konfigurasikan nodeSelector.
            k8s.aliyun.com/vnode: "true"
          tolerations:      # Konfigurasikan toleration.
          - key: k8s.aliyun.com/vnode
            operator: "Equal"
            value: "true"
            effect: "NoSchedule"
          serviceAccountName: bookinfo-productpage
          containers:
          - name: productpage
            image: docker.io/istio/examples-bookinfo-productpage-v1:1.16.4
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080
            volumeMounts:
            - name: tmp
              mountPath: /tmp
            securityContext:
              runAsUser: 1000
          volumes:
          - name: tmp
            emptyDir: {}
    ---
  2. Sebarkan aplikasi Bookinfo.

    kubectl -n istio-test apply -f bookinfo.yaml

    Keluaran perintah berikut dikembalikan:

    istio-1

  3. Lihat status Bookinfo.

    kubectl -n istio-test get pods -o wide

    Keluaran perintah berikut dikembalikan:

    istio-2

  4. Periksa layanan mikro Bookinfo.

    kubectl -n istio-test get services

    Keluaran perintah berikut dikembalikan:

    istio-3

Sebarkan gateway Istio

  1. Buat file bernama bookinfo-gateway.yaml dan salin template berikut ke dalam file:

    Buka File bookinfo-gateway.yaml

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: bookinfo-gateway
    spec:
      selector:
        istio: ingressgateway # gunakan pengontrol default istio
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - "*"
    ---
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: bookinfo
    spec:
      hosts:
      - "*"
      gateways:
      - bookinfo-gateway
      http:
      - match:
        - uri:
            exact: /productpage
        - uri:
            prefix: /static
        - uri:
            exact: /login
        - uri:
            exact: /logout
        - uri:
            prefix: /api/v1/products
        route:
        - destination:
            host: productpage
            port:
              number: 9080
  2. Sebarkan gateway Istio.

    kubectl -n istio-test apply -f bookinfo-gateway.yaml

    Keluaran perintah berikut dikembalikan: istio-4

  3. Lihat gateway Istio.

    kubectl -n istio-test get gateway

    Keluaran perintah berikut dikembalikan:

    istio-5

Verifikasi layanan mikro Bookinfo

  1. Peroleh alamat host gateway Istio.

    Pilih Layanan Ingress Istio berdasarkan jenis kluster. Dalam panduan ini, pilih LoadBalancer sebagai Layanan Ingress Istio.

    kubectl -n istio-system get service istio-ingressgateway

    Keluaran perintah berikut dikembalikan:

    istio-6

    Parameter istio-ingressgateway dari pesan yang dikembalikan menunjukkan alamat host (dalam format IP:Port) dari Istio Ingress Gateway. Dalam panduan ini, alamat host adalah 10.96.XX.XX:80.

  2. Buat pod uji untuk memverifikasi layanan mikro Bookinfo.

    1. Buat file bernama test-pod.yaml dan salin template berikut ke dalam file:

      Buka File test-pod.yaml

      apiVersion: v1
      kind: Pod
      metadata:
        name: centos
      spec:
        nodeSelector:    
          k8s.aliyun.com/vnode: "true"
        tolerations:      
        - key: k8s.aliyun.com/vnode
          operator: "Equal"
          value: "true"
          effect: "NoSchedule"
        containers:
        - name: eip
          image: registry-vpc.cn-shanghai.aliyuncs.com/eci_open/centos:7
          command:
          - bash
          - -c
          - sleep inf
    2. Sebarkan pod.

      kubectl apply -f test-pod.yaml
  3. Masuk ke pod uji dan jalankan perintah berikut untuk memverifikasi layanan mikro Bookinfo.

    kubectl exec -it centos -- bash
    curl -s http://10.96.XX.XX:80/productpage | grep -o "<title>.*</title>"

    Ganti 10.96.XX.XX:80 dengan alamat host yang Anda peroleh di langkah 1. Jika <title>Simple BookStore App<title> dikembalikan, Istio berjalan di VNode. Contoh keluaran perintah:

    istio-7