Kubernetes用Helm安装Ingress并踩一下使用的坑
1 前言
欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章!
Ingress
是Kubernetes
一个非常重要的Controller
,它类似一个路由转发的组件,可以让外界访问Kubernetes
内部的Service
。除了Ingress
,还有NodePort
、LoadBalance
等方式,Ingress
暴露给外界的方式还是很常用的。2 安装Ingress 我们通过
helm
来安装,会方便一些,先更新helm
的仓库。$ helm repo update
Helm
相关文章:用Helm部署Kubernetes应用,支持多环境部署与版本回滚容器技术相关文章
更新完之后,查找仓库关于
Ingress
的包有哪些:$ $ helm search repo ingress
NAMECHART VERSIONAPP VERSION DESCRIPTION
azure/gce-ingress1.2.01.4.0A GCE Ingress Controller
azure/ingressmonitorcontroller1.0.481.0.47IngressMonitorController chart that runs on kub...
azure/nginx-ingress1.41.2v0.34.1An nginx Ingress controller that uses ConfigMap...
stable/nginx-ingress0.9.50.10.2An nginx Ingress controller that uses ConfigMap...
azure/contour0.2.0v0.15.0Contour Ingress controller for Kubernetes
azure/external-dns1.8.00.5.14Configure external DNS servers (AWS Route53, Go...
azure/kong0.36.71.4DEPRECATED The Cloud-Native Ingress and API-man...
azure/lamp1.1.37Modular and transparent LAMP stack chart suppor...
azure/nginx-lego0.3.1Chart for nginx-ingress-controller and kube-lego
azure/traefik1.87.21.7.24A Traefik based Kubernetes ingress controller w...
azure/voyager3.2.46.0.0DEPRECATED Voyager by AppsCode - Secure Ingress...
stable/external-dns0.4.90.4.8Configure external DNS servers (AWS Route53, Go...
stable/lamp0.1.4Modular and transparent LAMP stack chart suppor...
stable/nginx-lego0.3.1Chart for nginx-ingress-controller and kube-lego
stable/traefik1.24.11.5.3A Traefik based Kubernetes ingress controller w...
stable/voyager3.1.06.0.0-rc.0Voyager by AppsCode - Secure Ingress Controller...
选择
azure/nginx-ingress
来安装,注意是有版本的。安装如下:$ helm install pkslow-ingress azure/nginx-ingress
安装成功后,控制台会有输出相关的使用说明。但要注意的是,要去
Kubernetes Dashboard
查看一下是否真的安装成功。我安装遇到过失败,原因都是因为镜像下载失败。解决方案是打开全局代理
,先手动下载好相关镜像。如:us.gcr.io/k8s-artifacts-prod/ingress-nginx/controller:v0.34.1
k8s.gcr.io/defaultbackend-amd64:1.5
jettech/kube-webhook-certgen:v1.0.0
quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.32.0
之后就安装成功了,相关的
Pods
都跑起来了。相关的Deployment
有:![Kubernetes用Helm安装Ingress并踩一下使用的坑](https://img.it610.com/image/info10/e07890c660fe47c4801d6a3ed742912c.jpg)
文章图片
3 使用Ingress 3.1 访问一个服务 一个最简单的例子如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19.0
ports:
- containerPort: 80---
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx
name: nginx-service
spec:
ports:
- port: 80
name: nginx-service
protocol: TCP
targetPort: 80
selector:
app: nginx
type: ClusterIP---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: example-ingress
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: nginx-service
servicePort: 80
host: localhost
【Kubernetes用Helm安装Ingress并踩一下使用的坑】这样配置后,当我们访问
http://localhost/
时,就会把我们的请求转发到nginx-service
的80
端口上去。如下所示:![Kubernetes用Helm安装Ingress并踩一下使用的坑](https://img.it610.com/image/info10/ce65df2e0f1249eab88d7846f25dd3ca.jpg)
文章图片
3.2 访问多个服务 当要访问多个服务时,事情就变得复杂起来了。访问多个服务,有两种配置方式,一种是通过
URL
路径匹配再转发,另一种是通过子域名
转发。3.2.1 子域名方式
通过子域名转发如下配置:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: example-ingress
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: nginx-service
servicePort: 80
host: nginx.localhost
- http:
paths:
- path: /
backend:
serviceName: springboot-service
servicePort: 8080
host: springboot.localhost
为了节省篇幅,这里就只展示
Ingress
的配置了。访问
http://nginx.localhost/
如下:![Kubernetes用Helm安装Ingress并踩一下使用的坑](https://img.it610.com/image/info10/4db0a952702c46fd8281ada88dec417c.jpg)
文章图片
访问
http://springboot.localhost/swagger-ui.html
如下,注意这个URL
带了子路径swagger-ui.html
:![Kubernetes用Helm安装Ingress并踩一下使用的坑](https://img.it610.com/image/info10/03b05029a25c4874bdffa34f9b63a758.jpg)
文章图片
3.2.2 URL路径匹配方式
那通过
URL
路径匹配方式是不是这样配置呢?apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: example-ingress
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- http:
paths:
- path: /nginx
backend:
serviceName: nginx-service
servicePort: 80
host: localhost
- http:
paths:
- path: /springboot
backend:
serviceName: springboot-service
servicePort: 8080
host: localhost
这样配置后,会直接报
404
,但不是Ingress
的404
,而是Nginx
或Springboot
的404
。说明请求已经成功转发到对应的service
了,但路径有问题。原因是,当这样配置时,Ingress
会把path
也转发到service
上。所以实际效果如下:localhost/nginx--> nginx-service/nginx
localhost/springboot --> springboot-service/springboot
所以服务的
Web Context
路径要与配置的path
匹配。比如nginx-service
的基础路径就要改为/nginx
,而不能是/
了。如果就想保持服务的
Web Context
路径是/
,那就需要配置rewrite
规则,如nginx.ingress.kubernetes.io/rewrite-target: /$1
。4 总结 过了一遍,坑真不少。使用
子域名
感觉是比较好的方式。另外,Ingress
还有一个坑,它是实现HTTP/HTTPS
转发的,但TCP
就不行了,比如我在Kubernetes
安装了一个MySQL
数据库,需要把地址和3306
以TCP
方式暴露给外面,就比较麻烦了,我们后续再讨论吧。欢迎关注微信公众号<南瓜慢说>,将持续为你更新...
![Kubernetes用Helm安装Ingress并踩一下使用的坑](https://img.it610.com/image/info10/b6793be5269846b6aceec0e803f0f8b8.jpg)
文章图片
多读书,多分享;多写作,多整理。
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- JS中的各种宽高度定义及其应用
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- 涉毒患者(新诗)
- 参保人员因患病来不及到指定的医疗机构就医,能否报销医疗费用()
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。