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 applyuntuk membuat Deployment:kubectl apply -f my-deployment.yaml --kubeconfig CLUSTER_KUBECONFIGGanti 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_KUBECONFIGOutput menunjukkan bahwa Deployment memiliki tiga Pod yang semuanya tersedia:
NAME READY UP-TO-DATE AVAILABLE AGE my-deployment 3/3 3 3 27sCantumkan Pod di Deployment Anda:
kubectl get pods --kubeconfig CLUSTER_KUBECONFIGOutput 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 34sDapatkan informasi mendetail tentang Deployment Anda:
kubectl get deployment my-deployment --output yaml --kubeconfig CLUSTER_KUBECONFIGOutput 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: 3Jelaskan Deployment Anda:
kubectl describe deployment my-deployment --kubeconfig CLUSTER_KUBECONFIGOutput 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: 8080Berikut adalah hal-hal penting yang perlu dipahami tentang Layanan dalam latihan ini:
Setiap Pod yang memiliki label
app: metricsdan labeldepartment: salesadalah anggota Layanan. Pod dimy-deploymentmemiliki 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-appmemproses port TCP8080. Anda dapat melihat setelan port ini dengan melihat Dockerfile dan kode sumber untuk aplikasi tersebut.Gunakan
kubectl applyuntuk membuat Service di cluster Anda:kubectl apply -f my-service.yaml --kubeconfig CLUSTER_KUBECONFIGGanti CLUSTER_KUBECONFIG dengan jalur file kubeconfig untuk cluster Anda.
Melihat Layanan Anda:
kubectl get service my-service --output yaml --kubeconfig CLUSTER_KUBECONFIGOutputnya 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.13Dalam output sebelumnya, Anda dapat melihat bahwa Service Anda memiliki
clusterIP, dan alamat IP eksternal. Objek ini juga memilikinodePort,port, dantargetPort.clusterIPtidak 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:80nodePort:31565targetPort:8080
Klien mengirimkan permintaan ke
192.168.1.13di 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_ADDRESSGanti INGRESS_IP_ADDRESS dengan alamat IP ingress di bagian
statusLayanan 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 deleteuntuk menghapus Layanan dari cluster Anda:kubectl delete service my-service --kubeconfig CLUSTER_KUBECONFIGPastikan Service Anda telah dihapus:
kubectl get services --kubeconfig CLUSTER_KUBECONFIGOutput tidak lagi menampilkan
my-service.
Menghapus Deployment Anda
Untuk menghapus Deployment Anda:
Gunakan
kubectl deleteuntuk menghapus Deployment dari cluster Anda:kubectl delete deployment my-deployment --kubeconfig CLUSTER_KUBECONFIGPastikan Deployment Anda telah dihapus:
kubectl get deployments --kubeconfig CLUSTER_KUBECONFIGOutput tidak lagi menampilkan
my-deployment.