Deployment
Versi Bahasa Indonesia. Baca dalam Bahasa Inggris
Deployment mengelola sekumpulan Pod untuk menjalankan beban kerja aplikasi, biasanya aplikasi yang tidak menyimpan state.
Membuat Aplikasi Sederhana
Pertama, mari kita buat aplikasi golang sederhana dengan mengikuti langkah-langkah di bawah ini:
- Buat folder baru bernama
simple-go. - Inisialisasi Go Module menggunakan
go mod init. - Buat file
main.go. - Struktur folder Anda akan terlihat seperti ini:
simple-go
βββ go.mod
βββ main.go- Kemudian mari kita buat server http sederhana yang akan mengembalikan respons json seperti
{"message":"success"}. - Anda dapat menyalin kode berikut:
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
)
type Response struct {
Message string `json:"message"`
}
func main() {
srv := http.NewServeMux()
srv.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
res := Response{
Message: "Success",
}
err := json.NewEncoder(w).Encode(res)
if err != nil {
log.Fatal(err)
}
})
fmt.Println("Server is running on port 8080...")
err := http.ListenAndServe(":8080", srv)
if err != nil {
log.Fatal(err)
}
}- Mari kita coba jalankan kode dengan perintah
go run main.go. - Anda akan melihat output ini di terminal:
Server is running on port 8080...- Mari kita coba akses menggunakan
curlke localhost port8080dan akan mengembalikan respons seperti ini:
β curl http://127.0.0.1:8080
{"message":"Success"}Membangun Docker Image
Setelah aplikasi sederhana berjalan dengan baik, langkah selanjutnya adalah membangun docker image untuk aplikasi yang baru kita buat. Buat file bernama Dockerfile di folder root dan untuk saat ini Anda dapat menyalin konfigurasi di bawah ini:
# Builder stage
FROM golang:1.22 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o server .
# Runtime image stage
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/server .
CMD [ "./server" ]Untuk membangun image sehingga tersedia di Minikube, kita perlu mengikuti langkah-langkah berikut:
- Pertama, beralih ke Minikube's Docker Daemon menggunakan perintah
eval $(minikube docker-env). - Kemudian kita dapat membangun docker image dengan tag
simple-goseperti ini:
docker build --tag simple-go .- Kita dapat memeriksa menggunakan perintah
docker imagesdan imagesimple-goakan ada dalam daftar:
β docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
simple-go latest d47dfe963439 12 minutes ago 15.1MB
registry.k8s.io/kube-apiserver v1.31.0 cd0f0ae0ec9e 5 months ago 91.5MB
registry.k8s.io/kube-scheduler v1.31.0 fbbbd428abb4 5 months ago 66MB
registry.k8s.io/kube-controller-manager v1.31.0 fcb0683e6bdb 5 months ago 85.9MB
registry.k8s.io/kube-proxy v1.31.0 71d55d66fd4e 5 months ago 94.7MB
registry.k8s.io/etcd 3.5.15-0 27e3830e1402 6 months ago 139MB
registry.k8s.io/pause 3.10 afb61768ce38 8 months ago 514kB
registry.k8s.io/coredns/coredns v1.11.1 2437cf762177 17 months ago 57.4MB
kubernetesui/dashboard <none> 20b332c9a70d 2 years ago 244MB
kubernetesui/metrics-scraper <none> a422e0e98235 2 years ago 42.3MB
gcr.io/k8s-minikube/storage-provisioner v5 ba04bb24b957 3 years ago 29MBMembuat Deployment
Dengan image yang sudah siap di Minikube docker daemon, kita dapat melanjutkan membuat konfigurasi deployment Kubernetes. Beri nama file deployment.yaml dan Anda dapat menyalin konfigurasi di bawah ini, lalu kita akan memecahnya bagian demi bagian.
apiVersion: apps/v1
kind: Deployment
metadata:
name: simple-go
labels:
app: simple-go
spec:
replicas: 3
selector:
matchLabels:
app: simple-go
template:
metadata:
labels:
app: simple-go
spec:
containers:
- name: server
image: simple-go:latest
imagePullPolicy: Never
ports:
- containerPort: 8080Struktur Umum
apiVersion: apps/v1
kind: DeploymentapiVersion: apps/v1: Menentukan versi API dari resource Deployment.apps/v1adalah versi API yang paling umum digunakan untuk Deployment di Kubernetes.kind: Deployment: Mendefinisikan jenis resource Kubernetes yang dibuat. Di sini, ini adalah Deployment.
Bagian Metadata
metadata:
name: simple-go
labels:
app: simple-gometadata:: Berisi metadata tentang resource.name: simple-go: Nama Deployment. Ini harus unik dalam namespace.labels:: Pasangan key-value yang digunakan untuk menandai Deployment. Label ini berguna untuk mengidentifikasi dan mengelompokkan resource.app: simple-go: Label yang menunjukkan Deployment ini terkait dengan aplikasisimple-go.
Bagian Spec
spec:
replicas: 3
selector:
matchLabels:
app: simple-gospec:: Mendefinisikan status yang diinginkan untuk Deployment.replicas: 3: Menentukan jumlah replika Pod yang harus dipertahankan. Kubernetes akan memastikan tiga Pod berjalan setiap saat.selector:: Mendefinisikan bagaimana Kubernetes mengidentifikasi Pod yang dikelola oleh Deployment ini.matchLabels:: Memfilter Pod dengan mencocokkan label mereka.app: simple-go: Ini mencocokkan Pod yang memiliki labelapp: simple-go.
Bagian Template
template:
metadata:
labels:
app: simple-gotemplate:: Mendeskripsikan Pod yang akan dibuat dan dikelola oleh Deployment.metadata:: Metadata khusus untuk Pod.labels:: Label yang diberikan ke setiap Pod yang dibuat oleh Deployment ini.app: simple-go: Memastikan Pod memiliki labelapp: simple-go, yang cocok dengan selector.
Bagian Pod Spec
spec:
containers:
- name: simple-go
image: go-configurable-port
imagePullPolicy: Never
ports:
- containerPort: 8080spec:: Mendefinisikan konfigurasi untuk Pod.containers:: Mendaftar container yang akan dijalankan di setiap Pod.- name: server: Nama container. Ini digunakan untuk identifikasi di dalam Pod.image: simple-go: Menentukan image container yang akan digunakan. Kubernetes akan mencari image ini di container registry atau lingkungan Docker lokal Minikube.imagePullPolicy: Never: Karena Minikube kita lokal, kita perlu menentukan kebijakan pull image menjadiNeveragar tidak mencoba menarik dari container registry tetapi menggunakan image lokal.ports:: Mendaftar port yang diekspos oleh container.- containerPort: 8080: Nomor port yang didengarkan oleh container. Ini memungkinkan Kubernetes merutekan traffic ke port yang benar di dalam container.
Menerapkan
Mari kita terapkan konfigurasi deployment menggunakan perintah kubectl apply -f deployment.yaml.
β kubectl apply -f deployment.yaml
deployment.apps/simple-go createdKemudian kita dapat memeriksa pod menggunakan kubectl get pods. Kita akan memiliki 3 pod yang berjalan seperti ini.
β kubectl get pods
NAME READY STATUS RESTARTS AGE
simple-go-65d7fccbfc-4f7xk 1/1 Running 0 10s
simple-go-65d7fccbfc-bgqlt 1/1 Running 0 10s
simple-go-65d7fccbfc-ltzgv 1/1 Running 0 10sMengakses Aplikasi
Kita berhasil menerapkan aplikasi, tetapi aplikasi belum dapat diakses. Kita akan belajar cara membuat service untuk membuat aplikasi kita dapat diakses, tetapi untuk saat ini kita dapat melakukan port forward menggunakan perintah kubectl port-forward <pod-name> <source-port>:<target-port>.
β kubectl port-forward simple-go-65d7fccbfc-4f7xk 8080:8080
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080Coba lagi menggunakan curl ke localhost port 8080 dan kita akan mendapatkan respons seperti ini:
β curl http://127.0.0.1:8080
{"message":"Success"}Referensi
- https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
- https://kubernetes.io/docs/tasks/access-application-cluster/port-forward-access-application-cluster/
Last updated on