kubernetes Server-Ingress-Nginx使用方法,Auth、URL重定向、等基础域名负载使用方法

kubernetes Server-Ingress-Nginx

个人学习记录

  • kubernetes Server-Ingress-Nginx
    • 一、安装 Ingress
    • 二、创建后端 Service - Deployment - Pod
    • 三、通过 Ingress 7 层代理,将内部的 Service - Deployment - Pod 暴露外网,根据域名访问
    • 四、Ingress 代理两个web集群服务,提供两个域名反代
      • Service - Deployment - Pod - Nginx
      • Service - Deployment - Pod - Apache
      • Ingrss 7层域名代理规则
    • 五、Ingress HTTPS 代理
    • 六、Nginx 进行 BasicAuth 认证
    • 七、Ingress - Nginx -URL地址重写

Ingress 七层代理,必须绑定域名,用Nginx服务做的反向代理

Ingress-Nginx 官网地址:https://kubernetes.github.io/ingress-nginx/deploy/

<所有 Ingress-Nginx 的学习资料都在官网网站里面了>

Ingress-Nginx 架构:

kubernetes Server-Ingress-Nginx使用方法,Auth、URL重定向、等基础域名负载使用方法_第1张图片

  1. 客户端访问域名,到达 K8s集群内部 - Nginx 反向代理,选择到后端的 Service - Pod 容器
  2. Nginx - NodePort Service 部署方案 ,暴露给外部用户
  3. 后端服务 创建 Service1,Service2 。Nginx 通过 Service1,Service2 来进行负载均衡

Ingress-Nginx 工作流程:

kubernetes Server-Ingress-Nginx使用方法,Auth、URL重定向、等基础域名负载使用方法_第2张图片

  1. 通过 APIServer 与 Store 协程进入监听状态。

  2. 如果发生数据写入,会写入到 updateChannel 循环消息队列当中。

  3. 通过 NginxController 主进程 监听 updateChannel 中写入的事件,发生一个循环后会更新一个事件。

  4. 将事件追加同步到 SyncQueue 消息队列,等待被 协程更改配置文件。协程会定期从队列中拉取要执行的任务。

  5. 如果有一些必要直接需要修改、更新的任务会直接发送到 SyncQueue,由Store 直接沟通 SyncQueue。

  6. 收取到所有要更新的数据,协程会判断是否需要重载写入数据。

    1. 如果需要写入会写入到 Nginx 配置文件,并进行重载 Nginx服务。

    2. 如果不需要,会构造 Post 数据(不需要重载的数据)以 Lua Server 模块直接运行。


一、安装 Ingress

创建目录

mkdir -p /kubernetes/plugin/ingress

从官网下载最新版本的 Ningx-Ingress文件

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud/deploy.yaml

查看这个文件中所需要的镜像,并将其下载到本地,做成镜像包

cat deploy.yaml | grep image

docker pull  quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.33.0

docker save -o ingress.contr.tar  quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.33.0

tar -zxvf ingress.contr.tar.gz  ingress.contr.tar

将做好的 tar包传到所有 node 节点上,然后解压成镜像

tar -zxvf ingress.contr.tar.gz

docker load -i ingress.contr.tar

执行 Ingress-Nginx 剧本,并查看其运行状态

kubectl apply -f deploy.yaml

kubectl get pod -n ingress-nginx -n 指定namespace名称空间,Ingress-Nginx所有的信息都在这个名称空间内查看


下载官网给出的 NodePort - Service 的文件

在这里插入图片描述

**有时候会出现重名:**mv deploy.yaml.1 nodeport.yaml

kubectl apply -f nodeport.yaml

kubectl get svc -n ingress-nginx 带上特有的名称空间来查看其 SVC 暴露 IP 和端口
在这里插入图片描述
到此 Ingress - Nginx 7层反向代理已经做完了,可以看到外暴露80/443的映射端口。


二、创建后端 Service - Deployment - Pod

运行一个 deployment 控制的2副本 Nginx 服务,并设置一个普通的Service

apiVersion: apps/v1
kind: Deployment
metadata: 
  name: nginx-dm
spec: 
  replicas: 2 
  selector: 
  	matchLabels:
  	   app: nginx
  template: 
    metadata: 
      labels:  
         app: nginx
    spec: 
      containers: 
        - name: nginx
          image: nginx:1.9.0
          imagePullPolicy: IfNotPresent
          ports: 
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata: 
  name: nginx-svc
spec: 
  ports: 
    - port: 80
      targetPort: 80
      protocol: TCP
  selector: 
    app: nginx

kubectl describe svc nginx-svc
kubernetes Server-Ingress-Nginx使用方法,Auth、URL重定向、等基础域名负载使用方法_第3张图片
kubectl get pod -o wide

kubernetes Server-Ingress-Nginx使用方法,Auth、URL重定向、等基础域名负载使用方法_第4张图片可以访问ClusterIP,做到Pod内部的负载均衡


三、通过 Ingress 7 层代理,将内部的 Service - Deployment - Pod 暴露外网,根据域名访问

创建一个 Ingress - Service,与 nginx -svc 对应,也可以理解成在 Nginx - svc 4层 上嵌套了一个 Ingress 7 层代理,代理规则用的是域名。

kubernetes Server-Ingress-Nginx使用方法,Auth、URL重定向、等基础域名负载使用方法_第5张图片

apiVersion: extensions/v1beta1
kind: Ingress
metadata: 
  name: nginx-test
spec:
  rules:	#Ingress 的规则
    - host: www.shmguigu.com  	#主机域名
      http: 			#页面信息
        paths: 			#访问路径
          - path: /		#访问域名根路径
            backend: 	
              serviceName: nginx-svc	#连接 nginx-svc Service
              servicePort: 80			#映射 nginx-svc 80

ingress- test 写入到了 Ingress-Nginx 的配置文件当中,通过 Ingress-Nginx进行后端负载

查看方法如下:

kubectl exec ingress-nginx-controller-75f84dfcd7-2w855 -n ingress-nginx -it -- /bin/bash

vi nginx.conf


修改本机的 Hosts
192.168.168.11 www.shmguigu.com
kubernetes Server-Ingress-Nginx使用方法,Auth、URL重定向、等基础域名负载使用方法_第6张图片

通过 Ingress 域名规则验证访问

kubernetes Server-Ingress-Nginx使用方法,Auth、URL重定向、等基础域名负载使用方法_第7张图片


四、Ingress 代理两个web集群服务,提供两个域名反代

kubernetes Server-Ingress-Nginx使用方法,Auth、URL重定向、等基础域名负载使用方法_第8张图片
先不要急着创建 ingress,跟之前写法有些不同,先将内网的两个 Pod 集群做好

Service - Deployment - Pod - Nginx

apiVersion: apps/v1
kind: Deployment
metadata:
 name: nginx-deploy
spec:
 replicas: 2
 selector:
   matchLabels:
      app: nginx-deploy
 template:
   metadata:
     labels:
        app: nginx-deploy
   spec:
     containers:
       - name: nginx
         image: nginx:1.9.0
         imagePullPolicy: IfNotPresent
         ports:
            - name: http
              containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
 name: nginx-svc
 namespace: default
spec:
 type: ClusterIP
 selector:
   app: nginx-deploy
 ports:
   - port: 80
     targetPort: 80
     protocol: TCP

kubectl apply -f nginx.yaml --record

Service - Deployment - Pod - Apache

apiVersion: apps/v1
kind: Deployment
metadata:
 name: apache-deploy
spec:
 replicas: 2
 selector:
   matchLabels:
      app: apache-deploy
 template:
   metadata:
     labels:
        app: apache-deploy
   spec:
     containers:
       - name: apache
         image: httpd:latest
         imagePullPolicy: IfNotPresent
         ports:
            - name: http
              containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
 name: apache-svc
 namespace: default
spec:
 type: ClusterIP
 selector:
   app: apache-deploy
 ports:
   - port: 80
     targetPort: 80
     protocol: TCP

两个 Pod 集群,和两个不同的 SVC已经建立好了
kubernetes Server-Ingress-Nginx使用方法,Auth、URL重定向、等基础域名负载使用方法_第9张图片

Ingrss 7层域名代理规则

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress1
spec:
  rules:
   - host: www.nginx.con
     http:
       paths:
        - path: /
          backend:
            serviceName: nginx-svc
            servicePort: 80
---

apiVersion: extensions/v1beta1
kind: Ingress
metadata: 
  name: ingress2
spec: 
  rules: 
   - host: www.apache.con	#注意我这里是 .con
     http: 
       paths: 
        - path: /
          backend: 
            serviceName: apache-svc
            servicePort: 80

查看 Ingress 7 层代理的负载规则,进入 Ingress-Nginx 的 nginx.conf 查看

kubectl exec ingress-nginx-controller-75f84dfcd7-2w855 -n ingress-nginx -it – /bin/bash

修改主机 hosts文件
kubernetes Server-Ingress-Nginx使用方法,Auth、URL重定向、等基础域名负载使用方法_第10张图片

验证访问,效果图不放了,轮询页面

www.nginx.com:32144

www.apache.con:32144


五、Ingress HTTPS 代理

用 Ingress - Nginx 的443 映射端口来进行访问。后端的 Pod 集群服务可以是 80 ,只在 Ingress - Nginx 上创建证书即可。

创建证书,以及 cert 存储方式

[root@k8s-master https]# openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"

[root@k8s-master https]# ls
tls.crt  tls.key

kubectl create secret tls tls-secret --key tls.key --cert tls.crt  
#secret存储后面有博客会讲,直到步骤操作即可

deployment - Service - Ingress Yaml 文件,创建一个新的 Pod - Nginx集群

apiVersion: apps/v1
kind: Deployment
metadata:
 name: ng-deploy
spec:
 replicas: 2
 selector:
   matchLabels:
      app: ng-deploy
 template:
   metadata:
     labels:
        app: ng-deploy
   spec:
     containers:
       - name: test-nginx
         image: nginx:1.9.0
         imagePullPolicy: IfNotPresent
         ports:
            - name: http
              containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
 name: ng-svc
 namespace: default
spec:
 type: ClusterIP
 selector:
   app: ng-deploy
 ports:
   - port: 80
     targetPort: 80
     protocol: TCP

确认是否创建成功
kubernetes Server-Ingress-Nginx使用方法,Auth、URL重定向、等基础域名负载使用方法_第11张图片

创建 Ingrss - Nginx - HTTPS 的文件

apiVersion: extensions/v1beta1
kind: Ingress
metadata: 
 name: ng-test
spec:
  tls:
   - hosts:
      - www.ngshm.com   #主机名
     secretName: tls-secret   #secret保存证书的方案名称
  rules:
   - host: www.ngshm.com
     http:
       paths:
         - path: /
           backend:
             serviceName: ng-svc
             servicePort: 80

kubectl get svc -n ingress-nginx

在这里插入图片描述

修改本地hosts文件

访问:https://www.ngshm.com:31656


六、Nginx 进行 BasicAuth 认证

借用 http 的 htpasswd 模块

yum -y install httpd
mkdir basic-auth ;  cd basic-auth/

htpasswd -c auth foo	#foo是认证的用户
New password: 123.com	#123.com 是 foo认证的密码
Re-type new password:123.com 

kubectl create secret generic basic-auth --from-file=auth

创建一个 Ingess - BasicAuth

apiVersion: extensions/v1beta1
kind: Ingress
metadata: 
  name: ingress-with-auth
  annotations: 
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - foo'
spec:
 rules:
   - host: auth.ngshm.com
     http:
      paths:
        - path: /
          backend: 
            serviceName: ng-svc
            servicePort: 80

修改主机 hosts文件

192.168.168.11 auth.ngshm.com

访问:http://auth.ngshm.com:32144 输入用户名 foo ,密码 123.com


七、Ingress - Nginx -URL地址重写

名称 描述
nginx.ingress.kubernetes.io/rewrite-target 必须重定向流量的目标URL value
nginx.ingress.kubernetes.io/ssl-redirect 指示位置部分是否仅可访问SSL(当ingress包含证书时,默认为True) 布尔
nginx.ingress.kubernetes.io/force-redirect 即使Ingress未启用TLS,也强制重定向到HTTPS 布尔
nginx.ingress.kubernetes.io/app-root 定义Controller必须重定向的应用程序根,如果它在"/"上下文中 value
nginx.ingress.kubernetes.io/use-regex 指示 Ingress 上定义的路径是否使用正则表达式 布尔
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-rewrite
  annotations: 
    nginx.ingress.kubernetes.io/rewrite-target: https://www.ngshm.com:31656
spec:
 rules:
   - host: re.ngshm.com
     http:
      paths: 
        - path: / 
          backend: 
            serviceName: ng-svc	#不链接都行,因为是URL地址跳转
            servicePort: 80

修改本地hosts文件

192.168.168.11 re.ngshm.com

访问验证:

http://re.ngshm.com:32144

你可能感兴趣的:(kubernetes,kubernetes)