目录
一、传统方式:不借助ingress实现七层代理
Deployment启动一组容器,并通过svc暴露一个ip,实现负载均衡,而ngin则只需在配置文件中将暴露出的clusterIP写在配置文件的代理区域,同时将自己的service改为nodeport(或loadBalancer)。既实现负载均衡
缺点:需要每次都进入nginx里更改配置文件,不够动态
二、nginx-ingress
官网:
ngress-Nginx github 地址:https://github.com/kubernetes/ingress-nginx
Ingress-Nginx 官方网站:https://kubernetes.github.io/ingress-nginx/
网站里有不同的部署方案(loadBalancer)AWS/GCE/等,也有基于NodePort
Nginx软件层面七层代理最强,但不可热更新
三、使用ingress实现七层代理
将配置信息对象化。使管控起来更为便利,原理无太大差异
Nginx-ingress结构:为了满足ingress可动态更新的需求,进行了结构层次的修改
协程:轻量级线程
协程会和apiservcer联立,监听变化
Lua server模块:可以以异步方案更新 以lua语言编写
2种重载及更新
1.非紧急事件(死了一个pod):会被放在更新队列中,此更新队列写满后被主程拿到另一个队列再更新(可有可无的事件),二级缓冲机制
2.紧急事件(svc变动):即时生效,判断是否需要重载生效。需要重载则重载
主要还是为了,让nginx更稳定
四、部署ingrss-nginx及功能
1)ingrss-nginx国内无法下载(quay.io),需要翻墙,此处采用老师提供的,国内有小网站代理,但不稳定,建议买个国外服务器
【】mkdir /usr/local/kubernetes/ingress
【】tar -xf ingress-nginx.tar.gz /usr/local/kubernetes/ingress
【】cd ingress-nginx
【】ls
ingress.tar(镜像) mandatory.yaml(部署文件包含控制器,包含权限) service-nodeport.yaml(service网络)
2)导入镜像,master和node都需要
【】docker load -i ingress.tar
【】scp ingress.tar 各节点
各节点【】docker load -i ingress.tar
3)启动部署文件
【】kubectl apply -f mandatory.yam
【】kubectl apply -f service-nodeport.yaml
【】kubectl get pod --all-namespaces
【】kubectl get svc -n ingress-nginx
#【】kubectl exec -it -n ingress-nginx nginx-ingress-controller-7995bd9c47-4nrph -- /bin/sh
#可以进入从pod内看看发现和nginx原理是一样的
4)删除ingress的方法
【】cd /usr/local/kubernetes/ingress/ingress-nginx/
【】kubectl delete -f service-nodeport.yaml
【】kubectl delete -f service-nodeport.yaml
五、样例
1.Ingress-nginx HTTP代理访问
1)创建资源清单,并启动
【】mkdir ingress
【】vim http-deploy.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-dm
spec:
replicas: 2
template:
metadata:
labels:
name: nginx
spec:
containers:
- name: nginx
image: wangyanglinux/myapp:v1
imagePullPolicy: IfNotPresent #下载策略为本地有就不下载
ports:
- containerPort: 80 #端口80-
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
name: nginx #与deployment的对应
---
apiVersion: extensions/v1beta1 #ingress接口
kind: Ingress #ingress对象
metadata:
name: nginx-test
spec:
rules:
- host: www1.zn.com #主机名
http: #基于http协议
paths: #可以写多个等同location
- path: /
backend:
serviceName: nginx-svc #由名字为nginx-svc的svc提供的pod
servicePort: 80
【】kubectl apply -f http-deploy.yaml
【】kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
nginx-test www1.hongfu.com 80 4m11s
访问基于域名所以要写host文件
C:\Windows\System32\drivers\etc/hosts
192.168.1.71 www.zn.com
拿物理路由器做DNAT映射或者搭建四层负载均衡调度或F5
2.Ingress HTTPS代理访问(会话卸载层)
后端用什么都可以,此处实际也用了nginx
1)创建证书,以及cert存储方式
【】openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"
#新版openssl支持的一条命令注入方式,国家或组织等可通过-的方案添加
【】kubectl create secret tls tls-secret --key tls.key --cert tls.crt
#secret 存储安全类型的文件
tls类型 名字tls-secret --key指定私钥 --cert 指定证书
【】kubecctl get secret
【】kubectl describe secret tls-secret
Name: tls-secret
Namespace: default
Labels: <none>
Annotations: <none>
Type: kubernetes.io/tls
Data
====
tls.crt: 1143 bytes
tls.key: 1704 bytes
2)创建ingress的资源清单
【】vim 2.https.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: https
spec:
tls: #tls类型
- hosts:
- ssl.zn.com #https的域名
secretName: tls-secret #用的是哪个证书即哪个csecret对象
rules: #https主机的入口设置
- host: ssl.hongfu.com #入口主机的域名(80的域名)
http: #http协议
paths: #路径lacation区域
- path: /
backend:
serviceName: nginx-svc #找此clusterip调度的真实服务器
servicePort: 80 # 端口
【】kubectl apply -f 2.https.yaml
3.Nginx进行BasicAuth(访问认证)
1)生成密码文件
【】yum -y install httpd(或httpd-tools)
【】htpasswd -c auth 用户名
#生成密码文件,会车输入密码
【】kubectl create secret generic basic-auth --from-file=auth
#generic类型
【】vim basicauth.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-with-auth
annotations: #标记,lables主要用于K8S内部匹配,但此标记会被ingress-nginx应用程序所识别(需在应用程序里写相关配置)
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: basic-auth
nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - foo' #此3条代表要进行basicAuth
spec:
rules:
- host: auth.hongfu.com
http:
paths:
- path: /
backend:
serviceName: nginx-svc
servicePort: 80
【】kubectl apply -f basicauth.yaml
主机修改host文件添加对应解析,访问呢即可
4、ingress-nginx进行重写(跳转)
名称 | 描述 | 值 |
nginx.ingress.kubernetes.io/rewrite-target | 必须重定向流量的目标URI | 串 |
nginx.ingress.kubernetes.io/ssl-redirect | 指示位置部分是否仅可访问SSL(当Ingress包含证书时默认为True),即必须https | 布尔 |
nginx.ingress.kubernetes.io/force-ssl-redirect | 即使Ingress未启用TLS,也强制重定向到HTTPS,即访问任何都会调转到https | 布尔 |
nginx.ingress.kubernetes.io/app-root | 定义Controller必须重定向的应用程序根,如果它在'/'上下文中 | 串 |
nginx.ingress.kubernetes.io/use-regex | 指示Ingress上定义的路径是否使用正则表达式 | 布尔 |
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: rew
annotations:
nginx.ingress.kubernetes.io/rewrite-target: http://ssl.fongfu.com:31795/hostname.html #也可以写https
spec:
rules:
- host: rew.hongfu.com #主机名,即访问foo10,跳转到ssl,hongfu。com:31795
http:
paths:
- path: /
backend:
serviceName: nginx-svc
servicePort: 80
做完清空以下,以免影响后续
【】kubectl delete ingress --all
【】kubectl delete svc nginx-svc
【】kubectl delete deployment --all
【】kubectl delete secret basic-auth tls-secret #注意默认的不要删除(default-token-brcmv)
总结:和svc对比优点和缺点即四七层的优缺点