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: v1 kind: Service metadata: name: ingress-nginx namespace : ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx spec: 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
|
###注释:定义pod 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 ####注释:添加server --- apiVersion: v1 kind: Service metadata: name: myapp spec: 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/v1beta1 kind: Ingress metadata: name: nginx-test spec: 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/)