Men-deploy aplikasi

Dokumen ini menjelaskan cara men-deploy aplikasi di GKE pada Bare Metal.

Sebelum memulai

Untuk men-deploy workload, Anda harus memiliki cluster pengguna, hybrid, atau mandiri yang mampu menjalankan workload.

Membuat Deployment

Berikut adalah langkah-langkah untuk membuat Deployment pada cluster Anda:

  1. Salin manifes berikut ke file bernama my-deployment.yaml:

    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"
    
  2. Gunakan kubectl apply untuk membuat Deployment:

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

    Ganti CLUSTER_KUBECONFIG dengan jalur file kubeconfig untuk cluster Anda.

  3. Dapatkan informasi dasar tentang Deployment untuk mengonfirmasi bahwa deployment berhasil:

    kubectl get deployment my-deployment --kubeconfig CLUSTER_KUBECONFIG
    

    Output menunjukkan bahwa Deployment memiliki tiga Pod yang semuanya tersedia:

    NAME            READY   UP-TO-DATE   AVAILABLE   AGE
    my-deployment   3/3     3            3           27s
    
  4. Tampilkan daftar Pod di Deployment Anda:

    kubectl get pods --kubeconfig CLUSTER_KUBECONFIG
    

    Output menunjukkan bahwa Deployment Anda memiliki tiga Pod yang berjalan:

    NAME                             READY   STATUS    RESTARTS   AGE
    my-deployment-869f65669b-5259x   1/1     Running   0          34s
    my-deployment-869f65669b-9xfrs   1/1     Running   0          34s
    my-deployment-869f65669b-wn4ft   1/1     Running   0          34s
    
  5. Dapatkan informasi mendetail tentang Deployment Anda:

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

    Output menampilkan detail tentang spesifikasi dan status Deployment:

    apiVersion: apps/v1
    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: "2023-06-29T16:17:17Z"
        lastUpdateTime: "2023-06-29T16:17:17Z"
        message: Deployment has minimum availability.
        reason: MinimumReplicasAvailable
        status: "True"
        type: Available
      - lastTransitionTime: "2023-06-29T16:17:12Z"
        lastUpdateTime: "2023-06-29T16:17:17Z"
        message: ReplicaSet "my-deployment-869f65669b" has successfully progressed.
        reason: NewReplicaSetAvailable
        status: "True"
        type: Progressing
      observedGeneration: 1
      readyReplicas: 3
      replicas: 3
      updatedReplicas: 3
    
  6. Jelaskan tentang Deployment Anda:

    kubectl describe deployment my-deployment --kubeconfig CLUSTER_KUBECONFIG
    

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

    Name:                   my-deployment
    Namespace:              default
    CreationTimestamp:      Thu, 29 Jun 2023 16:17:12 +0000
    Labels:                 <none>
    Annotations:            deployment.kubernetes.io/revision: 1
    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:         <none>
        Host Port:    <none>
        Environment:  <none>
        Mounts:       <none>
      Volumes:        <none>
    Conditions:
      Type           Status  Reason
      ----           ------  ------
      Available      True    MinimumReplicasAvailable
      Progressing    True    NewReplicaSetAvailable
    OldReplicaSets:  <none>
    NewReplicaSet:   my-deployment-869f65669b (3/3 replicas created)
    Events:
      Type    Reason             Age    From                   Message
      ----    ------             ----   ----                   -------
      Normal  ScalingReplicaSet  6m50s  deployment-controller  Scaled up replica set my-deployment-869f65669b to 3
    

Buat Service jenis LoadBalancer

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

Untuk membuat Service jenis LoadBalancer:

  1. Salin manifes berikut ke file bernama my-service.yaml:

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

    Berikut adalah hal-hal penting yang harus dipahami tentang Layanan dalam latihan ini:

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

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

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

    Secara default, penampung hello-app memproses di port TCP 8080. Anda dapat melihat setelan port ini dengan melihat Dockerfile dan kode sumber untuk aplikasi tersebut.

  2. Gunakan kubectl apply untuk membuat Layanan di cluster Anda:

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

    Ganti CLUSTER_KUBECONFIG dengan jalur file kubeconfig untuk cluster Anda.

  3. Lihat Layanan Anda:

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

    Outputnya mirip dengan hal berikut ini:

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

    Di output sebelumnya, Anda dapat melihat bahwa Layanan Anda memiliki clusterIP dan alamat IP eksternal. Class ini juga memiliki nodePort, port, dan targetPort.

    clusterIP tidak relevan dengan latihan ini. Alamat IP eksternal (status.loadBalancer.ingress.ip) berasal dari rentang alamat yang Anda tentukan saat Anda menentukan kumpulan alamat load balancer (spec.loadBalancer.addressPools) dalam file konfigurasi cluster.

    Sebagai contoh, ambil nilai yang ditunjukkan dalam output sebelumnya untuk Layanan Anda:

    • Alamat IP eksternal: 192.168.1.13
    • port: 80
    • nodePort: 31565
    • targetPort: 8080

    Klien mengirimkan permintaan ke 192.168.1.13 pada port TCP 80. Permintaan dirutekan ke load balancer Anda, lalu diteruskan ke Pod anggota di port TCP 8080.

  4. Hubungi Layanan Anda:

    curl INGRESS_IP_ADDRESS
    

    Ganti INGRESS_IP_ADDRESS dengan alamat IP ingress di bagian status pada Layanan yang Anda ambil pada langkah sebelumnya (status.loadBalancer.ingress).

    Output akan menampilkan pesan Hello, world!:

    Hello, world!
    Version: 2.0.0
    Hostname: my-deployment-869f65669b-wn4ft
    

Batas port LoadBalancer

Jenis LoadBalancer adalah ekstensi dari jenis NodePort. Jadi, Service jenis LoadBalancer memiliki alamat IP cluster dan satu atau beberapa nilai nodePort. Secara default, Kubernetes mengalokasikan port node ke Layanan jenis LoadBalancer. Alokasi ini dapat menghabiskan port node yang tersedia dengan cepat dari 2.768 yang dialokasikan untuk cluster Anda. Untuk menyimpan port node, nonaktifkan alokasi port node load balancer dengan menetapkan kolom allocateLoadBalancerNodePorts ke false dalam spesifikasi Layanan LoadBalancer. Dengan setelan ini, Kubernetes tidak akan mengalokasikan port node ke LoadBalancer Services. Untuk mengetahui informasi selengkapnya, baca Menonaktifkan alokasi NodePort load balancer dalam dokumentasi Kubernetes.

Berikut adalah manifes untuk membuat Layanan yang tidak menggunakan port node mana pun:

apiVersion: v1
kind: Service
metadata:
  name: service-does-not-use-nodeports
spec:
  selector:
    app: my-app
  type: LoadBalancer
  ports:
  - port: 8000
  # Set allocateLoadBalancerNodePorts to false
  allocateLoadBalancerNodePorts: false

Menghapus Layanan Anda

Untuk menghapus Layanan Anda:

  1. Gunakan kubectl delete untuk menghapus Layanan dari cluster Anda:

    kubectl delete service my-service --kubeconfig CLUSTER_KUBECONFIG
    
  2. Verifikasi bahwa Layanan Anda telah dihapus:

    kubectl get services --kubeconfig CLUSTER_KUBECONFIG
    

    Output tidak lagi menampilkan my-service.

Menghapus Deployment Anda

Untuk menghapus Deployment:

  1. Gunakan kubectl delete untuk menghapus Deployment dari cluster Anda:

    kubectl delete deployment my-deployment --kubeconfig CLUSTER_KUBECONFIG
    

    Verifikasi bahwa Deployment Anda telah dihapus:

    kubectl get deployments --kubeconfig CLUSTER_KUBECONFIG
    

    Output tidak lagi menampilkan my-deployment.

Langkah selanjutnya

Membuat Layanan dan Ingress