Kubernetes(k8s)使用ingress发布服务
一.系统环境
本文主要基于Kubernetes1.21.9和Linux操作系统CentOS7.4。
| 服务器版本 | Nginx Ingress Controller版本 | docker软件版本 | Kubernetes(k8s)集群版本 | CPU架构 |
|---|---|---|---|---|
| CentOS Linux release 7.4.1708 (Core) | v1.0.0 | Docker version 20.10.12 | v1.21.9 | x86_64 |
Kubernetes集群架构:k8scloude1作为master节点,k8scloude2,k8scloude3作为worker节点。
| 服务器 | 操作系统版本 | CPU架构 | 进程 | 功能描述 |
|---|---|---|---|---|
| k8scloude1/192.168.110.130 | CentOS Linux release 7.4.1708 (Core) | x86_64 | docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calico | k8s master节点 |
| k8scloude2/192.168.110.129 | CentOS Linux release 7.4.1708 (Core) | x86_64 | docker,kubelet,kube-proxy,calico | k8s worker节点 |
| k8scloude3/192.168.110.128 | CentOS Linux release 7.4.1708 (Core) | x86_64 | docker,kubelet,kube-proxy,calico | k8s worker节点 |
二.前言
随着云计算和容器技术的发展,越来越多的开发者开始采用Kubernetes进行应用程序部署和管理。在Kubernetes中,Service是一种重要的资源,用于管理和发布应用程序服务。而Ingress则是一种更高级别的抽象,用于定义对集群中多个服务的公共HTTP入口点。本文将介绍如何使用Ingress来发布Kubernetes服务。
使用Ingress来发布Kubernetes服务的前提是已经有一套可以正常运行的Kubernetes集群,关于Kubernetes(k8s)集群的安装部署,可以查看博客《Centos7 安装部署Kubernetes(k8s)集群》https://www.cnblogs.com/renshengdezheli/p/16686769.html。
三.Kubernetes ingress简介
Ingress是一个Kubernetes API对象,它定义了一组规则,将外部请求路由到集群中的服务。与NodePort和LoadBalancer相比,Ingress提供了更高级别的功能,例如虚拟主机、TLS终止和路径重写等。关于使用NodePort或者LoadBalancer发布Kubernetes服务,详情请查看博客《Kubernetes(k8s)服务service:service的发现和service的发布》。
要使用Ingress,需要先安装一个Ingress控制器来处理Ingress对象。Ingress控制器是一个运行在Kubernetes集群中的服务,用于监听Ingress对象的变化,并自动配置负载均衡器、路由规则和TLS证书等。
常见的Ingress控制器包括Nginx Ingress Controller、Traefik Ingress Controller和Istio Ingress Gateway。在本文中,我们将使用Nginx Ingress Controller来演示如何使用Ingress发布Kubernetes服务。
四.Ingress vs NodePort vs LoadBalancer
NodePort 和 LoadBalancer 是 Kubernetes 提供的其他两种服务发布方式。
- NodePort 将一个随机端口映射到 Service 的端口上,这样就可以通过 Kubernetes 集群的任何节点 IP 和 NodePort 访问 Service。
- LoadBalancer 将服务公开给外部负载均衡器,可以使用云提供商的负载均衡器或者自己配置 LoadBalancer。
Ingress 是 Kubernetes 集群中管理外部访问的重要组件,通过 Ingress Controller可以更细粒度地控制路由规则,支持多个 URL 路径和域名映射到不同的 Service 上。
NodePort 简单易用,适合小规模应用程序,但是对于高负载场景可能会出现性能问题。缺点是不够灵活,无法动态调整负载均衡策略,且端口冲突的可能性较大。
LoadBalancer 支持自动扩展,可以处理大流量和高并发请求。缺点是需要额外付费购买云平台提供的负载均衡器服务。
在选择使用哪种服务发布方式时,需要根据实际需求进行权衡。以下是一些参考因素:
- Ingress 可以更细粒度地控制路由规则,支持多个 URL 路径和域名映射到不同的 Service 上。
- NodePort 简单易用,适合小规模应用程序,但是对于高负载场景可能会出现性能问题。
- LoadBalancer 支持自动扩展,可以处理大流量和高并发请求。
五.安装部署Nginx Ingress Controller控制器
要使用Ingress,需要先安装一个Ingress控制器来处理Ingress对象。本次使用Nginx Ingress Controller控制器,Nginx Ingress Controller控制器本质上是一个nginx的反向代理(根据访问地址的不同,转发到不同的服务器)。
Nginx Ingress Controller的官网为:https://kubernetes.github.io/ingress-nginx/deploy/

Nginx Ingress Controller的安装说明如下:

下载Nginx Ingress Controller的部署文件
[root@k8scloude1 svc]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.1/deploy/static/provider/cloud/deploy.yaml
查看部署文件里需要的镜像
[root@k8scloude1 svc]# grep image deploy.yaml
image: k8s.gcr.io/ingress-nginx/controller:v1.1.1@sha256:0bc88eb15f9e7f84e8e56c14fa5735aaa488b840983f87bd79b1054190e660de
imagePullPolicy: IfNotPresent
image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660
imagePullPolicy: IfNotPresent
image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660
imagePullPolicy: IfNotPresent
因为deploy.yaml部署文件需要的是k8s.gcr.io下的镜像,k8s.gcr.io这个网址访问不了,我们下载其他官网的镜像来使用也是一样的。
注意:ingress-nginx-controller镜像和kube-webhook-certgen镜像的版本不能相差太大,不然部署会失败。
在所有节点上下载Nginx Ingress Controller所需的镜像。
[root@k8scloude1 svc]# docker pull willdockerhub/ingress-nginx-controller:v1.0.0
[root@k8scloude1 svc]# docker pull docker.io/liangjw/kube-webhook-certgen:v1.1.1
#此时所需镜像就下载好了
[root@k8scloude1 svc]# docker images | grep kubecube
willdockerhub/ingress-nginx-controller v1.0.0 ef43679c2cae 7 months ago 283MB
liangjw/kube-webhook-certgen v1.1.1 c41e9fcadf5a 6 months ago 47.7MB
修改部署文件里的镜像为下载好的镜像
[root@k8scloude1 svc]# vim deploy.yaml
#注意:- --watch-ingress-without-class=true参数经过测试加不加这个参数都没影响
#deploy.yaml 文件里args参数修改为如下:
args:
- /nginx-ingress-controller
- --election-id=ingress-controller-leader
- --controller-class=k8s.io/ingress-nginx
- --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
- --validating-webhook=:8443
- --validating-webhook-certificate=/usr/local/certificates/cert
- --validating-webhook-key=/usr/local/certificates/key
- --watch-ingress-without-class=true # 新增
[root@k8scloude1 svc]# grep image deploy.yaml
image: willdockerhub/ingress-nginx-controller:v1.0.0
imagePullPolicy: IfNotPresent
image: docker.io/liangjw/kube-webhook-certgen:v1.1.1
imagePullPolicy: IfNotPresent
image: docker.io/liangjw/kube-webhook-certgen:v1.1.1
imagePullPolicy: IfNotPresent
部署Nginx Ingress Controller控制器。
[root@k8scloude1 svc]# kubectl apply -f deploy.yaml
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
configmap/ingress-nginx-controller created
......
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
此时Nginx Ingress Controller控制器部署成功了。
[root@k8scloude1 upload]# kubectl get pod -n ingress-nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ingress-nginx-admission-create-p4m4z 0/1 Completed 0 2m13s 10.244.112.178 k8scloude2 <none> <none>
ingress-nginx-admission-patch-hdp4b 0/1 Completed 2 2m13s 10.244.251.205 k8scloude3 <none> <none>
ingress-nginx-controller-684bbc4b45-2t8d6 1/1 Running 0 2m13s 10.244.251.207 k8scloude3 <none> <none>
六.使用Ingress来发布Kubernetes服务
6.1 创建3个pod
pod配置文件如下,功能为使用Nginx镜像创建pod。
[root@k8scloude1 svc]# vim pod.yaml
[root@k8scloude1 svc]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
test: podtest
name: podtest
spec:
#当需要关闭容器时,立即杀死容器而不等待默认的30秒优雅停机时长。
terminationGracePeriodSeconds: 0
containers:
- name: nginx
image: nginx
#imagePullPolicy: IfNotPresent:表示如果本地已经存在该镜像,则不重新下载;否则从远程 Docker Hub 下载该镜像
imagePullPolicy: IfNotPresent
生成三个pod用于ingress访问。
[root@k8scloude1 svc]# sed 's/podtest/nginx1/' pod.yaml | kubectl apply -f -
pod/nginx1 created
[root@k8scloude1 svc]# sed 's/podtest/nginx2/' pod.yaml | kubectl apply -f -
pod/nginx2 created
[root@k8scloude1 svc]# sed 's/podtest/nginx3/' pod.yaml | kubectl apply -f -
pod/nginx3 created
[root@k8scloude1 svc]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx1 1/1 Running 0 21s 10.244.112.180 k8scloude2 <none> <none>
nginx2 1/1 Running 0 15s 10.244.251.209 k8scloude3 <none> <none>
nginx3 1/1 Running 0 11s 10.244.112.181 k8scloude2 <none> <none>
修改nginx的index.html文件,用于辨别每个pod。
[root@k8scloude1 svc]# kubectl exec -it nginx1 -- sh -c "echo 111 >/usr/share/nginx/html/index.html"
[root@k8scloude1 svc]# kubectl exec -it nginx2 -- sh -c "echo 222 >/usr/share/nginx/html/index.html"
[root@k8scloude1 svc]# kubectl exec -it nginx3 -- sh -c "mkdir /usr/share/nginx/html/ingress; echo 333 >/usr/share/nginx/html/ingress/index.html"
给每个pod创建一个svc服务
[root@k8scloude1 svc]# kubectl expose --name=nginx1svc pod nginx1 --port=80
service/nginx1svc exposed
[root@k8scloude1 svc]# kubectl expose --name=nginx2svc pod nginx2 --port=80
service/nginx2svc exposed
[root@k8scloude1 svc]# kubectl expose --name=nginx3svc pod nginx3 --port=80
service/nginx3svc exposed
[root@k8scloude1 svc]# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
nginx1svc ClusterIP 10.96.191.58 <none> 80/TCP 72s test=nginx1
nginx2svc ClusterIP 10.99.148.123 <none> 80/TCP 54s test=nginx2
nginx3svc ClusterIP 10.103.229.198 <none> 80/TCP 15s test=nginx3
通过ClusterIP访问每个Nginx。因为svc类型为ClusterIP,所以kubernetes集群外的机器访问不了svc,下面使用ingress发布服务。
[root@k8scloude1 svc]# curl -s 10.96.191.58
111
[root@k8scloude1 svc]# curl -s 10.99.148.123
222
[root@k8scloude1 svc]# curl -s 10.103.229.198/ingress/index.html
333
6.2 配置ingress规则发布服务
下面定义ingress的规则。ingress会将两个不同的域名(www.nginx13.com和www.nginx2.com)路由到不同的Service上。如下定义了三个规则,每个规则都绑定了一个不同的域名,并指定了该域名的HTTP请求将被转发到哪个Service上;
- 对于第一个和第二个规则(www.nginx13.com),对访问网址根目录路径的请求使用前缀匹配方式(pathType: Prefix)进行匹配,并将其转发到名为nginx1svc的Service上;对访问网址/ingress路径的请求使用前缀匹配方式(pathType: Prefix)进行匹配,并将其转发到名为nginx3svc的Service上;
- 对于第三个规则(www.nginx2.com),对访问网址根目录的请求使用前缀匹配方式(pathType: Prefix)进行匹配,并将其转发到名为nginx2svc的Service上。
特别注意:需要在annotations中指定你的ingress class,此处使用的nginx-ingress所以是Nginx,所以写为:annotations:kubernetes.io/ingress.class: "nginx", 否则无法通过配置的域名www.nginx13.com访问。
这个Ingress资源定义了路由规则,以便在集群外部访问服务时,可以通过不同的域名和路径来访问不同的后端服务。
[root@k8scloude1 svc]# vim ingress-rule.yaml
[root@k8scloude1 svc]# cat ingress-rule.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: www.nginx13.com
http:
paths:
#访问网址目录
- path: /
pathType: Prefix
backend:
service:
name: nginx1svc
port:
number: 80
- path: /ingress
pathType: Prefix
backend:
service:
name: nginx3svc
port:
number: 80
- host: www.nginx2.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx2svc
port:
number: 80
应用ingress规则
[root@k8scloude1 svc]# kubectl apply -f ingress-rule.yaml
ingress.networking.k8s.io/my-ingress created
查看ingress
[root@k8scloude1 svc]# kubectl get ingress -o wide
NAME CLASS HOSTS ADDRESS PORTS AGE
my-ingress <none> www.nginx13.com,www.nginx2.com 80 10s
[root@k8scloude1 svc]# kubectl get ing -o wide
NAME CLASS HOSTS ADDRESS PORTS AGE
my-ingress <none> www.nginx13.com,www.nginx2.com 80 10s
可以发现80端口被映射为32253端口。
[root@k8scloude1 svc]# kubectl get svc -n ingress-nginx -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
ingress-nginx-controller NodePort 10.96.184.210 <none> 80:32253/TCP,443:30876/TCP 22m app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx
ingress-nginx-controller-admission ClusterIP 10.102.52.109 <none> 443/TCP 22m app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx
当在其他命名空间创建相同的ingress规则时,会提醒重复
[root@k8scloude1 svc]# kubectl apply -f ingress-rule.yaml -n default
Error from server (BadRequest): error when creating "ingress-rule.yaml": admission webhook "validate.nginx.ingress.kubernetes.io" denied the request: host "www.nginx13.com" and path "/" is already defined in ingress tls-ingress/my-ingress
下面在浏览器里进行访问,因为ingress-nginx-controller控制器在192.168.110.128上,所以需要在客户端配置192.168.110.128和域名的映射。
首先需要配置Windows的hosts文件:在C:\Windows\System32\drivers\etc\HOSTS下添加如下:
192.168.110.128 www.nginx13.com
192.168.110.128 www.nginx2.com
在浏览器里访问,可以看到如下:



也可以在Linux里进行访问,同理需要在客户端配置192.168.110.128和域名的映射。
etcd1机器作为客户端,在/etc/hosts里添加ingress所在机器的地址映射。
[root@etcd1 ~]# vim /etc/hosts
[root@etcd1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.110.128 www.nginx13.com
192.168.110.128 www.nginx2.com
现在访问Nginx。
[root@etcd1 ~]# curl www.nginx13.com:31853/
111
[root@etcd1 ~]# curl www.nginx13.com:31853/ingress/index.html
333
[root@etcd1 ~]# curl www.nginx2.com:31853/
222
自此使用Ingress来发布Kubernetes服务成功!
七.总结
本文介绍了如何使用Kubernetes Ingress来发布服务,并演示了如何通过创建pod、Service和Ingress资源来配置和管理应用程序。使用Ingress,您可以方便地将多个服务公开到外部,并通过路由规则和TLS终止等高级功能来保护和管理它们。在实践中,需要根据自己的需求选择适合自己的Ingress控制器,并使用Ingress资源来配置和管理服务入口点。
Kubernetes(k8s)使用ingress发布服务的更多相关文章
- Kubernetes 系列(三):Kubernetes使用Traefik Ingress暴露服务
一.Kubernetes 服务暴露介绍 从 kubernetes 1.2 版本开始,kubernetes提供了 Ingress 对象来实现对外暴露服务:到目前为止 kubernetes 总共有三种暴露 ...
- Kubernetes K8S之Ingress详解与示例
K8S之Ingress概述与说明,并详解Ingress常用示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2C ...
- 基于Kubernetes(k8s)部署Dubbo+Nacos服务
一.说明 本文介绍基于 Kubernetes(k8s) 环境集成阿里云 私有镜像仓库 来部署一套 Dubbo + Nacos 的微服务系统,并使用 Kubernetes DNS 以及 port-for ...
- k8s 添加ingress 暴露服务
vim file.yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: name: pgadmin labels: k8s-app: ...
- 详解k8s组件Ingress边缘路由器并落地到微服务 - kubernetes
写在前面 Ingress 英文翻译 进入;进入权;进食,更准确的讲就是入口,即外部流量进入k8s集群必经之口.这到大门到底有什么作用?我们如何使用Ingress?k8s又是如何进行服务发现的呢?先看一 ...
- (转)详解k8s组件Ingress边缘路由器并落地到微服务 - kubernetes
转:https://www.cnblogs.com/justmine/p/8991379.html 写在前面 Ingress 英文翻译 进入;进入权;进食,更准确的讲就是入口,即外部流量进入k8s集群 ...
- Kubernetes实战 - 从零开始搭建微服务 - 1.5 提高可用性-发布多节点的Node/Express网络应用程序
1.5 提高可用性-发布多节点的Node/Express网络应用程序 Kubernetes实战 - 从零开始搭建微服务 前言 在上一篇文章中,已经学习了如何简单地开发一个单层网络应用.[Kuberne ...
- Kubernetes K8S在IPVS代理模式下Service服务的ClusterIP类型访问失败处理
Kubernetes K8S使用IPVS代理模式,当Service的类型为ClusterIP时,如何处理访问service却不能访问后端pod的情况. 背景现象 Kubernetes K8S使用IPV ...
- Kubernetes K8S之Service服务详解与示例
K8S之Service概述与代理说明,并详解所有的service服务类型与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master Cent ...
- 微服务探索之路03篇-docker私有仓库Harbor搭建+Kubernetes(k8s)部署私有仓库的镜像
❝ 目录: 微服务探索之路01篇.net6.0项目本地win10系统docker到服务器liunx系统docker的贯通 微服务探索之路02篇liunx ubuntu服务器部署k8s(kubernet ...
随机推荐
- DSLinux介绍
本发行版 名字叫 Damn Small Linux 整个磁盘大小是40多M, 相对于如今几十G起步的操作系统(对, 就是你Windows), 确实太tm小了 Kernel版本是2.4.26, 2004 ...
- 3.HTTP协议
HTTP协议 目录 HTTP协议 1.常见HTTP客户端 思考 1.网络协议为什么要分层? 2.www包含了哪些技术? 3.http请求/响应报文包含了哪些内容? 4.http特点有哪些? 2.代理的 ...
- Javascript 加密解密方法
本文链接 https://www.cnblogs.com/zichliang/p/17265960.html Javascript 和 我之前发的 python加密 以及 go加密 解密不一样 不需要 ...
- 关于Docker compose值IP与域名的映射 之 extra_host
公司的所有项目都是采用Docker容器化部署,最近有一个项目需要使用定时任务调用第三方Api,正式web环境服务器的网络与第三方网络是通畅的,但是当将代码发布到正式环境,调用接口却显示 System. ...
- [软件工程/数据工程] 软件工程&数据工程知识体系
1 概述 本篇是为了重新总结.重新编写5年前(2018-12-31 00:06),临近毕业时的一篇文章软件工程专业知识体系[求职/就业]而作,至此篇文章发布时,原文文章应已被删除.但第1章节中仍会存在 ...
- [网络/SSH]OpenSSH: sshd / sftp-server / ssh-agent | ssh / scp / sftp | OpenSSL
1 OpenSSH OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现. OpenSSH是使用SSH透过计算机网络加密通讯的实现. SSH协议族可以用来进行远程控制, 或在计 ...
- sorted、返回函数、匿名函数、装饰器、偏函数
1.sorted()排序方法,它可已经一个列表按照升序排序,也可以按照反序排序 1)如果要进行反序排序时,需要在函数里面设置reverse = True 2)sorted是一个高阶函数,它接受函数作为 ...
- yolov5训练自己的数据集
1.安装cuda 可以先看看自己的 显卡信息,支持哪个cuda版本 cuda下载地址:https://developer.nvidia.com/cuda-toolkit-archive 我的RTX30 ...
- Java:一篇学好设计模式
什么是设计模式 简单理解,设计模式是前人多年写代码踩坑总结出来的优秀代码攻略,目的是减少大量无用代码,让项目更好维护 七大设计原则 接下来要讲的23种设计模式,但遵循下面的七大原则: 单一职责原则 2 ...
- MySQL(六)存储引擎
存储引擎 连接管理.查询缓存.解析器和执行器被归为MySQL service,而把真实存储数据的功能划分为存储引擎的功能.所以MySQL service经过查询优化后,只需按照生成的执行计划调用存 ...