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集群必经之口

Kubernetes - Ingress暴露应用(四)_第1张图片

虽然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

Kubernetes - Ingress暴露应用(四)_第2张图片

Installation Guide - NGINX Ingress Controller

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

Kubernetes - Ingress暴露应用(四)_第3张图片

1、首先下载该 yaml 文件

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

Kubernetes - Ingress暴露应用(四)_第4张图片

 应用

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

Kubernetes - Ingress暴露应用(四)_第5张图片

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

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

Kubernetes - Ingress暴露应用(四)_第6张图片

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

Kubernetes - Ingress暴露应用(四)_第7张图片

Kubernetes - Ingress暴露应用(四)_第8张图片

(2)添加一个配置项 hostNetwork

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

Kubernetes - Ingress暴露应用(四)_第9张图片

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

你可能感兴趣的:(Kubernetes(K8S),kubernetes,Ingress)