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
四、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
五、常用配置
通过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/