Dokumen ini menjelaskan cara men-deploy aplikasi di Google Distributed Cloud.
Sebelum memulai
Untuk men-deploy workload, Anda harus memiliki cluster pengguna, hybrid, atau mandiri yang dapat menjalankan workload.
Membuat Deployment
Langkah-langkah berikut akan membuat Deployment di cluster Anda:
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"
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.
Dapatkan informasi dasar tentang Deployment Anda untuk mengonfirmasi bahwa Deployment berhasil dibuat:
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
Cantumkan Pod di Deployment Anda:
kubectl get pods --kubeconfig CLUSTER_KUBECONFIG
Output menunjukkan bahwa Deployment Anda memiliki tiga Pod yang sedang 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
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
Jelaskan Deployment Anda:
kubectl describe deployment my-deployment --kubeconfig CLUSTER_KUBECONFIG
Output akan menampilkan 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 Anda ke klien di luar cluster adalah dengan membuat
Service Kubernetes dengan jenis
LoadBalancer
.
Untuk membuat Service jenis LoadBalancer
:
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 perlu dipahami tentang Layanan dalam latihan ini:
Setiap Pod yang memiliki label
app: metrics
dan labeldepartment: sales
adalah anggota Layanan. Pod dimy-deployment
memiliki label ini.Saat klien mengirim permintaan ke Layanan di TCP port
80
, permintaan tersebut diteruskan ke Pod anggota di TCP port8080
.Setiap Pod anggota harus memiliki container yang memproses port TCP
8080
.
Secara default, container
hello-app
memproses port TCP8080
. Anda dapat melihat setelan port ini dengan melihat Dockerfile dan kode sumber untuk aplikasi tersebut.Gunakan
kubectl apply
untuk membuat Service di cluster Anda:kubectl apply -f my-service.yaml --kubeconfig CLUSTER_KUBECONFIG
Ganti CLUSTER_KUBECONFIG dengan jalur file kubeconfig untuk cluster Anda.
Melihat 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
Dalam output sebelumnya, Anda dapat melihat bahwa Service Anda memiliki
clusterIP
, dan alamat IP eksternal. Objek ini juga memilikinodePort
,port
, dantargetPort
.clusterIP
tidak relevan dengan latihan ini. Alamat IP eksternal (status.loadBalancer.ingress.ip
) berasal dari rentang alamat yang Anda tentukan saat menentukan kumpulan alamat load balancer (spec.loadBalancer.addressPools
) dalam file konfigurasi cluster.Sebagai contoh, ambil nilai yang ditampilkan 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
di port TCP80
. Permintaan dirutekan ke load balancer Anda, dan dari sana diteruskan ke Pod anggota di port TCP8080
.- Alamat IP eksternal:
Memanggil Layanan Anda:
curl INGRESS_IP_ADDRESS
Ganti INGRESS_IP_ADDRESS dengan alamat IP ingress di bagian
status
Layanan yang Anda ambil pada langkah sebelumnya (status.loadBalancer.ingress
).Output 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 Service jenis LoadBalancer
.
Alokasi ini dapat dengan cepat menghabiskan port node yang tersedia dari 2.768 yang dialokasikan ke cluster Anda. Untuk menghemat port node, nonaktifkan alokasi port node load balancer dengan menetapkan kolom allocateLoadBalancerNodePorts
ke false
dalam spesifikasi Service LoadBalancer
. Setelan ini mencegah Kubernetes mengalokasikan port node ke Layanan LoadBalancer. Untuk mengetahui informasi selengkapnya, lihat
Menonaktifkan alokasi NodePort load balancer
dalam dokumentasi Kubernetes.
Berikut adalah manifes untuk membuat Service yang tidak menggunakan port node:
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:
Gunakan
kubectl delete
untuk menghapus Layanan dari cluster Anda:kubectl delete service my-service --kubeconfig CLUSTER_KUBECONFIG
Pastikan Service Anda telah dihapus:
kubectl get services --kubeconfig CLUSTER_KUBECONFIG
Output tidak lagi menampilkan
my-service
.
Menghapus Deployment Anda
Untuk menghapus Deployment Anda:
Gunakan
kubectl delete
untuk menghapus Deployment dari cluster Anda:kubectl delete deployment my-deployment --kubeconfig CLUSTER_KUBECONFIG
Pastikan Deployment Anda telah dihapus:
kubectl get deployments --kubeconfig CLUSTER_KUBECONFIG
Output tidak lagi menampilkan
my-deployment
.