Dokumen ini menunjukkan cara membuat objek Ingress Kubernetes di cluster pengguna untuk GKE di VMware. Ingress terkait dengan satu atau beberapa Layanan, yang masing-masing dikaitkan dengan serangkaian Pod.
Sebelum memulai
Dapatkan koneksi SSH ke workstation admin:
Membuat Deployment
Berikut adalah manifes untuk Deployment:
apiVersion: apps/v1 kind: Deployment metadata: name: hello-deployment spec: selector: matchLabels: greeting: hello replicas: 3 template: metadata: labels: greeting: hello spec: containers: - name: hello-world image: "gcr.io/google-samples/hello-app:2.0" env: - name: "PORT" value: "50000" - name: hello-kubernetes image: "gcr.io/google-samples/node-hello:1.0" env: - name: "PORT" value: "8080"
Sebagai tujuan latihan ini, berikut adalah poin-poin penting yang perlu dipahami tentang manifes Deployment:
Setiap Pod yang termasuk dalam Deployment memiliki label
greeting: hello
.Setiap Pod memiliki dua container.
Kolom
env
menentukan bahwa penampunghello-app
diproses di port TCP 50000, dan penampungnode-hello
diproses di port TCP 8080. Untukhello-app
, Anda dapat melihat efek variabel lingkunganPORT
dengan melihat kode sumber hello-app.
Salin manifes ke file bernama hello-deployment.yaml
, lalu buat Deployment:
kubectl apply --kubeconfig USER_CLUSTER_KUBECONFIG -f hello-deployment.yaml
dengan USER_CLUSTER_KUBECONFIG adalah jalur file kubeconfig untuk cluster pengguna Anda.
Mengekspos Deployment Anda dengan Layanan
Untuk menyediakan cara yang stabil bagi klien dalam mengirim permintaan ke Pod Deployment Anda, buatlah Layanan.
Berikut adalah manifes untuk Layanan yang mengekspos Deployment Anda ke klien dalam cluster Anda:
apiVersion: v1 kind: Service metadata: name: hello-service spec: type: ClusterIP selector: greeting: hello ports: - name: world-port protocol: TCP port: 60000 targetPort: 50000 - name: kubernetes-port protocol: TCP port: 60001 targetPort: 8080
Salin manifes ke file bernama hello-service.yaml
, lalu buat
Service:
kubectl apply --kubeconfig USER_CLUSTER_KUBECONFIG -f hello-service.yaml
Lihat Service:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get service hello-service --output yaml
Output menunjukkan nilai clusterIP
yang telah diberikan ke Layanan.
Contoh:
apiVersion: v1 kind: Service metadata: annotations: ... spec: clusterIP: 10.96.14.249 clusterIPs: - 10.96.14.249 ipFamilies: - IPv4 ipFamilyPolicy: SingleStack ports: - name: world-port port: 60000 protocol: TCP targetPort: 50000 - name: kubernetes-port port: 60001 protocol: TCP targetPort: 8080 selector: greeting: hello sessionAffinity: None type: ClusterIP status: loadBalancer: {}
Dalam output sebelumnya, kolom ports
adalah array objek ServicePort
Kubernetes: satu lagi bernama world-port
dan satu lagi bernama kubernetes-port
.
Berikut adalah cara klien dapat memanggil Layanan:
Menggunakan
world-port
: Klien yang berjalan di salah satu node cluster mengirimkan permintaan keclusterIP
padaport
. Dalam contoh ini, 10.96.14.249:60000. Permintaan diteruskan ke Pod anggota padatargetPort
. Dalam contoh ini, POD_IP_ADDRESS:50000.Menggunakan
kubernetes-port
: Klien yang berjalan di salah satu node cluster mengirim permintaan keclusterIP
padaport
. Dalam contoh ini, 10.96.14.249:60001. Permintaan diteruskan ke Pod anggota padatargetPort
. Dalam contoh ini, POD_IP_ADDRESS:8080.
Komponen Ingress
Berikut adalah beberapa komponen cluster yang terkait dengan ingress:
Deployment
istio-ingress
. Ini adalah proxy masuk. Proxy ingress meneruskan traffic ke Layanan internal sesuai dengan aturan yang ditentukan dalam objek Ingress.Layanan
istio-ingress
. Layanan ini mengekspos Deploymentistio-ingress
.Deployment
istiod
. Ini adalah pengontrol traffic masuk. Pengontrol masuk mengamati pembuatan objek Ingress dan mengonfigurasi proxy masuk sebagaimana mestinya.
Membuat Ingress
Berikut adalah manifes untuk Ingress:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress spec: rules: - http: paths: - path: /greet-the-world pathType: Exact backend: service: name: hello-service port: number: 60000 - path: /greet-kubernetes pathType: Exact backend: service: name: hello-service port: number: 60001
Salin manifes ke file bernama my-ingress.yaml
, lalu buat Ingress:
kubectl apply --kubeconfig USER_CLUSTER_KUBECONFIG -f my-ingress.yaml
Saat membuat cluster pengguna, Anda harus menentukan nilai untuk
loadbalancer.ingressVip
dalam file konfigurasi cluster tersebut. Alamat IP ini dikonfigurasi pada load balancer cluster. Saat Anda membuat Ingress, Ingress
akan diberi VIP yang sama ini seperti alamat IP eksternalnya.
Saat klien mengirim permintaan ke VIP ingress cluster pengguna Anda, permintaan tersebut akan dirutekan ke load balancer Anda. Load balancer menggunakan Layanan istio-ingress
untuk meneruskan permintaan ke proxy ingress, yang berjalan di cluster pengguna Anda. Proxy
ingress dikonfigurasi untuk meneruskan permintaan ke backend yang berbeda, bergantung
pada jalur di URL permintaan.
Jalur /greet-the-world
Dalam manifes Ingress, Anda bisa melihat aturan yang menyatakan bahwa jalur /greet-the-world
dikaitkan dengan serviceName: hello-service
dan servicePort: 60000
. Ingat kembali bahwa 60000 adalah nilai port
di bagian world-port
pada Layanan hello-service
Anda.
- name: world-port port: 60000 protocol: TCP targetPort: 50000
Layanan masuk meneruskan permintaan ke clusterIP
:50000. Permintaan tersebut akan diteruskan ke salah satu Pod anggota Layanan hello-service
. Container, dalam Pod tersebut, yang memproses port 50000 menampilkan pesan Hello World!
.
Jalur /greet-kubernetes
Dalam manifes Ingress, Anda bisa melihat aturan yang menyatakan bahwa jalur /greet-kubernetes
dikaitkan dengan serviceName: hello-service
dan servicePort: 60001
. Ingat kembali bahwa 60001 adalah nilai port
di
bagian kubernetes-port
dalam Layanan hello-service
Anda.
- name: kubernetes-port port: 60001 protocol: TCP targetPort: 8080
Layanan masuk meneruskan permintaan ke clusterIP
: 8080. Permintaan tersebut akan diteruskan ke salah satu Pod anggota Layanan hello-service
. Container, dalam Pod tersebut, yang memproses port 8080 menampilkan pesan Hello Kubernetes!
.
Menguji Ingress
Uji Ingress menggunakan jalur /greet-the-world
:
curl USER_CLUSTER_INGRESS_VIP/greet-the-world
Ganti USER_CLUSTER_INGRESS_VIP dengan alamat IP eksternal Ingress.
Output menampilkan pesan Hello, world!
:
Hello, world! Version: 2.0.0 Hostname: ...
Uji Ingress menggunakan jalur /greet-kubernetes
:
curl USER_CLUSTER_INGRESS_VIP/greet-kubernetes
Output menampilkan pesan Hello, Kubernetes!
:
Hello Kubernetes!
Menyiapkan HTTPS untuk Ingress
Jika Anda ingin menerima permintaan HTTPS dari klien, proxy ingress harus memiliki sertifikat agar dapat membuktikan identitasnya kepada klien. Proxy ini juga harus memiliki kunci pribadi untuk menyelesaikan handshake HTTPS.
Contoh berikut menggunakan entitas ini:
Proxy masuk: Berpartisipasi dalam handshake HTTPS, lalu meneruskan paket ke Pod anggota Layanan
hello-service
.Domain untuk Layanan
hello-service
: altostrat.com di Example Org
Ikuti langkah-langkah berikut:
Membuat root certificate dan kunci pribadi. Contoh ini menggunakan root certificate authority
root.ca.example.com
di Root CA Example Org.openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -subj '/O=Root CA Example Inc./CN=root.ca.example.com' -keyout root-ca.key -out root-ca.crt
Buat permintaan penandatanganan sertifikat:
openssl req -out server.csr -newkey rsa:2048 -nodes -keyout server.key -subj "/CN=altostrat.com/O=Example Org"
Buat sertifikat penayangan untuk proxy masuk.
openssl x509 -req -days 365 -CA root-ca.crt -CAkey root-ca.key -set_serial 0 -in server.csr -out server.crt
Anda kini telah membuat sertifikat dan kunci berikut:
root-ca.crt
: Sertifikat untuk root CAroot-ca.key
: Kunci pribadi untuk root CAserver.crt
: Menyajikan sertifikat untuk proxy masukserver.key
: Kunci pribadi untuk proxy masuk
Membuat Secret Kubernetes yang menyimpan sertifikat dan kunci penayangan.
kubectl create secret tls example-server-creds --key=server.key --cert=server.crt --namespace gke-system
Secret yang dihasilkan diberi nama
example-server-creds
.
Membuat Deployment dan Layanan
Jika Anda membuat Deployment dan Layanan di bagian HTTP dalam panduan ini, biarkan keduanya tetap di tempatnya. Jika belum, buat sekarang, dengan mengikuti langkah-langkah yang dijelaskan untuk HTTP.
Membuat Ingress
Jika sebelumnya Anda membuat Ingress di bagian HTTP, hapus Ingress tersebut sebelum melanjutkan.
Menghapus Ingress:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG delete ingress my-ingress
Guna menangani traffic untuk Layanan yang Anda buat sebelumnya, buat Ingres baru yang memiliki bagian tls
. Tindakan ini akan mengaktifkan HTTPS antara klien dan
proxy masuk.
Berikut adalah manifes untuk Ingress:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress-2 spec: tls: - hosts: - altostrat.com secretName: example-server-creds rules: - host: altostrat.com http: paths: - path: /greet-the-world pathType: Exact backend: service: name: hello-service port: number: 60000 - path: /greet-kubernetes pathType: Exact backend: service: name: hello-service port: number: 60001
Simpan manifes dalam file bernama my-ingress-2.yaml
, dan buat Ingress:
kubectl apply --kubeconfig USER_CLUSTER_KUBECONFIG -f my-ingress-2.yaml
Konfirmasi dengan menguji.
Uji jalur /greet-the-world:
curl -v --resolve altostrat.com:443:USER_CLUSTER_INGRESS_VIP https://altostrat.com/greet-the-world --cacert root-ca.crt
Output:
Hello, world! Version: 2.0.0 Hostname: hello-deployment-5ff7f68854-wqzp7
Uji jalur
/greet-kubernetes
:curl -v --resolve altostrat.com:443:USER_CLUSTER_INGRESS_VIP https://altostrat.com/greet-kubernetes --cacert root-ca.crt
Output:
Hello Kubernetes!
Pembersihan
Menghapus Ingress Anda:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG delete ingress INGRESS_NAME
Ganti INGRESS_NAME dengan nama Ingress, seperti my-ingress
atau my-ingress-2
.
Hapus Layanan Anda:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG delete service hello-service
Hapus Deployment Anda:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG delete deployment hello-deployment