1.ingress控制器部署
Ingress 公開了從集群外部到集群內服務的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 資源上定義的規則控制。
你可以在集群中部署任意數量的 ingress 控制器。 創建 ingress 時,應該使用適當的 ingress.class
注解每個
Ingress 以表明在集群中如果有多個 Ingress 控制器時,應該使用哪個 Ingress 控制器。
如果不定義 ingress.class
,云提供商可能使用默認的 Ingress 控制器。
Ingress 是對集群中服務的外部訪問進行管理的 API 對象,典型的訪問方式是 HTTP。
Ingress 可以提供負載均衡、SSL 終結和基于名稱的虛擬托管
部署 nginx ingress控制器
默認配置從所有名稱空間監視Ingress對象。
若要更改此行為,請使用該標志--watch-namespace
將范圍限制為特定的名稱空間。
裸機安裝: 版本不同具體根據查看官網 https://kubernetes.github.io/ingress-nginx/deploy/
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.40.2/deploy/static/provider/baremetal/deploy.yaml
# 下載好鏡像,更具具體版本 可以配置docker socks5代理下載鏡像
docker pull k8s.gcr.io/ingress-nginx/controller:v0.40.2
# 部署到本地倉庫,它有三個鏡像,有兩個job
# 修改yaml文件鏡像地址
kubectl apply -f deploy.yaml
kubectl get pod -n ingress-nginx
kubectl get svc -n ingress-nginx
配置通過主機80,443端口訪問
# 更改為DaemonSet控制器
kind: DaemonSet
# 更改為主機網絡
hostNetwork: true
Nginxinc版
部署traefik ingress控制器
# 安裝helm3
wget https://get.helm.sh/helm-v3.4.0-linux-amd64.tar.gz
tar axf helm-v3.4.0-linux-amd64.tar.gz
cp linux-amd64/helm /usr/local/bin
helm repo add traefik https://helm.traefik.io/traefik
helm repo update
helm pull traefik/traefik
kubectl create ns traefik
helm install traefik ./traefik -n traefik
IngressClass資源
Kubernetes中的Ingress API使大量控制器能夠提供簡單而強大的方法來管理到Kubernetes工作負載的入站網絡流量。在Kubernetes 1.18中,我們對該API進行了3個重要的添加:
- 一個新
pathType
字段,可以指定應如何匹配Ingress路徑。 -
IngressClass
可以指定控制器應如何實現Ingress的新資源。 - 支持主機名中的通配符
ingressclass概念:
安裝Ingress Controller 時可以指定參數 -ingress-class <string > ,默認是nginx
這個參數指定的就是這個ingress控制器是屬于那個IngressClass
當創建一個ingress時,通過 spec.ingressClassName: <string > 來指定這個ingress屬于那個IngressClass,屬于那個ingress控制器
在IngressClass資源上將annotations ingressclass.kubernetes.io/is-default-class設置 為true,將確保未指定ingressClassName新的Ingress分配此默認值
IngressClass
。
# 這是 Nginxinc版提供安裝方式中會有這個資源清單 common/ingress-class.yaml
apiVersion: networking.k8s.io/v1beta1
kind: IngressClass
metadata:
name: nginx
#annotations:
#ingressclass.kubernetes.io/is-default-class: "true"
spec:
controller: nginx.org/ingress-controller
# k8s版nginx
apiVersion: networking.k8s.io/v1beta1
kind: IngressClass
metadata:
name: nginx
annotations:
ingressclass.kubernetes.io/is-default-class: "true"
spec:
controller: k8s.io/ingress-nginx
2.ingress單個Service
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-dm
spec:
replicas: 2
selector:
matchLabels:
name: nginx
template:
metadata:
labels:
name: nginx
spec:
containers:
- name: nginx
image: ikubernetes/myapp:v7
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
name: nginx # 關聯標簽nam:nginx的 pod
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-test
spec:
rules:
- host: www.kubetest.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-svc # 關聯名稱 nginx-svc 的service
port:
number: 80
kubectl get svc -n ingress-nginx
ingress-nginx-controller NodePort 10.110.171.65 <none> 80:32180/TCP,443:30700/TCP 66m
ingress-nginx-controller-admission ClusterIP 10.110.217.3 <none> 443/TCP 66m
外部訪問http://www.kubetest.com:32180/hostname.html
原理相當于把規則注入到nginx配置文件中
進入ingress-nginx可以看到相關nginx配置文件配置
kubectl exec -it ingress-nginx-controller-785557f9c9-skgkw -n ingress-nginx /bin/bash
3.ingress基于名稱的虛擬托管
基于名稱的虛擬主機支持將針對多個主機名的 HTTP 流量路由到同一 IP 地址上。
graph TD
A{ingress}-->|www.ingress.com|B{SVC1}
A{ingress}-->|res.ingress.com|C{SVC2}
B-->D[pod1 v1]
B-->E[pod2 v1]
C-->F[pod1 v2]
C-->G[pod1 v2]
ingress.http1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment1
spec:
replicas: 2
selector:
matchLabels:
name: nginx1
template:
metadata:
labels:
name: nginx1
spec:
containers:
- name: nginx
image: ikubernetes/myapp:v7
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: svc1
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
name: nginx1
ingress.http2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment2
spec:
replicas: 2
selector:
matchLabels:
name: nginx2
template:
metadata:
labels:
name: nginx2
spec:
containers:
- name: nginx
image: ikubernetes/myapp:v7
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: svc2
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
name: nginx2
ingressrule.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress
spec:
rules:
- host: www.ingress.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: svc1
port:
number: 80
- host: res.ingress.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: svc2
port:
number: 80
4.ingress https代理訪問
https://kubernetes.github.io/ingress-nginx/examples/auth/client-certs/
創建自簽證書
openssl req -x509 -sha256 -newkey rsa:4096 -keyout ca.key -out ca.crt -days 356 -nodes -subj '/CN=My Cert Authority'
# 創建包含CA證書和服務器證書的密鑰,該密鑰可同時用于TLS和客戶端身份驗證
kubectl create secret tls tls-secret --key ca.key --cert ca.crt
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress
spec:
tls:
- hosts:
- www.ingress.com
secretName: tls-secret
rules:
- host: www.ingress.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: svc1
port:
number: 80
- host: res.ingress.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: svc2
port:
number: 80
外部訪問 https://www.ingress.com:30700/
根據查看配置文件及測試發現 只要配置了tls,所有ingress的所有域名都有https
5.nignx-ingress基本認證
Basic Authentication
本示例說明如何使用包含由生成的文件的機密在Ingress規則中添加身份驗證htpasswd
。生成的文件的名稱很重要auth
(實際上-機密具有密鑰data.auth
),否則入口控制器將返回503。
yum -y install httpd
# 創建用戶foo
htpasswd -c auth foo
kubectl create secret generic basic-auth --from-file=auth
kubectl get secret basic-auth -o yaml
apiVersion: networking.k8s.io/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: foo.bar.com
http:
paths:
- path: /
backend:
serviceName: svc1
servicePort: 80
驗證
curl -v http://10.0.0.2:32180 -H 'Host: foo.bar.com' -u 'foo:123'
6.nginx-ingress重寫
部署方式
可以使用以下注釋控制重寫:
名稱 | 描述 | 價值觀 |
---|---|---|
nginx.ingress.kubernetes.io/rewrite-target | 必須將流量重定向到的目標URI | 串 |
nginx.ingress.kubernetes.io/ssl-redirect | 指示位置部分是否僅可訪問SSL(Ingress包含證書時默認為True) | 布爾 |
nginx.ingress.kubernetes.io/force-ssl-redirect | 即使未啟用TLS,也強制將重定向到HTTPS | 布爾 |
nginx.ingress.kubernetes.io/app-root | 定義如果在“ /”上下文中,控制器必須重定向的應用程序根 | 串 |
nginx.ingress.kubernetes.io/use-regex | 指示在Ingress上定義的路徑是否使用正則表達式 | 布爾 |
# nginx.ingress.kubernetes.io/app-root: /app1
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: rewrite-target
annotations:
nginx.ingress.kubernetes.io/rewrite-target: https://www.ingress.com:30700/
spec:
rules:
- host: r.ingress.com
http:
paths:
- path: /
backend:
serviceName: svc1
servicePort: 80