Dokumen ini menunjukkan cara membuat objek Ingress Kubernetes di cluster pengguna untuk Google Distributed Cloud. Ingress dikaitkan dengan satu atau beberapa Layanan, yang masing-masing dikaitkan dengan sekumpulan Pod.
Sebelum memulai
Dapatkan koneksi SSH ke workstation admin Anda:
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"
Untuk 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 - envmenentukan bahwa container- hello-appmemproses port TCP 50000, dan container- node-hellomemproses port TCP 8080. Untuk- hello-app, Anda dapat melihat efek variabel lingkungan- PORTdengan 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 Service
Untuk menyediakan cara yang stabil bagi klien untuk mengirim permintaan ke Pod Deployment Anda, buat Service.
Berikut adalah manifes untuk Service yang mengekspos Deployment Anda ke klien di 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 menampilkan 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 bernama world-port dan satu lagi bernama kubernetes-port.
Berikut cara klien dapat memanggil Layanan:
- Menggunakan - world-port: Klien yang berjalan di salah satu node cluster mengirimkan permintaan ke- clusterIPdi- port. Dalam contoh ini, 10.96.14.249:60000. Permintaan diteruskan ke Pod anggota di- targetPort. Dalam contoh ini, POD_IP_ADDRESS:50000.
- Menggunakan - kubernetes-port: Klien yang berjalan di salah satu node cluster mengirim permintaan ke- clusterIPdi- port. Dalam contoh ini, 10.96.14.249:60001. Permintaan diteruskan ke Pod anggota di- targetPort. Dalam contoh ini, POD_IP_ADDRESS:8080.
Komponen ingress
Berikut adalah beberapa komponen cluster yang terkait dengan ingress:
- Deployment - istio-ingress. Ini adalah proxy ingress. Proxy ingress meneruskan traffic ke Layanan internal sesuai dengan aturan yang ditentukan dalam objek Ingress.
- Layanan - istio-ingress. Layanan ini mengekspos- istio-ingressDeployment.
- Deployment - istiod. Ini adalah pengontrol ingress. Pengontrol ingress memantau pembuatan objek Ingress dan mengonfigurasi proxy ingress yang sesuai.
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 menentukan nilai untuk
loadbalancer.ingressVip dalam file konfigurasi cluster. Alamat IP ini dikonfigurasi di load balancer cluster. Saat Anda membuat Ingress, Ingress
diberi VIP yang sama ini sebagai alamat IP eksternalnya.
Saat klien mengirim permintaan ke VIP ingress cluster pengguna Anda, permintaan tersebut akan
dirutekan ke load balancer Anda. Load balancer menggunakan istio-ingress Service
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 dapat melihat aturan yang menyatakan bahwa jalur
/greet-the-world dikaitkan dengan serviceName: hello-service dan
servicePort: 60000. Ingatlah bahwa 60000 adalah nilai port di bagian world-port
pada Service hello-service Anda.
- name: world-port
    port: 60000
    protocol: TCP
    targetPort: 50000
Layanan ingress meneruskan permintaan ke clusterIP:50000. Permintaan kemudian
diteruskan ke salah satu Pod anggota Service hello-service. Container, di
Pod tersebut, yang memproses port 50000 akan menampilkan pesan Hello World!.
Jalur /greet-kubernetes
Dalam manifes Ingress, Anda dapat melihat aturan yang menyatakan bahwa jalur
/greet-kubernetes dikaitkan dengan serviceName: hello-service dan
servicePort: 60001. Ingat bahwa 60001 adalah nilai port di bagian
kubernetes-port pada Service hello-service Anda.
- name: kubernetes-port
    port: 60001
    protocol: TCP
    targetPort: 8080
Layanan ingress meneruskan permintaan ke clusterIP: 8080. Permintaan kemudian
diteruskan ke salah satu Pod anggota Service hello-service. Container, di Pod tersebut, yang memproses port 8080 akan 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 Anda. Proxy ini juga harus memiliki kunci pribadi untuk menyelesaikan handshake HTTPS.
Contoh berikut menggunakan entitas ini:
- Proxy ingress: Berpartisipasi dalam handshake HTTPS, lalu meneruskan paket ke Pod anggota - hello-serviceService.
- Domain untuk Layanan - hello-service: altostrat.com di Example Org
Ikuti langkah-langkah berikut:
- Buat sertifikat root dan kunci pribadi. Contoh ini menggunakan otoritas sertifikat root - root.ca.example.comdi 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 ingress. - 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 CA root
- root-ca.key: Kunci pribadi untuk CA root
- server.crt: Menayangkan sertifikat untuk proxy ingress
- server.key: Kunci pribadi untuk proxy ingress
 
- Buat 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 Service di bagian HTTP dalam panduan ini, biarkan keduanya tetap ada. Jika Anda belum melakukannya, buat sekarang, dengan mengikuti langkah-langkah yang dijelaskan untuk HTTP.
Membuat Ingress
Membuat Ingress untuk HTTPS mirip dengan membuat Ingress untuk
HTTP, tetapi spesifikasi Ingress untuk HTTPS menyertakan bagian tls
yang menentukan host dan Secret. hosts di bagian tls
harus cocok secara eksplisit dengan host di bagian rules.
Jika Layanan backend Anda berada di namespace terpisah, Anda perlu membuat Layanan jenis ExternalName di namespace yang sama dengan Ingress untuk merutekan traffic ke Layanan backend.
Jika sebelumnya Anda membuat Ingress di bagian HTTP, hapus Ingress tersebut sebelum melanjutkan.
Hapus Ingress:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG delete ingress my-ingress
Untuk menangani traffic untuk Layanan yang Anda buat sebelumnya, buat Ingress baru yang memiliki bagian tls. Tindakan ini akan mengaktifkan HTTPS antara klien dan
proxy ingress.
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, lalu buat Ingress:
kubectl apply --kubeconfig USER_CLUSTER_KUBECONFIG -f my-ingress-2.yaml
Konfirmasi dengan pengujian.
- 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
Hapus Ingress Anda:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG delete ingress INGRESS_NAME
Ganti INGRESS_NAME dengan nama Ingress, seperti my-ingress atau my-ingress-2.
Menghapus Layanan Anda:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG delete service hello-service
Hapus Deployment Anda:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG delete deployment hello-deployment