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