kubernetes部署ingress-nginx

1. kubernetes暴露服务方式

1.1 ClusterIP

Clusterip是集群内部的私有ip,在集群内部访问服务非常方便,也是kuberentes集群默认的方式,
直接通过service的Clusterip访问,也可以直接通过ServiceName访问。集群外部则是无法访问的+

1.2 NodePort

NodePort 服务是引导外部流量到你的服务的最原始方式。NodePort,正如这个名字所示,在所有节点(虚拟
机)上开放一个特定端口,任何发送到该端口的流量都被转发到对应服务。

#NodePort 服务特征如下:
每个端口只能是一种服务
端口范围只能是 30000-32767(可调)
不在 YAML 配置文件中指定则会分配一个默认端口

1.3  LoadBalancer

LoadBlancer Service 是 kubernetes 深度结合云平台的一个组件;当使用 LoadBlancer 
Service 暴露服务时,实际上是通过向底层云平台申请创建一个负载均衡器来向外暴露服务;目前
LoadBlancer Service 支持的云平台已经相对完善,比如国外的 GCE、DigitalOcean,国内的 阿里云,私有
云 Openstack 等等,由于 LoadBlancer Service 深度结合了云平台,所以只能在一些云平台上来使用.

1.4  Ingress

Ingress资源对象,用于将不同URL的访问请求转发到后端不同的Service,以实现HTTP层的业务路由机制。Kubernetes使用一个Ingress策略定义和一个具体的Ingress Controller,两者结合并实现了一个完整的Ingress负载均衡器。
Ingress Controller将基于Ingress规则将客户请求直接转发到Service对应的后端Endpoint上,这样会跳过kube-proxy的转发功能,kube-proxy 不再起作用。

2.部署ingress

安装ingress-controller和api交互

安装ingress告知ingress-controller如何进行流量转发

2.1 下载最新的启动文件

https://github.com/kubernetes/ingress-nginx/blob/main/deploy/static/provider/baremetal/deploy.yaml

2.2 修改对应的仓库地址(可下载则直接跳过)

registry.k8s.io/ingress-nginx/controller:v1.3.0@sha256:d1707ca76d3b044ab8a28277a2466a02100ee9f58a86af1535a3edf9323ea1b5
registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.7.1
registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.7.1
在镜像的spec中添加hostNetwork: true使nginx-ingress-controller直接监听在宿主机上便于访问

修改ingress-nginx-controller的service的type为NodePort(本人未用)

每个节点都有nginx-ingress-controller,则将kind类型由Deployment设置为DaemonSet

让nginx-ingress-controller运行在指定的节点,可以为节点打标签kubectl label node nodename key=value(标签查看kubectl get nodes --show-labels,标签删除kubectl label node nodename key-),搜索nodeSelector在kubernetes.io/os: linux下一行添加上面修改的标签key: value,两个标签是并的关系,即都满足才会部署

kubernetes部署ingress-nginx_第1张图片

2.3 启动服务

kubectl apply -f ingress-1.7.1.yaml
可以直接运行kubectl create ingress my-ingress --rule="/*=deploy1:80"把相应参数修改为项目上对应的即可,或把上面的yaml保存执行。
ingressClassName是必须指定的。有一些 Ingress 控制器不需要定义默认的 IngressClass。比如:Ingress-NGINX 控制器可以通过参数 --watch-ingress-without-class 来配置。 不过仍然推荐 设置默认的 IngressClass。
pathType路径类型,未明确设置 pathType 的路径无法通过合法性检查。当前支持的路径类型有三种:

ImplementationSpecific:对于这种路径类型,匹配方法取决于 IngressClass。 具体实现可以将其作为单独的 pathType 处理或者与 Prefix 或 Exact 类型作相同处理

Exact:精确匹配 URL 路径,且区分大小写

Prefix:基于以 / 分隔的 URL 路径前缀匹配。匹配区分大小写,并且对路径中的元素逐个完成。 路径元素指的是由 / 分隔符分隔的路径中的标签列表。 如果每个 p 都是请求路径 p 的元素前缀,则请求与路径 p 匹配

你可能感兴趣的:(kubernetes,运维)