Mecanismo de enrutamiento de capa 7: ingreso

Este artículo es bastante confuso, por lo que apenas puedo leerlo.

Concepto de ingreso:

En términos sencillos: Ingress, al igual que Service and Deployment mencionado anteriormente, también es un tipo de recurso k8s; Ingress se usa para acceder a la aplicación interna de k8s mediante la implementación de un nombre de dominio, y Service puede ser más adecuado para el acceso entre servicios.

Usamos esta versión del mantenimiento oficial de k8s, y también hay una versión oficial de nginx, cómo usarla depende del individuo.

Ingress admite una variedad de soluciones: incluidas Nginx, Haproxy, Traefik, istio, etc.; en la práctica, puede haber un proxy de capa de hardware de una empresa además de Ingress.

El diagrama de flujo aproximado es el siguiente:
inserte la descripción de la imagen aquí

Crear un ingreso:

Este ingreso se crea utilizando el método Hlem, y escribiré un artículo sobre el uso de helm en el futuro. No me importa el principio ahora.

Proporcionaré los siguientes recursos:

  • Dos direcciones de descarga de imagen de contenedor utilizadas por Ingress-nginx:

  • Dirección espejo: registration.cn-hangzhou.aliyuncs.com

  • Espejo:yyangs/ingress-nginx-controller;yyangs/ingress-nginx-kube-webhook-certgen

  • Enlace del paquete de gráficos: ingreso-nginx-4.0.17

  • Primero creamos un Helm (porque queremos usar helm para crear)

[root@k8s-master01 ~]# wget https://get.helm.sh/helm-v3.8.0-linux-amd64.tar.gz
[root@k8s-master01 ~]# tar xf helm-v3.8.0-linux-amd64.tar.gz
[root@k8s-master01 ~]# mv linux-amd64/helm /usr/local/bin/helm
  • Cree un repositorio para facilitar la instalación de ingress: la versión de APP VERSION de ingress debe ser preferiblemente superior a 0.35, verifique los paquetes disponibles debajo de ella
[root@k8s-master01 ~]# helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
"ingress-nginx" has been added to your repositories
[root@k8s-master01 ~]# helm repo list
NAME         	URL                                       
ingress-nginx	https://kubernetes.github.io/ingress-nginx
[root@k8s-master01 ~]# helm search repo ingress-nginx
NAME                       	CHART VERSION	APP VERSION	DESCRIPTION                                       
ingress-nginx/ingress-nginx	4.0.17       	1.1.1      	Ingress controller for Kubernetes using NGINX a...
  • Descargue el paquete de ingreso y descomprima el paquete en un directorio creado para modificar la configuración fácilmente
[root@k8s-master01 ~]# helm pull ingress-nginx/ingress-nginx
ingress-nginx-4.0.17.tgz
[root@k8s-master01 ~]# mkdir /temp
[root@k8s-master01 ~]# mv ingress-nginx-4.0.17.tgz /temp/
[root@k8s-master01 ~]# cd /temp/
[root@k8s-master01 temp]# tar xf ingress-nginx-4.0.17.tgz 
# 进到ingress-nginx目录
[root@k8s-master01 temp]# cd ingress-nginx/
  • Modifica valores.yaml, básicamente cada línea representa una posición
# 源位置
controller:
  name: controller
  image:
    registry: registry.cn-hangzhou.aliyuncs.com
    image: yyangs/ingress-nginx-controller
    ## digest: sha256:0bc88eb15f9e7f84e8e56c14fa5735aaa488b840983f87bd79b1054190e660de
# dns策略
  dnsPolicy: ClusterFirstWithHostNet
# 使用宿主机端口号,性能好
  hostNetwork: true
# 资源类型选择DaemonSet,会在指定节点上部署
  kind: DaemonSet
# 在有标签的node上部署
  nodeSelector:
    kubernetes.io/os: linux
    ingress: "true"
# 类型,本地环境使用
    type: ClusterIP
# 最后位置的另一处源位置
    patch:
      enabled: true
      image:
        registry: registry.cn-hangzhou.aliyuncs.com
        image: yyangs/ingress-nginx-kube-webhook-certgen
        ## digest: sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660

Algunas notas sobre las modificaciones anteriores:

  • Mirror source: su fuente predeterminada es extranjera y no podemos acceder a ella. Así que lo reemplacé con mi fuente Ali. Si estás haciendo este experimento, puedes usar mi fuente; la última fuente es la misma; presta atención a los comentarios de verificación

  • Use hostNetwork: true para crear y seleccione DaemonSet con el tipo de recurso para un mejor rendimiento

  • política dns: si se usa hostNetwork, la política debe cambiarse a dnsPolicy: ClusterFirstWithHostNet

  • Ejecutar la creación de archivos yaml

# 创建一个命名空间
[root@k8s-master01 ingress-nginx]# kubectl create ns ingress-nginx
namespace/ingress-nginx created
# 因为要在指定node上创建,所以给一台机器创建一个标签
[root@k8s-master01 ingress-nginx]# kubectl label nodes k8s-master03 ingress=true
node/k8s-master03 labeled
# 执行helm创建,那个名称自定义,之前出了一点问题,所以换个名字。
[root@k8s-master01 ~]# cd /temp/ingress-nginx/
您在 /var/spool/mail/root 中有新邮件
[root@k8s-master01 ingress-nginx]# helm install nginx-ingress -n ingress-nginx .
[root@k8s-master01 temp]# kubectl get pod -n ingress-nginx -o wide 
NAME                                           READY   STATUS    RESTARTS   AGE   IP             NODE           NOMINATED NODE   READINESS GATES
nginx-ingress-ingress-nginx-controller-lrs9s   1/1     Running   0          22h   192.168.10.4   k8s-master03   <none>           <none>

Puede ver que el Pod se ha activado e implementado en el nodo master03, es decir, ingress=tureel nodo con la etiqueta, por lo que es mucho más conveniente expandir o reducir el ingreso.
Por ejemplo, cuando desee expandir la capacidad, solo necesita marcar la etiqueta correspondiente en el nodo que desea expandir, y automáticamente se implementará un nuevo Pod, tal como el siguiente comando.

kubectl label node k8s-master02 ingress=true

Cuando no quiera este Pod, será más fácil encogerlo, solo quite la etiqueta. Puede ver el poder de la etiqueta. El signo menos significa eliminar la etiqueta.

kubectl label node k8s-master02 ingress-

El ingreso implementado por hostNetwork iniciará un proceso en el host. Vayamos al nodo donde se implementa el Pod.

[root@k8s-master03 ~]# ss -tpln | grep 80
LISTEN     0      16384  192.168.10.4:2380                     *:*                   users:(("etcd",pid=1703,fd=7))
LISTEN     0      16384        *:80                       *:*                   users:(("nginx",pid=106434,fd=19),("nginx",pid=106427,fd=19))
LISTEN     0      16384        *:80                       *:*                   users:(("nginx",pid=106433,fd=11),("nginx",pid=106427,fd=11))
LISTEN     0      16384     [::]:80                    [::]:*                   users:(("nginx",pid=106433,fd=12),("nginx",pid=106427,fd=12))
LISTEN     0      16384     [::]:80                    [::]:*                   users:(("nginx",pid=106434,fd=20),("nginx",pid=106427,fd=20))
[root@k8s-master03 ~]# ps aux | grep nginx
root       2622  0.0  0.1   8852  5456 ?        Ss   01:12   0:00 nginx: master process nginx -g daemon off;
101        2759  0.0  0.0   9272  2456 ?        S    01:12   0:00 nginx: worker process
101        2760  0.0  0.0   9272  2456 ?        S    01:12   0:00 nginx: worker process
root      25605  0.0  0.0 112840  2292 pts/0    S+   15:19   0:00 grep --color=auto nginx
101      106347  0.0  0.0    208     4 ?        Ss   09:08   0:00 /usr/bin/dumb-init -- /nginx-ingress-controller --publish-service=ingress-nginx/nginx-ingress-ingress-nginx-controller --election-id=ingress-controller-leader --controller-class=k8s.io/ingress-nginx --ingress-class=nginx --configmap=ingress-nginx/nginx-ingress-ingress-nginx-controller --validating-webhook=:8443 --validating-webhook-certificate=/usr/local/certificates/cert --validating-webhook-key=/usr/local/certificates/key
101      106359  0.1  1.1 743048 44956 ?        Ssl  09:08   0:25 /nginx-ingress-controller --publish-service=ingress-nginx/nginx-ingress-ingress-nginx-controller --election-id=ingress-controller-leader --controller-class=k8s.io/ingress-nginx --ingress-class=nginx --configmap=ingress-nginx/nginx-ingress-ingress-nginx-controller --validating-webhook=:8443 --validating-webhook-certificate=/usr/local/certificates/cert --validating-webhook-key=/usr/local/certificates/key
101      106427  0.0  0.9 145100 36332 ?        S    09:08   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf
101      106433  0.0  1.0 157128 40848 ?        Sl   09:08   0:06 nginx: worker process
101      106434  0.0  1.0 157128 41000 ?        Sl   09:08   0:07 nginx: worker process
101      106435  0.0  0.7 143072 29120 ?        S    09:08   0:00 nginx: cache manager process

Después de ejecutarlo, intente usarlo de manera simple:
en la arquitectura tradicional, para publicar servicios, necesita configurar y modificar el archivo de configuración de nginx; en k8s, el ingreso es igual que otros tipos de recursos, y una instancia de ingreso se declara a través de yaml .
Sitio web oficial: La documentación oficial del controlador de ingreso se puede encontrar aquí.

Use un ejemplo en el sitio web oficial para conocer primero el ingreso

vim ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
  name: example
spec:
  ingressClassName: nginx
  rules:  # 可以配置多个rules
  - host: foo.bar.com # 域名匹配
    http:
      paths:  # 相当于nginx的location配合,同一个host可以配置多个paths
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-svc # 代理的哪个svc
            port: 
              number: 80

Aquí hay algunas explicaciones del ejemplo anterior:

A partir de las reglas y hacia abajo están las reglas que definen las conexiones de front-end y back-end:

  • host: representa el acceso basado en el dominio y el cliente accede a los recursos de back-end a través de este nombre de dominio
  • http.paths: equivalente a reglas coincidentes en la ubicación de nginx
  • pathType:Prefix: Tipo de ruta. La ruta está separada en elementos por el símbolo "/". La regla de coincidencia es realizar la coincidencia de prefijos elemento por elemento. El valor predeterminado es Implementación específica, y el otro es Exacto.
  • backend: definir el backend
  • Defina la dirección del backend bajo el servicio, incluido el svc del proxy y el número de puerto
    ——————————————————————————————————

Aquí tengo un problema:

[root@k8s-master01 ~]# kubectl create -f ingress.yaml 
Error from server (InternalError): error when creating "ingress.yaml": Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": failed to call webhook: Post "https://ingress-nginx-controller-admission.ingress-nginx.svc:443/networking/v1/ingresses?timeout=10s": service "ingress-nginx-controller-admission" not found

Error al crear: yaml": Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes. io"this.

Revisé Internet y dije que debería haberse eliminado cuando se eliminaron los recursos creados antes.

[root@k8s-master01 ~]# kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io 
NAME                                    WEBHOOKS   AGE
ingress-nginx-admission                 1          3d

Luego verifique que haya uno ingress-nginx-admission, y después de eliminarlo, la creación es exitosa

[root@k8s-master01 ~]# kubectl delete -A validatingwebhookconfigurations.admissionregistration.k8s.io ingress-nginx-admission 
validatingwebhookconfiguration.admissionregistration.k8s.io "ingress-nginx-admission" deleted

—————————————————————————————————

Ejecute el archivo ingress.yaml, esta vez se creó con éxito.

[root@k8s-master01 ~]# kubectl create -f ingress.yaml 
ingress.networking.k8s.io/exmple created
[root@k8s-master01 ~]# kubectl get ingress
NAME     CLASS    HOSTS         ADDRESS   PORTS   AGE
exmple   <none>   foo.bar.com             80      10m

El ingreso también se puede configurar con múltiples nombres de dominio

Simplemente agregue una instancia de host.

# 第一个域名
  - host: foo.bar.com 
    http:
      paths:  
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-svc
            port: 
              number: 80
# 第二个域名
  - host: foo2.bar.com 
    http:
      paths:  
      - path: /test
        pathType: Prefix
        backend:
          service:
            name: nginx-svc-2
            port: 
              number: 80

Luego actualice el archivo yaml muy bien

[root@k8s-master01 ~]# kubectl replace -f ingress.yaml

Supongo que te gusta

Origin blog.csdn.net/qq_42527269/article/details/122924796
Recomendado
Clasificación