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

yizhihongxing

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日

相关文章

  • Python OpenCV之常用滤波器使用详解

    Python OpenCV之常用滤波器使用详解 在计算机视觉领域,滤波器是一种常用的技术,可以用来增强或降低图像的某些特性。Python OpenCV提供了丰富的滤波器函数,本文将介绍其中常用的几种,并且给出示例说明。 1.均值滤波器 均值滤波器是一种线性滤波器,其原理是将图像中的每个像素点与周围的邻域像素点取平均值,并将这个平均值设为该像素的新值。Pyth…

    人工智能概论 2023年5月25日
    00
  • django中cookiecutter的使用教程

    下面我将详细讲解“Django中Cookiecutter的使用教程”的完整攻略。 什么是Cookiecutter Cookiecutter是基于模板快速创建项目的工具,可以使用Cookiecutter创建项目的好处是可以快速创建符合最佳实践的项目模板,减少重复性体力劳动,提高工作效率。 Cookiecutter的安装 Cookiecutter基于Python…

    人工智能概览 2023年5月25日
    00
  • 使用TensorFlow直接获取处理MNIST数据方式

    下面我来详细讲解如何使用TensorFlow直接获取处理MNIST数据的完整攻略。 什么是MNIST数据 MNIST数据是指手写数字数据集,图像为黑白灰度图像,每张图像的大小为28*28像素。MNIST数据集一般用于机器学习领域的基础实验,例如手写数字图像识别。 获取MNIST数据 首先,我们需要从TensorFlow中获取MNIST数据,TensorFlo…

    人工智能概论 2023年5月24日
    00
  • 写好Python代码的几条重要技巧

    下面是我给您提供的“写好Python代码的几条重要技巧”的攻略: 写好Python代码的几条重要技巧 1. 具有可读性的代码 可读性是写好Python代码的重要因素之一。可读性高的代码可让其他人,包括自己,更容易理解和维护。以下是提高代码可读性的一些技巧: 使用描述性的变量名 描述性的变量名有助于其他人轻松地理解代码执行的实际含义。 #不好的例子 a = ‘…

    人工智能概览 2023年5月25日
    00
  • Python Django模板之模板过滤器与自定义模板过滤器示例

    Python Django模板之模板过滤器与自定义模板过滤器示例 什么是模板过滤器? 模板过滤器是Django模板语言中的一种特殊的模板标签,用于对模板变量进行处理和转换。使用模板过滤器可以在模板渲染时对变量进行格式化、编码、截断等操作,从而更好的展示页面内容。 模板过滤器通常在模板变量后使用,使用竖线“|”隔开,例如:{{variable|filter}}…

    人工智能概览 2023年5月25日
    00
  • tensorflow pb to tflite 精度下降详解

    首先我们需要明确一点,将TensorFlow pb模型转换为TensorFlow Lite格式可能会导致精度下降,主要原因是两种格式的计算方式不同。而这种精度下降的原因有很多,下面我们逐一分析。 原因一:量化 TensorFlow Lite是一种被量化的格式,也就是说,它将在一定程度上损失精度以换取性能的提升。这种损失的程度取决于模型本身的精度以及量化的方式…

    人工智能概论 2023年5月25日
    00
  • python pycharm中使用opencv时没有代码自动补全提示的解决方案

    首先,解决pycharm中opencv库没有代码自动补全提示的问题,需要先确认几个方面: pycharm中是否正确安装opencv库。 是否在pycharm中正确配置了opencv库的路径。 是否正确配置了pycharm的代码补全设置。 如果以上几个方面都确认无误,但仍然没有代码自动补全提示,那么可以采用以下解决方案: 解决方案一:安装opencv-pyth…

    人工智能概论 2023年5月25日
    00
  • 什么是MEAN?JavaScript编程中的MEAN是什么意思?

    MEAN是JavaScript编程中的一个技术栈,它包含了四个技术领域的理念:MongoDB、Express.js、AngularJS、Node.js。下面我来详细讲解一下这四个技术领域对于MEAN的意义和重要作用。 MongoDB MongoDB是一个面向文档的数据库,可以帮助我们存储和管理数据。它非常灵活,可以处理非结构化数据和大规模数据。在MEAN技术…

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