Kubernetes Ingress — NGINX

Prodan Labs 等级 305 0 0

Kubernetes Ingress — NGINX 在 Kubernetes 中,Service 是一种抽象的概念,它定义了每一组 Pod 的逻辑集合和访问方式,并提供一个统一的入口,将请求进行负载分发到后端的各个 Pod 上。Service 默认类型是 ClusterIP,集群内部的应用服务可以相互访问,但集群外部的应用服务无法访问。为此 Kubernetes 提供了 NodePorts,LoadBalancer 和 Ingress 三种外部访问 Kubernetes 集群的方式。

Ingress 是 Kubernetes 中的一个 API 对象(在1.19版本GA),它提供路由规则来管理外部用户对 Kubernetes 集群中服务的访问。Ingress Controller 是 Ingress API 的实际实现,通过和 Kubernetes API 交互,动态的去感知集群中 Ingress 规则变化,将外部流量路由到 Kubernetes 集群,同时提供负载平衡,并负责L4-L7网络服务。 Kubernetes Ingress — NGINX

目前社区上的 Ingress Controller 有十几种,如 Nginx Ingress、Kong、Traefik、Istio Ingress、APISIX 等,可根据自己的功能需求选型。

Nginx Ingress

Nginx Ingress 是由 Kubernetes SIGs 小组开发的。顾名思义,它基于 nginx,并补充了一组用于实现额外功能的 Lua 插件。由于 nginx 的普及以及在用作控制器时对其进行的最小改动,对于大部分人来说,它可能是最简单,最直接的选择。 Kubernetes Ingress — NGINX

Nginx Ingress 安装非常简单,在裸机上部署的 kubernetes 集群,使用 NodePort

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.42.0/deploy/static/provider/baremetal/deploy.yaml

其他环境查看社区文档。

[root@k8s-test01 ~]# kubectl get po,svc -n ingress-nginx 
NAME                                            READY   STATUS      RESTARTS   AGE
pod/ingress-nginx-admission-create-xtjfl        0/1     Completed   0          97m
pod/ingress-nginx-admission-patch-wx2jt         0/1     Completed   0          97m
pod/ingress-nginx-controller-848bfcb64d-6spj4   1/1     Running     0          97m

NAME                                         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                 AGE
service/ingress-nginx-controller             NodePort    10.254.14.4     <none>        80:80/TCP,443:443/TCP   97m
service/ingress-nginx-controller-admission   ClusterIP   10.254.94.128   <none>        443/TCP                 97m
[root@k8s-test01 ~]# 

创建一个 ingress 示例

[root@k8s-test01 ~]# cat ingress-nginx-demo.yaml
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-wildcard-host
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: "foo.bar.com"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: nginx
            port:
              number: 80
[root@k8s-test01 ~]# kubectl describe ingress ingress-wildcard-host 
Name:             ingress-wildcard-host
Namespace:        default
Address:          172.31.9.226
Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
  Host         Path  Backends
  ----         ----  --------
  foo.bar.com  
               /   nginx:80 (192.168.47.155:80)
Annotations:   kubernetes.io/ingress.class: nginx
Events:
  Type    Reason  Age                  From                      Message
  ----    ------  ----                 ----                      -------
  Normal  Sync    103s (x2 over 111s)  nginx-ingress-controller  Scheduled for sync
[root@k8s-test01 ~]# kubectl get po -o wide | grep nginx
nginx-546585459c-zxfmh   1/1     Running     0          94m   192.168.47.155   k8s-test02   <none>           <none>
[root@k8s-test01 ~]# 

Kubernetes Ingress — NGINX

  1. NGINX Ingress Controller 提供了有三种方式配置 NGINX :
  2. ConfigMap:使用 ConfigMap 在 NGINX 中设置全局配置。
  3. Annotations:在特定 Ingress 规则的特定配置。
  4. Custom template:当需要更具体的设置(如打开文件缓存)时,可以使用自定义 nginx 模板。

配置 SSL

通过 Annotations 来配置某一个 ingress 使用 SSL。

创建secret

kubectl create secret tls ingress-cert --key=fullchain.com.key --cert=fullchain.cer 

创建Ingress

[root@k8s-test01 cert]# cat ingress-nginx-demo.yaml
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-wildcard-host
  annotations:
    kubernetes.io/ingress.class: nginx
    ingress.kubernetes.io/force-ssl-redirect: "true"
    kubernetes.io/tls-acme: "true"
spec:
  rules:
  - host: "foo.xxx.com"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: nginx
            port:
              number: 80
  tls:
   - secretName: ingress-cert
[root@k8s-test01 cert]# kubectl create -f  ingress-nginx-demo.yaml
ingress.networking.k8s.io/ingress-wildcard-host created

Kubernetes Ingress — NGINX

配置ModSecurity防火墙与OWASP规则

ModSecurity是一个免费、开源的 Apache 模块,用于入侵探测与拦截,目前已经支持 Nginx,可以充当 Web 应用防火墙(WAF),旨在增强 Web 应用程序的安全性和避免遭受来自已知与未知的攻击。而 OWASP 是安全社区开发和维护的一套免费的应用程序保护规则,是 MoodSecurity 的核心规则集。Nginx-ingress 集成了 ModSecurity 模块和 OWASP 规则,默认没有开启。

测试简单 XSS 攻击,没开启 Modsecurity 之前: Kubernetes Ingress — NGINX

状态200,没有拦截。

开启 Modsecurity 模块

[root@k8s-test01 ~]# cat ingress-nginx-demo.yaml 
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-wildcard-host
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/enable-modsecurity: "true"
    nginx.ingress.kubernetes.io/enable-owasp-modsecurity-crs: "true"
    nginx.ingress.kubernetes.io/modsecurity-snippet: |
      SecRuleEngine On
      SecRequestBodyAccess On
      SecAuditEngine RelevantOnly
      SecAuditLogParts ABIJDEFHZ
      SecAuditLog /var/log/nginx/modsec_audit.log
      Include /etc/nginx/owasp-modsecurity-crs/nginx-modsecurity.conf
spec:
  rules:
  - host: "foo.bar.com"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: nginx
            port:
              number: 80
[root@k8s-test01 ~]#

再进行 XSS 攻击测试 Kubernetes Ingress — NGINX

状态403,已拦截。

查看 Nginx 拦截日志

2020/12/27 09:37:56 [error] 3001#3001: *213189 [client 47.242.91.20] ModSecurity: Access denied with code 403 (phase 2). Matched "Operator `Ge' with parameter `5' against variable `TX:ANOMALY_SCORE' (Value: `5' ) [file "/etc/nginx/owasp-modsecurity-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "80"] [id "949110"] [rev ""] [msg "Inbound Anomaly Score Exceeded (Total Score: 5)"] [data ""] [severity "2"] [ver "OWASP_CRS/3.3.0"] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-generic"] [hostname "192.168.123.79"] [uri "/"] [unique_id "160906187674.566940"] [ref ""], client: 47.242.91.20, server: foo.bar.com, request: "HEAD /?search=<scritp>alert(xss);</script> HTTP/1.1", host: "foo.bar.com"

获取客户端真实IP

Nginx Ingress 部署使用 nodePort 模式, 在讲获取客户端真实 IP 之前,我们大概了解下 nodePort 模式的链路。从 Kubernetes 1.5 开始,NodePort 类型的 Services 的数据包默认进行源地址 NAT。

假设某一个 Pod 运行在 node1 节点,客户端访问 node2:nodeport,过程如下:

            client
             \ ^
              \ \
               v \
   node 1 <--- node 2
    | ^   SNAT
    | |   --->
    v |
 endpoint

1、客户端发送数据包到 node2:nodePort 2、node2 使用它自己的 IP 地址替换数据包的源 IP 地址(SNAT) 3、node2 使用 pod IP 地址替换数据包的目的 IP 地址 4、数据包被路由到 node1,然后交给 endpoint 5、Pod 的回复被路由回 node2 6、Pod 的回复被发送回给客户端

所以 nodePort 模式下源地址被转换了(SNAT),服务端获取的并不是正确的客户端 IP,它们是集群的内部 IP。为什么会这样呢?原因是为了支持从任一节点IP+NodePort 都可以访问应用,而不得不做的 SNAT。

当然,Kubernetes 也提供了一个特性来保留客户端的源 IP 地址,通过设置 externalTrafficPolicy 的值为 Local,请求就只会被代理到本地 endpoints 而不会被转发到其它节点。这样就保留了最初的源 IP 地址。

---
# Source: ingress-nginx/templates/controller-service.yaml
apiVersion: v1
kind: Service
metadata:
  annotations:
  labels:
    helm.sh/chart: ingress-nginx-3.17.0
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/version: 0.42.0
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/component: controller
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  externalTrafficPolicy: Local
  type: NodePort
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: http
      nodePort: 80
    - name: https
      port: 443
      protocol: TCP
      targetPort: https
      nodePort: 443
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/component: controller

但是,如果没有本地 endpoints,发送到这个节点的数据包将会被丢弃。即请求 node2:nodePort , 但 node2 上没有运行 Pod , 故本地没有 endpoints ,所以请 node2:nodePort 是失败的,node1:nodePort 正常。

          client
       ^ /   \
      / /     \
     / v       X
   node 1     node 2
    ^ |
    | |
    | v
 endpoint

所以 Nginx Ingress如需获取客户端真实 IP 需要设置 externalTrafficPolicy 或设置容器网络使用主机模式 hostNetwork: true ,然后 daemonset 部署,或通过亲和性把 Pod 固定在某些节点,客户端访问 Pod 所在的节点,源 IP 地址便不会 SNAT。

Nginx Ingress 获取客户端真实 IP 的配置如下:

---
# Source: ingress-nginx/templates/controller-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    helm.sh/chart: ingress-nginx-3.17.0
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/version: 0.42.0
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/component: controller
  name: ingress-nginx-controller
  namespace: ingress-nginx
data:
  server-tokens: "false"
  forwarded-for-header: "X-Forwarded-For"
  use-forwarded-headers: "true"
  compute-full-forwarded-for: "true"

还可以通过http-snippet 获取 客户端真实 IP

data:
  server-tokens: "false"
  http-snippet: |
    real_ip_header X-Forwarded-For;
    set_real_ip_from 0.0.0.0/0;

通过日志可以看到已经获取到真实的IP Kubernetes Ingress — NGINX

当 Nginx Ingress 在转发请求时会通过 X-Forwarded-For 和 X-Real-IP 字段来记录客户端源 IP,后端可以通过此字段获得客户端真实源 IP,可以写一个简单的程序来验证下

package main

import (
    "log"
    "net"
    "net/http"
    "strings"
)

func myHandle(w http.ResponseWriter, r *http.Request) {
    _, _ = w.Write([]byte(remoteIP(r)))
}

func main() {

    serveMux := http.NewServeMux()
    serveMux.HandleFunc("/", myHandle)

    err := http.ListenAndServe("0.0.0.0:80", serveMux)
    if err != nil {
        log.Printf("http.ListenAndServe():%v\n", err)
        return
    }
}
func remoteIP(r *http.Request) string {
    ip := r.Header.Get("X-Original-Forwarded-For")
    log.Printf("X-Original-Forwarded-For : %s", r.Header.Get("X-Original-Forwarded-For"))
    if ip != "" {
        return ip
    }

    ip = r.Header.Get("X-Forwarded-For")
    log.Printf("X-Forwarded-For: %s", r.Header.Get("X-Forwarded-For"))
    if ip != "" {
        return ip
    }

    ip = r.Header.Get("X-Real-Ip")
    log.Printf("X-Real-Ip : %s", r.Header.Get("X-Real-Ip"))
    if ip != "" {
        return ip
    }

    if ip, _, err := net.SplitHostPort(strings.TrimSpace(r.RemoteAddr)); err == nil {
        return ip
    }

    return ""
}

程序运行日志

[root@k8s-test01 ~]# kubectl cp app nginx-d8d5f47c9-n9bnm:/
[root@k8s-test01 ~]# kubectl exec -it nginx-d8d5f47c9-n9bnm -- bash
root@nginx-d8d5f47c9-n9bnm:/# ./app 
2020/12/27 10:40:57 X-Original-Forwarded-For : 
2020/12/27 10:40:57 X-Forwarded-For: 47.112.119.36

路由配置

通过 iris 框架写一个简单的测试程序

func NewAPP() *iris.Application {
    // 创建app结构体对象
    app := iris.New()
    // 配置字符编码
    app.Configure(iris.WithConfiguration(iris.Configuration{
        Charset: "UTF-8",
    }))

    // 配置日志
    customLogger := logger.New(logger.Config{
        //状态显示状态代码
        Status: true,
        // IP显示请求的远程地址
        IP: true,
        //显示http方法
        Method: true,
        // Path显示请求路径
        Path: true,
        // Query将url查询附加到Path。
        Query: true,
        //Columns:true,
        // 如果不为空然后它的内容来自`ctx.Values(),Get("logger_message")
        //将添加到日志中。
        MessageContextKeys: []string{"logger_message"},
        //如果不为空然后它的内容来自`ctx.GetHeader(“User-Agent”)
        MessageHeaderKeys: []string{"User-Agent"},
    })
    // 捕获所有http错误:
    app.OnAnyErrorCode(customLogger, func(ctx iris.Context) {
        switch ctx.GetStatusCode() {
        case 404:
            ctx.Values().Set("logger_message", "a dynamic message passed to the logs")
            ctx.Writef("My Custom 404 error page")
        default:
            ctx.Values().Set("logger_message", "a dynamic message passed to the logs")
            ctx.Writef("%v unknown error page", ctx.GetStatusCode())
        }
    })
    app.Use(customLogger)

    // favicons
    app.Favicon("./static/favicons/favicon.ico")

    // static
    app.HandleDir("/", "static")

    return app
}

入口程序

func main() {
    app := config.NewAPP()
    resAPI := app.Party("/api/v1")
    resAPI.Get("/namespaces",handle.GetNameSpace)
    resAPI.Get("/ip",handle.GetIP)
    resAPI.Get("/hostname",handle.GetHostname)
    app.Run(iris.Addr("0.0.0.0:8080"), iris.WithoutServerError(iris.ErrServerClosed), iris.WithOptimizations)
}

创建Ingress

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/enable-modsecurity: "true"
    nginx.ingress.kubernetes.io/enable-owasp-modsecurity-crs: "true"
    nginx.ingress.kubernetes.io/modsecurity-snippet: |
      SecRuleEngine On
      SecRequestBodyAccess On
      SecAuditEngine RelevantOnly
      SecAuditLogParts ABIJDEFHZ
      SecAuditLog /var/log/nginx/modsec_audit.log
      Include /etc/nginx/owasp-modsecurity-crs/nginx-modsecurity.conf
spec:
  rules:
  - host: "demo.bar.com"
    http:
      paths:
      - pathType: Prefix
        path: "/api/v1"
        backend:
          service:
            name: demo
            port:
              number: 8080
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: demo
            port:
              number: 8080

Kubernetes Ingress — NGINX

静态资源加一级路由测试,重写路径

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/enable-modsecurity: "true"
    nginx.ingress.kubernetes.io/enable-owasp-modsecurity-crs: "true"
    nginx.ingress.kubernetes.io/modsecurity-snippet: |
      SecRuleEngine On
      SecRequestBodyAccess On
      SecAuditEngine RelevantOnly
      SecAuditLogParts ABIJDEFHZ
      SecAuditLog /var/log/nginx/modsec_audit.log
      Include /etc/nginx/owasp-modsecurity-crs/nginx-modsecurity.conf
    nginx.ingress.kubernetes.io/app-root: /test/
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/configuration-snippet: |
      rewrite ^/css/(.*)$ /test/css/$1 redirect;
      rewrite ^/js/(.*)$ /test/js/$1 redirect;
      rewrite ^/img/(.*)$ /test/img/$1 redirect;
spec:
  rules:
  - host: "demo.bar.com"
    http:
      paths:
      - pathType: Prefix
        path: "/api/v1"
        backend:
          service:
            name: demo
            port:
              number: 8080
      - pathType: Prefix
        path: "/test(/|$)(.*)"
        backend:
          service:
            name: demo
            port:
              number: 8080

显示正常。(这里的前端样式文件用的是相对路径) Kubernetes Ingress — NGINX

开启压缩

开启压缩前 Kubernetes Ingress — NGINX

开启压缩

    nginx.ingress.kubernetes.io/server-snippet: |
        gzip on;
        gzip_disable "MSIE [1-6]\.";
        gzip_vary on;
        gzip_proxied any;
        gzip_comp_level 5;
        gzip_min_length 512;
        gzip_buffers 16 128k;
        gzip_http_version 1.1;
        gzip_types
            application/json
            application/javascript
            application/xml
            application/x-javascript
            application/vnd.api+json
            application/json
            application/x-font-ttf
            text/javascrip
            text/css
            text/plain
            image/jpeg
            image/png
            image/jpg
            image/svg+xml
            image/x-icon;

Kubernetes Ingress — NGINX

其他

Nginx Ingress 的配置参数与 Nginx 相差无几,更多配置请参考官方文档:

https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/

感兴趣的读者可以关注下微信号 Kubernetes Ingress — NGINX

收藏
评论区

相关推荐

Kubernetes(k8s)中文文档 Kubernetes概述
简介 Kubernetes(https://www.kubernetes.org.cn/)是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。 Kubernetes一个核心的特点就是能够自主的管理容
nginx安全配置
安全是一个重要的问题,必须引起注意。 1. nginx介绍 nginx本身不能处理PHP(http://www.ttlsa.com/php/ "php"),它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端。nginx一般是把请求发fastcgi管理进程处理,fastcgi管理进程选择cgi子
nginx配置系列-日志切割
nginx配置系列日志切割 背景 nginx日志中我们希望日志能够每天或者每小时自动切割,nginx本身没有提供自动切割的机制,但是我们可以通过脚本或者稍加改造让其具备这种能力。下面让我们看看怎么操作吧。 日志切割 常见做法有四种,在我们做之前我们来学习一下nginx日志中常用的内置变量字段都是什么意思 nginx内置变量
k8s超详细总结
一个目标:容器操作;两地三中心;四层服务发现;五种Pod共享资源;六个CNI常用插件;七层负载均衡;八种隔离维度;九个网络模型原则;十类IP地址;百级产品线;千级物理机;万级容器;相如无亿,K8s有亿:亿级日服务人次。 一个目标:容器操作 Kubernetes(k8s)是自动化容器操作的开源平台。这些容
Kubernetes + GitLab 微服务应用自动化部署
Kubernetes GitLab 微服务应用自动化部署 Docker 简化了单个服务的部署,Kubernetes 通过强大的容器编排能力使得运维人员可以轻松管理成千上万的容器,这些容器归属于多个服务,而这些服务又组合形成了多个应用。从代码到运行中的应用,需要经历构建、打包、测试和部署等阶段,如果每个步骤都手动执行,无疑会消耗研发人员的大量时间。本文讲解
NGINX的 IF AND 和 OR
if的逻辑用法 什么是逻辑用法呢, 就程序中的and、or关系, 就叫做逻辑了. NGINX支持if的 and 与 or 或者 && 与 || 吗? 答案是No. 当你尝试这样配置, 重载nginx时, nginx会报出错误 location /test/ { default_type text/html;
Kubernetes Ingress — NGINX
在 Kubernetes 中,Service 是一种抽象的概念,它定义了每一组 Pod 的逻辑集合和访问方式,并提供一个统一的入口,将请求进行负载分发到后端的各个 Pod 上。Service 默认类型是 ClusterIP,集群内部的应用服务可以相互访问,但集群外部的应用服务无法访问。为此 Kubernetes 提供了 NodePorts,LoadBalan
Kubernetes Ingress — Kong
Kong 是由 Mashape 公司开源的一个高性能、高可用、易扩展的 API Gateway 项目,基于OpenResty(Nginx Lua模块),并提供了插件实现 API 的 AOP 功能。可以通过负载均衡、插件扩展等方式,来处理网络请求。 Kong 主要的概念Servi
Kubernetes部署高可用PostgreSQL集群
PostgreSQL 是一个功能强大的开源关系数据库,它使用和扩展了 SQL 语言,并结合了许多安全存储和扩展最复杂数据工作负载的功能。PostgreSQL 的起源可以追溯到 1986 年,作为加利福尼亚大学伯克利分校 POSTGRES 项目的一部分,与 Linux 内核相似,PostgreSQL 是由社区驱动的开源项目,由全世界贡献者所维护。Postgre
Kubernetes自定义调度器 — 初识调度框架
Kubernetes 已经成为容器编排(Orchestration)平台的事实标准,它为容器化应用提供了简单且高效部署的方式、大规模可伸缩、资源调度等生命周期管理功能。kubescheduler作为kubernetes的核心组件,它负责整个集群资源的调度功能,根据特定的调度算法或调度策略,将Pod调度到最优的Node节点,使集群的资源得到合理且充分的利用。
基于k8s的DevOps实践之路
原标题:基于k8s的DevOps实践之路很多快速发展的公司都面临着一个巨大挑战:在需求不断动态横向扩容的同时继续保持系统的高可用性。如何有效解决这一问题,Kubernetes(k8s)应运而生。k8s以运行可扩展工作负载而闻名,它可以根据资源使用情况调整工作负载。白山科技云分发团队基于多年的DevOps实践经验,在白山会运维日第三期与Thoughtworks
SRE和DevOps值得关注的十大开源项目
构建可扩展且高度可靠的软件系统是每个SRE的最终目标。在SRE/DevOps领域中,有大量出色的开源项目,每个项目都有新颖而激动人心的解决方案。在本文中,我们将会介绍一些在监视,部署和维护领域最受欢迎的开源项目。 1\. Cloudprober可以主动跟踪和监视应用程序,并帮助你提前发现故障。它使用“活动(active)”监视模型来检查你的组件是否按预
2021年值得关注的五个云原生安全问题
云原生正变得越来越流行,在2020年,统计发现,其中83%的组织也在生产环境中使用kubernetes。由于,团队可以轻松地构建和使用,,,以及管理服务,而不必担心底层的服务器。但是,云原生安全性仍然是一个真正的挑战。奇怪的是,云原生安全性的最大问题与所有新技术无关。首席安全官表示,如果组织希望以更好地开始新的一年,则应着手解决五个主要的云原生安全性问题。有
2021年云原生技术趋势
2020年3月下旬的几周时间里,COVID19使全球业务停滞不前,因此每个人都在试图找出应对这种疫情的最佳方法。那时候,没有人知道会发生什么,因此会议被取消,合同被搁置,项目被推迟。一切都停止了。但是,到2020年4月初,我们见证了IT社区的工作重新焕发活力。尽管其他行业还不能恢复正常,但很快我们就明白,仍然需要IT来进行经济和社会活动。你甚至可以得出这样
实测Tengine开源的Dubbo功能
本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star。 背景 Tengine是阿里巴巴基于Nginx开发并开源的Web服务器,它继承了Nginx所有的功能和特性,并在其基础上做了大量的扩展和增强,其中像动态模块加载,四层负载均衡,reuseport支持等能力,都逐渐被Nginx官方吸收引用。Tengine在开