Creazione di un Servizio e un Ingress

Questa pagina mostra come creare un oggetto Ingress Kubernetes in un cluster utente 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 container hello-app sono in ascolto sulla porta TCP 50000 e i container node-hello in ascolto sulla porta TCP 8080. Per hello-app, puoi vedere l'effetto della variabile di ambiente PORT 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 su port. In questo esempio, 10.105.252.237:60000. La richiesta viene inoltrata a un pod di membri il giorno targetPort. 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 giorno targetPort. 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 su port. In questo esempio, 10.105.252.237:60001. La richiesta viene inoltrata a un pod di membri il giorno targetPort. 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 giorno targetPort. 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 deployment hello-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

Passaggi successivi

Panoramica degli argomenti avanzati per l'installazione

Creazione di dashboard per monitorare l'integrità del cluster