Kubernetes用Helm安装Ingress并踩一下使用的坑

摘要:
Ingress是Kubernetes非常重要的控制器。它类似于路由和转发组件,允许外部世界访问Kubernetes的内部服务。除了Ingress,还有NodePort、LoadBalance和其他方法。Ingress经常暴露于外界。2.通过舵安装入口。这样会更方便。首先更新helm存储库。但是,需要注意的是,您应该去Kubernetes Dashboard检查安装是否成功。
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有:

Kubernetes用Helm安装Ingress并踩一下使用的坑第1张

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端口上去。如下所示:

Kubernetes用Helm安装Ingress并踩一下使用的坑第2张

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并踩一下使用的坑第3张

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

Kubernetes用Helm安装Ingress并踩一下使用的坑第4张

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并踩一下使用的坑第5张

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

免责声明:文章转载自《Kubernetes用Helm安装Ingress并踩一下使用的坑》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇CSS文本部分之字体样式[1]用J-LINK烧写Bootloader到ARM开发板的Nand Flash下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

基于CFSSL工具创建CA证书

背景描述 CA(Certification Authority)证书,指的是权威机构给我们颁发的证书。 在局域网中部署组件时,想要通过证书来实现身份的认证,确保通信的安全性,可以通过cfssl工具来进行CA证书,服务端证书,客户端证书的创建。   部署cfssl工具 下载cfssl,cfssljson,cfssl-certinfo工具 下载地址:http...

使用 Elastic 技术栈构建 Kubernetes全栈监控

以下我们描述如何使用 Elastic 技术栈来为 Kubernetes 构建监控环境。可观测性的目标是为生产环境提供运维工具来检测服务不可用的情况(比如服务宕机、错误或者响应变慢等),并且保留一些可以排查的信息,以帮助我们定位问题。总的来说主要包括3个方面: 监控指标提供系统各个组件的时间序列数据,比如 CPU、内存、磁盘、网络等信息,通常可以用来显示系...

K8S(二)-创建一个pod应用

 Pod是可以创建和管理Kubernetes计算的最小可部署单元。pod可以理解为容器的外壳,给容器做了一层抽象封装。一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip。 一个pod类似一个豌豆荚,包含一个或多个容器(通常是docker),这多个容器间共享IPC、Network和UTC,和存储卷,存储卷不再属于容器,而属于pod。 Pod分...

基于ack k8s集群调度的方案设计

目录 1、概述 2、原生调度原则 2.1 调度流程 2.2 调度策略 3、应用和服务概况 4、阿里云集群概况 4.1 集群概况 4.1 node节点的规划 4.1.1 阿里云ecs介绍 4.1.2 k8s集群节点选型原则 4.1.3 k8s集群节点池设计 5、调度策略的设计 5.1 原生调度类型的取舍 5.2 局部最优解理论 5....

Kubernetes监控etcd集群(自带metrics接口)

Kubernetes用operator部署prometheus上面采用Kubernetes部署prometheus 我们可以使用prometheus来监控自带metrics接口的应用。 etcd是Kubernetes的数据库,自带接口,我们可以用etcd作为实例来看看怎么操作。 一、监控etcd集群 1.1、查看接口信息 二进制和kubeadm安装方式...

k8s .netcore的春天

一直有在关注k8s容器管理平台,不是因为对运维感兴趣,而是它是云原生,云架构的一块基石,我们可以看看bat在云原生架构方面的推动和投入,相信以后软件从已诞生就生长在云上。 K8S,可能有些朋友认为k8s跟微服务没有啥关系,这个的看你站在什么维度和视角去看待这个问题。尤其是.NETCORE平台,没有像JAVASPRINGCLOUD这样的全家桶,更没有SPRI...