k8s之ingress-nginx详解和部署方案

k8s之ingress-nginx详解和部署方案

介绍

Ingress是一个Kubernetes对象,用于管理和公开Kubernetes集群中服务的路由规则。 Ingress不会提供自己的实际负载均衡,相反,它需要一个后端负载均衡器来实现实际路由。

Nginx是一个流行的Web服务器和反向代理服务器。nginx-ingress-controller是一个开源的Ingress控制器,它使用Nginx作为后端负载均衡器。

部署nginx-ingress-controller

部署一个nginx-ingress-controller,需要执行以下步骤:

  1. 部署使用RBAC的ingress-controller:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-ingress-controller
  namespace: default
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: ingress-nginx
      app.kubernetes.io/part-of: ingress-nginx
  template:
    metadata:
      labels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
    spec:
      containers:
        - name: controller
          image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.25.0
          args:
            - /nginx-ingress-controller
            - --configmap=$(POD_NAMESPACE)/nginx-configuration
            - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
            - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
            - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller
            - --annotations-prefix=nginx.ingress.kubernetes.io
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
          ports:
            - name: http
              containerPort: 80
            - name: https
              containerPort: 443
  1. Service部署使用:
apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx-controller
  namespace: default
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:us-west-2:XXXXXXX:certificate/XXXXXXX-XXXXXXX-XXXXXXX
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443"
    service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout: '3600'
    service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: 'true'
spec:
  externalTrafficPolicy: Local
  type: LoadBalancer
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  ports:
    - name: http
      port: 80
      targetPort: 80
    - name: https
      port: 443
      targetPort: 443
  1. 部署所需的ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-configuration
data:
  ssl-protocols: TLSv1.2 TLSv1.3

部署Ingress

在部署Ingress之前,必须将Ingress控制器作为Kubernetes集群的一部分进行部署,如上。接下来,通过创建Ingress对象来将服务公开。假设有一个名为my-service的服务,可以使用以下Ingress对象将其公开:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-service
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /my-path
            pathType: Prefix
            backend:
              service:
                name: my-service
                port:
                  name: http

上面的Ingress对象:

  • 接受来自example.com主机的请求。
  • 匹配example.com/my-path路径的请求。
  • 重写请求的路径以删除/my-path前缀。
  • 将请求路由到名为my-service的服务。

示例

1. 部署Ingress

创建Deployment:

apiVersion: v1
kind: Pod
metadata:
  name: hello-world-1
  labels:
    app: hello-world-1
spec:
  containers:
  - name: hello-world-1
    image: gcr.io/google-samples/hello-app:1.0
    ports:
    - containerPort: 8080

创建Service:

apiVersion: v1
kind: Service
metadata:
  name: hello-world-1
spec:
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: hello-world-1

创建Ingress:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: hello-world-1
spec:
  rules:
    - host: hello-world-1.example.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: hello-world-1
              port:
                name: http

2. 部署多条Ingress

创建Deployment:

apiVersion: v1
kind: Pod
metadata:
  name: hello-world-2
  labels:
    app: hello-world-2
spec:
  containers:
  - name: hello-world-2
    image: gcr.io/google-samples/hello-app:1.0
    ports:
    - containerPort: 8080

创建Service:

apiVersion: v1
kind: Service
metadata:
  name: hello-world-2
spec:
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: hello-world-2

创建Ingress:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: hello-world
spec:
  rules:
    - host: hello-world.example.com
      http:
        paths:
        - path: /hello-world-1
          pathType: Prefix
          backend:
            service:
              name: hello-world-1
              port:
                name: http
        - path: /hello-world-2
          pathType: Prefix
          backend:
            service:
              name: hello-world-2
              port:
                name: http

以上Ingress定义中,根据不同的请求路径,将请求路由到相应的服务中。可以通过访问http://hello-world.example.com/hello-world-1http://hello-world.example.com/hello-world-2测试是否工作正常。

注意:不同的Ingress对象需要不同的主机名,并且每个主机名都需要在DNS中解析为Ingress控制器的IP地址。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:k8s之ingress-nginx详解和部署方案 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • django使用channels2.x实现实时通讯

    下面我将详细介绍如何使用 Django 和 Channels 2.x 搭建实时通讯应用。 准备工作 首先,需要安装 Django 和 Channels,可以使用 pip 命令安装。假设你已经熟悉了 Django 的基本使用方法,下面就是 Channels 的部分了。 创建 Django 项目 首先,我们创建一个 Django 项目: $ django-adm…

    人工智能概览 2023年5月25日
    00
  • jsp留言板源代码一: 给jsp初学者.

    下面是关于“jsp留言板源代码一: 给jsp初学者”的完整攻略: 一、概述 “jsp留言板源代码一:给jsp初学者”是一个简单的留言板示例代码,其使用了JSP和Java Servlet技术实现,旨在帮助jsp刚学者更好地了解JSP和Servlet的基本用法以及如何将它们运用到实际开发中。该示例代码包含了留言板的基本功能,比如用户留言、留言显示、留言修改和删除…

    人工智能概论 2023年5月25日
    00
  • Kubernetes中Nginx服务启动失败排查流程分析(Error: ImagePullBackOff)

    针对”Kubernetes中Nginx服务启动失败排查流程分析(Error: ImagePullBackOff)”的问题,我们可以从以下几个方面入手进行排查: 1. 查看容器镜像 $ kubectl describe pod <pod-name> | grep -i image 首先,我们需要确认容器镜像是否存在、是否正确或从私有镜像仓库能否拉取…

    人工智能概览 2023年5月25日
    00
  • springboot-mongodb的多数据源配置的方法步骤

    下面是详细讲解 “springboot-mongodb的多数据源配置的方法步骤” 的完整攻略,包含两个示例说明。 第一步:导入相关依赖 首先,在 pom.xml 文件中添加 Spring Boot 和 MongoDB 的依赖项。 <dependencies> <!–Spring Boot相关依赖–> <dependency&…

    人工智能概论 2023年5月25日
    00
  • yolov5调用usb摄像头及本地摄像头的方法实例

    下面我们来详细讲解一下“yolov5调用usb摄像头及本地摄像头的方法实例”的完整攻略。 调用USB摄像头实例 1. 安装依赖项 在调用USB摄像头之前,需要先安装相关的依赖项。可以在命令行中使用以下命令安装: pip install opencv-python 2. 导入必要库 在调用USB摄像头之前,需要先导入必要的库。可以在Python脚本中使用以下代…

    人工智能概览 2023年5月25日
    00
  • keras使用Sequence类调用大规模数据集进行训练的实现

    Keras是一个用于深度学习的高级API,它可以在TensorFlow、CNTK、Theano、MXNet等框架之上运行,并提供了简单易用的接口,方便用户进行模型的设计、调试和训练。如果我们需要对大规模数据集进行训练,为了避免内存溢出等问题,可以使用Keras提供的Sequence类来调用数据。本文将详细介绍如何使用Keras的Sequence类实现大规模数…

    人工智能概论 2023年5月25日
    00
  • Dubbo本地开发技巧分享

    Dubbo本地开发技巧分享 Dubbo是一个高性能、轻量级的Java RPC框架,被广泛应用于微服务架构中。在进行Dubbo应用开发时,本地开发是必不可少的环节,因此掌握一些Dubbo本地开发技巧是非常有必要的。 本文将会分享几个Dubbo本地开发技巧,包括Dubbo本地开发环境的配置、Dubbo服务的本地调用等。 环境配置 在进行本地开发前,需要首先配置本…

    人工智能概览 2023年5月25日
    00
  • yum源安装mongodb图文教程

    下面是yum源安装mongoDB的详细攻略,包括准备工作、安装步骤和示例说明。 准备工作 确认yum源已经正确配置,可使用命令yum search mongo-10gen-server来检查是否已经可以找到mongo-10gen-server包。 确认系统版本和架构,mongoDB仅支持64位的系统。 安装步骤 安装MongoDB的官方yum源。 使用以下命…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部