Questa pagina mostra come creare un oggetto Kubernetes Ingress in un cluster Anthos sul cluster utente VMware (GKE on-prem). Un oggetto Ingress deve essere associato a uno o più oggetti Service, ognuno dei quali è associato a un set di pod.
Accedi alla workstation mediante SSH
Accedi alla workstation mediante SSH:
ssh -i ~/.ssh/vsphere_workstation ubuntu@[IP_ADDRESS]
dove [IP_ADDRESS] è l'indirizzo IP della workstation di amministrazione.
Esegui tutti i passaggi rimanenti di questo argomento sulla 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 questa esercitazione, ecco i punti importanti da comprendere sul manifest del 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
sono in ascolto sulla porta TCP 50000 e i containernode-hello
in ascolto sulla porta TCP 8080. Perhello-app
, puoi vedere l'effetto della variabile di ambientePORT
esaminando il codice sorgente.
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 file kubeconfig per il cluster utente.
Esposizione del deployment con un servizio
Per fornire ai clienti un modo stabile di inviare richieste ai pod del tuo deployment, crea un servizio.
Ecco un manifest per un Service che espone il tuo deployment ai client all'interno e all'esterno del cluster:
apiVersion: v1 kind: Service metadata: name: hello-service spec: type: NodePort 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 i valori nodePort
che sono stati assegnati al servizio:
apiVersion: v1 kind: Service metadata: ... name: hello-service namespace: default ... spec: clusterIP: 10.105.252.237 externalTrafficPolicy: Cluster ports: - name: world-port nodePort: 31807 port: 60000 protocol: TCP targetPort: 50000 - name: kubernetes-port nodePort: 30734 port: 60001 protocol: TCP targetPort: 8080 selector: greeting: hello sessionAffinity: None type: NodePort status: loadBalancer: ingress: - {}
Nell'output precedente, il campo ports
è un array di oggetti ServicePort: uno denominato world-port
e uno denominato kubernetes-port
.
Ecco i modi in cui un cliente può chiamare il servizio utilizzando world-port
:
Un client in esecuzione su uno dei nodi del cluster può inviare una richiesta all'elemento
clusterIP
suport
. In questo esempio, 10.105.252.237:60000. La richiesta viene inoltrata a un pod di membri il giornotargetPort
. In questo esempio, [POD_IP_ADDRESS]:50000.Un client può inviare una richiesta all'indirizzo IP di qualsiasi nodo del cluster su
nodePort
. In questo esempio, [NODE_IP_ADDRESS]:31807. La richiesta viene inoltrata a un pod di membri il giornotargetPort
. In questo esempio, [POD_IP_ADDRESS]:50000.
Ecco i modi in cui un cliente può chiamare il servizio utilizzando kubernetes-port
:
Un client in esecuzione su uno dei nodi del cluster può inviare una richiesta all'elemento
clusterIP
suport
. In questo esempio, 10.105.252.237:60001. La richiesta viene inoltrata a un pod di membri il giornotargetPort
. In questo esempio, [POD_IP_ADDRESS]:8080.Un client può inviare una richiesta all'indirizzo IP di qualsiasi nodo del cluster su
nodePort
. In questo esempio, [NODE_IP_ADDRESS]:30734. La richiesta viene inoltrata a un pod di membri il giornotargetPort
. In questo esempio, [POD_IP_ADDRESS]:8080.
Creare una risorsa Ingress
Ecco un manifest per una risorsa Ingress:
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: my-ingress spec: rules: - http: paths: - path: /greet-the-world backend: serviceName: hello-service servicePort: 60000 - path: /greet-kubernetes backend: serviceName: hello-service servicePort: 60001
Copia il manifest in un file denominato my-ingress.yaml
e crea la risorsa
Ingress:
kubectl apply --kubeconfig [USER_CLUSTER_KUBECONFIG] -f my-ingress.yaml
Durante la creazione del tuo cluster utente, hai specificato un indirizzo IP virtuale (VIP)
per il traffico in entrata fornendo un valore per usercluster.vips.ingressvip
nel
file di configurazione del cluster utente.
Quando un client invia una richiesta al tuo VIP Ingress in cluster, la richiesta viene instradata al bilanciatore del carico BIG-IP di F5. Il bilanciatore del carico inoltra la richiesta a un servizio in entrata in esecuzione nel cluster utente. Il servizio in entrata è configurato per inoltrare la richiesta a backend diversi a seconda del percorso dell'URL della richiesta.
È importante capire che esistono due diversi servizi relativi ai passaggi di questo argomento:
Il tuo servizio
hello-service
. Questo è un servizio che hai creato per esporre i pod del tuo deploymenthello-deployment
.Il servizio in entrata eseguito nello spazio dei nomi
gke-system
del cluster utente. Questo servizio fa parte della tua infrastruttura cluster.
Percorso /greet-the-world
Nel manifest 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
nel campo world-port
del servizio hello-service
.
- name: world-port nodePort: 31807 port: 60000 protocol: TCP targetPort: 50000
Il servizio in entrata sceglie un nodo cluster e inoltra la richiesta al nodo su nodePort
. In questo esempio, [NODE_IP_ADDRESS]:31807. Le regole iptables sul nodo inoltrano la richiesta a un pod membro sulla porta 50000. Il
contenitore in ascolto sulla porta 50000 visualizza un messaggio Hello World!
.
Percorso /greet-kubernetes
Nel manifest 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 port
nel
campo kubernetes-port
del servizio hello-service
.
- name: kubernetes-port nodePort: 30734 port: 60001 protocol: TCP targetPort: 8080
Il servizio in entrata sceglie un nodo cluster e inoltra la richiesta al nodo su nodePort
. In questo esempio, [NODE_IP_ADDRESS]:30734. Le regole iptables sul nodo inoltrano la richiesta a un pod membro sulla porta 8080.
Il container in ascolto sulla porta 8080 visualizza un messaggio Hello Kubernetes!
.
Verifica il traffico Ingress:
Testa l'Ingress utilizzando il percorso /greet-the-world
:
curl [USER_CLUSTER_INGRESS_VIP]/greet-the-world
L'output mostra un messaggio Hello, world!
:
Hello, world! Version: 2.0.0 Hostname: ...
Testa l'Ingress utilizzando il percorso /greet-kubernetes
:
curl [USER_CLUSTER_INGRESS_VIP]/greet-kubernetes
L'output mostra un messaggio Hello, Kubernetes!
:
Hello Kubernetes!
Pulizia
Elimina la risorsa Ingress:
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] delete ingress my-ingress
Elimina il servizio:
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] delete service hello-service
Elimina il deployment:
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] delete deployment hello-deployment