|NO.Z.00165|——————————|CloudNative|——|KuberNetes&服务发布.V16|——|ingress.v04|创建ingress.pod|
一、Ingress入门使用
### --- 使用详解:
~~~ # 地址:
~~~ https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/
~~~ # 配置域名的方式有好几种:
~~~ ConfigMap,Annotations,Custom template自定义模板(使用不多);一般使用Annotations
~~~ 在k8s中Ingress也是一种资源类型,它和我们的其它资源也是一样的,
~~~ 都是通过yaml文件去声明一个Ingress的实例,这个Ingress实例配置了我们的域名,
~~~ 这个域名反向的到那个service,
~~~ # 所以说:
~~~ 无论你起了多少个IngressPod,我们只需要创建一个yaml文件即可,
~~~ 它就会Ingress Controller会监听Ingress的实例文件,读取里面的配置,
~~~ 然后自动生成nginx的配置文件
~~~ 我们无需去修改每个controller的配置,这样相对传统架构简单化了。
~~~ 而且Ingress controler它会有一个校验的功能,若是这个Ingress这个yaml文件写错了。
~~~ 或者配置不对,它就不会去应用,不会影响你的业务正确性。
~~~ # Annotations:
~~~ 应用发布,跨域的配置,限速的配置等配置文件一般写在Annotations里面,
~~~ 然后Ingress Controller会分析你这个Ingress的实例,从Annotations里面读取它的配置,
~~~ 然后生成我们的nginx的配置文件。
二、创建一个ingress:创建ingress.yaml配置文件
### --- 创建ingress.yaml配置文件
[root@k8s-master01 ~]# vim ingress.yaml
apiVersion: networking.k8s.io/v1beta1 # networking.k8s.io/v1 / extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: "nginx" # 声明配置的为ingress.class name为nginx的这个配置,
name: example
spec:
rules: # 一个Ingress可以配置多个rules
- host: foo.bar.com # 域名配置,可以不写,匹配*, *.bar.com
http:
paths: # 相当于nginx的location配合,同一个host可以配置多个path / /abc
- backend:
serviceName: nginx-svc
servicePort: 80
path: /
### --- 注释:声明ingress.class name的位置
~~~ # ********注释1************
apiVersion: networking.k8s.io/v1beta1 // apiVersion在k8s1.19以后都是建议使用networking.k8s.io/v1beta1这个。这个暂时还没有被废弃掉,在k8s1.22之后会被废弃掉。
#extensions/v1beta1 // 这种的是ingress最开始的格式,已经被废弃掉了。
~~~ # ********注释2************
annotations: // 在创建Ingress中,需要高速ingress,我们实现的配置是什么呢?配置一般都会写在annotations中。
~~~ # ********注释3************
~~~ 我们在创建这个Ingress的时候,指定了一个IngressClass的名称为nginx,
~~~ 创建Ingress实例的时候,需要告诉这个接口使用的是一个叫nginx的ingress.class
~~~ 因为一个集群中不止一个Ingress,可能会很多,
~~~ 声明这个实例需要用nginx的Ingress去解析。其它的可能解析不了。
[root@k8s-master01 ~]# vim /root/ingress-nginx/values.yaml
ingressClass: nginx
~~~ # ********注释4************
spec:
rules: // 规定写法 一个Ingress可以配置多个rules
- host: foo.bar.com // 域名配置,可以不写,匹配*, *.bar.com;写固定域名是用的最多的。
http:
paths: // 相当于nginx的location配合,同一个host可以配置多个path / /abc
- backend:
serviceName: nginx-svc // 当前域名代理到那个service,匹配了一个域名下的两个路径,也是可以配置的
servicePort: 80 // 端口号是service的端口号
path: /
三、通过service解析配置的nginx-ingress.pod
### --- 查看创建的ingress-nginx.service
~~~ 这种IP地址+端口号的形式是非常不建议的,所以我们可以配置一个Ingress,
~~~ 通过域名的方式访问到这个服务上。
[root@k8s-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-svc NodePort 10.101.145.83 <none> 80:31000/TCP,443:32765/TCP 47h
### --- 测试service地址是否正常解析
~~~ 配置一个域名,反代到这个service上。
~~~ Ingress也是有namespace隔离的,Ingress和你的service在同一个namespace下。
[root@k8s-master01 ~]# curl 10.101.145.83 // 这个service可以正常访问
<h1>Welcome to nginx!</h1>
四、通过Chrome验证是否正常解析
### --- 创建Ingress并通过Chrome验证
~~~ 提示v1beta1在1.22版本之后会被废弃掉,建议使用v1
[root@k8s-master01 ~]# kubectl create -f ingress.yaml
Warning: networking.k8s.io/v1beta1 Ingress is deprecated in v1.19+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
ingress.networking.k8s.io/example created
### --- 查看创建的ingress
[root@k8s-master01 ~]# kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
example <none> foo.bar.com 80 15s
### --- 访问一下这个域名
~~~ 配置hosts文件,这个hosts需要解析到Ingress所在的宿主机节点上面。
~~~ 在生产环境中,购买的域名;可以做一个DNS解析,DNS解析应该是解析到公司入口的LB上的,
~~~ LB在反代到你的k8s的ingress的节点的IP地址和端口号上。
~~~ 我们只需要解析到宿主机的IP地址上即可。
~~~ 配置本地hosts文件:192.168.1.14 foo.bar.com
~~~ 通过Chrome访问:http://foo.bar.com/可以正常解析到welcome to nginx;
~~~ 可以正常访问后端的服务。
五、Ingress实例详解
### --- Ingress实例的详解;登入pod里面:它会监听ingress的实例,对应的生成配置文件。
~~~ 实现了域名发布的方式。就不用去维护nginx的配置;直接去维护yaml文件即可
[root@k8s-master01 ~]# kubectl exec -ti ingress-nginx-controller-brbvs -n ingress-nginx -- sh
/etc/nginx $ grep "foo.bar.com" nginx.conf
## start server foo.bar.com //这个域名的开始的配置
server_name foo.bar.com ;
## end server foo.bar.com //这个域名的结束的配置
/etc/nginx $ grep "## start server foo.bar.com" nginx.conf -A 20 //查看这个文件的后20行
## start server foo.bar.com
server {
server_name foo.bar.com ; //server的名称;
listen 80 ;
listen [::]:80 ;
listen 443 ssl http2 ;
listen [::]:443 ssl http2 ;
set $proxy_upstream_name "-";
ssl_certificate_by_lua_block {
certificate.call()
}
location / {
set $namespace "default";
set $ingress_name "example";
set $service_name "nginx-svc";
set $service_port "80";
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了