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之模板层的实现代码

    下面是“Django之模板层的实现代码”的完整攻略。 什么是Django模板层? Django的模板层是将用户数据和视图层之间的交互进行分离的一种方式。通过Django模板层,我们可以将页面渲染的代码分离到一个单独的文件中,从而减少代码混杂和代码冗余的问题,提高了代码的可维护性和可读性。 Django模板层如何实现 Django的模板层是由一些Python类…

    人工智能概论 2023年5月25日
    00
  • django中url映射规则和服务端响应顺序的实现

    一、django中url映射规则的实现 在Django中,我们可以通过URL配置文件(urls.py)来定义URL和视图的映射规则。其中,常见的映射规则有以下三种: 1.基于函数的视图映射 使用“urlpatterns”中的“path”和“re_path”配置函数或类视图。 示例: from django.urls import path from . im…

    人工智能概览 2023年5月25日
    00
  • Python关于print的操作(倒计时、转圈显示、进度条)

    Python中关于print的操作可以实现各种有趣的效果,本攻略将会详细讲解三种print的操作,分别为倒计时、转圈显示和进度条。 倒计时 倒计时是一种非常有用的效果,可以在很多场合使用,比如计时器、倒计时动画等。下面提供一段Python代码实现倒计时: import time def countdown(t): while t > 0: m, s =…

    人工智能概论 2023年5月25日
    00
  • win系统下为Python3.5安装flask-mongoengine 库

    下面是在win系统下为Python3.5安装flask-mongoengine库的完整攻略: 1. 安装Python3.5 首先需要在Windows系统下安装Python3.5。可以在Python官网下载对应版本的Python3.5安装包进行安装,注意勾选添加到系统环境变量,以便于在命令行中使用Python。安装完成后需要在命令行中输入以下命令来检查Pyth…

    人工智能概览 2023年5月25日
    00
  • Django如何将URL映射到视图

    Django将URL映射到视图的过程主要有以下几个步骤: 配置URL路由规则 定义视图函数 将URL路由规则与视图函数进行绑定 下面分别讲解这几个步骤: 配置URL路由规则 Django使用urls.py文件来定义URL路由规则。在urls.py文件中,需要先导入Django中的path函数。path函数用来定义URL路由规则,支持正则表达式,类似于Flas…

    人工智能概览 2023年5月25日
    00
  • Mongodb聚合函数count、distinct、group如何实现数据聚合操作

    MongoDB是目前流行的非关系型数据库之一,在数据聚合操作中,使用其提供的聚合函数可以轻松实现各种聚合操作。本文将详细讲解 MongoDB 聚合函数 count、distinct、group 的使用方法,包括语法和示例。 count函数 count函数用于统计集合中满足条件的文档数量。语法如下: db.collection.count(query, opt…

    人工智能概论 2023年5月25日
    00
  • 解析Tars-Java客户端源码

    解析Tars-Java客户端源码的完整攻略 Tars-Java客户端是基于Tars框架的Java版本实现的一种提供远程服务的客户端。在理解Tars-Java客户端源码时,我们可以从以下几个方面入手: 1. 主要依赖的引入 在使用Tars-Java客户端时,我们需要在pom.xml文件中引入以下依赖: <dependency> <groupI…

    人工智能概览 2023年5月25日
    00
  • Linux系统设置复杂密码策略方法

    下面我将为您详细讲解在Linux系统中如何设置复杂密码策略。 确认密码策略配置文件 首先,我们需要确认系统使用的密码策略配置文件。在大多数Linux系统中,默认使用的策略配置文件是/etc/login.defs,我们可以通过命令grep PASS_MAX_DAYS /etc/login.defs来确认该文件是否被使用。如果显示结果如下: PASS_MAX_D…

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