k8s ingress学习总结

k8s-ingress学习总结

大纲

  • 概念
  • 部署安装ingress
  • https 支持

概念

Ingress主要是一个用于Kubernetes集群业务的入口。可以使用Traefik、Istio、Nginx、HAProxy作为Ingress,典型的访问方式是 HTTP

K8s集群对外暴露服务的方式目前有三种:

  • LoadBalancer
  • Nodeport
  • Ingress

LoadBalancer 大部分情况下只适用于支持外部负载均衡器的云提供商(AWS,阿里云,华为云等)使用。缺点 需要云服务商提供支持

Nodeport 的问题是需要集群主机开放大量的端口,如果服务多了就不好管理

Ingress的优势是减少不必要的端口暴露只需要一个NodePort或者一个LoadBalancer就可以满足所有service对外服务的需求,同时可以实现动态配置暴露服务当新增加一个服务时只需要配置一个域名即可

在这里插入图片描述

Ingress其实还是利用service 实现对外暴露

ingress的工作原理

ingress contronler通过与k8s的api进行交互,拉取k8s集群中ingress服务规则的变化,然后读取并按照定义的ingress规则,修改ingress-controller中的nginx配置,实现转发到k8s集群中对应的service。

Ingress组成

Ingress由两部分组成:Ingress controller和Ingress服务
单独使用Ingress是无效的

本次测试使用Nginx Ingress controller

k8s社区提供的Nginx ingress,github地址 https://github.com/kubernetes/ingress-nginx
nginx社区提供的Nginx ingress,github地址 https://github.com/nginxinc/kubernetes-ingress

部署安装ingress

本次测试:

  • k8s集群版本为 1.70
  • Nginx Ingress controller版本为0.26.2
  • 两个应用tomcat 和 springboot order-service

使用ingress 对外暴露服务的架构如下

在这里插入图片描述

step1 下载并安装Nginx Ingress controller

下载Nginx Ingress controller mandatory.yaml 配置文件

在这里插入图片描述

得到 mandatory.yaml 配置文件

注意:此mandatory.yaml 中只有包含 nginx-ingress-controller 没有包含service 需要自己独立创建

在这里插入图片描述

kubectl apply -f mandatory.yaml
kubectl get all -n ingress-nginx

在这里插入图片描述

nginx-ingress-controller完成安装

step2 创建nginx-ingress-controller-service

创建一个 nginx-ingress-controller-service 用于暴露nginx-ingress-controller

此service的关键是selector 选择的标签是mandatory.yaml 中nginx容器指定的标签

apiVersion: v1
kind: Service
metadata:
  namespace: ingress-nginx
  name: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  # 此service是需要对外暴露的type: NodePort
  type: NodePort
  ports:
    - name: http #服务为http
      port: 80 #service端口为80
      targetPort: 80 #容器端口为80 对应nginx-ingress-controller 中nginx-容器的端口
      protocol: TCP
      nodePort: 32280
  # 这里需要注意    selector 标签为 mandatory.yaml nginx-容器的标签
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

执行命令

kubectl apply -f nginx-ingress-controller-service.yaml

在这里插入图片描述

进入pod 可以看到内部的实现是基于openresty lua

在这里插入图片描述

集群外部使用nodePort端口访问成功

在这里插入图片描述

step3 创建业务service + pod

此步骤就是常规的k8s使用方式 service + deployment 实现业务服务部署

注意此步创建的service type都是 ClusterIP 并没有对外暴露

这是tomcat的配置
apiVersion: v1
kind: Service
metadata:
  name: tomcat-service
  namespace: default
spec:
  selector:
    app: tomcat
  # service的类型为 ClusterIP 这样就不使用nodePort暴露过多的端口 
  type: ClusterIP  
  ports:
  - name: http
    port: 8080
    targetPort: 8080
  - name: ajp
    port: 8009
    targetPort: 8009
 
---

apiVersion: apps/v1
kind: Deployment
metadata: 
  name: tomcat-deploy
spec:
  replicas: 1
  selector: 
    matchLabels:
      app: tomcat
  template:
    metadata:
      labels:
        app: tomcat
    spec:
      containers:
      - name: tomcat
        image: bitnami/tomcat
        env:
           - name: ALLOW_EMPTY_PASSWORD
             value: "yes"  
        ports:
           - name: http
             containerPort: 8080
           - name: ajp
             containerPort: 8009

执行命令

kubectl apply -f deploy-service-order.yaml
kubectl apply -f deploy-service-tomcat.yaml

在这里插入图片描述

step4 创建Ingress

创建Ingress 实现域名与service的映射

# 注意apiVersion
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  namespace: default
  annotations: 
    kubernets.io/ingress.class: "nginx"
spec:
  rules:
  - host: my.test.tomcat.cn  #将域名与node IP 绑定写入访问节点hosts文件
    http:
      paths:
      - path: 
        # 注意配置 backend 指定对应的service 与 service的端口
        backend:
          serviceName: tomcat-service
          servicePort: 8080
  - host: my.order.test.con  #将域名与node IP 绑定写入访问节点hosts文件
    http:
      paths:
      - path:
        backend:
          serviceName: order-service
          servicePort: 5555

执行命令

kubectl apply -f ingress.yaml

在这里插入图片描述

在次登录到nginx-ingress-controller Pod中查看nginx.conf 配置文件

kubectl exec -it -n ingress-nginx  nginx-ingress-controller-9dfc54f55-7cj87 bash

在这里插入图片描述

step5 修改Host

修改本机host文件,将域名与k8s集群中任意一台机器ip地址映射

在这里插入图片描述

使用域名访问 成功实现业务Pod的对外暴露

在这里插入图片描述
在这里插入图片描述

https 支持

Ingress 支持https需要额外准备证书和私钥

这里直接使用存在的证书和私钥

kubectl create secret tls medcrab-https-secret --cert=/medcrab/k8s/ingress-test/key/medcrab.com.crt --key=/medcrab/k8s/ingress-test/key/medcrab.com.key

*注意此证书书 .medcrab.com 通配符证书

其他部署和上面的http配置类似只需要配置两个地方

  • 1 ingress的配置
  • 2 创建一个secret 保存证书与私钥

setp1 创建ingress

只需要添加tls 相关配置即可

spec:
  tls:
  # 注意我们的证书是同配置证书
  # secret只需要配置一个即可
  - hosts:
    - order.medcrab.com
    secretName: medcrab-https-secret
  - hosts:
    - tomcat.medcrab.com  
    secretName: medcrab-https-secret

setp2 创建secret 保存证书与私钥

kubectl create secret tls medcrab-https-secret --cert=/medcrab/k8s/ingress-test/key/medcrab.com.crt --key=/medcrab/k8s/ingress-test/key/medcrab.com.key

在这里插入图片描述

setp3 修改Host

添加ip与域名映射

192.168.0.210 tomcat.medcrab.com
192.168.0.211 order.medcrab.com

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寂寞的4角钱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值