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:
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=ture
el 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