没有创建负载均衡器并将静态 ip 分配给 GKE 上的 traefik ingress

No load balancer created and static ip assigned to traefik ingress on GKE

当我设置入口控制器以指向 traefik 服务时,我希望在 GKE 上为该入口控制器创建负载均衡器,方式与 LoadBalancer 服务相同。然后我可以指向创建的静态 ip。

但是,当我进入入口时,没有分配静态 IP。

$ kubectl get ingresses -n kube-system
NAME              HOSTS                 ADDRESS   PORTS     AGE
traefik-ingress   traefik-ui.minikube             80        4m

traefik-ingress.yml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: traefik-ingress
  namespace: kube-system
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
    - host: traefik-ui.minikube
      http:
        paths:
          - path: "/"
            backend:
              serviceName: traefik-ingress-service
              servicePort: 80

traefik-deployment.yml

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
  labels:
    k8s-app: traefik-ingress-lb
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: traefik-ingress-lb
  template:
    metadata:
      labels:
        k8s-app: traefik-ingress-lb
        name: traefik-ingress-lb
    spec:
      serviceAccountName: traefik-ingress-controller
      terminationGracePeriodSeconds: 60
      containers:
        - image: traefik
          name: traefik-ingress-lb
          ports:
            - name: http
              containerPort: 80
            - name: admin
              containerPort: 8080
          args:
            - --api
            - --kubernetes
            - --logLevel=INFO
---
kind: Service
apiVersion: v1
metadata:
  name: traefik-ingress-service
  namespace: kube-system
spec:
  selector:
    k8s-app: traefik-ingress-lb
  ports:
    - protocol: TCP
      port: 80
      name: web
    - protocol: TCP
      port: 8080
      name: admin
  type: NodePort

您正在为 traefik 部署创建一个 Service 对象,但您使用了 NodePort 类型,该类型只能从集群内部访问。如果你想让 Kubernetes 为 Service 创建一个 LoadBalancer,你需要在你的服务中指定类型 LoadBalancer,所以你的 traefik Service 看起来像

kind: Service
apiVersion: v1
metadata:
  name: traefik-ingress-service
  namespace: kube-system
spec:
  selector:
    k8s-app: traefik-ingress-lb
  ports:
    - protocol: TCP
      port: 80
      name: web
    - protocol: TCP
      port: 8080
      name: admin
  type: LoadBalancer

这将与 GKE API 通信并为您创建一个带有 IP 的 LoadBalancer。