k8s部署IngressController

本文介绍如何在Kubernetes中部署Ingress Controller,并详细讲解Ingress的工作原理及常见配置方法,包括使用Ingress暴露服务、配置HTTPS等。

ingress概念

Ingress: Service的统一网关入口.


ingress工作原理

参考: https://www.toutiao.com/a6939101056643203587/?log_from=8fbeb3d56fe36_1646033531592
在这里插入图片描述


k8s部署IngressController


下载ingress-nginx资源清单

项目地址: https://kubernetes.github.io/ingress-nginx/deploy/#quick-start

如果不是云主机,请下载裸金属配置: https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal-clusters

# 下载ingress-nginx资源清单
wget https://ghproxy.com/https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.6.4/deploy/static/provider/baremetal/deploy.yaml

编辑ingress-nginx资源清单(裸金属配置不用修改)

!!!注意: nodePort大小写敏感

services中添加httphttptNodePort,默认是随机端口
type修改为NodePort
http的端口修改为30080
https的端口修改为30443
在这里插入图片描述


修改ingress默认端口

参考: https://blog.csdn.net/catoop/article/details/121447317

如果ingress已经部署好,就使用下面的方法进行修改

# 编辑nginx-ingress-controller
kubectl edit daemonset nginx-ingress-controller -n ingress-nginx

编辑nginx-ingress-controller的yaml资源清单

    containers:
      - args:
        - /nginx-ingress-controller
        - --default-backend-service=$(POD_NAMESPACE)/default-http-backend
        - --configmap=$(POD_NAMESPACE)/nginx-configuration
        - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
        - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
        - --annotations-prefix=nginx.ingress.kubernetes.io
        # 增加以下两个参数参数(一个是http端口,一个是https端口)
        - --http-port=80
        - --https-port=443    

删除原来的nginx-ingress-controller这个 pod,k8s重建pod后端口会生效.


apply后查看ingress

# apply这个ingress资源清单
kubectl apply -f deploy.yaml

# 查看ingress
kubectl get ingress -A

# 查看ingress详情
kubectl desrice ingress ing名

修改ingress-nginx的网络模式hostNetwork

开启hostNetwork后可以直接使用域名访问,不需要加端口,性能也更好.
控制器类型必需使用DaemonSet,否则pod暴露的host端口会冲突

参考: https://blog.csdn.net/weixin_41535316/article/details/121873795

修改下载好的ingress-nginx资源清单文件中的网路配置为hostNetwork

# 将Deployment修改为DaemonSet
apiVersion: apps/v1
#kind: Deployment
kind: DaemonSet  #这里把Deployment改成DaemonSet
metadata:

# 在DaemonSet的下方的容器选择中添加一行
    spec:
      dnsPolicy: ClusterFirst
      hostNetwork: true  #这里加一句,开启hostNetwork
      containers:
        - name: controller
# 修改NodePort为ClusterIP(非必须)
# type: NodePort
  type: ClusterIP

在这里插入图片描述


pathType路径类型

路径类型官方文档

  • Exact:精确匹配 URL 路径,且区分大小写。

  • Prefix:基于以 / 分隔的 URL 路径前缀匹配。匹配区分大小写,并且对路径中的元素逐个完成。 路径元素指的是由 / 分隔符分隔的路径中的标签列表。 如果每个 p 都是请求路径 p 的元素前缀,则请求与路径 p 匹配。

ingress如果要访问路径,在path 要填写//路径,注意是/
如果访问的是根路径1/就好


ingress暴露的两种方式

  • NodePort
  • hostnetwork

在这里插入图片描述


k8s发布一个应用


1. 创建deployment

创建deployment

# 创建一个deployment
kubectl create deployment edu --image=nginx

2. 为deployment创建services

创建service

# 创建一个svc
kubectl expose deployment edu --port=80 --target-port=80

3. 为services创建ingress

# 通过命令行创建yaml
kubectl create ingress edu --rule=web.edu.cn/=edu:80 --dry-run=client -o yaml > ing.yaml

ingress-yaml资源清单示例

!!!注意: k8s1.22及以上版本的ingress必须声明控制器

# 定义 Kubernetes Ingress 资源,用于配置外部访问集群服务的路由规则
apiVersion: networking.k8s.io/v1
## apiVersion: 使用 networking.k8s.io/v1 版本的 Ingress API(Kubernetes 1.19+ 推荐)

kind: Ingress
## kind: 资源类型为 Ingress,用于管理外部 HTTP/HTTPS 访问

metadata:
  name: edu
  ## name: Ingress 资源的名称,在命名空间内唯一

  annotations:
    # 指定使用的 Ingress 控制器类型,确保由 NGINX Ingress Controller 处理此规则
    # 如果集群中部署了多个 Ingress Controller(如 nginx、traefik、alb),必须指定
    kubernetes.io/ingress.class: "nginx"
    ## kubernetes.io/ingress.class: 指定 Ingress 的控制器类别
    ## "nginx": 表示该 Ingress 应由 NGINX Ingress Controller 处理
    ## 若不设置,可能被错误的控制器忽略,导致域名无法访问

spec:
  ## spec: Ingress 的规格定义,描述期望状态

  rules:
    ## rules: 定义一组基于主机和路径的路由规则
    ## 支持多个规则,每个规则对应一个 host

  - host: web.edu.cn
    ## host: 指定客户端访问的域名
    ## 当 HTTP 请求的 Host 头为 web.edu.cn 时,匹配此规则
    ## 若省略 host,则匹配所有域名(通配)

    http:
      ## http: 定义 HTTP 路由规则(Ingress 也支持 https/tls)

      paths:
        ## paths: 定义该 host 下的路径匹配规则列表

      - path: /
        ## path: URL 路径匹配前缀
        ## "/" 表示匹配所有路径(如 /, /api, /static 等)
        ## 支持前缀匹配(Prefix)或精确匹配(Exact)

        pathType: Prefix
        ## pathType: 路径匹配类型
        ## Prefix: 前缀匹配,请求路径以 path 开头即匹配
        ## Exact: 精确匹配,请求路径必须完全一致

        backend:
          ## backend: 定义匹配成功后的后端服务

          service:
            ## service: 指定后端为 Kubernetes Service

            name: edu
            ## name: 目标 Service 的名称
            ## 必须与集群中已存在的 Service 名称一致

            port:
              ## port: 指定 Service 的端口

              number: 80
              ## number: Service 开放的端口号
              ## 流量将被转发到名为 edu 的 Service 的 80 端口
              ## Service 再将流量转发到后端 Pod 的 targetPort

通过命令行创建ingress(命令创建的域名无法访问,未解决)
访问/目录时要填写两个//

# 创建名为 edu 的 Ingress,将 web.edu.cn/ 路由到 edu 服务的 80 端口
## kubectl create ingress: 创建 Ingress 资源
## edu: Ingress 名称
## --rule=host/path=service:port: 规则格式
## web.edu.cn/: 主机名 + 路径(路径不能省略,至少为 /)
### 访问/目录时要填写两个//
## edu:80: 目标 Service 名称和端口
kubectl creste ingress ${ing名称} --rule="${域名}=${svc名}:${svc端口}"
kubectl create ingress edu --rule="web.edu.cn/=edu:80"

4. apply这个ingress

# apply这个ingress
kubectl apply -f ing.yaml

# 查看ingress
kubectl get ingress

5. 验证这个ingress


本地修改hosts绑定对应域名

!!!注意:<Ingress Controler Pod所在Node IP> 域名

# 查看Ingress Controler Pod所在node
kubectl get po -A -owide|grep ingress-nginx-controller

# # 查看Ingress Controler Pod所在node
kubectl get pods,svc -owide -n ingress-nginx

在这里插入图片描述


ingress配置规则https

参考: 将 HTTPS 负载平衡中的多个 SSL 证书与 Ingress 搭配使用

在这里插入图片描述


创建证书文件(自签名)

https://blog.csdn.net/omaidb/article/details/121188674

# 创建key
openssl genrsa -out qftest.com.tls.key 2048

# 创建crt
openssl req new -x509 -key tls.key -out tls.crt -subj
/C=CN/ST=Beijing/L=Beijing/O=DevOps/CN=myapp.tls-ingress.com

# 将key和crt文件合并成pem证书文件
#cat my_site.pem ca_chain.pem my_site.key > combined_cert.pem

# 将证书保存到Secret
kubectl create secret tls 证书名 --cert=tls.crt --key=tls.key

创建https的ingress规则

# 将证书保存到Secret
kubectl create secret tls 证书名 --cert=tls.crt --key=tls.key

# 创建https的ingress规则
## 访问/目录时要填写两个//
kubectl create ingress edu --rule=web.edu.cn//=edu:80,tls=证书名secret --dry-run=client -o yaml > https-ing.yaml

ingress-yaml资源清单示例

!!!注意: k8s1.22及以上版本的ingress必须声明控制器

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: edu
  annotations:
    # 指定下ingress控制器,不然域名访问不了
    kubernetes.io/ingress.class: "nginx"

spec:
  tls:
  - host: web.edu.cn
    secretName: 证书名 # 这里填写secret中对应的证书名
  rules:
    - host: web.edu.cn
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: edu
                port:
                  number: 443

部署backend应用

通常在 Ingress 控制器中会配置 defaultBackend(默认后端),以服务于任何不符合规约中 path 的请求.

参考:
k8s-doc配置默认后端

部署backend应用

查看ing详情时会提示: Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
这是没有部署默认backend应用.
在这里插入图片描述


创建ingress报错

参考: https://blog.csdn.net/qq_39218530/article/details/115372879
错误提示如下:
Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": Post https://ingress-nginx-controller-admission.kube-system.svc:443/networking/v1beta1/ingresses? timeout=10s: dial tcp 10.0.0.5:8443: connect: connection refused


解决办法

参考办法: https://stackoverflow.com/questions/61616203/nginx-ingress-controller-failed-calling-webhook

# 使用下面的命令查看 webhook
kubectl get validatingwebhookconfigurations
# 打印ingress-nginx-admission

# 删除ingress-nginx-admission
kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission

# 再创建ingress就不报错了

ingress没有adress,域名访问404

参考: 解决 Kubernetes NGINX Ingress Controller v1.0.0-Yamasa of the World 的 404 错误问题

老版本的ingress可以域名访问,且有address,新版本的ingress访问404且没有adress

发生错误的版本: controller-v1.1.2


解决办法: 声明ingressClass(指定ingress控制器)

必须声明ingressClass(指定ingress控制器)

# 创建ingress时声明IngressClass就会有address,也不会404
  annotations:
    kubernetes.io/ingress.class: "nginx"

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

教Linux的李老师

您的赞赏,是我深夜码字时最亮的

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

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

打赏作者

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

抵扣说明:

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

余额充值