简介

Kubernetes集群搭建完后需要一个外部边缘网关,也就是ingress,因为不可能所有的服务都提过service的nodepod暴露,如果服务多了,后面集群的端口可能会不够用,而且也没有像nginx一样的灵活的转发策略,这里我们使用traefik作为集群的ingress。

架构图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sdSuCqBf-1661412781095)(C:\Users\xuzhiwei\AppData\Roaming\Typora\typora-user-images\image-20220825152636842.png)]

架构详解
  • ingress traefik详细转发步骤:外部域名访问 ——> node集群负载均衡 ——>ingress traefik service ——> ingress traefik pod ——> 其他服务service ——> 其他服务pod
  • 集群通过外部负载均衡转发到ingress再分发到各个容器服务,ingress在k8s里起的是普通服务架构里nginx的作用

前提要求

  • 一个k8s集群,单节点或高可用都可以,搭建参考 k8s搭建 或者 k8s高可用搭建
  • 一个4层负载均衡节点,可以是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
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐