Kubernetes(k8s)使用ingress发布服务

这篇具有很好参考价值的文章主要介绍了Kubernetes(k8s)使用ingress发布服务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录
  • 一.系统环境
  • 二.前言
  • 三.Kubernetes ingress简介
  • 四.Ingress vs NodePort vs LoadBalancer
  • 五.安装部署Nginx Ingress Controller控制器
  • 六.使用Ingress来发布Kubernetes服务
    • 6.1 创建3个pod
    • 6.2 配置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资源来配置和管理服务入口点。文章来源地址https://www.toymoban.com/news/detail-473941.html

到了这里,关于Kubernetes(k8s)使用ingress发布服务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Kubernetes技术--k8s核心技术 ingress

    1.引入        我们之前在部署应用(如nginx)的时候,如果你需要外部进行访问,使用的是service中的nodePort方式进行对外的暴露。然后外部就可以使用ip + 端口号来进行访问部署应用。         其实这一种方式是存在着较为明显的缺陷,每一个端口你只能够使用一次,一个端口

    2024年02月10日
    浏览(38)
  • k8s集群使用ingress转发grafana服务

    在k8s集群中,使用ingress服务转发grafana的页面。 ingress方面增加路由规则和跨命名空间的service即可 grafana增加configmap挂载grafana.ini文件,增加匿名登陆配置和root_url配置 grafana.ini文件的yaml文件 grafana启动服务的yaml文件 我这里使用的pvc的存储类型是rook-ceph,使用其他存储类型的修

    2024年02月09日
    浏览(34)
  • 【kubernetes系列】k8s ingress配置websocket支持

    背景:公司的后端同事在代码调试过程中需要上传一个文件,调用的websocket接口 浏览器上传文件一直卡主,通过浏览器调试模式发现无法正常获取websocket的连接 websocket的接口访问可以通过wscat命令(需单独安装)测试。 浏览器访问报错如下: WebSocket connection to ‘ws://*******

    2024年02月06日
    浏览(50)
  • Kubernetes(k8s)服务service:service的发现和service的发布

    目录 一.系统环境 二.前言 三.Kubernetes service简介 四.使用hostPort向外界暴露应用程序 4.1 创建deploy 4.2 使用hostPort向外界暴露pod的端口 五.使用service服务向外界暴露应用程序 5.1 使用service服务向外界暴露pod 5.1.1 创建service服务 5.1.2 测试svc的负载均衡 六.service服务的发现 6.1 使用

    2024年02月08日
    浏览(54)
  • 【一起来学kubernetes】7、k8s中的ingress详解

    Ingress 是Kubernetes集群中的一种资源类型,用于实现用域名的方式访问Kubernetes内部应用。它为Kubernetes集群中的服务提供了入口,可以提供负载均衡、SSL终止和基于名称的虚拟主机。在生产环境中常用的Ingress有 Treafik 、 Nginx 、 HAProxy 、 Istio 等。基本概念是在Kubernetes v 1.1版中添

    2024年02月05日
    浏览(44)
  • 用Kubernetes(k8s)的ingress部署https应用

    我之前有一片文章写的是用ingress暴露应用,这篇文章接着上一片文章继续讲使用ingress暴露https的应用。请先参考上一片文章将ingress先在Kubernetes集群当中安装上: ingress暴露应用文章地址:https://blog.csdn.net/m0_51510236/article/details/132536519 因为是暴露https,所以需要域名证书。分以

    2024年02月10日
    浏览(43)
  • K8S Nginx Ingress实现金丝雀发布

    通过给 Ingress 资源指定 Nginx Ingress 所支持的 annotation 可实现金丝雀发布。 需给服务创建2个 Ingress,其中 1个常规 Ingress , 另1个为带  nginx.ingress.kubernetes.io/canary: \\\"true\\\"  固定的 annotation 的 Ingress,称为 Canary Ingress。 Canary Ingress 一般代表新版本的服务,结合另外针对流量切分策

    2024年02月11日
    浏览(42)
  • 飞天使-k8s知识点22-kubernetes实操7-ingress

    ingress 概念理解 环境准备 准备service和pod tomcat-nginx.yaml 创建ingress-http.yaml 验证效果 https 代理 创建证书 创建ingress-https.yaml 效果 查看映射到公网端口 参考文档: https://znunwm.top/archives/121212#7.4-ingress%E4%BB%8B%E7%BB%8D

    2024年02月22日
    浏览(41)
  • 【K8S 云原生】K8S的对外服务—ingress

    目录 一、K8S的Service 1、Service的作用 2、Service类型: 二、ingress 1、ingress的组成: 2、ingress资源的定义项: 三、nginx-ingress-controller暴露服务端的方式 1、Deployment+LoadBalancer模式: 1、工作流程图: 2、Daemonset+hostnetwork+nodeSelector模式: 1、工作流程图 2、实验: 3、deployment+NodePort

    2024年01月18日
    浏览(44)
  • k8s---对外服务 ingress

    目录 目录 ingress与service ingress的组成 ingress-controller: ingress暴露服务的方式 2.方式二:DaemonSet+hostnetwork+nodeSelector DaemonSet+hostnetwork+nodeSelector如何实现 3.deployment+NodePort: 虚拟主机的方式实现http代理 总结 deploymentit+loadbalancer: daemonset+hostnetwork+nodeselector: deployment+nodeport: serv

    2024年01月22日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包