Men-deploy aplikasi server web dalam container


Tutorial ini menjelaskan cara mengupload aplikasi container di lingkungan perlengkapan air-gapped Google Distributed Cloud (GDC), dan menjalankan aplikasi tersebut di lingkungan perlengkapan. Anda akan mempelajari cara membuat project Harbor, mengupload image ke Harbor, dan membuat workload sebagai bagian dari tutorial ini. Beban kerja yang di-container berjalan dalam namespace project.

Lingkungan appliance air gap GDC dilengkapi dengan registry Harbor yang telah dikonfigurasi sebelumnya bernama tear-harbor untuk Anda di project GDC bernama tear. Anda akan menggunakan registri ini dalam contoh ini.

Tutorial ini menggunakan aplikasi server web contoh yang tersedia dari Google Cloud Artifact Registry.

Tujuan

  • Kirim image container ke registry Harbor terkelola.
  • Deploy aplikasi container contoh ke cluster.

Sebelum memulai

  1. Pastikan Anda memiliki project untuk mengelola deployment dalam container. Buat project jika Anda belum memilikinya.

  2. Tetapkan namespace project Anda sebagai variabel lingkungan:

    export NAMESPACE=PROJECT_NAMESPACE
    
  3. Download dan instal gdcloud CLI.

  4. Minta Admin IAM Organisasi Anda untuk memberi Anda peran berikut:

    • Peran Namespace Admin (namespace-admin) untuk namespace project Anda. Peran ini diperlukan untuk men-deploy workload container di project Anda.

    • Peran Harbor Instance Viewer (harbor-instance-viewer) untuk namespace project Anda. Peran ini diperlukan untuk melihat dan memilih instance Harbor.

    • Peran Harbor Project Creator (harbor-project-creator) untuk namespace project Anda. Peran ini diperlukan untuk mengakses dan mengelola project Harbor.

  5. Login ke cluster Kubernetes dan buat file kubeconfig-nya dengan identitas pengguna. Pastikan Anda menetapkan jalur kubeconfig sebagai variabel lingkungan:

    export KUBECONFIG=CLUSTER_KUBECONFIG
    

Membuat project Harbor di registry

GDC menyediakan Harbor sebagai Layanan, yang merupakan layanan terkelola sepenuhnya yang memungkinkan Anda menyimpan dan mengelola image container menggunakan Harbor.

Untuk menggunakan Harbor sebagai Layanan, Anda harus membuat project Harbor dalam instance registry tear-harbor untuk mengelola image container Anda:

  1. Anda memerlukan URL tear-harbor. Mencantumkan URL instance:

    gdcloud harbor instances describe tear-harbor --project=tear
    

    Outputnya mirip dengan harbor-1.org-1.zone1.google.gdc.test.

  2. Tetapkan URL instance sebagai variabel untuk digunakan nanti dalam tutorial:

    export INSTANCE_URL=INSTANCE_URL
    
  3. Sebelum membuat project, Anda harus login ke Harbor menggunakan URL dari langkah sebelumnya. Gunakan browser untuk membuka URL ini dan login ke instance Harbor.

  4. Buat project Harbor:

    gdcloud harbor harbor-projects create HARBOR_PROJECT \
        --project=tear \
        --instance=tear-harbor
    

    Ganti HARBOR_PROJECT dengan nama project Harbor yang akan dibuat. Anda tidak dapat membuat project Harbor di namespace project mana pun. Anda harus menggunakan project tear.

  5. Tetapkan nama project Harbor sebagai variabel untuk digunakan nanti dalam tutorial:

    export HARBOR_PROJECT=HARBOR_PROJECT
    

Konfigurasi Docker

Untuk menggunakan Docker di Harbor registry, selesaikan langkah-langkah berikut:

  1. Mengonfigurasi Docker agar memercayai Harbor sebagai Layanan. Untuk mengetahui informasi selengkapnya, lihat Mengonfigurasi Docker agar memercayai CA root Harbor.

  2. Mengonfigurasi autentikasi Docker ke Harbor. Untuk mengetahui informasi selengkapnya, lihat Mengonfigurasi autentikasi Docker ke instance registry Harbor.

  3. Karena tear-harbor adalah registry Harbor yang telah dikonfigurasi sebelumnya, Anda harus memercayai sertifikat yang ditandatangani oleh CA internal air-gapped Google Distributed Cloud:

    1. Minta IO Anda untuk memberikan informasi berikut:

      1. URL eksternal cluster Harbor.
      2. file .crt CA internal Google Distributed Cloud dengan air gap. File umumnya disimpan di control plane sebagai secret dengan nama trust-store-internal-only di namespace anthos-creds.
    2. Mirip dengan langkah sebelumnya, buat folder dengan nama URL eksternal cluster Harbor dan simpan file .crt di dalam folder.

Buat secret penarikan image Kubernetes

Karena Anda menggunakan project Harbor pribadi, Anda harus membuat secret penarikan image Kubernetes.

  1. Tambahkan akun robot project Harbor. Ikuti langkah-langkah di UI Harbor untuk membuat akun robot dan menyalin token rahasia robot: https://goharbor.io/docs/2.8.0/working-with-projects/project-configuration/create-robot-accounts/#add-a-robot-account.

  2. Catat nama akun project robot baru, yang memiliki sintaksis berikut:

    <PREFIX><PROJECT_NAME>+<ACCOUNT_NAME>
    

    Misalnya, format nama akun project robot menyerupai harbor@library+artifact-account.

    Untuk mengetahui informasi selengkapnya tentang cara menemukan nama akun project robot Anda di Harbor, lihat dokumentasi Harbor: https://goharbor.io/docs/2.8.0/working-with-projects/project-configuration/create-robot-accounts/#view-project-robot-accounts.

  3. Login ke Docker dengan akun robot project Harbor dan token rahasia Anda:

    docker login ${INSTANCE_URL}
    

    Jika diminta, masukkan nama akun project robot untuk Username dan token rahasia untuk Password.

  4. Tetapkan nama arbitrer untuk secret penarikan image:

    export SECRET=SECRET
    
  5. Buat secret yang diperlukan untuk penarikan image:

    kubectl create secret docker-registry ${SECRET}  \
        --from-file=.dockerconfigjson=DOCKER_CONFIG \
        -n NAMESPACE
    

    Ganti kode berikut:

    • DOCKER_CONFIG: jalur ke file .docker/config.json.
    • NAMESPACE: namespace untuk secret yang Anda buat.

Mengirim image container ke managed Harbor registry

Untuk tutorial ini, Anda akan mendownload dan mengirim image server web nginx ke registry Harbor yang dikelola, dan menggunakannya untuk men-deploy aplikasi server web nginx contoh ke cluster Kubernetes. Aplikasi server web nginx tersedia dari Artifact Registry Google Cloud publik.

  1. Tarik image nginx dari Google Cloud Artifact Registry ke workstation lokal Anda menggunakan jaringan eksternal:

    docker pull gcr.io/cloud-marketplace/google/nginx:1.25
    
  2. Tetapkan nama gambar. Format nama image lengkap adalah sebagai berikut:

    ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx
    
  3. Beri tag pada image lokal dengan nama repositori:

    docker tag gcr.io/cloud-marketplace/google/nginx:1.25 ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
    
  4. Kirim image container nginx ke managed Harbor registry Anda:

    docker push ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
    

Men-deploy aplikasi container contoh

Sekarang Anda siap men-deploy image container nginx ke cluster appliance.

Kubernetes merepresentasikan aplikasi sebagai resource Pod, yaitu unit skalabel yang menampung satu atau beberapa container. Pod adalah unit terkecil yang dapat di-deploy di Kubernetes. Biasanya, Anda men-deploy pod sebagai serangkaian replika yang dapat diskalakan dan didistribusikan bersama-sama di seluruh cluster. Salah satu cara untuk men-deploy set replika adalah melalui Deployment Kubernetes.

Di bagian ini, Anda akan membuat Deployment Kubernetes untuk menjalankan aplikasi container nginx di cluster Anda. Deployment ini memiliki replika, atau pod. Satu pod Deployment hanya berisi satu container: image container nginx. Anda juga membuat resource Service yang menyediakan cara stabil bagi klien untuk mengirim permintaan ke pod Deployment Anda.

Deploy server web nginx:

  1. Buat dan deploy resource kustom Deployment dan Service Kubernetes:

    kubectl --kubeconfig ${KUBECONFIG} -n ${NAMESPACE} \
    create -f - <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
            ports:
            - containerPort: 80
          imagePullSecrets:
          - name: ${SECRET}
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service
    spec:
      selector:
        app: nginx
      ports:
        - port: 80
          protocol: TCP
      type: LoadBalancer
    EOF
    
  2. Pastikan pod dibuat oleh deployment:

    kubectl get pods -l app=nginx -n ${NAMESPACE}
    

    Outputnya mirip dengan hal berikut ini:

    NAME                                READY     STATUS    RESTARTS   AGE
    nginx-deployment-1882529037-6p4mt   1/1       Running   0          1h
    nginx-deployment-1882529037-p29za   1/1       Running   0          1h
    nginx-deployment-1882529037-s0cmt   1/1       Running   0          1h
    
  3. Buat kebijakan jaringan untuk mengizinkan semua traffic jaringan ke namespace:

    kubectl --kubeconfig ${KUBECONFIG} -n ${NAMESPACE} \
    create -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      annotations:
      name: allow-all
    spec:
      ingress:
      - from:
        - ipBlock:
            cidr: 0.0.0.0/0
      podSelector: {}
      policyTypes:
      - Ingress
    EOF
    
  4. Ekspor alamat IP untuk layanan nginx:

      export IP=`kubectl --kubeconfig=${KUBECONFIG} get service nginx-service \
          -n ${NAMESPACE} -o jsonpath='{.status.loadBalancer.ingress[*].ip}'`
    
  5. Uji alamat IP server nginx menggunakan curl:

      curl http://$IP
    

Langkah berikutnya

  • Baca dokumentasi penampung untuk mengetahui informasi tentang cara mengelola penampung.