https://www.cnblogs.com/caodan01/p/15142709.html
一、介紹
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/