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集群服务,提供两
kubernetes Server-Ingress-Nginx
Ingress 七层代理,必须绑定域名,用Nginx服务做的反向代理
Ingress-Nginx 官网地址:https://kubernetes.github.io/ingress-nginx/deploy/
<所有 Ingress-Nginx 的学习资料都在官网网站里面了>
Ingress-Nginx 架构:
- 客户端访问域名,到达 K8s集群内部 - Nginx 反向代理,选择到后端的 Service - Pod 容器
- Nginx - NodePort Service 部署方案 ,暴露给外部用户
- 后端服务 创建 Service1,Service2 。Nginx 通过 Service1,Service2 来进行负载均衡
Ingress-Nginx 工作流程:
-
通过 APIServer 与 Store 协程进入监听状态。
-
如果发生数据写入,会写入到 updateChannel 循环消息队列当中。
-
通过 NginxController 主进程 监听 updateChannel 中写入的事件,发生一个循环后会更新一个事件。
-
将事件追加同步到 SyncQueue 消息队列,等待被 协程更改配置文件。协程会定期从队列中拉取要执行的任务。
-
如果有一些必要直接需要修改、更新的任务会直接发送到 SyncQueue,由Store 直接沟通 SyncQueue。
-
收取到所有要更新的数据,协程会判断是否需要重载写入数据。
-
如果需要写入会写入到 Nginx 配置文件,并进行重载 Nginx服务。
-
如果不需要,会构造 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
kubectl get pod -o wide
可以访问ClusterIP,做到Pod内部的负载均衡
三、通过 Ingress 7 层代理,将内部的 Service - Deployment - Pod 暴露外网,根据域名访问
创建一个 Ingress - Service,与 nginx -svc 对应,也可以理解成在 Nginx - svc 4层 上嵌套了一个 Ingress 7 层代理,代理规则用的是域名。
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
通过 Ingress 域名规则验证访问
四、Ingress 代理两个web集群服务,提供两个域名反代
先不要急着创建 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已经建立好了
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文件
验证访问,效果图不放了,轮询页面
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
确认是否创建成功
创建 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
更多推荐
所有评论(0)