Ingress-Nginx 官网地址:https://kubernetes.github.io/ingress-nginx/deploy/
<所有 Ingress-Nginx 的学习资料都在官网网站里面了>
Ingress-Nginx 架构:
Ingress-Nginx 工作流程:
通过 APIServer 与 Store 协程进入监听状态。
如果发生数据写入,会写入到 updateChannel 循环消息队列当中。
通过 NginxController 主进程 监听 updateChannel 中写入的事件,发生一个循环后会更新一个事件。
将事件追加同步到 SyncQueue 消息队列,等待被 协程更改配置文件。协程会定期从队列中拉取要执行的任务。
如果有一些必要直接需要修改、更新的任务会直接发送到 SyncQueue,由Store 直接沟通 SyncQueue。
收取到所有要更新的数据,协程会判断是否需要重载写入数据。
如果需要写入会写入到 Nginx 配置文件,并进行重载 Nginx服务。
如果不需要,会构造 Post 数据(不需要重载的数据)以 Lua Server 模块直接运行。
创建目录
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的映射端口。
运行一个 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
创建一个 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,跟之前写法有些不同,先将内网的两个 Pod 集群做好
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
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
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
验证访问,效果图不放了,轮询页面
www.nginx.com:32144
www.apache.con:32144
用 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
借用 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
名称 | 描述 | 值 |
---|---|---|
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