KubernetesIngress-nginxの高度な使用法

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のデプロイ

(1)yaml導入入力-nginx

(2)ヘルムは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が「このウェブサイトは表示できません」と表示するなど、一部のブラウザはページ表示をサポートしていません

 

おすすめ

転載: blog.csdn.net/heian_99/article/details/115017473