Minikub是什么?

Minikub是一个能够在虚拟(VirtualBox或者Hyper-V)中运行单节点Kubernetes集群的工具,方便开发者可以在本地环境中进行开发和调试Kubernetes。这个工具默认安装和配置了一个Linux VM,Docker和Kubernetes的相关组件,并且提供Dashboard。目前支持在Linux, OS X及Windows上安装
安装kubectl

1
https://dl.k8s.io/v1.10.11/kubernetes-client-windows-amd64.tar.gz

Minikub安装

Minitube是一个独立的Go应用,下载运行就可以
Windows 平台
下载 minikube-windows-amd64.exe 文件,并重命名为 minikube.exe,然后加入到环境变量路径下即可

Letsencrypt 来签发凭证">用 Letsencrypt 来签发凭证

为我们管理SSL / TLS证书的组件是Cert manager。它将为每个入口端点自动创建新证书。此外,它将在证书过期时自动续订。
手动申请证书安装 certbot,参考官方教程

kubernetes 自动申请配置TLS

使用helm安装cert-manager

如果群集未启用 RBAC,添加:–set rbac.create=false \
–set serviceAccount.create=false

1
2
3
4
5
helm install \
--name cert-manager \
--namespace kube-system \
stable/cert-manager
kubectl get pod -n ingress --selector=app=cert-manage

安装clusterissuers,指示Cert Manager使用Let的https。替换你的电子邮件地址
证书管理器必须有 Issuer 或 ClusterIssuer 资源,才能颁发证书。 这两种 Kubernetes 资源的功能完全相同,区别在于 Issuer 适用于单一命名空间,而 ClusterIssuer 适用于所有命名空间这里只讲ClusterIssuer

ClusterIssuers

cat certificate-issuer.yaml

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
namespace: default
spec:
acme:
email: root@idcsec.com
server: https://acme-v01.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-prod
http01: {}

metadata.name 是我们创建的签发机构的名称,后面我们创建证书的时候会引用它
spec.acme.email 是你自己的邮箱,证书快过期的时候会有邮件提醒,不过 cert-manager 会利用 acme 协议自动给我们重新颁发证书来续期
spec.acme.server 是 acme 协议的服务端,我们这里用 Let’s Encrypt,这个地址就写死成这样就行
spec.acme.privateKeySecretRef 指示此签发机构的私钥将要存储到哪个 Secret 对象中,名称不重要
spec.acme.http01 这里指示签发机构使用 HTTP-01 的方式进行 acme 协议 (还可以用 DNS 方式,acme 协议的目的是证明这台机器和域名都是属于你的,然后才准许给你颁发证书)

如果使用阿里云的服务器并且域名备案接入商是阿里就购买阿里云提供的ipv6地址(通过ipv6转ipv4

以下是通过https://www.tunnelbroker.net提供的ipv6隧道方法

centos7开启ipv6支持

vim /etc/modprobe.d/disable_ipv6.conf

1
options ipv6 disable=0

vim /etc/sysconfig/networ

1
NETWORKING_IPV6=yes

vim /etc/sysctl.conf

1
2
3
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0

配置完最好重启一下
reboot

注册账号

https://www.tunnelbroker.net注册账号
创建一个ipv6 tunnel
ipv6
monitoring
这centos7选择linux-net-tools按照命令执行完查看
添加dns

1
2
3
cat /etc/resolv.conf 
nameserver 2001:4860:4860::8888
nameserver 2001:4860:4860::8844

ping6 ipv6.google.com
nginx转发配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server {
listen 80;
listen [::]:80;
server_name test.idcsec.com;
<!--more-->
#charset koi8-r;

# access_log logs/wangting.access.log main;

location / {
root html;
index index index.html index.htm;
proxy_pass http://test.idcsec.com.com;
proxy_redirect off;
# 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header Host "test.idcsec.com";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
}

域名添加4A解析
验证
http://ipv6-test.com/validate.php
页面代理服务ipv6网站www.ipv6proxy.net/index.php

修改Prometheus.yml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
rules.yml: |
groups:
- name: container.rules
rules:
- alert: Container_Memory_RSS
expr: ((sum(container_memory_rss{job="kubernetes-cadvisor",pod_name!=""}) by (pod_name)) /(sum(container_spec_memory_limit_bytes{job="kubernetes-cadvisor",pod_name!=""}) by (pod_name)) * 100) > 95
for: 2m
labels:
severity: critica
annotations:
summary: "检测内存使用率过高"
description: "{{ $labels.pod_name }}内存持续2分钟高于95%. 当前值: {{ $value }}"
- alert: Container_Network_RX_Average
expr: ((sum (rate (container_network_receive_bytes_total{job="kubernetes-nodes",pod_name!=""}[1m])) by (pod_name)) / 1024) > 102400
for: 2m
labels:
severity: critica
annotations:
summary: "检测网络带宽使用率过高."
description: "{{ $labels.pod_name }}网络带宽持续2分钟高于 100M. RX带宽使用率: {{ $value }}"
- alert: Container_Network_TX_Average
expr: ((sum (rate (container_network_transmit_bytes_total{job="kubernetes-nodes",pod_name!=""}[1m])) by (pod_name)) / 1024) > 102400
for: 2m
labels:
severity: critica
annotations:
summary: "检测网络带宽使用率过高."
description: "{{ $labels.pod_name }}网络带宽持续2分钟高于 100M. TX带宽使用率: {{ $value }}"
- alert: Container_USAGE_CPU_Average
expr: ((sum(rate(container_cpu_usage_seconds_total{job="kubernetes-nodes",image!="",pod_name!=""}[1m])) BY (pod_name)) * 100) > 95
for: 2m
labels:
severity: critica
annotations:
summary: "检测CPU平均使用率过高."
description: "{{ $labels.pod_name }}CPU持续2分钟高于高于95% 当前值: {{ $value }}"

参考
https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/

###进程健康检查
健康检查最简单的方式就是检查进程的状态。Kubelet 不断的询问 Docker daemon 这个容器进程是否还在运行,如果没有,这个容器就会被重启。目前在所有 Kubernetes 的案例中,这种健康检查是一直开启的。对与 Kubernetes 中所有运行的容器都是生效的。然而,在很多场景中这个低级别的健康检查是没有作用的:比如进程也一直在运行,但是从应用的角度看,代码已经死锁,而且不会有正确的响应。

###Pod健康检测机制
LivenessProbe探针:
用于判断容器是否存活,即Pod是否为running状态,如果LivenessProbe探针探测到容器不健康,则kubelet将kill掉容器,并根据容器的重启策略是否重启,如果一个容器不包含LivenessProbe探针,则Kubelet认为容器的LivenessProbe探针的返回值永远成功。
ReadinessProbe探针:
用于判断容器是否正常提供服务,即容器的Ready是否为True,是否可以接收请求,如果ReadinessProbe探测失败,则容器的Ready将为False,控制器将此Pod的Endpoint从对应的service的Endpoint列表中移除,从此不再将任何请求调度此Pod上,直到下次探测成功。(剔除此pod不参与接收请求不会将流量转发给此Pod)

目前,有三种类型的应用健康检查你可以选择:
exec:通过执行命令来检查服务是否正常,回值为0则表示容器健康
httpGet方式:通过发送http请求检查服务是否正常,返回200-399状态码则表明容器健康
tcpSocket:通过容器的IP和Port执行TCP检查,如果能够建立TCP连接,则表明容器健康

###探测的结果有以下三者之一:
Success:Container通过了检查。
Failure:Container未通过检查。
Unknown:未能执行检查,因此不采取任何措施。

####本环境使用httpGet方式
示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  containers:
- name: nginx
image: nginx
readinessProbe:
httpGet:
path: /
port: 80
scheme: HTTP
initialDelaySeconds: 120
periodSeconds: 15
timeoutSeconds: 2
livenessProbe:
httpGet:
path: /
port: 80
scheme: HTTP
initialDelaySeconds: 180
timeoutSeconds: 2
periodSeconds: 15
----------

initialDelaySeconds:容器启动后第一次执行探测是需要等待多少秒。
periodSeconds:执行探测的频率。默认是10秒,最小1秒。
timeoutSeconds:探测超时时间。默认1秒,最小1秒。
successThreshold:探测失败后,最少连续探测成功多少次才被认定为成功。默认是1。对于liveness必须是1。最小值是1。
failureThreshold:探测成功后,最少连续探测失败多少次才被认定为失败。默认是3。最小值是1。

####httpGet探测方式有如下可选的控制字段
host:要连接的主机名,默认为Pod IP,可以在http request head中设置host头部。
httpHeaders:

- name: X-Custom-Header
  value: Awesome

scheme: 用于连接host的协议,默认为HTTP。
path:http服务器上的访问URI。
httpHeaders:自定义HTTP请求headers,HTTP允许重复headers。
port: 容器上要访问端口号或名称
对于LivenessProbe和ReadinessProbe用法都一样,拥有相同的参数和相同的监测方式。
当前对每一个Container都可以设置不同的restartpolicy,有三种值可以设置:
Always : 只要container退出就重新启动
OnFailure : 当container非正常退出后重新启动
Never : 从不进行重新启动
restartPolicy: [Always|Never|OnFailure]//重启策略
如果restartpolicy没有设置,那么默认值是Always。如果container需要重启,仅仅是通过kubelet在当前节点进行container级别的重启。
如果要使用ReadinessProbe只需要将livenessProbe修改为readinessProbe即可

monitoring

使用Prometheus的blackbox_exporter进行网络监控

  • Prometheus提供了一个blackbox_exporter可以实现网络监控,支持http、dns、tcp、icmp等监控。

其中9115是这个exporter的http端点的监听端口,blackbox.yml是它的配置文件,需要在其中使用blackbox_exporter的http、dns、tcp、icmp等prober定制配置出各种监测模块(module)。关于blackbox_exporter的配置具体参考Blackbox exporter configuration和Blackbox exporter configuration Exmaple。下面的例子是一个最基本的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
modules:
http_2xx: # http 监测模块
prober: http
http:
http_post_2xx: # http post 监测模块
prober: http
http:
method: POST
tcp_connect: # tcp 监测模块
prober: tcp
ping: # icmp 检测模块
prober: icmp
timeout: 5s
icmp:
preferred_ip_protocol: "ip4"
dns:
transport_protocol: "tcp"
preferred_ip_protocol: "ip4"
query_name: "kubernetes.default.svc.cloud.ctrm" # 利用这个域名来检查 dns 服务器
query_type: "A" # 如果是 kube-dns ,一定要加入这个

在Prometheus的配置文件中配置使用ping module:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- job_name: 'ping_all'
scrape_interval: 1m

metrics_path: /probe
params:
module: [ping]
static_configs:
- targets:
- 192.168.1.2
labels:

instance: node2
- targets:
- 192.168.1.3
labels:

instance: node3
relabel_configs:
- source_labels: [__address__]
target_label: __param_target

- target_label: __address__
replacement: 127.0.0.1:9115 # black_exporter服务器的地址

测试
curl “http://127.0.0.1:9115/probe?module=ping&target=192.168.1.2
http检测
Blackbox 配置了 http_2xx 模块,所以这里只需要在 Prometheus的配置文件中配置使用http_2xx module

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- job_name: 'blackbox'
metrics_path: /probe

params:
module: [http_2xx] # Look for a HTTP 200 response.
static_configs:
- targets:
- http://prometheus.io # Target to probe with http.
- https://prometheus.io # Target to probe with https.
- http://example.com:8080 # Target to probe with http on port 8080.
relabel_configs:

- source_labels: [__address__]
target_label: __param_target

- source_labels: [__param_target]
target_label: instance

- target_label: __address__
replacement: 127.0.0.1:9115 # The blackbox exporter's real hostname:port

dns监控

1
2
3
4
5
6
7
8
9
10
11
12
13
14
- job_name: "kubernetes-service-dns"
metrics_path: /probe # 不是 metrics,是 probe

params:
module: [dns] # DNS 模块
static_configs:
- targets:
- kube-dns:53 # 不要省略端口号
relabel_configs:

- source_labels: [__address__]
target_label: __param_target

- source_labels: [__param_target]
target_label: instance

- target_label: __address__
replacement: blackbox # 服务地址,和上面的 Service 定义保持一致

/-/reload(curl -XPOST ip:prom端口/-/reload)使配置生效
可以使用 probe_success{job=”kubernetes-service-dns”} 查看结果
如果HTTP服务启用了安全认证,Blockbox Exporter内置了对basic_auth的支持,可以直接设置相关的认证信息即可:

1
2
3
4
5
6
7
8
9
10
http_basic_auth_example:
prober: http
timeout: 5s
http:
method: POST
headers:
Host: "login.example.com"
basic_auth:
username: "username"
password: "mysecret"

对于使用了Bear Token的服务也可以通过bearer_token配置项直接指定令牌字符串,或者通过bearer_token_file指定令牌文件。

对于一些启用了HTTPS的服务,但是需要自定义证书的服务,可以通过tls_config指定相关的证书信息:

1
2
3
4
5
6
http_custom_ca_example:
prober: http
http:
method: GET
tls_config:
ca_file: "/certs/my_cert.crt"

自带 metrics 端点的服务
有的服务,例如 prometheus 或者 blackbox,以及 kube-dns、etcd 等, 都是自有 /metrics 提供指标输出的,这种服务对 Blackbox + Prometheus 组合是非常方便的。
只要给服务的注解部分加入几个标签:
kubernetes-pods
对于pod的监测也是需要加注解:

1
2
3
4
prometheus.io/host: calico-etcd # 服务名称
prometheus.io/port: "6666" # metrics 端口
prometheus.io/scrape: "true" # 抓取开关
prometheus.io/path: "/metrics"默认为/metric

完整的kubernetes部署文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
blackbox-exporter-deploy.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: prometheus-blackbox-exporter
namespace: monitoring
spec:
selector:
matchLabels:
app: prometheus-blackbox-exporter
replicas: 1
template:
metadata:
labels:
app: prometheus-blackbox-exporter
spec:
restartPolicy: Always
containers:
- name: prometheus-blackbox-exporter
image: prom/blackbox-exporter:v0.12.0
imagePullPolicy: IfNotPresent
ports:
- name: blackbox-port
containerPort: 9115
readinessProbe:
tcpSocket:
port: 9115
initialDelaySeconds: 5
timeoutSeconds: 5
resources:
requests:
memory: 50Mi
cpu: 100m
limits:
memory: 60Mi
cpu: 200m
volumeMounts:
- name: config
mountPath: /etc/blackbox_exporter
args:
- --config.file=/etc/blackbox_exporter/blackbox.yml
- --log.level=debug
- --web.listen-address=:9115
volumes:
- name: config
configMap:
name: prometheus-blackbox-exporter
nodeSelector:
prometheus: "core"
tolerations:
- key: "node-role.kubernetes.io/master"
effect: "NoSchedule"
---
apiVersion: v1
kind: Service
metadata:
labels:
app: prometheus-blackbox-exporter
name: blackbox-exporter
namespace: monitoring
annotations:
prometheus.io/scrape: 'true'
spec:
type: NodePort
selector:
app: prometheus-blackbox-exporter
ports:
- name: blackbox
port: 9115
targetPort: 9115
protocol: TCP

prometheus的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- job_name: 'blackbox'
metrics_path: /probe

params:
module: [http_2xx] # Look for a HTTP 200 response.
static_configs:
- targets:
- http://prometheus.io # Target to probe with http.
- https://prometheus.io # Target to probe with https.
- http://example.com:8080 # Target to probe with http on port 8080.
relabel_configs:

- source_labels: [__address__]
target_label: __param_target

- source_labels: [__param_target]
target_label: instance

- target_label: __address__
replacement: blackbox-exporter:9115 # The blackbox exporter's real hostname:port

monitoring

prometheus的配置文件alermanager报警规则

1
2
3
4
5
6
7
8
9
- name: sitealer
rules:
- alert: 网站异常
expr: up{job="blackbox"} == 0 or probe_success{job="blackbox"} == 0
for: 10s
labels:
severity: critica
annotations:
summary: "网站 {{ $labels.target }} 访问异常"

monitoring

oracledb_exporter参考:
https://github.com/iamseth/oracledb_exporter
本文直接把oracledb_exporter部署在k8s环境。docker部署方式更为简单
我们使用Prometheus在Grafana上为Oracle实现监控仪表板。由于Oracle不支持http通信,它由Oracle Exporter获取指标,它将Oracle的内容发送到Prometheus,并将Prometheus内容输出到Grafana。
crt
Oracle DB→Oracle Exporter→Prometheus→Grafana

Oracle Exporter需要将Oracle与Prometheus连接。Oracle Exporter将有关Oracle的信息传递给Prometheus。
创建yaml对象

部署oracle-export

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
cat <<EOF | kubectl create -f - 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
name: oracle-export-198
name: oracle-export-dm
namespace: monitoring
spec:
replicas: 1
selector:
matchLabels:
app: oracle-export-198
template:
metadata:
labels:
app: oracle-export-198
spec:
containers:
- image: wtingdocker/oracledb_exporter:latest
name: oracle-export-198
command:
- "/oracledb_exporter"
ports:
- containerPort: 9161
protocol: TCP
env:
- name: DATA_SOURCE_NAME
value: "system/oracle@ip:1521/sid" #改成自己的数据库信息 定义DATA_SOURCE_NAME变量
---
kind: Service
apiVersion: v1
metadata:
labels:
app: oracle-export-198
name: oracle-export-198
namespace: monitoring
spec:
type: NodePort
ports:
- port: 9161
targetPort: 9161
selector:
app: oracle-export-198
EOF

修改prometheus.yml文件

1
2
3
4
5
6
7
8
scrape_configs:
- job_name: 'oracle-endpoint'
static_configs:
- targets:
- oracle-export-X-X:9161
labels:
target: '192.168.1.X'
descr: 'XX数据库'

重新加载prometheus配置文件

1
kubectl  apply -f configmap.yaml

重新启动prometheus容器以使修改后的内容生效

1
curl -XPOST http://192.168.7.X:30680/-/reload

Grafana展示

访问oracle-export端口验证Oracle和Prometheus连接
oracle1
oracle1
Grafana添加Prometheus数据库源
oracle2

仪表板导入3333可以根据自己的需要添加export提供的metrics 展示以及通过alertmanager告警
oracle2

Ingress是Kubernetes中的一个概念,用于将入站连接路由到不同的服务。这可以通过不同方式实现。
生成证书文件

1
openssl req -x509 -nodes -days 2920 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=*.idcsec.com/O=nginxsvc"

导入证书文件到k8s secret

1
kubectl create secret tls https-secret --key tls.key --cert tls.crt

或者使用yaml

1
2
3
4
5
6
7
8
apiVersion: v1
kind: Secret
type: kubernetes.io/tls
metadata:
name: mytlssecret
data:
tls.crt: <base64 encoded cert>
tls.key: <base64 encoded key>

配置ingress

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: test
annotations:
ingress.kubernetes.io/ssl-redirect: "False" #设置是否强制跳转 false| true
spec:
tls:
- hosts:
- www.idcsec.com
secretName: https-secret
rules:
- host: www.idcsec.com
http:
paths:
- path: /
backend:
serviceName: test
servicePort: 80

校验证书信息

1
openssl x509 -in tls.crt  -noout -text

Client Certificate Authentication
TLS证书

通过configmap修改nginx controller的一些全局变量

通过启动nginx controller的yaml文件,其实我们可以看出来,在启动controller的时候,向启动命令传递了一大堆参数,包括–default-backend-service以及–apiserver-host等。更多的参数,可以直接参考相关文档

nginx controller本质上就是一个nginx代理,这个代理使用了一大堆nginx默认参数启动。而在某些特定场景下,这些我们需要定制这些参数以更适用于我们的需求。在controller启动的时候,提供了一个–configmap的参数,我们可以将需要定制的参数保存到一个configmap中,并在controller启动的时候,来读取这个configmap,获取其值,应用到controller中。具体哪些值可以通过configmap来传递,可以直接参考相关文档
https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/configmap.md

一、使用ConfigMap

确保指定启动Ingress控制器时要使用的configmaps资源。
需要注意-

1
2
3
4
5
6
7
8
9
10
11
12
kind: ConfigMap 
apiVersion: v1
metadata:
name: nginx-configuration
namespace: ingress-nginx
labels:
app: ingress-nginx
data:
client-header-buffer-size: "4k"
proxy-connect-timeout: "40"
proxy-read-timeout: "110"
proxy-send-timeout: "110"

创建配置资源:

1
2
3
4
 kubectl apply -f nginx-configuration.yaml
kubectl get cm nginx-configuration -n ingress-nginx -o yaml
[root@k8s-m ~]# kubectl exec -it nginx-ingress-controller-5f947cc79f-86cvc -n ingress-nginx -- cat /etc/nginx/nginx.conf | grep client_header_buffer_size
trueclient_header_buffer_size 4k;

修改nginx-controller的yml文件nginx-ingress-daemonset.yaml启动参数如下:

1
2
3
4
5
6
7
8
9
10
spec:
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
- --publish-service=$(POD_NAMESPACE)/ingress-nginx
- --annotations-prefix=nginx.ingress.kubernetes.io

  • 如需要生效重启nginx-ingress-controller pod *

    二、使用Annotations

    如果只想自定义特定Ingress资源的配置,可以使用Annotations。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
    name: cafe-ingress-with-annotations
    annotations:
    nginx.org/proxy-connect-timeout: "30s"
    nginx.org/proxy-read-timeout: "20s"
    nginx.org/client-max-body-size: "4m"
    spec:
    rules:
    - host: cafe.example.com
    http:
    paths:
    - path: /tea
    backend:
    serviceName: tea-svc
    servicePort: 80
    - path: /coffee
    backend:
    serviceName: coffee-svc
    servicePort: 80

Annotations配置优先于ConfigMap
https://github.com/nginxinc/kubernetes-ingress/tree/master/examples/customization
https://github.com/nginxinc/kubernetes-ingress/tree/master/examples/customization

限速

Annotationsingress.kubernetes.io/limit-connectionsingress.kubernetes.io/limit-rps定义可由单个客户端IP地址打开的连接的限制。这可用于缓解DDoS攻击

1
2
3
4
5
nginx.ingress.kubernetes.io/limit-connections:单个IP地址允许的并发连接数。

nginx.ingress.kubernetes.io/limit-rps:每秒可从给定IP接受的连接数。

如果在单个Ingress规则中指定两个Annotations,`limit-rps`则优先。