K8S traefik-ingress-controller搭建

ingress负责请求路由到内部的service,这里选择用traefik的方案

2.x版本参考:https://cloud.tencent.com/developer/article/1615712

网上很多nginx-ingress的教程应该都要更新了,这里和之前不一致了https://kubernetes.github.io/ingress-nginx/deploy/

配置地址(如果版本2.0以下可以直接去examples目录下获取yaml):
https://github.com/containous/traefik/tree/v1.7/examples/k8s

创建一个单独放置traefik的文件夹,下载或复制配置
分别运行

kubectl apply -f traefik-rbac.yaml
kubectl apply -f traefik-deployment.yaml

在这里插入图片描述
deployment配置中默认的service应该就是type: NodePort,如果不是就edit修改为nodeport
在这里插入图片描述
浏览器输入nodeip:nodeport即可访问ui页面
在这里插入图片描述
但是这样太low了,还得加端口
我尝试了将ingress直接代理到service上,虽然页面已经有了配置,host也已经配置成功的情况下依然访问不到

在这里插入图片描述

问题可能出现在节点ip上,这里是一个集群ip,外部无法访问,而nodeport又无法设置为80,所以只能使用host模式来代理,修改如下配置,添加hostNetwork

在这里插入图片描述
再看一下pod对应node的ip

kubectl get pod -n kube-system -o wide

在这里插入图片描述
创建ingress路由

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: traefik-web-ui
  namespace: kube-system
spec:
  rules:
  # 修改主机的host文件 不是虚拟机的哦
  - host: test.traefik.com
    http:
      paths:
      - path: /
        backend:
          #service的名称
          serviceName: traefik-ingress-service
          #port的名称 一定要对上否则找不到
          servicePort: controller

配置host(win的用户百度找下,mac /etc/hosts)
在这里插入图片描述
打开浏览器访问 http://test.traefik.com

在这里插入图片描述
为了测试能否代理不同的命名空间,我又创建了一个default命名空间的nginx pod

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort

创建nginx-ingress

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
spec:
  rules:
  - host: test.nginx.com
    http:
      paths:
      - path: /nginx
        backend:
          serviceName: nginx
          servicePort: web

修改service,添加port名称为web

kubectl edit svc nginx

在这里插入图片描述
访问http://test.nginx.com/

在这里插入图片描述
看来不同命名空间的是可以共用一个ingress-controller的,但是service和ingress需要在同一个命名空间

以上是1.7版本


2.x版本,稍微有点坑,至于哪里坑我也不知道

2.3官网的Example,https://docs.traefik.io/routing/providers/kubernetes-crd/

crd和rbac如果不切换namespace的话可以直接执行,至于Deployment和IngressRoute的话,我这里是感觉有问题的,换成这样是可以

apiVersion: apps/v1
kind: Deployment
metadata:
  name: traefik
  labels:
    app: traefik
spec:
  selector:
    matchLabels:
      app: traefik
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: traefik
    spec:
      serviceAccountName: traefik-ingress-controller
      tolerations:
      - operator: "Exists"
      containers:
      - image: traefik:v2.3
        name: traefik
        ports:
        - name: web
          containerPort: 80
          hostPort: 80
        - name: websecure
          containerPort: 443
          hostPort: 443
        args:
        - --log.level=INFO
        - --accesslog
        - --entryPoints.web.address=:80
        - --entryPoints.websecure.address=:443
        - --api=true
        - --api.dashboard=true
        - --ping=true
        # - --providers.kubernetesingress
        - --providers.kubernetescrd
      

然后页面话使用内置的service

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: traefik-dashboard
spec:
  entryPoints:
  - web
  routes:
  - match: Host(`test.traefik.com`)
    kind: Rule
    services:
    - name: api@internal
      kind: TraefikService


但是这里有个问题,域名解析到master的ip时无法访问,node的ip是没问题的,不清楚什么情况,集群正常,nodeport,pod内解析servicename都ok,知道的大佬评论或私信交流下。。

Logo

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

更多推荐