Questo documento mostra come creare un oggetto Kubernetes Ingress in un cluster utente per Google Distributed Cloud. Un Ingress è associato a uno o più servizi, ciascuno 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, di seguito sono riportati i punti importanti da comprendere in merito al file manifest di Deployment:
Ogni pod che appartiene al deployment ha l'etichetta
greeting: hello
.Ogni pod ha due container.
I campi
env
specificano che i containerhello-app
ascoltano sulla porta TCP 50000 e i containernode-hello
sulla porta TCP 8080. Perhello-app
, puoi vedere l'effetto della variabile di ambientePORT
esaminando i 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 file kubeconfig per il tuo cluster utente.
Esposizione del 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 ServicePort
Kubernetes: uno denominato world-port
e uno denominato kubernetes-port
.
Di seguito sono riportati i modi in cui un client può chiamare il servizio:
Utilizzando
world-port
: un client in esecuzione su uno dei nodi del cluster invia una richiesta richiesta aclusterIP
il giornoport
. In questo esempio, 10.96.14.249:60000. La richiesta viene inoltrata a un pod del membro il giornotargetPort
. In questo esempio, POD_IP_ADDRESS:50.000.Con
kubernetes-port
: un client in esecuzione su uno dei nodi del cluster invia una richiesta aclusterIP
il giornoport
. In questo esempio, 10.96.14.249:60001. La richiesta viene inoltrata a un pod del membro il giornotargetPort
. In questo esempio, POD_IP_ADDRESS:8080.
Componenti Ingress
Di seguito sono riportati alcuni dei componenti del cluster relativi all'ingresso:
Il deployment
istio-ingress
. Si tratta del proxy di ingresso. Il proxy di ingresso inoltra il traffico ai servizi interni in base alle regole specificate in un oggetto Ingress.Il Servizio
istio-ingress
. Questo servizio espone il deploymentistio-ingress
.Il deployment
istiod
. Si tratta del controller di ingresso. Il traffico in entrata controlla la creazione di In entrata e configura il proxy in entrata di conseguenza.
Crea un 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 il
In entrata:
kubectl apply --kubeconfig USER_CLUSTER_KUBECONFIG -f my-ingress.yaml
Quando crei un cluster utente, specifichi un valore per
loadbalancer.ingressVip
nel file di configurazione del cluster. Questo indirizzo IP è
configurate sul bilanciatore del carico del cluster. Quando crei una risorsa Ingress,
riceve lo stesso VIP del suo indirizzo IP esterno.
Quando un client invia una richiesta al VIP in entrata del cluster utente, la richiesta viene
instradato al bilanciatore del carico. Il bilanciatore del carico utilizza il servizio istio-ingress
per inoltrare la richiesta al proxy in entrata, eseguito nel cluster utente. La
Il proxy in entrata è configurato per inoltrare la richiesta a backend diversi a seconda
nel percorso dell'URL della richiesta.
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 tuo servizio hello-service
.
- name: world-port port: 60000 protocol: TCP targetPort: 50000
Il servizio di ingresso inoltra la richiesta a clusterIP
:50000. La richiesta quindi
va a uno dei pod membri del servizio hello-service
. Il container nel
pod in ascolto sulla porta 50000 mostra un messaggio Hello World!
.
Percorso /greet-kubernetes
Nel manifest Ingress, puoi vedere una regola che indica il percorso
/greet-kubernetes
è associato a serviceName: hello-service
e
servicePort: 60001
. Ricorda che 60001 è il valore port
nella
Sezione kubernetes-port
del tuo servizio hello-service
.
- name: kubernetes-port port: 60001 protocol: TCP targetPort: 8080
Il servizio di ingresso inoltra la richiesta a clusterIP
: 8080. La richiesta quindi
va a uno dei pod membri del servizio hello-service
. Il container, in
quel pod, in ascolto sulla porta 8080 viene visualizzato un messaggio Hello Kubernetes!
.
Testa il traffico in entrata
Testa la risorsa Ingress 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 Ingress utilizzando il percorso /greet-kubernetes
:
curl USER_CLUSTER_INGRESS_VIP/greet-kubernetes
L'output mostra un messaggio Hello, Kubernetes!
:
Hello Kubernetes!
Configura HTTPS per Ingress
Se vuoi accettare richieste HTTPS dai tuoi client, il proxy di ingresso deve avere un certificato per dimostrare la propria identità ai client. Questo proxy e disporre di una chiave privata per completare l'handshake HTTPS.
L'esempio seguente utilizza queste entità:
Proxy in entrata: partecipa all'handshake HTTPS e inoltra i pacchetti ai pod membri del servizio
hello-service
.Dominio per il servizio
hello-service
: altostrat.com nell'organizzazione di esempio
Segui questi passaggi:
Crea un certificato radice e una chiave privata. Questo esempio utilizza un'autorità di certificazione radice di
root.ca.example.com
in 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 pubblicazione per il proxy di ingresso.
openssl x509 -req -days 365 -CA root-ca.crt -CAkey root-ca.key -set_serial 0 -in server.csr -out server.crt
A questo punto hai creato i certificati e le chiavi seguenti:
root-ca.crt
: certificato per la CA radiceroot-ca.key
: chiave privata per la CA principaleserver.crt
: certificato di pubblicazione per il proxy in entrataserver.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, e di lasciarli invariati. Se non l'hai fatto, creali ora seguendo i passaggi descritti per HTTP.
Crea una risorsa Ingress
Se in precedenza hai creato una risorsa Ingress nella parte HTTP, eliminala 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
Ingres con una sezione tls
. In questo modo verrà attivato HTTPS tra i client e il proxy di ingresso.
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'oggetto Ingress:
kubectl apply --kubeconfig USER_CLUSTER_KUBECONFIG -f my-ingress-2.yaml
Conferma con il test.
Verifica 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 l'Ingress:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG delete ingress INGRESS_NAME
Sostituisci INGRESS_NAME con il nome dell'Ingress, ad esempio my-ingress
o my-ingress-2
.
Eliminare il servizio:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG delete service hello-service
Elimina il tuo deployment:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG delete deployment hello-deployment