Deploy Nginx Ingress Controller di Kubernetes menggunakan Helm Chart

Cara standar untuk mengekspos aplikasi yang berjalan pada sekumpulan Pod di Cluster Kubernetes adalah dengan menggunakan sumber daya layanan. Setiap Pod di Kubernetes memiliki alamat IP sendiri, tetapi satu set Pod dapat memiliki satu nama DNS. Kubernetes dapat memuat lalu lintas keseimbangan di seluruh Pod tanpa modifikasi apa pun di lapisan aplikasi. Sebuah layanan, secara default diberi alamat IP (kadang-kadang disebut ” cluster IP “), yang digunakan oleh proxy Layanan . Sebuah Service dapat mengidentifikasi sekumpulan Pod menggunakan selektor label.

Apa itu Ingress Controller?

Sebelum Anda dapat menjawab pertanyaan ini, pemahaman tentang objek Ingress di Kubernetes adalah penting. Dari dokumentasi resmi Kubernetes, sebuah Ingress didefinisikan seperti:

An API object that manages external access to the services in a cluster, typically HTTP.  Ingress may provide load balancing, SSL termination and name-based virtual hosting.

Ingress di Kubernetes memaparkan rute HTTP dan HTTPS dari luar cluster ke layanan yang berjalan di dalam cluster. Semua perutean lalu lintas dikendalikan oleh aturan yang ditentukan pada sumber daya Ingress. Ingress dapat dikonfigurasi untuk:

  • Menyediakan Layanan dengan URL yang dapat dijangkau secara eksternal
  • Lalu lintas keseimbangan beban yang masuk ke layanan cluster
  • Hentikan lalu lintas SSL / TLS
  • Menyediakan hosting virtual berbasis nama di Kubernetes

Pengontrol Ingress adalah yang memenuhi Ingress, biasanya dengan penyeimbang beban. Di bawah ini adalah contoh bagaimana Ingress mengirimkan semua lalu lintas klien ke Layanan di Cluster Kubernetes:

Untuk lalu lintas HTTP dan HTTPS standar, Pengontrol Ingress akan dikonfigurasi untuk mendengarkan pada port 80 dan 443 . Itu harus mengikat ke alamat IP dari mana cluster akan menerima lalu lintas dari. Catatan DNS Wildcard untuk domain yang digunakan untuk rute Ingress akan mengarah ke alamat IP yang didengarkan oleh pengontrol Ingress.

Fakta bahwa Kubernetes mengadopsi pendekatan BYOS (Bring-Your-Own-Software) untuk sebagian besar add-onnya dan tidak menyediakan perangkat lunak yang melakukan fungsi Ingress di luar kotak. Anda dapat memilih dari banyak Ingress Controllers yang tersedia. Kubedex juga bekerja dengan baik dalam meringkas daftar Ingress yang tersedia untuk Kubernetes.

Dengan semua dasar-dasar Layanan dan Ingress Kubernetes, sekarang kita dapat terjun ke instalasi sebenarnya dari NGINX Ingress Controller Kubernetes.

Opsi 1: Instal Nginx Ingress Controller Kubernetes tanpa Helm

Dengan metode ini Anda akan mengunduh dan menjalankan manifes penerapan secara manual menggunakan alat baris perintah kubectl .

Langkah 1: Instal alat git, curl dan wget

Instal alat git, curl dan wget di Bastion Anda tempat kubectl diinstal dan dikonfigurasi:

# CentOS / RHEL / Fedora / Rocky sudo yum -y install wget curl git# Debian / Ubuntu sudo apt update sudo apt install wget curl git

Langkah 2: Terapkan manifes Nginx Ingress Controller

Proses penerapan bervariasi tergantung pada penyiapan Kubernetes Anda. Kubernetes saya akan menggunakan panduan penerapan Bare-metal Nginx Ingress. Untuk cluster Kubernetes lainnya termasuk cluster terkelola, lihat panduan di bawah ini:

Metode Bare-metal berlaku untuk semua cluster Kubernetes yang digunakan pada bare-metal dengan distribusi Linux generik (Seperti CentOS, Ubuntu, Debian, Rocky Linux) dll

Unduh penerapan pengontrol Nginx untuk Baremetal:

controller_tag=$(curl -s https://api.github.com/repos/kubernetes/ingress-nginx/releases/latest | grep tag_name | cut -d '"' -f 4) wgethttps://raw.githubusercontent.com/kubernetes/ingress-nginx/${controller_tag}/deploy/static/provider/baremetal/deploy.yaml

Ganti nama file penerapan:

mv deploy.yaml nginx-ingress-controller-deploy.yaml

Jangan ragu untuk memeriksa konten file dan memodifikasi tempat yang Anda inginkan:

vim nginx-ingress-controller-deploy.yaml

Terapkan file penyebaran manifes pengontrol ingress Nginx:

$ kubectl apply -fnginx-ingress-controller-deploy.yaml namespace/ingress-nginx created serviceaccount/ingress-nginx created configmap/ingress-nginx-controller created clusterrole.rbac.authorization.k8s.io/ingress-nginx created clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created role.rbac.authorization.k8s.io/ingress-nginx created rolebinding.rbac.authorization.k8s.io/ingress-nginx created service/ingress-nginx-controller-admission created service/ingress-nginx-controller created deployment.apps/ingress-nginx-controller created ingressclass.networking.k8s.io/nginx created validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created serviceaccount/ingress-nginx-admission created clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created role.rbac.authorization.k8s.io/ingress-nginx-admission created rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created job.batch/ingress-nginx-admission-create created job.batch/ingress-nginx-admission-patch created

Anda dapat memperbarui konteks Anda saat ini untuk menggunakan namespace nginx ingress:

kubectl config set-context --current --namespace=ingress-nginx

Jalankan perintah berikut untuk memeriksa apakah pod pengontrol ingress telah dimulai:

$ kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx --watch NAME READY STATUS RESTARTS AGE ingress-nginx-admission-create--1-hpkzp 0/1 Completed 0 43s ingress-nginx-admission-patch--1-qnjlj 0/1 Completed 1 43s ingress-nginx-controller-644555766d-snvqf 1/1 Running 0 44s

Setelah pod pengontrol ingress berjalan, Anda dapat membatalkan perintah mengetik Ctrl+C .

Langkah 3: Edit layanan ingress-nginx-controller dan atur IP eksternal

Dalam penyiapan penerapan Infrastruktur Kubernetes pribadi, kecil kemungkinan Anda akan memiliki dukungan layanan Load Balancer.

$ kubectl get svc -n ingress-nginx ingress-nginx-controller NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx-controller NodePort 10.101.4.21 <none> 80:30248/TCP,443:30773/TCP 3m53s

Anda akan melihat layanan jenis NodePort. Kami akan memperbarui layanan dengan membuat Ingress mengikat ke alamat IP tertentu dengan menggunakan IP Eksternal.

Kubernetes mendukung penetapan alamat IP eksternal ke spec.externalIPsbidang Layanan melalui fasilitas ExternalIP. Ini akan mengekspos alamat IP virtual tambahan, yang ditetapkan ke Layanan Pengendali Ingress Nginx. Hal ini memungkinkan kita untuk mengarahkan lalu lintas ke node lokal untuk load balancing.

Di Cluster Kubernetes saya, saya memiliki dua node Plane kontrol dengan alamat IP utama di bawah ini:

  • k8smaster01.example.com 192.168.42.245
  • k8smaster02.example.com 192.168.42.246

Alamat IP node dapat diperiksa dengan menjalankan perintah:

kubectl get nodes -o wide

Saya akan membuat file yang berisi modifikasi untuk menambahkan IP Eksternal ke layanan.

$ vim external-ips.yaml spec: externalIPs: - 192.168.42.245 - 192.168.42.246

Sekarang mari kita terapkan tambalan ke layanan.

$ kubectl -n ingress-nginx patch svc ingress-nginx-controller --patch "$(cat external-ips.yaml)" service/ingress-nginx-controller patched

Periksa layanan setelah menerapkan tambalan jika IP Eksternal ditambahkan:

 

$ kubectl get svc ingress-nginx-controller -n ingress-nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx-controller NodePort 10.101.4.21 192.168.42.245,192.168.42.246 80:30248/TCP,443:30773/TCP 8m31

Langkah 4: Menjalankan Pod ingress-nginx-controller di Control Plane (Master) Node

Anda dapat mempertimbangkan untuk menjalankan Ingress Controller Pod pada master node. Untuk mencapai ini, kita akan memberi label pada node master kemudian menggunakan pemilih node untuk menetapkan pod dalam penerapan pengontrol Ingress ke node Control Plane.

$ kubectl get nodes -l node-role.kubernetes.io/control-plane NAME STATUS ROLES AGE VERSION k8smaster01.example.com Ready control-plane,master 16d v1.23.5 k8smaster02.example.com Ready control-plane,master 16d v1.23.5

Tambahkan label ke node master; hal dapat berupa node lain di cluster:runingress=nginx

 

kubectl label node k8smaster01.example.com runingress=nginx kubectl label node k8smaster02.example.com runingress=nginx

Label yang ditambahkan ke node dapat diperiksa menggunakan perintah:

kubectl describe node <node-name>

Contoh:

$ kubectl describe nodek8smaster01.example.com Name: k8smaster01.example.com Roles: control-plane,master Labels: beta.kubernetes.io/arch=amd64 beta.kubernetes.io/os=linux kubernetes.io/arch=amd64 kubernetes.io/hostname=k8smaster01.example.com kubernetes.io/os=linux node-role.kubernetes.io/control-plane= node-role.kubernetes.io/master= node.kubernetes.io/exclude-from-external-load-balancers= runingress=nginx # Label added .....

Buat file patch untuk menjalankan Pod di node dengan labelruningress=nginx

 

$ vim node-selector-patch.yaml spec: template: spec: nodeSelector:runingress: nginx

Terapkan tambalan untuk menambahkan pemilih simpul:

$ kubectl get deploy -n ingress-nginx NAME READY UP-TO-DATE AVAILABLE AGE ingress-nginx-controller 1/1 1 1 20m $kubectl -n ingress-nginx patchdeployment/ingress-nginx-controller --patch "$(cat node-selector-patch.yaml)" deployment.apps/ingress-nginx-controller patched

Tambahkan toleransi untuk mengizinkan Nginx Ingress Pod berjalan di node Control Plane

Di Kubernetes, pengaturan default adalah menonaktifkan pod agar tidak berjalan di node master. Agar Pod Ingress berjalan di node master, Anda harus menambahkan toleransi.

 

Mari buat file patch untuk menerapkan toleransi pada penerapan Ingress.

$ vim master-node-tolerations.yaml spec: template: spec: tolerations: - key: node-role.kubernetes.io/master operator: Equal value: "true" effect: NoSchedule - key: node-role.kubernetes.io/master operator: Equal effect: NoSchedule - key: node-role.kubernetes.io/control-plane operator: Equal value: "true" effect: NoSchedule - key: node-role.kubernetes.io/control-plane operator: Equal effect: NoSchedule

Terapkan tambalan:

kubectl -n ingress-nginx patch deployment/ingress-nginx-controller --patch "$(catmaster-node-tolerations.yaml)"

Konfirmasikan bahwa pod baru yang dibuat telah dikonfigurasi Node Selector.

 

$ kubectl get pods -n ingress-nginx NAME READY STATUS RESTARTS AGE ingress-nginx-admission-create--1-hpkzp 0/1 Completed 0 3d ingress-nginx-admission-patch--1-qnjlj 0/1 Completed 1 3d ingress-nginx-controller-57b46c846b-8n28t 1/1 Running 0 1m47s $ kubectl describe pod ingress-nginx-controller-57b46c846b-8n28t ...omitted_output... QoS Class: Burstable Node-Selectors: kubernetes.io/os=linux run-nginx-ingress=true runingress=nginx Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- .....

Opsi 2: Instal Nginx Ingress Controller Kubernetes menggunakan Helm

Jika Anda memilih metode pemasangan Helm, ikuti langkah-langkah yang disediakan di bagian ini.

Langkah 1: Instal helm 3 di workstation kami

Instal helm 3 di Workstation Anda tempat Kubectl diinstal dan dikonfigurasi.

cd ~/ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 chmod 700 get_helm.sh ./get_helm.sh

Skrip penginstal berfungsi untuk sistem operasi Linux dan macOS. Berikut adalah hasil instalasi yang berhasil:

Downloading https://get.helm.sh/helm-v3.8.1-linux-amd64.tar.gz Verifying checksum... Done. Preparing to install helm into /usr/local/bin helm installed into /usr/local/bin/helm

Mari kita menanyakan versi paket helm untuk memvalidasi instalasi yang berfungsi:

 

$ helm version version.BuildInfo{Version:"v3.8.1", GitCommit:"5cb9af4b1b271d11d7a97a71df3ac337dd94ad37", GitTreeState:"clean", GoVersion:"go1.17.5"}

Langkah 2: Terapkan Nginx Ingress Controller

Unduh rilis stabil terbaru dari kode Nginx Ingress Controller:

controller_tag=$(curl -s https://api.github.com/repos/kubernetes/ingress-nginx/releases/latest | grep tag_name | cut -d '"' -f 4) wget https://github.com/kubernetes/ingress-nginx/archive/refs/tags/${controller_tag}.tar.gz

Ekstrak file yang diunduh:

tar xvf ${controller_tag}.tar.gz

Beralih ke direktori yang dibuat:

cd ingress-nginx-${controller_tag}

Ubah direktori kerja Anda ke folder grafik:

 

cd charts/ingress-nginx/

Beri label node yang akan menjalankan Ingress Controller Pod

Pemilih node digunakan ketika kita harus men-deploy pod atau grup pod pada grup node tertentu yang melewati kriteria yang ditentukan dalam file konfigurasi.

Daftar node:

$ kubectl get nodes NAME STATUS ROLES AGE VERSION k8smaster01.example.com Ready control-plane,master 14h v1.23.5 k8smaster02.example.com Ready control-plane,master 14h v1.23.5 k8sworker01.example.com Ready <none> 13h v1.23.5 k8sworker02.example.com Ready <none> 13h v1.23.5 k8sworker03.example.com Ready <none> 13h v1.23.5

Tambahkan label :runingress=nginx

$ kubectl label node k8smaster01.example.com runingress=nginx node/k8smaster01.example.com labeled$ kubectl label node k8smaster02.example.com runingress=nginx node/k8smaster02.example.com labeled

Tampilkan kumpulan label

$ kubectl describe nodek8smaster01.example.com Name: k8smaster01.example.com Roles: control-plane,master Labels: beta.kubernetes.io/arch=amd64 beta.kubernetes.io/os=linux kubernetes.io/arch=amd64 kubernetes.io/hostname=k8smaster01.example.com kubernetes.io/os=linux node-role.kubernetes.io/control-plane= node-role.kubernetes.io/master= node.kubernetes.io/exclude-from-external-load-balancers= runingress=nginx # Label added .....

Perbarui file values.yml untuk mengubah parameter

Edit file nilai

 

vim values.yaml

Tambahkan toleransi untuk node Master

controller: tolerations: - key: node-role.kubernetes.io/master operator: Equal value: "true" effect: NoSchedule - key: node-role.kubernetes.io/master operator: Equal effect: NoSchedule - key: node-role.kubernetes.io/control-plane operator: Equal value: "true" effect: NoSchedule - key: node-role.kubernetes.io/control-plane operator: Equal effect: NoSchedule

Setelcontroller.service.externalIPs

controller: service: externalIPs: ["192.168.42.245","192.168.42.246"]

Untuk mengatur jumlah replika penerapan pengontrol Ingress padacontroller.replicaCount

controller: replicaCount: 1

Jika menggunakan pemilih node untuk penetapan pod untuk pod pengontrol Ingress yang diaktifkancontroller.nodeSelector

controller: nodeSelector: kubernetes.io/os: linux runingress: "nginx"

Buat ruang nama

kubectl create namespace ingress-nginx

Sekarang gunakan Nginx Ingress Controller menggunakan perintah berikut

helm install -ningress-nginx ingress-nginx -f values.yaml .

Contoh keluaran penerapan

NAME: ingress-nginx LAST DEPLOYED: Thu Nov 4 02:50:28 2021 NAMESPACE: ingress-nginx STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: The ingress-nginx controller has been installed. It may take a few minutes for the LoadBalancer IP to be available. You can watch the status by running 'kubectl --namespace ingress-nginx get services -o wide -w ingress-nginx-controller' An example Ingress that makes use of the controller: apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx name: example namespace: foo spec: ingressClassName: example-class rules: - host: www.example.com http: paths: - path: / pathType: Prefix backend: service: name: exampleService port: 80 # This section is only required if TLS is to be enabled for the Ingress tls: - hosts: - www.example.com secretName: example-tls If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided: apiVersion: v1 kind: Secret metadata: name: example-tls namespace: foo data: tls.crt: <base64 encoded cert> tls.key: <base64 encoded key> type: kubernetes.io/tls

Periksa status semua sumber daya dinamespace ingress-nginx:

 

kubectl get all -n ingress-nginx

cek

$ kubectl get pods -ningress-nginx NAME READY STATUS RESTARTS AGE ingress-nginx-controller-6f5844d579-hwrqn 1/1 Running 0 23m

Untuk memeriksa log di Pod, gunakan perintah:

$ kubectl -n ingress-nginx logs deploy/ingress-nginx-controller ------------------------------------------------------------------------------- NGINX Ingress controller Release: v1.0.4 Build: 9b78b6c197b48116243922170875af4aa752ee59 Repository: https://github.com/kubernetes/ingress-nginx nginx version: nginx/1.19.9 ------------------------------------------------------------------------------- W1104 00:06:59.684972 7 client_config.go:615] Neither --kubeconfig nor --master was specified. Using the inClusterConfig. This might not work. I1104 00:06:59.685080 7 main.go:221] "Creating API client" host="https://10.96.0.1:443" I1104 00:06:59.694832 7 main.go:265] "Running in Kubernetes cluster" major="1" minor="22" git="v1.22.2" state="clean" commit="8b5a19147530eaac9476b0ab82980b4088bbc1b2" platform="linux/amd64" I1104 00:06:59.937097 7 main.go:104] "SSL fake certificate created" file="/etc/ingress-controller/ssl/default-fake-certificate.pem" I1104 00:06:59.956498 7 ssl.go:531] "loading tls certificate" path="/usr/local/certificates/cert" key="/usr/local/certificates/key" I1104 00:06:59.975510 7 nginx.go:253] "Starting NGINX Ingress controller" I1104 00:07:00.000753 7 event.go:282] Event(v1.ObjectReference{Kind:"ConfigMap", Namespace:"ingress-nginx", Name:"ingress-nginx-controller", UID:"5aea2f36-fdf2-4f5c-96ff-6a5cbb0b5b82", APIVersion:"v1", ResourceVersion:"13359975", FieldPath:""}): type: 'Normal' reason: 'CREATE' ConfigMap ingress-nginx/ingress-nginx-controller I1104 00:07:01.177639 7 nginx.go:295] "Starting NGINX process" I1104 00:07:01.177975 7 leaderelection.go:243] attempting to acquire leader lease ingress-nginx/ingress-controller-leader... I1104 00:07:01.178194 7 nginx.go:315] "Starting validation webhook" address=":8443" certPath="/usr/local/certificates/cert" keyPath="/usr/local/certificates/key" I1104 00:07:01.180652 7 controller.go:152] "Configuration changes detected, backend reload required" I1104 00:07:01.197509 7 leaderelection.go:253] successfully acquired lease ingress-nginx/ingress-controller-leader I1104 00:07:01.197857 7 status.go:84] "New leader elected" identity="ingress-nginx-controller-6f5844d579-hwrqn" I1104 00:07:01.249690 7 controller.go:169] "Backend successfully reloaded" I1104 00:07:01.249751 7 controller.go:180] "Initial sync, sleeping for 1 second" I1104 00:07:01.249999 7 event.go:282] Event(v1.ObjectReference{Kind:"Pod", Namespace:"ingress-nginx", Name:"ingress-nginx-controller-6f5844d579-hwrqn", UID:"d6a2e95f-eaaa-4d6a-85e2-bcd25bf9b9a3", APIVersion:"v1", ResourceVersion:"13364867", FieldPath:""}): type: 'Normal' reason: 'RELOAD' NGINX reload triggered due to a change in configuration

Untuk mengikuti log saat streaming berjalan:

 

kubectl -n ingress-nginx logs deploy/ingress-nginx-controller -f

Meningkatkan Rilis Helm

Saya akan menyetel jumlah replika Pod pengontrol menjadi 2:

$ vimvalues.yaml  controller: replicaCount: 3

Kami dapat mengonfirmasi bahwa saat ini kami memiliki satu Pod:

$ kubectl -n ingress-nginx get deploy NAME READY UP-TO-DATE AVAILABLE AGE ingress-nginx-controller 1/1 1 1 43m

Tingkatkan rilis ingress-nginx dengan menjalankan perintah helm berikut:

 

$ helm upgrade -n ingress-nginx ingress-nginx -f values.yaml . Release "ingress-nginx" has been upgraded. Happy Helming! NAME: ingress-nginx LAST DEPLOYED: Thu Nov 4 03:35:41 2021 NAMESPACE: ingress-nginx STATUS: deployed REVISION: 5 TEST SUITE: None NOTES: The ingress-nginx controller has been installed.

Periksa jumlah pod saat ini setelah peningkatan:

$ kubectl -ningress-nginx get deploy NAME READY UP-TO-DATE AVAILABLE AGE ingress-nginx-controller 3/3 3 3 45m

Deploy Aplikasi dan ekspos menggunakan Nginx Ingress

Metode definisi Ingress juga dapat dilihat menggunakan opsi perintah jelaskan:

$ kubectl explain ingress KIND: Ingress VERSION: networking.k8s.io/v1 DESCRIPTION: Ingress is a collection of rules that allow inbound connections to reach the endpoints defined by a backend. An Ingress can be configured to give services externally-reachable urls, load balance traffic, terminate SSL, offer name based virtual hosting etc. FIELDS: apiVersion	<string> APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources kind	<string> Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds metadata	<Object> Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata spec	<Object> Spec is the desired state of the Ingress. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status status	<Object> Status is the current state of the Ingress. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status

Deploy aplikasi sampel dan ekspos menggunakan ingress

Buat ruang nama sementara yang disebut demo

 

kubectl create namespace demo

Buat file YAML Pod dan Layanan pengujian:

cd ~/ vim demo-app.yml

Tempelkan data di bawah ini ke dalam file:

kind: Pod apiVersion: v1 metadata: name: apple-app labels: app: apple spec: containers: - name: apple-app image: hashicorp/http-echo args: - "-text=apple" --- kind: Service apiVersion: v1 metadata: name: apple-service spec: selector: app: apple ports: - port: 5678 # Default port for image --- kind: Pod apiVersion: v1 metadata: name: banana-app labels: app: banana spec: containers: - name: banana-app image: hashicorp/http-echo args: - "-text=banana" --- kind: Service apiVersion: v1 metadata: name: banana-service spec: selector: app: banana ports: - port: 5678 # Default port for image

Buat pod dan objek layanan:

 

$ kubectl apply -f demo-app.yml -n demo pod/apple-app created service/apple-service created pod/banana-app created service/banana-service created

Uji apakah itu berfungsi

$ kubectl get pods -n demo NAME READY STATUS RESTARTS AGE apple-app 1/1 Running 0 2m53s banana-app 1/1 Running 0 2m52s ubuntu 1/1 Running 0 11m $ kubectl -n demo logs apple-app 2021/10/19 00:24:28 Server is listening on :5678

Buat pod Ubuntu yang akan digunakan untuk menguji koneksi layanan

 

cat <<EOF | kubectl -n demo apply -f - apiVersion: v1 kind: Pod metadata: name: ubuntu labels: app: ubuntu spec: containers: - name: ubuntu image: ubuntu:latest command: ["/bin/sleep", "3650d"] imagePullPolicy: IfNotPresent restartPolicy: Always EOF

Uji

 

$ kubectl -n demo exec -ti ubuntu -- bash [email protected]:/# apt update && apt install curl -y [email protected]:/# curl apple-service:5678 apple [email protected]:/# curl banana-service:5678 banana

Buat rute masuk

Sekarang, deklarasikan Ingress untuk merutekan permintaan ke /apple ke layanan pertama, dan permintaan ke /banana ke layanan kedua. Lihat bidang aturan Ingress yang menyatakan bagaimana permintaan diteruskan.

Untuk versi cluster Kubernetes < 1.19

$ vim demo-app-ingress.yml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: demo-app-ingress annotations: # use the shared ingress-nginx kubernetes.io/ingress.class: "nginx" spec: rules: - host: apple-banana.example.com http: paths: - path: /apple pathType: Prefix backend: service: name: apple-service port: number: 5678 - path: /banana pathType: Prefix backend: service: name: banana-service port: number: 5678

Buat sumber daya masuk dengan kubectl:

 

$ kubectl -n demo apply -f demo-app-ingress.yml ingress.networking.k8s.io/demo-app-ingress created

Untuk versi cluster Kubernetes >= 1.19 :

apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: nginx spec: controller: k8s.io/ingress-nginx --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: demo-app-ingress spec: ingressClassName: nginx rules: - host: apple-banana.example.com http: paths: - path: /apple pathType: Prefix backend: service: name: apple-service port: number: 5678 - path: /banana pathType: Prefix backend: service: name: banana-service port: number: 5678

Kemudian terapkan file untuk membuat objek

 

$ kubectl -n demo apply -f demo-app-ingress.yml ingressclass.networking.k8s.io/nginx configured ingress.networking.k8s.io/demo-app-ingress created

Daftar masuk yang dikonfigurasi:

$ kubectl get ingress -n demo NAME CLASS HOSTS ADDRESS PORTS AGE demo-app-ingress <none> apple-banana.example.com192.168.42.245 80 7m36s

Masukkan pengontrol ingress nginx untuk memeriksa apakah konfigurasi nginx jika disuntikkan

$ kubectl get pods -n ingress-nginx NAME READY STATUS RESTARTS AGE ingress-nginx-controller-6f5844d579-hwrqn 1/1 Running 0 53m ingress-nginx-controller-6f5844d579-kvgtd 1/1 Running 0 25m ingress-nginx-controller-6f5844d579-lcrrt 1/1 Running 0 25m $ kubectl exec -n ingress-nginx -itingress-nginx-controller-6f5844d579-hwrqn -- /bin/bash bash-5.1$

Menghapus Instalasi Bagan

Untuk menghapus pengontrol ingress nginx dan semua sumber daya terkait yang kami gunakan oleh Helm, jalankan perintah di bawah ini di terminal Anda.

 

$ helm-ningress-nginx uninstallingress-nginx release "ingress-nginx" uninstalled