hello云胜

技术与生活

0%

Ingress

service nodeport的问题:

  1. 端口有限,默认30000-32767 只有2768个。(可以自己改,但最大也就65535)

  2. 不安全,直接访问主机端口

  3. 负载均衡能力有限,4层复杂均衡。只能进行最基本的策略。

整体架构图

image-20211103102638681

ingress方案:

  1. service不再使用nodeport,全内网部署
  2. 在部分机器上部署ingress-nginx。这个nginx是k8s管理的。所以可以路由到所有服务。
  3. ingress-nginx被ingress-controller管理,通过编写ingress-rule进行配置变更
  4. ingress-nginx相互之间数据同步
  5. 外网负载均衡将流量打给ingress-nginx

安装

Ingress | Kubernetes

Installation Guide - NGINX Ingress Controller (kubernetes.github.io)

注意提前拉取镜像

可以使用demonset,使每台机器部署一个

可以给node打标签,设置哪些机器部署ingress

Ingress rule

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: itdachang-ingress
namespace: default
spec:
defaultBackend: ## 指定所有未匹配的默认后端
service:
name: php-apache
port:
number: 80
rules:
- host: itdachang.com
http:
paths:
- path: /abc
pathType: Prefix
backend:
service:
name: my-nginx-svc
port:
number: 80

nginx的全局配置

通过配置config-map

1
2
3
4
5
kubectl edit cm ingress-nginx-controller -n ingress-nginx
编辑配置加上
data:
配置项: 配置值

所有配置项参考 https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/

nginx开启功能

metadata里通过Annotations开启功能

路径重写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2 //只保留第二部分,把前面的上下文去掉了
name: rewrite
namespace: default
spec:
rules:
- host: rewrite.bar.com
http:
paths:
- path: /something(/|$)(.*)
pathType: Prefix
backend:
service:
name: http-svc
port:
number: 80

会话保持

基于cookie粘连

Sticky Sessions - NGINX Ingress Controller (kubernetes.github.io)

annotations

nginx.ingress.kubernetes.io/affinity

SSL

  1. 搞证书

    自己玩:

    1
    2
    3
    openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ${KEY_FILE:tls.key}
    -out ${CERT_FILE:tls.cert} -subj
    "/CN=${HOST:xxx.com}/O=${HOST:xxx.com}"

    买个域名,申请个免费证书DV

    这种下载的证书可能是pem文件,直接改成crt就行

  2. 配置secret

    1
    kubectl create secret tls xxx-tls --key tls.key --cert tls.cert
  3. 在ingress中使用

    1
    2
    3
    4
    5
    6
    spec:
    tls:
    - hosts:
    - itdachang.com
    secretName: itdachang-tls

金丝雀

Annotations - NGINX Ingress Controller (kubernetes.github.io)