概述
k8s提供NodePort类型的Service可以用于向集群外暴露服务,但是其具备一定局限性,如端口维护困难(一个端口只能供一个服务使用且需要提前规划),只能提供4层负载。
一个解决思路是使用具备7层路由功能的代理比如nginx作为所有外部流量的唯一入口,再由代理转发到不同的后台服务。以nginx为例,在集群部署一个nginx并以NodePort类型Service暴露给外部,然后通过添加nginx配置的形式把流量路由到不同后台服务的Service。ingress就是采用类似机制的一套解决方案。其中涉及几个概念:
ingress资源: 用来描述路由规则的资源对象
ingress-controller: ingress控制器,本质是一个代理容器(如nginx),并且在此基础上实现了k8s的控制器机制,监听ingress资源并反馈到代理配置中。以ingress-nginx-controller,它其实是一个具备控制器功能的nginx,动态监听ingress并将其转化为nginx配置。
部署(以ingress-nginx为例)
环境要求kubeVersion: >=1.19.0-0
操作目录 /root/lsd/ingress-nginx
部署ingress-nginx-controller
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm pull ingress-nginx/ingress-nginx
#pull不下来,直接手动下载
wget https://github.com/kubernetes/ingress-nginx/releases/download/helm-chart-4.0.10/ingress-nginx-4.0.10.tgz
tar zxvf ingress-nginx-4.0.10.tgz
cd ingress-nginx
vi values.yaml 修改相关镜像参数
registry: registry.hub.docker.com
image: liangjw/ingress-nginx-controller
#注释掉digest
# digest: sha256:f766669fdcf3dc26347ed273a55e754b427eb4411ee075a53f30718b4499076a
...
registry: registry.hub.docker.com
image: liangjw/kube-webhook-certgen
#注释掉digest
digest: sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660
registry: registry.hub.docker.com
image: ibmcom/defaultbackend-amd64
# helm 安装
helm delete ingress-nginx -n ingress-nginx
helm install ingress-nginx ./ --namespace ingress-nginx --create-namespace
创建ingress资源
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: prometheus-ingress
namespace: monitoring
spec:
ingressClassName: nginx # ingress-controller部署成功后会产生一个默认class:nginx
rules:
- host: prometheus-k8s.monitoring # 用来访问的域名
http:
paths:
- path: "/" # 路径转发规则
pathType: Prefix
backend: # 后台服务,转发到prometheus的9090端口
service: