• 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文件如下:

    1. apiVersion: v1
    2. kind: Service
    3. metadata:  
    4. name: my-nodeport-service
    5. selector:  
    6. app: my-appspec:
    7. type: NodePort
    8. ports:  
    9. - name: http
    10.   port: 80
    11.   targetPort: 80
    12.   nodePort: 30008
    13.   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

    1. [root@eureka8761 ingress]# kubectl apply -f deploy.yaml
    2. namespace/ingress-nginx unchanged
    3. serviceaccount/ingress-nginx unchanged
    4. serviceaccount/ingress-nginx-admission unchanged
    5. role.rbac.authorization.k8s.io/ingress-nginx unchanged
    6. role.rbac.authorization.k8s.io/ingress-nginx-admission unchanged
    7. clusterrole.rbac.authorization.k8s.io/ingress-nginx unchanged
    8. clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission unchanged
    9. rolebinding.rbac.authorization.k8s.io/ingress-nginx unchanged
    10. rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission unchanged
    11. clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx unchanged
    12. clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission unchanged
    13. configmap/ingress-nginx-controller unchanged
    14. service/ingress-nginx-controller created
    15. service/ingress-nginx-controller-admission created
    16. deployment.apps/ingress-nginx-controller created
    17. job.batch/ingress-nginx-admission-create unchanged
    18. job.batch/ingress-nginx-admission-patch unchanged
    19. ingressclass.networking.k8s.io/nginx unchanged
    20. 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资源规范

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

    1. apiVersion: networking.k8s.io/v1
    2. kind: Ingress
    3. metadata:
    4. name: k8s-ingress
    5. spec:
    6. rules:
    7. - host: www.abc.com
    8. http:
    9. paths:
    10. - pathType: Prefix
    11. path: /
    12. backend:
    13. service:
    14. name: nginx
    15. port:
    16. number: 80

    (2)应用

    kubectl apply -f ingress-nginx-rule.yaml

    此时如果报错

    1. ingress-nginx-controller-58bfcbb55b-nk2pw 0/1 ContainerCreating 0 6m5s
    2. [root@eureka8761 ingress]# kubectl apply -f ingress-nginx-rule.yaml
    3. 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文件)

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

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

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

    1. containers:
    2.       - image: spring-cloud-alibaba-consumer-1.0.0-jar
    3.         name: spring-cloud-alibaba-consumer-1-0-0-jar-8ntrx
    4.         imagePullPolicy: Never

    把镜像拉取策略改为Never

    4、对外暴露服务

    1. 部署提供者:
    2. (1)
    3. kubectl create deployment spring-cloud-alibaba-provider --image=spring-cloud-alibaba-provider --dry-run -o yaml > provider.yaml
    4. (2)
    5. kubectl apply -f provider.yaml
    6. 部署消费者:
    7. (1)
    8. kubectl create deployment spring-cloud-alibaba-consumer --image=spring-cloud-alibaba-consumer --dry-run -o yaml > consumer.yaml
    9. (2)
    10. kubectl apply -f consumer.yaml
    11. (3)
    12. kubectl expose deployment spring-cloud-alibaba-consumer --port=9090 --target-port=9090 --type=NodePort
    13. 部署网关:
    14. (1)
    15. kubectl create deployment spring-cloud-alibaba-gateway --image=spring-cloud-alibaba-gateway --dry-run -o yaml > gateway.yaml
    16. (2)
    17. kubectl apply -f gateway.yaml
    18. (3)
    19. kubectl expose deployment spring-cloud-alibaba-gateway --port=80 --target-port=80 --type=NodePort

    5、 查看状态

    1. kubectl get service -n ingress-nginx
    2. kubectl get deploy -n ingress-nginx
    3. kubectl get pods -n ingress-nginx
    4. 看pod详情:
    5. kubectl describe pods spring-cloud-alibaba-consumer-xx
    6. 看pod运行日志:
    7. kubectl logs -f spring-cloud-alibaba-consumer-xx

  • 相关阅读:
    GEE:Bfast时间序列扰动检测
    使用ASP.NET Core封装接口请求参数格式
    docker 安装 portainer
    电脑录屏快捷键是什么?win10自带屏幕录制在哪
    CSRF和SSRF有什么不同?
    优化高手都需要深入的访问路径(ACCESS PATH)
    一个无经验的大学毕业生,可以转行做软件测试吗?我的真实案例
    进制原理
    QT Creator概览
    进程的认识
  • 原文地址:https://blog.csdn.net/MinggeQingchun/article/details/126429048