18--k8s之Nginx ingress

一、介绍

ingress为kubernetes集群中的服务提供了入口,可以提供负载均衡,ssl终止和基于名称的虚拟主机,在生产环境中常用的Ingress有treafik、Nginx、HAProxy、Istio等。在kubernetesv 1.1 版中添加的 Ingress 用于从集群外部到集群内部 Service 的 HTTP 和 HTTPS 路由,流量从 Internet 到 Ingress 再到 Services 最后到 Pod 上,通常情况下,Ingress 部署在所有的 Node 节点上。Ingress 可以配置提供服务外部访问的 URL、负载均衡、终止 SSL,并提供基于域名的虚拟主机。但 Ingress 不会暴露任意端口或协议。

二、安装nginx ingress

# 下载
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.2/deploy/static/provider/baremetal/deploy.yaml

# 修改自己的镜像
    spec:
      dnsPolicy: ClusterFirst
      containers:
        - name: controller
          image: registry.cn-shanghai.aliyuncs.com/baim0os/ingress-nginx:v0.44.0
          imagePullPolicy: IfNotPresent
          lifecycle:
            preStop
    或者
修改镜像
[root@k8s-m-01 ~]# sed -i 's#k8s.gcr.io/ingress-nginx/controller:v0.48.1@sha256:e9fb216ace49dfa4a5983b183067e97496e7a8b307d2093f4278cd550c303899#registry.cn-hangzhou.aliyuncs.com/k8sos/ingress-controller:v0.48.1#g' deploy.yaml
    
# 安装
kubectl apply -f deploy.yaml

# 检查是否安装成功
kubectl get pods -n ingress-nginx

三、http部署

1.编写一个service准备实验

apiVersion: apps/v1
kind: Deployment
metadata:
  name: discuz
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
---
apiVersion: v1
kind: Service
metadata:
  name: discuz
spec:
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
      nodePort: 30080
  type: NodePort

2.编写http的ingress

kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
  name: discuz
spec:
  rules:
    - host: "www.discuz.com" # 要绑定的域名
      http:
        paths:
          - path: / # 请求的路径
            pathType: Prefix #自由匹配
            # pathType: Exact # 精确匹配
            backend:
              service:
                name: discuz # 必须和service的名字一致才可以绑定
                port:
                  number: 80  # 服务的端口号

3.部署

[root@m01 k8s]# kubectl apply -f nginx.yaml 
deployment.apps/discuz created
service/discuz created
ingress.networking.k8s.io/discuz created
[root@m01 k8s]# kubectl get svc -n ingress-nginx 
NAME                                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.99.211.135   <none>        80:30685/TCP,443:30542/TCP   3d
ingress-nginx-controller-admission   ClusterIP   10.99.2.179     <none>        443/TCP                      3d
# 配置本地的hosts去进行访问
www.discuz.com:30685

img

四、https部署

# 生成证书
[root@m01 k8s]# openssl genrsa -out tls.key 2048
[root@m01 k8s]# openssl req -new -x509 -key tls.key -out tls.crt -subj /C=CN/ST=ShangHai/L=ShangHai/O=Ingress/CN=www.test.com

# 查看
[root@m01 k8s]# ll
-rw-r--r-- 1 root root 1289 Aug 12 22:46 tls.crt
-rw-r--r-- 1 root root 1679 Aug 12 22:46 tls.key

# 绑定证书
kubectl -n [名称空间] create secret tls [secretname] --cert=[证书.crt] --key=[证书.key]

kubectl -n default create secret tls ingress-tls --cert=tls.crt --key=tls.key

kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
  name: discuz
spec:
  tls:
    - secretName: ingress-tls # 创建的加密的证书名
  rules:
    - host: "www.discuz.com" # 要绑定的域名
      http:
        paths:
          - path: / # 请求的路径
            pathType: Prefix #自由匹配
            # pathType: Exact # 精确匹配
            backend:
              service:
                name: discuz # 必须和service的名字一致才可以绑定
                port:
                  number: 80  # 服务的端口号

# 部署
kubectl apply -f

# 配置hosts访问
www.discuz.com:30542

img

五、常用配置

通过annotations来添加各种的功能

1、生成密码文件
[root@kubernetes-master-01 ingress]# yum install httpd-tools -y
[root@kubernetes-master-01 ingress]# htpasswd -c auth baim0

创建secret,把密码文件放置于集群中
[root@kubernetes-master-01 ingress]# kubectl create secret generic basic-auth --from-file=auth 

编写注解,使用auth功能
      annotations:
        nginx.ingress.kubernetes.io/auth-type: basic # 类型
        nginx.ingress.kubernetes.io/auth-secret: basic-auth # secret
        nginx.ingress.kubernetes.io/auth-realm: "在线发牌!" # 提示信息
        
2、限制并发数
nginx.ingress.kubernetes.io/limit-connections: 1

3、每秒从给定 IP 接受的请求数
nginx.ingress.kubernetes.io/limit-rps: 1

4、每分钟从给定 IP 接受的请求数
nginx.ingress.kubernetes.io/limit-rpm: 1

5、初始千字节数
nginx.ingress.kubernetes.io/limit-rate-after: 1

6、白名单
nginx.ingress.kubernetes.io/whitelist-source-range: 192.168.13.59

详细请查询

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

原文地址:https://www.cnblogs.com/caodan01/p/15142709.html