Questo documento mostra come creare un oggetto Ingress Kubernetes in un cluster utente per Google Distributed Cloud. Un Ingress è associato a uno o più servizi, ognuno dei quali è associato a un insieme di pod.
Prima di iniziare
Ottieni una connessione SSH alla tua workstation di amministrazione:
Creazione di un deployment
Ecco un manifest per un 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"
Ai fini di questo esercizio, questi sono i punti importanti da comprendere sul manifest di deployment:
- Ogni pod appartenente al deployment ha l'etichetta - greeting: hello.
- Ogni pod ha due container. 
- I campi - envspecificano che i container- hello-appsono in ascolto sulla porta TCP 50000 e i container- node-hellosulla porta TCP 8080. Per- hello-app, puoi vedere l'effetto della variabile di ambiente- PORTesaminando il codice sorgente di hello-app.
Copia il manifest in un file denominato hello-deployment.yaml e crea il
Deployment:
kubectl apply --kubeconfig USER_CLUSTER_KUBECONFIG -f hello-deployment.yaml
dove USER_CLUSTER_KUBECONFIG è il percorso del file kubeconfig per il cluster utente.
Esporre il deployment con un servizio
Per fornire ai client un modo stabile per inviare richieste ai pod del tuo deployment, crea un servizio.
Ecco un manifest per un servizio che espone il deployment ai client all'interno del cluster:
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
Copia il manifest in un file denominato hello-service.yaml e crea il servizio:
kubectl apply --kubeconfig USER_CLUSTER_KUBECONFIG -f hello-service.yaml
Visualizza il servizio:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get service hello-service --output yaml
L'output mostra il valore di clusterIP assegnato al servizio.
Ad esempio:
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: {}
Nell'output precedente, il campo ports è un array di oggetti Kubernetes
ServicePort: uno denominato world-port e uno denominato kubernetes-port.
Questi sono i modi in cui un client può chiamare il servizio:
- Utilizzo di - world-port: un client in esecuzione su uno dei nodi del cluster invia una richiesta a- clusterIPsu- port. In questo esempio, 10.96.14.249:60000. La richiesta viene inoltrata a un pod membro il giorno- targetPort. In questo esempio, POD_IP_ADDRESS:50000.
- Utilizzo di - kubernetes-port: un client in esecuzione su uno dei nodi del cluster invia una richiesta a- clusterIPsu- port. In questo esempio, 10.96.14.249:60001. La richiesta viene inoltrata a un pod membro il giorno- targetPort. In questo esempio, POD_IP_ADDRESS:8080.
Componenti Ingress
Ecco alcuni componenti del cluster correlati all'ingresso:
- Il deployment - istio-ingress. Questo è il proxy in entrata. Il proxy ingress inoltra il traffico ai servizi interni in base alle regole specificate in un oggetto Ingress.
- Il servizio - istio-ingress. Questo servizio espone il deployment- istio-ingress.
- Il deployment - istiod. Questo è il controller Ingress. Il controller Ingress monitora la creazione di oggetti Ingress e configura il proxy Ingress di conseguenza.
Crea una risorsa Ingress
Ecco un manifest per un 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
Copia il manifest in un file denominato my-ingress.yaml e crea l'ingresso:
kubectl apply --kubeconfig USER_CLUSTER_KUBECONFIG -f my-ingress.yaml
Quando crei un cluster utente, specifica un valore per
loadbalancer.ingressVip nel file di configurazione del cluster. Questo indirizzo IP è
configurato sul bilanciatore del carico del cluster. Quando crei un Ingress, a Ingress viene assegnato lo stesso VIP come indirizzo IP esterno.
Quando un client invia una richiesta al VIP in entrata del cluster utente, la richiesta viene
instradata al bilanciatore del carico. Il bilanciatore del carico utilizza il servizio istio-ingress
per inoltrare la richiesta al proxy in entrata, che viene eseguito nel cluster utente. Il
proxy in entrata è configurato per inoltrare la richiesta a backend diversi a seconda
del percorso nell'URL della richiesta.
Il percorso /greet-the-world
Nel manifest di Ingress, puoi vedere una regola che indica che il percorso
/greet-the-world è associato a serviceName: hello-service e
servicePort: 60000. Ricorda che 60000 è il valore port nella sezione world-port
del servizio hello-service.
- name: world-port
    port: 60000
    protocol: TCP
    targetPort: 50000
Il servizio in entrata inoltra la richiesta a clusterIP:50000. La richiesta viene quindi
inviata a uno dei pod membri del servizio hello-service. Il container, in
quel pod, in ascolto sulla porta 50000 mostra un messaggio Hello World!.
Il percorso /greet-kubernetes
Nel manifest di Ingress, puoi vedere una regola che indica che il percorso
/greet-kubernetes è associato a serviceName: hello-service e
servicePort: 60001. Ricorda che 60001 è il valore di port nella sezione
kubernetes-port del tuo servizio hello-service.
- name: kubernetes-port
    port: 60001
    protocol: TCP
    targetPort: 8080
Il servizio in entrata inoltra la richiesta a clusterIP: 8080. La richiesta viene quindi
inviata a uno dei pod membri del servizio hello-service. Il container, in
quel pod, in ascolto sulla porta 8080 visualizza un messaggio Hello Kubernetes!.
Testa l'ingresso
Testa l'ingresso utilizzando il percorso /greet-the-world:
curl USER_CLUSTER_INGRESS_VIP/greet-the-world
Sostituisci USER_CLUSTER_INGRESS_VIP con l'indirizzo IP esterno di Ingress.
L'output mostra un messaggio Hello, world!:
Hello, world! Version: 2.0.0 Hostname: ...
Testa l'ingresso utilizzando il percorso /greet-kubernetes:
curl USER_CLUSTER_INGRESS_VIP/greet-kubernetes
L'output mostra un messaggio Hello, Kubernetes!:
Hello Kubernetes!
Configurare HTTPS per Ingress
Se vuoi accettare le richieste HTTPS dai tuoi client, il proxy Ingress deve avere un certificato per poter dimostrare la propria identità ai tuoi client. Questo proxy deve anche avere una chiave privata per completare l'handshake HTTPS.
Il seguente esempio utilizza queste entità:
- Proxy Ingress: partecipa all'handshake HTTPS e poi inoltra i pacchetti ai pod membri del servizio - hello-service.
- Dominio per il servizio - hello-service: altostrat.com in Example Org
Segui questi passaggi:
- Crea un certificato radice e una chiave privata. Questo esempio utilizza un'autorità di certificazione radice - root.ca.example.comin 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 
- Crea una richiesta di firma del certificato: - openssl req -out server.csr -newkey rsa:2048 -nodes -keyout server.key -subj "/CN=altostrat.com/O=Example Org" 
- Crea un certificato di servizio per il proxy Ingress. - openssl x509 -req -days 365 -CA root-ca.crt -CAkey root-ca.key -set_serial 0 -in server.csr -out server.crt - Ora hai creato i seguenti certificati e chiavi: - root-ca.crt: Certificato per la CA radice
- root-ca.key: Chiave privata per la CA radice
- server.crt: Certificato di servizio per il proxy in entrata
- server.key: Chiave privata per il proxy in entrata
 
- Crea un secret Kubernetes che contenga il certificato e la chiave di servizio. - kubectl create secret tls example-server-creds --key=server.key --cert=server.crt --namespace gke-system - Il secret risultante si chiama - example-server-creds.
Crea un deployment e un servizio
Se hai creato un deployment e un servizio nella parte HTTP di questa guida, lasciali in posizione. In caso contrario, creali ora, seguendo i passaggi descritti per HTTP.
Crea una risorsa Ingress
La creazione di una risorsa Ingress per HTTPS è simile alla creazione di una risorsa Ingress per
HTTP, ma la specifica Ingress per HTTPS include una sezione tls
che specifica l'host e un secret. hosts nella sezione tls
deve corrispondere esplicitamente a host nella sezione rules.
Se il servizio di backend si trova in uno spazio dei nomi separato, devi creare un servizio di tipo ExternalName nello stesso spazio dei nomi di Ingress per instradare il traffico al servizio di backend.
Se in precedenza hai creato un Ingress nella parte HTTP, eliminalo prima di procedere.
Elimina l'oggetto Ingress:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG delete ingress my-ingress
Per gestire il traffico per il servizio che hai creato in precedenza, crea un nuovo
Ingress con una sezione tls. In questo modo, HTTPS verrà abilitato tra i client e il
proxy in entrata.
Ecco un manifest per un 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
Salva il manifest in un file denominato my-ingress-2.yaml e crea l'ingresso:
kubectl apply --kubeconfig USER_CLUSTER_KUBECONFIG -f my-ingress-2.yaml
Conferma tramite test.
- Testa il percorso /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 
- Testa il percorso - /greet-kubernetes:- curl -v --resolve altostrat.com:443:USER_CLUSTER_INGRESS_VIP https://altostrat.com/greet-kubernetes --cacert root-ca.crt - Output: - Hello Kubernetes! 
Pulizia
Elimina il tuo Ingress:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG delete ingress INGRESS_NAME
Sostituisci INGRESS_NAME con il nome dell'ingresso, ad esempio my-ingress o my-ingress-2.
Elimina il servizio:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG delete service hello-service
Elimina il deployment:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG delete deployment hello-deployment