1 前言

欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章!

IngressKubernetes一个非常重要的Controller,它类似一个路由转发的组件,可以让外界访问Kubernetes内部的Service。除了Ingress,还有NodePortLoadBalance等方式,Ingress暴露给外界的方式还是很常用的。

2 安装Ingress

我们通过helm来安装,会方便一些,先更新helm的仓库。

$ helm repo update

Helm相关文章:用Helm部署Kubernetes应用,支持多环境部署与版本回滚

容器技术相关文章

更新完之后,查找仓库关于Ingress的包有哪些:

$ $ helm search repo ingress
NAME CHART VERSION APP VERSION DESCRIPTION
azure/gce-ingress 1.2.0 1.4.0 A GCE Ingress Controller
azure/ingressmonitorcontroller 1.0.48 1.0.47 IngressMonitorController chart that runs on kub...
azure/nginx-ingress 1.41.2 v0.34.1 An nginx Ingress controller that uses ConfigMap...
stable/nginx-ingress 0.9.5 0.10.2 An nginx Ingress controller that uses ConfigMap...
azure/contour 0.2.0 v0.15.0 Contour Ingress controller for Kubernetes
azure/external-dns 1.8.0 0.5.14 Configure external DNS servers (AWS Route53, Go...
azure/kong 0.36.7 1.4 DEPRECATED The Cloud-Native Ingress and API-man...
azure/lamp 1.1.3 7 Modular and transparent LAMP stack chart suppor...
azure/nginx-lego 0.3.1 Chart for nginx-ingress-controller and kube-lego
azure/traefik 1.87.2 1.7.24 A Traefik based Kubernetes ingress controller w...
azure/voyager 3.2.4 6.0.0 DEPRECATED Voyager by AppsCode - Secure Ingress...
stable/external-dns 0.4.9 0.4.8 Configure external DNS servers (AWS Route53, Go...
stable/lamp 0.1.4 Modular and transparent LAMP stack chart suppor...
stable/nginx-lego 0.3.1 Chart for nginx-ingress-controller and kube-lego
stable/traefik 1.24.1 1.5.3 A Traefik based Kubernetes ingress controller w...
stable/voyager 3.1.0 6.0.0-rc.0 Voyager 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有:

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

这样配置后,当我们访问http://localhost/时,就会把我们的请求转发到nginx-service80端口上去。如下所示:

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/如下:

访问http://springboot.localhost/swagger-ui.html如下,注意这个URL带了子路径swagger-ui.html

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,但不是Ingress404,而是NginxSpringboot404。说明请求已经成功转发到对应的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数据库,需要把地址和3306TCP方式暴露给外面,就比较麻烦了,我们后续再讨论吧。


欢迎关注微信公众号<南瓜慢说>,将持续为你更新...

多读书,多分享;多写作,多整理。

Kubernetes用Helm安装Ingress并踩一下使用的坑的更多相关文章

  1. kubernetes(k8s) helm安装kafka、zookeeper

    通过helm在k8s上部署kafka.zookeeper 通过helm方法安装 k8s上安装kafka,可以使用helm,将kafka作为一个应用安装.当然这首先要你的k8s支持使用helm安装.he ...

  2. 使用helm安装ingress,实现用域名的方式访问k8s内部应用

    k8s集群版本 k8s集群版本是1.22 提前部署好nginx服务和创建好svc deployment方式部署的nginx服务,1个副本 创建的服务 通过服务可以代理到nginx服务 curl 10. ...

  3. 把H2数据库从jar包部署到Kubernetes,并解决Ingress不支持TCP的问题

    1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! H2 Database是一个优秀的数据库,又小又方便,支持内存和文件形式,经常会在测试.POC(proof of conce ...

  4. kubernetes 1.14安装部署ingress

    简单介绍: Ingress是Kubernetes API的标准资源类型之一,它其实就是一组基于DNS名称或URL路径把请求转发至指定的Service资源的规则,用来将集群外部的请求流量转发至集群内部. ...

  5. Helm 安装Kafka

    helm镜像库配置 helm repo add stable http://mirror.azure.cn/kubernetes/charts helm repo add incubator http ...

  6. kubernetes实战(十):k8s使用Helm安装harbor

    1.基本概念 对于复杂的应用中间件,需要设置镜像运行的需求.环境变量,并且需要定制存储.网络等设置,最后设计和编写Deployment.Configmap.Service及Ingress等相关yaml ...

  7. Helm 安装部署Kubernetes的dashboard

    Kubernetes Dashboard 是 k8s集群的一个 WEB UI管理工具,代码托管在 github 上,地址:https://github.com/kubernetes/dashboard ...

  8. Helm 安装Nginx Ingress

    为了便于将集群中的服务暴露到集群外部,需要使用Ingress.接下来使用Helm将Nginx Ingress部署到Kubernetes上. Nginx Ingress Controller被部署在Ku ...

  9. kubernetes系列(十七) - 通过helm安装dashboard详细教程

    1. 前提条件 2. 配置https证书为secret 3. dashboard安装 3.1 helm拉取dashboard的chart 3.2 配置dashboard的chart包配置 3.3 he ...

随机推荐

  1. 将终结点图添加到你的ASP.NET Core应用程序中

    在本文中,我将展示如何使用DfaGraphWriter服务在ASP.NET Core 3.0应用程序中可视化你的终结点路由.上面文章我向您演示了如何生成一个有向图(如我上篇文章中所示),可以使用Gra ...

  2. CF940E Cashback 线段树优化DP

    题目描述 Since you are the best Wraith King, Nizhniy Magazin «Mir» at the centre of Vinnytsia is offerin ...

  3. 学会DevOps 能拿多少工资?DevOps 怎么自学?

    落地高薪!DevOps为何受宠? DevOps在近几年的发展势头可谓是迅猛无比,已经有越来越多的企业机构开始尝试落地,从国外的微软谷歌到国内的阿里腾讯,DevOps已经从时髦概念落地最佳实践,进而改变 ...

  4. From 表单序列化为json对象(代码片段)

    $.fn.serializeJson=function(){ var serializeObj={}; var array=this.serializeArray(); $(array).each(f ...

  5. 2n皇后问题-------递归 暴力求解题与分布讨论题

    问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一列或同一 ...

  6. vue学习(八) vue中样式 class 定义引用

    //style<style> .red{ color:red; } .thin{//字体粗细 font-weight:200 } .italic{//字体倾斜 font-style:ita ...

  7. Python JSON的基本使用

    Python JSON的基本使用 一.json格式介绍 JSON(JavaScript Object Notation) 通用的数据类型,易于人阅读和编写. 跟字典有些类似,形式也是key-value ...

  8. 解决移动端rem加载瞬间页面错乱的方法(放大或者缩小)

    移动端布局有很多种,这里我们最常使用到rem+百分比的布局方式(高度/字体设置rem单位,宽度设置百分比)来处理屏幕兼容,这种方法在兼容上是比较不错的,可以使得字体以及整体适应各种大小的屏幕,可以解决 ...

  9. LQB2018A09倍数问题

    这个题,第一反应一定是三个for嵌套加一个max比较. 超级无敌大暴搜 #include <iostream> #include <string> #include <s ...

  10. LQB2013A03振兴中华

    最近状态出了点问题呜呜呜,可能是天有点热吧加上有一点点不太舒服,,,稳住啊! 明显一个递归(但是就是不会写) 递归:(一般这种找有多少个的题,返回值都是int) 首先找变化的东西当作参数.(本题是坐标 ...