【前置文章】
- kubernetes入门,可以查看我之前的文章:【k8s学习】Kubernetes新手学习,4小时视频笔记总结
- Helm相关:【k8s学习】Helm安装及Hello-world示例
- kubernetes ingress相关:【k8s学习】Kubernetes Ingress介绍
【环境】
- 环境:MacOS
- Minikube version: v1.25.2 (
minikube start --vm-driver=hyperkit,使用的是hyperkit驱动)
1. 介绍
参考:docs.nginx.com/nginx-ingre…
1. Ingress组件 vs Service组件
通常情况下,k8s中的服务需要暴露给集群外部,可以通过以下几种方式:
- a. 通过
Ingress组件,(官网文档),一般正式环境会选用这种方式。 - b. 通过
Service组件,有几种方式,具体可以参考我之前的文章:www.jianshu.com/p/36978c9d8…:NodePort ServiceLoadBalancer Service- ClusterIP Service使用
externalIPs对外暴露服务
1.2 Ingress vs Ingress Controller
我们都知道,除了安装Ingress组件之外,我们还需要一个Ingress的实现(Implementation),这个实现就是Ingress Controller,Ingress Controller也是运行在Pod中的,即我们可以创建一个Pod,叫Ingress Controller Pod。
Ingress Controller是干什么的?它是用来解析上述Ingress yaml中的rules规则的,即需要怎样的跳转。(如一级域名,二级域名等等,诸如此类的跳转规则的实现)。
1.3 Ingress Controller版本
关于Ingress Controller,目前就很多种:
社区版本,即Ingress NGINX Controller,是Kubernetes下的基于NGINX开发的一个Ingress controller。NGINX版本,即NGINX Ingress Controller,是NGINX团队开发的,目前分两个版本:开源版本,【本文用的就是这个开源版本】NGINX Plus版本,即商业版,功能更为丰富。
1.4 NGINX Ingress Controller工作图解
这块官网介绍的挺好的,详见:docs.nginx.com/nginx-ingre…
图来源官网:
1.5 NGINX Ingress Controller 资源
- Github: github.com/nginxinc/ku…
- 官网: docs.nginx.com/nginx-ingre…
2. 通过helm chart 安装 NGINX Ingress Controller
参考:docs.nginx.com/nginx-ingre…
2.1 Helm Repository
helm repo add nginx-stable helm.nginx.com/stable
helm repo update
2.2 安装Helm chart
helm install my-release nginx-stable/nginx-ingress --set enableSnippets=true
安装成功:
可以看到安装了:
pod:my-release-nginx-ingressservice:my-release-nginx-ingress,类型为LoadBalancer,即可以从集群外部访问,我们看到EXTERNAL-IP为<pending>,参考了别的文章,应该是因为装在Minikube中的原因,可以执行命令:minikube tunnel,执行完命令,External-IP很快就会出现:
2.3 除了pod和service,还安装了其它资源:
介绍:docs.nginx.com/nginx-ingre…
ConfigMap和secret:
Resource Type=IngressClass:
可以看到Helm chart还为我们装了Ingress Class,如果没有IngressClass资源,那么Ingress Controller将失效。
3. 安装两个项目用于测试
3.1 安装两个项目
在第2章我们安装了NGINX Ingress Controller,下面我们尝试集成两个app来进行测试。
app1=nginx1context-path=/nginx1,有个api=/version,返回 "hello Nginx_1.0"。app2=nginx2context-path=/nginx2,有个api=/version,返回 "hello Nginx_2.0"。
编写基本的deployment.xml和service.xml(这里略)。
可以看到app1安装:
可以看到app2安装:
总结下pod和service的安装情况:
3.2 编写Ingress
创建ingress.yaml:
- 在这里我们需要指定
ingressClassName = nginx。
1.18及以后版本需要通过ingressClassName指定使用的controller,或者在ingressClass中设置默认controller,否则ingress不生效。
这里的值为nginx,可以参考 - 这里定义了
host=testnginx.com.abc - 定义了两个path规则:
- url以
/nginx1/开头的 --> 转发到nginx1-service上。 - url以
/nginx2/开头的 --> 转发到nginx2-service上。
- url以
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
spec:
ingressClassName: nginx
rules:
- host: testnginx.com.abc
http:
paths:
- path: /nginx1/
pathType: Prefix
backend:
service:
name: nginx1-service
port:
number: 8080
- path: /nginx2/
pathType: Prefix
backend:
service:
name: nginx2-service
port:
number: 8080
安装:
kubectl apply -f ingress.yaml
3.3 修改hosts
我这里是MacOS的方式,如果是windows,去百度查下。
sudo vim /etc/hosts
在内容中追加:
10.109.65.41 testnginx.com.abc
这里的ip是上述第2章: my-release-nginx-ingress service的external ip。
3.4 测试:
转发成功:
4. 查看nginx-ingress pod配置
4.1 进入pod
kubectl exec -it {nginx-ingress-pod} bash
4.2 查看核心配置nginx.conf
进入容器后,在/etc/nginx下有nginx.conf文件:
可以看到文件include了其它的config:
进入/etc/nginx/conf.d 目录后,查看default-test-ingress.conf,可以看到nginx1和nginx2的相关配置:
可以看到更为详细的配置,这个跟我们平常的nginx配置几乎一样了:
5. 通过 nginx.org/location-snippets 增加Header
需求,上述的nginx1和nginx2,我们希望在NGINX中加上一些header,比如如果是传统的nginx,我们可以在nginx.conf中配置:
location / {
proxy_set_header X-Real-IP $remote_addr;
}
那么怎么在NGINX Ingress Controller中配置呢?
参考:docs.nginx.com/nginx-ingre…
5.1 首先要开启Snippets功能
我们在第2章通过 helm 安装pod = my-release-nginx-ingress的时候,默认情况下,snippets是false。
【怎么知道是false呢?有两种方法:】
- a. 通过helm show values可以看下需要安装的values文件,导出到本地:
helm show values nginx-stable/nginx-ingress > ./nginx-ingress-helm-value.yaml
- b. 第二种方法是可以通过github查看源代码,地址为:github.com/nginxinc/ku…
在页面上可以看到:
controller:
enableSnippets: false
- c. 我们在第2章已经安装了pod my-release-nginx-ingress-xxxx,我们可以通过
kubectl describe {pod name}来查看配置:
【如何开启?】
我们在第2章通过 helm 安装,可以指定增加values:
helm install my-release nginx-stable/nginx-ingress --set controller.enableSnippets=true
ps. 重新安装后,记得改下hosts里的ip,可能会不一样了。
【检查配置:】
kubectl describe pod my-release-nginx-ingress-6697bbfb89-4w6w4
可以看到已经改为true了:
5.2 在我们的nginx1和nginx2中增加测试API
加上API:
@GetMapping("request/x-real-ip")
public String realIP(HttpServletRequest request) {
return request.getHeader("X-Real-IP");
}
5.3 在ingress.yaml中增加header配置
【重要】传统的nginx.conf的内容,可以通过annotations的方式加上,详细如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
annotations:
nginx.org/location-snippets: |
proxy_set_header X-Real-IP $remote_addr;
spec:
ingressClassName: nginx
rules:
// 略
重新安装:
kubectl apply -f ingress.yaml
5.4 测试
可以看到header被成功加上了:
参考: