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访问成功。