Men-deploy aplikasi

Dokumen ini memberikan contoh cara men-deploy aplikasi di cluster pengguna untuk GKE di VMware.

Sebelum memulai

Untuk contoh yang diberikan di sini, Anda memerlukan cluster pengguna yang menggunakan load balancing MetalLB paket. Untuk mengetahui petunjuk cara membuat cluster pengguna minimal yang menggunakan MetalLB, lihat Membuat cluster dasar.

Anda dapat menggunakan konsol Google Cloud atau alat command line kubectl di workstation admin untuk men-deploy aplikasi.

Konsol

  1. Di konsol, buka halaman ringkasan cluster Google Kubernetes Engine.

    Buka cluster GKE

  2. Klik cluster pengguna pada daftar cluster, dan pastikan Anda sudah login ke cluster.

    Jika belum login ke cluster pengguna, login dengan mengikuti petunjuk di Mengelola cluster dari Konsol Google Cloud.

Container

  1. Di bagian Penampung baru, pilih Image container yang sudah ada.

  2. Untuk Image path, masukkan us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0.

  3. Klik Lanjutkan.

Konfigurasi

  1. Untuk Deployment name, masukkan my-deployment.

  2. Untuk Namespace, masukkan default.

  3. Masukkan dua label ini:

    • Kunci 1: app, Nilai 1: metrics
    • Kunci 2: department, Nilai 2 sales
  4. Di drop-down cluster Kubernetes, pilih cluster Anda.

  5. Klik Lanjutkan.

Mengekspos

  1. Centang Mengekspos deployment sebagai layanan baru.

  2. Untuk Port 1, masukkan 80.

  3. Untuk Port target 1, masukkan 8080. Ini adalah nilai yang sesuai karena penampung hello-app memproses port 8080 TCP secara default. Anda dapat melihatnya dengan melihat Dockerfile dan kode sumber untuk aplikasi tersebut.

  4. Untuk Protocol 1, pilih TCP.

  5. Untuk Service type, pilih LoadBalancer.

Di bagian bawah halaman, klik tombol Deploy.

Melihat detail Deployment dan Layanan

  1. Jika Deployment sudah siap, halaman Detail deployment akan terbuka di bagian beban kerja Kubernetes pada Konsol Google Cloud. Di halaman ini, Anda dapat melihat detail tentang Deployment dan ketiga Pod-nya.

  2. Di bagian Exposing services, klik nama Layanan yang mengekspos Deployment Anda. Untuk latihan ini, namanya adalah my-deployment-service.

  3. Halaman Detail layanan akan terbuka. Di halaman ini, Anda dapat melihat detail tentang Layanan. Misalnya, Anda dapat melihat bahwa setiap Pod yang memiliki label app: metrics dan department: sales adalah anggota Service. Ingat kembali bahwa Pod di my-deployment memiliki label ini.

Anda juga dapat melihat nilai untuk Load balancer IP. IP load balancer telah dikonfigurasi secara otomatis di load balancer cluster.

Penerusan untuk Layanan

Misalkan klien di luar cluster mengirimkan permintaan ke IP load balancer pada TCP port 80. Permintaan akan dirutekan ke load balancer cluster. Load balancer meneruskan permintaan ke Pod anggota di TCP port 8080. Ingat kembali bahwa setiap Pod di my-deployment memiliki container yang memproses di TCP port 8080.

Menguji Layanan Anda

Buka mesin tempat IP load balancer dapat dirutekan.

Untuk memanggil Service, masukkan IP load balancer di browser, atau gunakan perintah seperti curl. Contoh:

curl [LOAD_BALANCER_IP]:80

Output akan menampilkan pesan Hello, world!. Contoh:

curl 203.0.113.1:80
Hello, world!
Version: 2.0.0
Hostname: my-deployment-dbd86c8c4-9wpbv

Menghapus Deployment

Buka halaman Workloads di bagian Kubernetes Engine pada konsol.

Buka halaman Workloads

Dalam daftar Deployment, pilih my-deployment.

Di bagian atas halaman, klik Hapus. Tindakan ini akan menghapus Deployment dan Service mengekspos.

Command line

Menghubungkan ke workstation admin

Mendapatkan koneksi SSH ke workstation admin Anda. Lakukan langkah-langkah berikut di workstation admin Anda.

Membuat Deployment

Berikut manifes untuk Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  selector:
    matchLabels:
      app: metrics
      department: sales
  replicas: 3
  template:
    metadata:
      labels:
        app: metrics
        department: sales
    spec:
      containers:
      - name: hello
        image: "us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0"

Salin manifes ke file bernama my-deployment.yaml, lalu buat Deployment:

kubectl apply --kubeconfig USER_CLUSTER_KUBECONFIG -f my-deployment.yaml

dengan USER_CLUSTER_KUBECONFIG adalah jalur file kubeconfig untuk cluster pengguna Anda.

Dapatkan informasi dasar tentang Deployment Anda:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get deployment my-deployment

Output menunjukkan bahwa Deployment memiliki tiga Pod yang semuanya tersedia:

NAME            READY   UP-TO-DATE   AVAILABLE   AGE
my-deployment   3/3     3            3           27s

Tampilkan daftar Pod di Deployment Anda:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get pods

Output menunjukkan bahwa Deployment Anda memiliki tiga Pod yang berjalan:

NAME                             READY   STATUS    RESTARTS   AGE
my-deployment-54944c8d55-4srm2   1/1     Running   0          6s
my-deployment-54944c8d55-7z5nn   1/1     Running   0          6s
my-deployment-54944c8d55-j62n9   1/1     Running   0          6s

Dapatkan informasi mendetail tentang Deployment Anda:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get deployment my-deployment --output yaml

Output menampilkan detail tentang spesifikasi dan status Deployment:

kind: Deployment
metadata:
  ...
  generation: 1
  name: my-deployment
  namespace: default
  ...
spec:
  ...
  replicas: 3
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: metrics
      department: sales
  ...
    spec:
      containers:
      - image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0
        imagePullPolicy: IfNotPresent
        name: hello
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
status:
  availableReplicas: 3
  conditions:
  ‑ lastTransitionTime: "2019-11-11T18:44:02Z"
    lastUpdateTime: "2019-11-11T18:44:02Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  ‑ lastTransitionTime: "2019-11-11T18:43:58Z"
    lastUpdateTime: "2019-11-11T18:44:02Z"
    message: ReplicaSet "my-deployment-54944c8d55" has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing
  observedGeneration: 1
  readyReplicas: 3
  replicas: 3
  updatedReplicas: 3

Jelaskan tentang Deployment Anda:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG describe deployment my-deployment

Output menunjukkan detail yang diformat dengan baik tentang Deployment, termasuk ReplicaSet terkait:

Name:                   my-deployment
Namespace:              default
CreationTimestamp:      Mon, 11 Nov 2019 10:43:58 -0800
Labels:                 
...
Selector:               app=metrics,department=sales
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=metrics
           department=sales
  Containers:
    hello:
    Image:        us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0
    Port:         
    Host Port:    
    Environment:  
    Mounts:       
  Volumes:        
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  
NewReplicaSet:   my-deployment-54944c8d55 (3/3 replicas created)

Membuat Layanan jenis LoadBalancer

Salah satu cara untuk mengekspos Deployment ke klien di luar cluster adalah dengan membuat Service Kubernetes jenis LoadBalancer.

Berikut adalah manifes untuk Layanan jenis LoadBalancer:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: metrics
    department: sales
  type: LoadBalancer
  ports:
  ‑ port: 80
    targetPort: 8080

Untuk tujuan latihan ini, berikut adalah hal-hal penting yang perlu dipahami tentang Layanan:

  • Setiap Pod yang memiliki label app: metrics dan label department: sales adalah anggota Layanan. Perhatikan bahwa Pod di my-deployment memiliki label ini.

  • Saat klien mengirim permintaan ke Layanan di TCP port 80, permintaan tersebut diteruskan ke Pod anggota di port TCP 8080.

  • Setiap Pod anggota harus memiliki container yang memantau port TCP 8080.

Hal ini terjadi secara default, penampung hello-app memproses port TCP 8080. Anda dapat melihatnya dengan melihat Dockerfile dan kode sumber aplikasi tersebut.

Simpan manifes ke file bernama my-service.yaml, lalu buat Service:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG apply -f my-service.yaml

dengan USER_CLUSTER_KUBECONFIG adalah jalur file kubeconfig untuk cluster pengguna Anda.

Saat Anda membuat Layanan, GKE di VMware otomatis mengonfigurasi alamat loadBalancerIP pada load balancer cluster.

Lihat Layanan Anda:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get service my-service --output yaml

Outputnya mirip dengan ini:

kind: Service
metadata:
  ...
  name: my-service
  namespace: default
  ...
spec:
  allocateLoadBalancerNodePorts: true
  clusterIP: 10.96.1.39
  clusterIPs:
  - 10.96.1.39
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - nodePort: 31184
    port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: metrics
    department: sales
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 203.0.113.1

Pada output sebelumnya, Anda dapat melihat bahwa Layanan Anda memiliki clusterIP, dan loadBalancerIP. Class ini juga memiliki port dan targetPort.

clusterIP tidak relevan dengan latihan ini. loadBalancerIP adalah alamat IP yang dapat digunakan klien di luar cluster untuk memanggil Layanan.

Sebagai contoh, ambil nilai yang ditunjukkan dalam output sebelumnya. Dengan begitu, Layanan Anda memiliki loadBalancerIP = 203.0.113.1, port = 80, dan targetPort = 8.080.

Klien mengirimkan permintaan ke 203.0.113.1 pada TCP port 80. Permintaan akan dirutekan ke load balancer cluster. Load balancer meneruskan permintaan ke Pod anggota di TCP port 8080.

Hubungi Layanan Anda:

curl LOAD_BALANCER_IP

Output akan menampilkan pesan Hello, world!:

curl 203.0.113.1
Hello, world!
Version: 2.0.0
Hostname: my-deployment-dbd86c8c4-9wpbv

Menghapus Layanan Anda

Hapus Layanan Anda:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG delete service my-service

Verifikasi bahwa Layanan Anda telah dihapus:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get services

Output tidak lagi menampilkan my-service.

Menghapus Deployment Anda

Hapus Deployment Anda:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG delete deployment my-deployment

Verifikasi bahwa Deployment Anda telah dihapus:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get deployments

Output tidak lagi menampilkan my-deployment.

Langkah selanjutnya

Membuat Layanan dan Ingress