k8s的ingress treafik部署使用
Kubernetes集群搭建完后需要一个外部边缘网关,也就是ingress,因为不可能所有的服务都提过service的nodepod暴露,如果服务多了,后面集群的端口可能会不够用,而且也没有像nginx一样的灵活的转发策略,这里我们使用traefik作为集群的ingress。
简介
Kubernetes集群搭建完后需要一个外部边缘网关,也就是ingress,因为不可能所有的服务都提过service的nodepod暴露,如果服务多了,后面集群的端口可能会不够用,而且也没有像nginx一样的灵活的转发策略,这里我们使用traefik作为集群的ingress。
架构图
架构详解
- ingress traefik详细转发步骤:外部域名访问 ——> node集群负载均衡 ——>ingress traefik service ——> ingress traefik pod ——> 其他服务service ——> 其他服务pod
- 集群通过外部负载均衡转发到ingress再分发到各个容器服务,ingress在k8s里起的是普通服务架构里nginx的作用
前提要求
部署安装
机器详情
# master节点
10.0.1.176
# node节点
10.0.1.177 10.0.1.178
# 负载均衡节点
10.0.1.179
nginx搭建(在负载均衡节点上,搭建略,这里可以是nginx+keepalived的高可用负载均衡)
k8s_ingress.conf文件内容如下,代理node的端口,创建并加入到nginx配置文件中
# 代理到k8s集群node节点173,174,175的8000和8443端口
stream {
upstream traefikhttp {
server 10.0.1.177:8000;
server 10.0.1.178:8000;
}
upstream traefikhttps {
server 10.0.1.177:8443;
server 10.0.1.178:8443;
}
server {
listen 80;
proxy_pass traefikhttp;
}
server {
listen 443;
proxy_pass traefikhttps;
}
}
启动nginx监听端口
k8s的master节点下载yaml文件
wget https://github.com/xuwei777/xw_yaml/blob/main/traefik-rbac.yaml
wget https://github.com/xuwei777/xw_yaml/blob/main/traefik.yaml
k8s的master节点执行安装traefik
kubectl apply -f traefik-rbac.yaml
kubectl apply -f traefik.yaml
查看traefik是否已经运行
kubectl get pod -n kube-system |grep traefik
配置4层代理代理到集群的node节点端口
确认运行后有3个端口,8000(http),8443(https),9000(管理端口)
可以将外层负载均衡的80端口代理到node节点的8000,443端口代理到node节点的8443
配置使用
创建普通代理服务配置
例如这里我创建一个在test命名空间的代理配置,test.ingress.com域名,/路径转发默认转发到app1-svc的service的9001端口上,匹配到/app2/转发到app1-svc的service的9002端口上(这里端口指的是暴露在cluster ip上的端口,也就是service配置里的port,而非targetPort)
vim test_ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
#nginx.ingress.kubernetes.io/rewrite-target: /
#kubernetes.io/ingress.class: "nginx"
#kubernetes.io/tls-acme: "true"
#nginx.ingress.kubernetes.io/proxy-body-size: 50m
kubernetes.io/ingress.class: traefik
traefik.frontend.rule.type: PathPrefixStrip
name: cabzoo-ingress-nginx-ssl # Ingress 的名字,仅用于标识
namespace: test # ingress所在的命名空间
spec:
rules: # Ingress 中定义 L7 路由规则
- host: test.ingress.com # 根据 virtual hostname 进行路由(请使用您自己的域名)
http:
paths: # 按路径进行路由
- path: /
backend:
serviceName: app1-svc # 转发到app1-svc的service
servicePort: 9001 # 转发到的service的端口
- host: test.ingress.com # 根据 virtual hostname 进行路由(请使用您自己的域名)
http:
paths: # 按路径进行路由
- path: /app2/
backend:
serviceName: app2-svc # 转发到app2-svc的service
servicePort: 9002 # 转发到的service的端口
创建域名的ssl配置
准备好域名的key和pem文件,例如我这里是test.ingress.com域名的文件
创建证书的secret,名为testssl,在test命名空间
kubectl create secret tls testssl --key test.ingress.com.key --cert test.ingress.com.pem -n test
创建ingress配置
vim test_ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
#nginx.ingress.kubernetes.io/rewrite-target: /
#kubernetes.io/ingress.class: "nginx"
#kubernetes.io/tls-acme: "true"
#nginx.ingress.kubernetes.io/proxy-body-size: 50m
kubernetes.io/ingress.class: traefik
traefik.frontend.rule.type: PathPrefixStrip
name: cabzoo-ingress-nginx-ssl # Ingress 的名字,仅用于标识
namespace: test # ingress所在的命名空间
spec:
rules: # Ingress 中定义 L7 路由规则
- host: test.ingress.com # 根据 virtual hostname 进行路由(请使用您自己的域名)
http:
paths: # 按路径进行路由
- path: /
backend:
serviceName: app1-svc # 转发到app1-svc的service
servicePort: 9001 # 转发到的service的端口
- host: test.ingress.com # 根据 virtual hostname 进行路由(请使用您自己的域名)
http:
paths: # 按路径进行路由
- path: /app2/
backend:
serviceName: app2-svc # 转发到app2-svc的service
servicePort: 9002 # 转发到的service的端口
tls: # ssl的配置
- hosts:
- test.ingress.cn # 域名
secretName: testssl # 创建的secret的名字
访问验证
如果是内网指定的域名,必须将域名和ip绑定在hosts(这里域名将绑定在负载均衡的ip上再代理到node节点的8000端口)
echo '10.0.1.179 test.ingress.com' >> /etc/hosts
请求域名http://test.ingress.com/查看是否是aap1的内容,再请求http://test.ingress.com/app2/查看是否是app2的内容
# 可以使用curl或者其他方式都可以,这里如果配置了ssl也可以访问https
curl http://test.ingress.com/
curl http://test.ingress.com/app2/
ess.com/查看是否是aap1的内容,再请求http://test.ingress.com/app2/查看是否是app2的内容
# 可以使用curl或者其他方式都可以,这里如果配置了ssl也可以访问https
curl http://test.ingress.com/
curl http://test.ingress.com/app2/
查看test命名空间下的ingress
kubectl get -n test ingress
更多推荐
所有评论(0)