Kubernetes部署Ingress
Ingress基本概念
通俗来讲,ingress和Service、Deployment,也是一个k8s的资源类型,ingress用于实现用域名的方式访问k8s内部应用。
通过用户访问的 URL,把请求转发给不同的后端 Service。这种全局的,为了代理不同后端Service而设置的负载均衡服务,就是Kubernetes里的Ingress服务。
client > 负载均衡(nginx) > ingress > service > pod (客户请求至负载均衡,负载均衡在到达ingress,ingress分发至不同server,server分配至pod)
1、部署ingress-nginx
获取配置文件:https://github.com/kubernetes/ingress-nginx/blob/nginx-0.20.0/deploy/mandatory.yaml
这边下载失败,直接拷贝内容自己创建mandatory.yaml。
查看一下文件需要下载一个镜像,镜像比较大,就在一台node上面直接执行下载。

在两个node上直接下载镜像:docker pull quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.20.0


以上操作完成,在k8s执行:
kubectl apply -f mandatory.yaml

执行完成查看:kubectl get pod -n ingress-nginx

然后将ingress暴露出去:vim service-nodeport.yaml
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
apiVersion: v1kind: Servicemetadata: name: ingress-nginx namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginxspec: type: NodePort ports: - name: http port: 80 targetPort: 80 protocol: TCP nodePort: 32080 #http - name: https port: 443 targetPort: 443 protocol: TCP nodePort: 32443 #https selector: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx |

查看暴露出去的ingress服务:kubectl get svc -n ingress-nginx

2、创建一个server及后端deployment(以nginx为例)
vim svc-deployment.yaml
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
###注释:定义podapiVersion: apps/v1kind: Deploymentmetadata: name: myapp-deployspec: replicas: 3 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: nginx imagePullPolicy: IfNotPresent ports: - containerPort: 80####注释:添加server---apiVersion: v1kind: Servicemetadata: name: myappspec: selector: app: myapp ports: - name: http port: 80 targetPort: 80 |
查看创建的pod

查看创建的server

测试通过svc访问pod,nginx副本数三个,修改的html文件访问时现实顺序。

然后将nginx加入ingress中,我们定义的名字为myapp,创建时候需要用到myapp名字。
vim ingress.yaml
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
apiVersion: extensions/v1beta1kind: Ingressmetadata: name: nginx-testspec: rules: - host: www.test.com http: paths: - path: / backend: serviceName: myapp servicePort: 80###注释host:添加一个域名,测试时候通过域名访问serviceName:将svc添加至ingress中 |
创建kubectl apply -f ingress.yaml
查看是否创建:kubectl get ingress

查看ingrss对外80暴露的端口是32080
kubectl get svc -n ingress-nginx

上面我们给ingress的yaml文件中设置了一个域名:www.test.com 我们通过外部windowns访问时就需要修改win的hosts文件
修改路径:C:\Windows\System32\drivers\etc\hosts
添加域名,及k8s服务器的ip地址。

然后测试访问,看是否通过域名可以访问。
ingress中添加的域名地址为:www.test.com ,ingress的80对外端口是32080,我们通过域名加端口进行访问测试,看是否能访问成功,访问成功是否是轮询访问三台nginx。


由此可见通过ingress访问server,server在分发至pod访问成功。
ingress扩展
项目中有的需要https访问时就需要添加证书进行访问,以下就是ingress添加https
首先测试环境,手动生成一个简单的证书用于测试。
#创建公私钥 openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc" #通过kubectl的secret将证书封装,定义一个名称(tls-secret)将其封装进去 kubectl create secret tls tls-secret --key tls.key --cert tls.crt

创建完成执行封装

创建一个deployment,svc用于实验还是用nginx镜像
vim svc-deployment (跟之前一样deployment,svc是不变的,主要是在ingress里面添加封装的证书)
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: myapp-ser
spec:
selector:
app: myapp
ports:
- name: http
port: 80
targetPort: 80
kubectl apply -f svc-deployment.yaml
查看是否创建deployment,及svc

创建ingress:vim ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx-https
spec:
tls:
- hosts:
- www.min.com #证书添加域名
secretName: tls-secret #指定封装的证书
rules:
- host: www.min.com #指定域名
http:
paths:
- path: /
backend:
serviceName: myapp-ser #指定server的名称调用server
servicePort: 80
创建完成进行查看

域名访问需要在本地添加hosts 地址:C:\Windows\System32\drivers\etc\hosts

查看ingress的443对外端口:kubectl get svc -n ingress-nginx

输入地址测试:https://www.min.com:32443,是否是以https进行访问


由此可见配置ingress的https访问测试成功。
ingress的nginx地址重写扩展

在上面(配置ingress的https)中我们使用的是https访问(https://www.min.com:32443)。为了测试创建一个svc,及deployment,然后通过ingress进行重定向至https网站
创建一个www.max.com网站,重定向至:https://www.min.com:32443
vim svc-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-rewrite
spec:
replicas: 1
selector:
matchLabels:
app: myapp1
template:
metadata:
labels:
app: myapp1
spec:
containers:
- name: myapp1
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-rewrite-ser
spec:
selector:
app: myapp1
ports:
- name: http1
port: 80
targetPort: 80
创建完成查看

然后创建ingress,进行重定向
vim ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx-inge-wir
annotations:
nginx.ingress.kubernetes.io/rewrite-target: https://www.min.com:32443
spec:
rules:
- host: www.max.com #对外提供网站
http:
paths:
- path: /
backend:
serviceName: nginx-rewrite-ser
servicePort: 80
#访问www.max.com,然后重新定向至https的www.min.com网站上去。
创建完成查看

还是需要在本地的win系统内hosts添加一个www.max.com的域名

已经添加hosts,我们访问www.max.com:32080,看是否能跳转至https://www.min.com:32443


ingress的重定向已经完成并且成功。
ingress还提供了很多功能,可以在官网一一查看学习(Ingress-Nginx 官方网站:https://kubernetes.github.io/ingress-nginx/)

浙公网安备 33010602011771号