1.イングレスとは
ngress(kubernetes v1.1で追加)は、クラスターの外部からクラスター内のサービスに公開HTTP
またはHTTPS
ルーティングします。ingress
リソースで定義されたルールは、トラフィックのルーティングを制御します。
internet
|
[ Ingress ]
--|-----|--
[ Services ]
1つingress
は、外部からアクセス可能なサービスURL、負荷分散トラフィック、SSLターミナルを提供し、仮想ホスト名の構成を提供するように構成できます。ingress controller
(通常はロードバランサーを使用して)エントリ(入力)を実装する責任があります。ただし、トラフィックの処理に役立つようにエッジルーターまたは追加のフロントエンドを構成することもできます。ingress
ポートやプロトコルは公開されていません。HTTPおよびHTTPS以外のサービスをインターネットに公開するためのサービスタイプは、NodePortまたはロードバランスです。
2.入力の違い
違い:https://github.com/nginxinc/kubernetes-ingress/blob/master/docs/nginx-ingress-controllers.md
Ingress-nginx
Ingress-nginx:kubernetesによって公式に維持されているIngress
Ingress-nginxの公式ドキュメント:https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#rewrite
Ingress-nginx Github:https://github.com/kubernetes/ingress-nginx
Nginx-ingress
Nginx-ingress:nginxによって公式に維持されている入力
Nginx-ingressの公式ドキュメント:https://docs.nginx.com/nginx-ingress-controller/configuration/ingress-resources/advanced-configuration-with-annotations/
Nginx-ingress Github:https://github.com/nginxinc/kubernetes-ingress/blob/master/docs/nginx-ingress-controllers.md
類似:Traefik、HAProxy、Istio
3.Ingress-nginxのデプロイ
Ingress-nginxの高度な紹介では、ここでは主にKubernetesのプラグインを使用します。
4.Ingress-nginx作成プロセス
(1)最初にポッドを作成します
(2)サービスを作成する
(3)ingress-nginxを作成します
kubectl create ns heian
#创建命名空间后,运行下面yaml,就可以实现上面三个步骤的工作
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: heian
name: ingress-heian
annotations:
k8s.kuboard.cn/workload: ingress-heian
deployment.kubernetes.io/revision: '1'
k8s.kuboard.cn/service: ClusterIP
k8s.kuboard.cn/ingress: 'true'
labels:
app: ingress-heian
spec:
selector:
matchLabels:
app: ingress-heian
revisionHistoryLimit: 10
template:
metadata:
labels:
app: ingress-heian
spec:
affinity: {}
securityContext:
seLinuxOptions: {}
imagePullSecrets: []
restartPolicy: Always
initContainers: []
containers:
- image: 'wangyanglinux/myapp:v1'
imagePullPolicy: IfNotPresent
name: ingress-heian
volumeMounts:
- name: tz-config
mountPath: /usr/share/zoneinfo/Asia/Shanghai
- name: tz-config
mountPath: /etc/localtime
- name: timezone
mountPath: /etc/timezone
resources:
limits:
cpu: 100m
memory: 100Mi
requests:
cpu: 10m
memory: 10Mi
env:
- name: TZ
value: Asia/Shanghai
- name: LANG
value: C.UTF-8
lifecycle: {}
ports:
- name: web
containerPort: 80
protocol: TCP
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumes:
- name: tz-config
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
type: ''
- name: timezone
hostPath:
path: /etc/timezone
type: ''
dnsPolicy: ClusterFirst
dnsConfig:
options: []
schedulerName: default-scheduler
terminationGracePeriodSeconds: 30
progressDeadlineSeconds: 600
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
maxSurge: 1
replicas: 1
---
apiVersion: v1
kind: Service
metadata:
namespace: heian
name: ingress-heian
annotations:
k8s.kuboard.cn/workload: ingress-heian
labels:
app: ingress-heian
spec:
selector:
app: ingress-heian
type: ClusterIP
ports:
- port: 80
targetPort: 80
protocol: TCP
name: ingress-web-1
nodePort: 0
sessionAffinity: None
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
namespace: heian
name: ingress-heian
annotations:
k8s.kuboard.cn/workload: ingress-heian
labels:
app: ingress-heian
spec:
rules:
- host: ingress.heian.com
http:
paths:
- path: /
backend:
serviceName: ingress-heian
servicePort: 80
効果のスクリーンショット:
5. Ingress-nginxドメイン名リダイレクト(リダイレクト)
アノテーション宣言
#重定向,就是这一句 ,现在访问这个域名,会重定向到我的博客地址
annotations:
nginx.ingress.kubernetes.io/permanent-redirect: 'https://blog.csdn.net/heian_99'
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/permanent-redirect: 'https://blog.csdn.net/heian_99'
name: ingress-heian
namespace: heian
spec:
rules:
- host: ingress.heian.com
http:
paths:
- backend:
serviceName: ingress-heian
servicePort: 80
path: /
pathType: ImplementationSpecific
これは、ingress-nginxでのnginxの構成です。
6. Ingress-nginxのフロントエンド分離(書き換え)
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
name: ingress-heian
namespace: heian
spec:
rules:
- host: ingress.heian.com
http:
paths:
- backend:
serviceName: ingress-heian
servicePort: 80
path: /something(/|$)(.*)
pathType: ImplementationSpecific
7.Ingress-nginxのSSL構成
公式ウェブサイト:https://kubernetes.github.io/ingress-nginx/user-guide/tls/
自作の証明書を作成します(メイン:ブラウザで認識されません)
Ingress-nginxはSSLで構成されており、httpsWebページに自動的にジャンプします
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.cert -subj "/CN=ingress.heian.com/O=ingress.heian.com"
kubectl create secret tls ca-ceart --key tls.key --cert tls.cert -n heian
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
name: ingress-heian
namespace: heian
spec:
rules:
- host: ingress.heian.com
http:
paths:
- backend:
serviceName: ingress-heian
servicePort: 80
path: /something(/|$)(.*)
pathType: ImplementationSpecific
tls:
- hosts:
- ingress.heian.com
secretName: ca-ceart
tls:
- hosts:
- ingress.heian.com
secretName: ca-ceart
https強制リダイレクトを無効にする
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"
デフォルトの証明書を設定します:-default-ssl-certificate = default / foo-tls
ingress-controllerの起動パラメーターを変更しました
8.Ingress-nginxの白黒リスト
注釈:指定された入力に対してのみ有効です
ConfigMap:グローバルに効果的
ブラックリストはConfigMapを使用して構成でき、ホワイトリストは注釈を使用して構成することをお勧めします。
(1)ホワイトリストをホワイトリストに追加する方法は、注釈に直接書き込むことも、ConfigMapで構成することもできます。
注釈で書かれています:
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: 192.168.0.100
name: ingress-heian
namespace: heian
spec:
rules:
- host: ingress.heian.com
http:
paths:
- backend:
serviceName: ingress-heian
servicePort: 80
path: /
pathType: ImplementationSpecific
固定IPまたはネットワークセグメントを作成することもできます。ConfigMapに構成します。
apiVersion: v1
kind: ConfigMap
metadata:
labels:
helm.sh/chart: ingress-nginx-2.1.0
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/version: 0.32.0
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: controller
name: ingress-nginx-controller
namespace: ingress-nginx
data:
whitelist-source-range: 10.1.10.0/24
(2)ブラックリストブラックリストはConfigMapを介してのみ構成できます
ConfigMapの構成は次のとおりです。
apiVersion: v1
kind: ConfigMap
metadata:
labels:
helm.sh/chart: ingress-nginx-2.1.0
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/version: 0.32.0
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: controller
name: ingress-nginx-controller
namespace: ingress-nginx
data:
whitelist-source-range: 10.1.10.0/24
block-cidrs: 10.1.10.100
注釈構成
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/server-snippet: |-
deny 192.168.0.1;
deny 192.168.0.100;
allow all;
creationTimestamp: null
name: ingress-heian
spec:
rules:
- host: ingress.heian.com
http:
paths:
- backend:
serviceName: ingress-heian
servicePort: 80
path: /
pathType: ImplementationSpecific
status:
loadBalancer: {}
9.Ingress-nginxマッチングリクエストヘッダー
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/server-snippet: |-
set $agentflag 0;
if ($http_user_agent ~* "(iPhone)" ){
set $agentflag 1;
}
if ( $agentflag = 1 ) {
return 301 https://m.heian.com;
}
creationTimestamp: null
name: ingress-heian
spec:
rules:
- host: ingress.heian.com
http:
paths:
- backend:
serviceName: ingress-heian
servicePort: 80
path: /
pathType: ImplementationSpecific
status:
loadBalancer: {}
10.Ingress-nginxのレート制限
限速¶
这些注释定义了对连接和传输速率的限制。这些可以用来减轻DDoS攻击。
nginx.ingress.kubernetes.io/limit-connections:单个IP地址允许的并发连接数。超出此限制时,将返回503错误。
nginx.ingress.kubernetes.io/limit-rps:每秒从给定IP接受的请求数。突发限制设置为此限制乘以突发乘数,默认乘数为5。当客户端超过此限制时,将 返回limit-req-status-code默认值: 503。
nginx.ingress.kubernetes.io/limit-rpm:每分钟从给定IP接受的请求数。突发限制设置为此限制乘以突发乘数,默认乘数为5。当客户端超过此限制时,将 返回limit-req-status-code默认值: 503。
nginx.ingress.kubernetes.io/limit-burst-multiplier:突发大小限制速率的倍数。默认的脉冲串乘数为5,此注释将覆盖默认的乘数。当客户端超过此限制时,将 返回limit-req-status-code默认值: 503。
nginx.ingress.kubernetes.io/limit-rate-after:最初的千字节数,在此之后,对给定连接的响应的进一步传输将受到速率的限制。必须在启用代理缓冲的情况下使用此功能。
nginx.ingress.kubernetes.io/limit-rate:每秒允许发送到给定连接的千字节数。零值禁用速率限制。必须在启用代理缓冲的情况下使用此功能。
nginx.ingress.kubernetes.io/limit-whitelist:客户端IP源范围要从速率限制中排除。该值是逗号分隔的CIDR列表。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/limit-rate: 100K
nginx.ingress.kubernetes.io/limit-whitelist: 10.1.10.100
nginx.ingress.kubernetes.io/limit-rps: 1
nginx.ingress.kubernetes.io/limit-rpm: 30
spec:
rules:
- host: iphone.coolops.cn
http:
paths:
- path:
backend:
serviceName: ng-svc
servicePort: 80
nginx.ingress.kubernetes.io/limit-rate:限制客户端每秒传输的字节数
nginx.ingress.kubernetes.io/limit-whitelist:白名单中的IP不限速
nginx.ingress.kubernetes.io/limit-rps:单个IP每秒的连接数
nginx.ingress.kubernetes.io/limit-rpm:单个IP每分钟的连接数
11.Ingress-nginxの基本認証
dubbo-adminなど、一部のアクセスには認証アクセスが必要です。アクセスするときに、最初にユーザー名とパスワードの入力を求められます。Ingressnginxもこれを実現できます。
(1)パスワードを作成します。httpコマンドツールを使用してここでパスワードを生成します
[root@k8s-master01 ingress]# htpasswd -c auth heian
New password:
Re-type new password:
Adding password for user heian
[root@k8s-master01 ingress]# ls
auth tls.cert tls.key
[root@k8s-master01 ingress]# cat auth
heian:$apr1$8LffOJL7$ZIGV4XRNSuginqO5GMxAZ.
[root@k8s-master01 ingress]#
(2)秘密を作成する
[root@k8s-master01 ingress]# kubectl create secret generic basic-auth --from-file=auth -n heian
secret/basic-auth created
(3)入力を構成します
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/auth-realm: Need to longin
nginx.ingress.kubernetes.io/auth-secret: basic-auth
nginx.ingress.kubernetes.io/auth-type: basic
creationTimestamp: null
name: ingress-heian
spec:
rules:
- host: ingress.heian.com
http:
paths:
- backend:
serviceName: ingress-heian
servicePort: 80
path: /
pathType: ImplementationSpecific
status:
loadBalancer: {}
12.Ingress-nginxがグレースケールカナリアのリリースを実現
Nginx Annotationsは、次の4種類のカナリアルールをサポートしています。
nginx.ingress.kubernetes.io/canary-by-header
:リクエストヘッダーに基づくトラフィックセグメンテーション。グレースケールリリースとA / Bテストに適しています。リクエストヘッダーが設定されている場合、リクエストalways
はカナリアバージョンまで送信されます。リクエストヘッダーが設定されている場合、リクエストnever
はカナリアインレットに送信されません。その他の値のヘッダー、ヘッダーは無視され、優先度は他のカナリアルールによる要求は優先順位を比較します。nginx.ingress.kubernetes.io/canary-by-header-value
:一致するリクエストヘッダーの値。CanaryIngressで指定されたサービスにリクエストをルーティングするようにIngressに通知するために使用されます。リクエストヘッダーがこの値に設定されると、カナリアエントリにルーティングされます。このルールにより、ユーザーはリクエストヘッダーの値をカスタマイズできます。これは、前のアノテーション(つまり、canary-by-header)と一緒に使用する必要があります。nginx.ingress.kubernetes.io/canary-weight
:サービスの重みに基づくトラフィックセグメンテーション。青緑色の展開に適しており、重みの範囲は0〜100で、CanaryIngressの指定されたサービスにリクエストをパーセンテージでルーティングします。重み0は、カナリアルールがカナリアポータルのサービスにリクエストを送信しないことを意味します。重み100は、すべてのリクエストがカナリアポータルに送信されることを意味します。nginx.ingress.kubernetes.io/canary-by-cookie
:Cookieベースのトラフィックセグメンテーション。グレースケールパブリッシングとA / Bテストに適しています。CanaryIngressで指定されたサービスにリクエストをルーティングするようにIngressに通知するために使用されるCookie。Cookieの値が設定されているalways
場合、それはインレットカナリアにルーティングされます。Cookieの値が設定されているnever
場合、リクエストはカナリアのインレットに送信されません。他の値の場合、他のカナリアとのCookieリクエストの優先度ルールは無視されます。レベル比較。コードの2つのバージョンを定義します。
同じドメイン名で2つの入力を作成します
v2バージョン
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: heian
nginx.ingress.kubernetes.io/canary-by-header-value: v2
nginx.ingress.kubernetes.io/canary-weight: "50"
name: ingress-heian2
namespace: heian
spec:
rules:
- host: ingress.heian.com
http:
paths:
- backend:
serviceName: ingress-heian2
servicePort: 80
path: /
pathType: ImplementationSpecific
13.Ingress-nginxカスタムエラーページ
githubアドレス:https://github.com/kubernetes/ingress-nginx/blob/master/docs/examples/customization/custom-errors/custom-default-backend.yaml
kubectl apply -f error.yaml -n heian
ds構成ファイルを変更し、これを追加します
- --default-backend-service=heian/nginx-errors
検証
実行しkubectl get pod -n ingress-nginx
てポッドが再起動したかどうかを 確認します。自動的に再起動しない場合は、ポッドを強制終了する必要があります。
存在しないリンクを開いて、定義されたエラーページが表示されるかどうかを確認します。
Google Chromeが「このウェブサイトは表示できません」と表示するなど、一部のブラウザはページ表示をサポートしていません