Kubernetes - Ingress暴露应用四

阅读本文前可先参考

Kubernetes - Kubernetes详解;安装部署_MinggeQingchun的博客-CSDN博客

https://blog.csdn.net/MinggeQingchun/article/details/126420188

一、Ingress

k8s 对外暴露服务(service)主要有两种方式:NotePort, LoadBalance, 此外externalIPs也可以使各类service对外提供服务,但是当集群服务很多的时候,NodePort方式最大的缺点是会占用很多集群机器的端口;LB方式最大的缺点则是每个service一个LB又有点浪费和麻烦,并且需要k8s之外的支持; 而ingress则只需要一个NodePort或者一个LB就可以满足所有service对外服务的需求

Kubernetes 暴露服务的方式:

NodePort:后期维护困难,不支持虚拟路径

LoadBlancer:需要云厂商支持,有局限性

ClusterIP:只能在集群内部访问

Ingress:灵活,无依赖

(一)NodePort

NodePort服务是让外部请求直接访问服务的最原始方式,NodePort是在所有的节点(虚拟机)上开放指定的端口,所有发送到这个端口的请求都会直接转发到服务中的pod里

NodePort服务的YAML文件如下:

apiVersion: v1
kind: Service
metadata:  
 name: my-nodeport-service
selector:   
 app: my-appspec:
 type: NodePort
 ports:  
 - name: http
   port: 80
   targetPort: 80
   nodePort: 30008
   protocol: TCP

这种方式有一个“nodePort"的端口,能在节点上指定开放哪个端口,如果没有指定端口,它会选择一个随机端口,大多数时候应该让Kubernetes随机选择端口;

这种方式的不足:

1、一个端口只能供一个服务使用;

2、只能使用30000–32767之间的端口;

3、如果节点/虚拟机的IP地址发生变化,需要手动进行处理;

因此,在生产环境不推荐使用这种方式来直接发布服务,如果不要求运行的服务实时可用,或者用于演示或者临时运行一个应用可以用这种方式

三种端口说明

ports:  

 - name: http

   port: 80

   targetPort: 80

   nodePort: 30008

   protocol: TCP

nodePort

外部机器(在windows浏览器)可以访问的端口

如一个Web应用需要被其他用户访问,那么需要配置type=NodePort,而且配置nodePort=30001,那么其他机器就可以通过浏览器访问scheme://node:30001访问到该服务

targetPort

容器的端口,与制作容器时暴露的端口一致(Dockerfile中EXPOSE),如docker.io官方的nginx暴露的是80端口

port

Kubernetes集群中的各个服务之间访问的端口,虽然mysql容器暴露了3306端口,但外部机器不能访问到mysql服务,因为他没有配置NodePort类型,该3306端口是集群内其他容器需要通过3306端口访问该服务

kubectl expose deployment springboot-k8s --port=8080 --target-port=8080 --type=NodePort

(二)LoadBalancer

LoadBlancer可以暴露服务,这种方式需要向云平台申请负载均衡器,目前很多云平台都支持,但是这种方式深度耦合了云平台(购买服务)

从外部的访问通过负载均衡器LoadBlancer转发到后端的Pod,具体如何实现要看云提供商

(三)Ingress

Ingress 英文翻译为:入口、进入、进入权、进食,也就是入口,即外部请求进入k8s集群必经之口

虽然k8s集群内部署的pod、service都有自己的IP,但是却无法提供外网访问,以前我们可以通过监听NodePort的方式暴露服务,但是这种方式并不灵活,生产环境也不建议使用;

Ingresss是k8s集群中的一个API资源对象,相当于一个集群网关,我们可以自定义路由规则来转发、管理、暴露服务(一组pod),比较灵活,生产环境建议使用这种方式;

Ingress不是kubernetes内置的(安装好k8s之后,并没有安装ingress),ingress需要单独安装,而且有多种类型Google Cloud Load Balancer,Nginx,Contour,Istio等等,我们这里选择官方维护的Ingress Nginx

Ingress:k8s中的一个抽象资源,给管理员提供一个暴露应用的入口定义方法,将不同URL的访问请求转发到后端不同的Service,以实现HTTP层的业务路由机制

Ingress Controller:根据Ingress生成具体的路由规则,并对Pod负载均衡,实现基于不同HTTP URL向后转发的负载分发规则,并可以灵活设置7层负载分发策略。

使用Ingress进行负载分发时,Ingress Controller基于Ingress规则将客户端请求直接转发到Service对应的后端Endpoint(Pod)上,这样会跳过kube-proxy的转发功能,kube-proxy不再起作用。如果Ingress Controller提供的是对外服务,则实际上实现的是边缘路由器的功能

使用Ingress Nginx的步骤

1、部署Ingress Nginx

2、配置Ingress Nginx规则

二、Ingress暴露容器化应用

1、部署一个容器化应用(pod),如Nginx、SpringBoot应用

kubectl create deployment nginx --image=nginx

2、暴露该服务

kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort

3、部署Ingress Nginx

GitHub地址:

GitHub - kubernetes/ingress-nginx: Ingress-NGINX Controller for Kubernetes

Installation Guide - NGINX Ingress Controller

ingress-nginx是使用NGINX作为反向代理和负载均衡器的Kubernetes的Ingress控制器

1、首先下载该 yaml 文件

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.0/deploy/static/provider/cloud/deploy.yaml

 应用

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.0/deploy/static/provider/cloud/deploy.yaml

2、应用

kubectl apply -f deploy.yaml

输出如下:xx unchanged ;正确输出应该是xx created ;查看service、deployment、pod状态也发现并未启动好

validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission configured

[root@eureka8761 ingress]# kubectl apply -f deploy.yaml
namespace/ingress-nginx unchanged
serviceaccount/ingress-nginx unchanged
serviceaccount/ingress-nginx-admission unchanged
role.rbac.authorization.k8s.io/ingress-nginx unchanged
role.rbac.authorization.k8s.io/ingress-nginx-admission unchanged
clusterrole.rbac.authorization.k8s.io/ingress-nginx unchanged
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission unchanged
rolebinding.rbac.authorization.k8s.io/ingress-nginx unchanged
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission unchanged
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx unchanged
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission unchanged
configmap/ingress-nginx-controller unchanged
service/ingress-nginx-controller created
service/ingress-nginx-controller-admission created
deployment.apps/ingress-nginx-controller created
job.batch/ingress-nginx-admission-create unchanged
job.batch/ingress-nginx-admission-patch unchanged
ingressclass.networking.k8s.io/nginx unchanged
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission configured

查看Ingress的状态

kubectl get service -n ingress-nginx

kubectl get deploy -n ingress-nginx

kubectl get pods -n ingress-nginx

3、 我们修改下载好的 deploy.yaml 文件 

v1 Ingress资源规范

apiVersion: networking.k8s.io/v1 #资源所属的API群组和版本
kind: Ingress #资源类型标识符
metadata: #元数据
  name <string> #资源名称
  annotations: #资源注解,vlbetal使用下面的注解来指定要解析该资源的控制器类型
    kubernetes.io/ingress.class:<string> #适配的Ingress控制器类别
  namespace <string>  #名称空间
spec:
  rules <[]object> #Ingress规则列表
  - host <string>  #虚拟主机的FQDN,支持“*"前缀通配,不支持IP,不支持指定端口
    http <object>
      paths <[]object>#虚拟主机PATH定义的列表,由path和backend组成
      - path <string> #流量匹配的HTTP PATH,必须以/开头
        pathType <string> #支持Exact、Prefix和ImplementationSpecific,必选
        backend <Object>#匹配到的流量转发到的目标后端
          resource <object>  #引用的同一名称空间下的资源,与下面两个字段互斥
          service <object> #关联的后端Service对象
            name <string> #后端Service的名称
            port bject> #后端Service上的端口对象
              name <string> #端口名称
              number <integer>  #端口号
  tls <[]object>  #TLS配置,用于指定上rules中定义的哪些host需要工作HTTPS模式
  - hosts <[]string>  #使用同一组证书的主机名称列表
    secretName <string> #保存于数字证书和私钥信息的secret资源名称
  backend <object>  #默认backend的定义,可嵌套字段及使用格式跟rules字段中的相同
  ingressClassName <string> #ingress类名称,用于指定适配的控制器

(1)修改镜像,不然会下载失败

阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

(2)添加一个配置项 hostNetwork

hostNetwork设置适用于Kubernetes。当Pod配置为时hostNetwork: true,在此Pod中运行的应用程序可以直接看到启动Pod的主机的网络接口

4、删除webhook,删除之前未创建好的service、deployment、pod,重新应用

查看 webhook

kubectl get validatingwebhookconfigurations

删除ingress-nginx-admission

kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission
kubectl delete service ingress-nginx-controller -n ingress-nginx
kubectl delete service ingress-nginx-controller-admission -n ingress-nginx

kubectl delete deploy ingress-nginx-controller -n ingress-nginx

kubectl delete pods -n ingress-nginx

kubectl apply -f deploy.yaml

5、查看Ingress的状态

kubectl get service -n ingress-nginx

kubectl get deploy -n ingress-nginx

kubectl get pods -n ingress-nginx

6、创建Ingress规则

(1)编写 ingress-nginx-rule.yaml 文件

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: k8s-ingress
spec:
  rules:
  - host: www.abc.com
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: nginx
            port: 
              number: 80

(2)应用

kubectl apply -f ingress-nginx-rule.yaml

此时如果报错

ingress-nginx-controller-58bfcbb55b-nk2pw   0/1     ContainerCreating   0          6m5s
[root@eureka8761 ingress]# kubectl apply -f ingress-nginx-rule.yaml
Error from server (InternalError): error when creating "ingress-nginx-rule.yaml": Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": Post "https://ingress-nginx-controller-admission.ingress-nginx.svc:443/networking/v1/ingresses?timeout=10s": dial tcp 10.111.130.1:443: connect: connection refused

解决办法:

kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission

再次执行 

kubectl apply -f ingress-nginx-rule.yaml

查看规则 

kubectl get ingress

三、kubernetes部署Spring Cloud微服务

1、项目打成jar包或者war包

2、制作项目镜像(编写Dockerfile文件)

生成镜像:
docker build -t spring-cloud-alibaba-consumer -f Dockerfile-consumer .
docker build -t spring-cloud-alibaba-provider -f Dockerfile-provider .
docker build -t spring-cloud-alibaba-gateway -f Dockerfile-gateway .

3、用k8s部署镜像(命令方式、yaml方式)

注:deploy.yaml文件里面镜像从本地拉取

containers:

      - image: spring-cloud-alibaba-consumer-1.0.0-jar

        name: spring-cloud-alibaba-consumer-1-0-0-jar-8ntrx

        imagePullPolicy: Never

把镜像拉取策略改为Never

4、对外暴露服务

部署提供者:
(1)
kubectl create deployment spring-cloud-alibaba-provider --image=spring-cloud-alibaba-provider --dry-run -o yaml > provider.yaml
(2)
kubectl apply -f provider.yaml
部署消费者:
(1)
kubectl create deployment spring-cloud-alibaba-consumer --image=spring-cloud-alibaba-consumer --dry-run -o yaml > consumer.yaml
(2)
kubectl apply -f consumer.yaml
(3)
kubectl expose deployment spring-cloud-alibaba-consumer --port=9090 --target-port=9090 --type=NodePort
部署网关:
(1)
kubectl create deployment spring-cloud-alibaba-gateway --image=spring-cloud-alibaba-gateway --dry-run -o yaml > gateway.yaml
(2)
kubectl apply -f gateway.yaml
(3)
kubectl expose deployment spring-cloud-alibaba-gateway --port=80 --target-port=80 --type=NodePort

5、 查看状态

kubectl get service -n ingress-nginx
kubectl get deploy -n ingress-nginx
kubectl get pods -n ingress-nginx

看pod详情:
kubectl describe pods spring-cloud-alibaba-consumer-xx

看pod运行日志:
kubectl logs -f spring-cloud-alibaba-consumer-xx

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340