Dokumen ini menjelaskan cara men-deploy aplikasi di Google Distributed Cloud.
Sebelum memulai
Untuk men-deploy beban kerja, Anda harus memiliki cluster pengguna, hybrid, atau mandiri yang mampu menjalankan workload.
Membuat Deployment
Langkah-langkah berikut akan membuat Deployment pada cluster:
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.
Mendapatkan informasi dasar tentang Deployment untuk mengonfirmasi bahwa Deployment dibuat berhasil:
kubectl get deployment my-deployment --kubeconfig CLUSTER_KUBECONFIG
Outputnya 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:
kubectl get pods --kubeconfig CLUSTER_KUBECONFIG
Outputnya menunjukkan bahwa Deployment 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
Dapatkan informasi mendetail tentang Deployment Anda:
kubectl get deployment my-deployment --output yaml --kubeconfig CLUSTER_KUBECONFIG
Outputnya menunjukkan 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 menunjukkan detail Deployment yang diformat dengan baik, termasuk atribut ReplicaSet:
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 Layanan jenis LoadBalancer
Salah satu cara untuk mengekspos Deployment ke klien di luar cluster adalah dengan membuat
jenis Service Kubernetes
LoadBalancer
.
Untuk membuat Layanan 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:
Semua Pod yang memiliki label
app: metrics
dan labeldepartment: sales
adalah anggota Layanan. Pod dimy-deployment
memiliki label ini.Saat klien mengirim permintaan ke Layanan melalui port TCP
80
, permintaan tersebut diteruskan ke Pod anggota di port TCP8080
.Setiap Pod anggota harus memiliki container yang memantau port TCP
8080
.
Secara default, container
hello-app
memproses port TCP8080
. Anda dapat melihat setelan porta ini dengan melihat Dockerfile dan kode sumbernya untuk aplikasi.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.
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
Pada output sebelumnya, Anda dapat melihat bahwa Layanan Anda memiliki
clusterIP
, dan alamat IP eksternal. Class ini juga memilikinodePort
,port
, dantargetPort
.clusterIP
tidak relevan dengan latihan ini. Alamat IP eksternal (status.loadBalancer.ingress.ip
) berasal dari rentang alamat yang saat menentukan kumpulan alamat load balancer (spec.loadBalancer.addressPools
) di file konfigurasi cluster.Misalnya, ambil nilai yang terlihat di output sebelumnya untuk Layanan:
- Alamat IP eksternal:
192.168.1.13
port
:80
nodePort
:31565
targetPort
:8080
Klien mengirimkan permintaan ke
192.168.1.13
pada port TCP80
. Permintaannya berupa yang dirutekan ke load balancer, dan dari sana diteruskan ke Pod anggota pada porta TCP8080
.- Alamat IP eksternal:
Hubungi Layanan Anda:
curl INGRESS_IP_ADDRESS
Ganti INGRESS_IP_ADDRESS dengan alamat IP masuk di Bagian
status
dari Layanan yang Anda ambil pada langkah sebelumnya (status.loadBalancer.ingress
).Output menunjukkan 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 Services jenis LoadBalancer
.
Alokasi ini dapat dengan cepat menghabiskan porta {i>node<i} yang tersedia dari 2.768
yang dialokasikan ke cluster Anda. Untuk menyimpan port node, nonaktifkan port node load balancer
alokasi dengan menetapkan kolom allocateLoadBalancerNodePorts
ke false
di
spesifikasi Layanan LoadBalancer
. Setelan ini mencegah Kubernetes
yang mengalokasikan port node ke Layanan LoadBalancer. Untuk informasi selengkapnya, lihat
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
Hapus Layanan Anda
Untuk menghapus Layanan Anda:
Gunakan
kubectl delete
untuk menghapus Service dari cluster Anda:kubectl delete service my-service --kubeconfig CLUSTER_KUBECONFIG
Verifikasi bahwa Layanan Anda telah dihapus:
kubectl get services --kubeconfig CLUSTER_KUBECONFIG
Output tidak lagi menampilkan
my-service
.
Menghapus Deployment
Untuk menghapus Deployment Anda:
Gunakan
kubectl delete
untuk menghapus Deployment dari cluster:kubectl delete deployment my-deployment --kubeconfig CLUSTER_KUBECONFIG
Verifikasi bahwa Deployment telah dihapus:
kubectl get deployments --kubeconfig CLUSTER_KUBECONFIG
Output tidak lagi menampilkan
my-deployment
.