如何使用 MetalLB 配置 k8s 反向代理服务

How to configure a k8s reverse proxy service with MetalLB

我需要从端口 80 到达 jupyter-lab 并将 k8s 配置重定向到 8888。这是我设置自己学习 k8s 网络的问题,并且还获得了 jupyter-lab 运行.

这是 MetalLB 配置图。 本地 DNS 将“jupyter-lab.k8s.home”解析为这些 IP 地址

---
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 10.10.10.24-10.10.10.26

这是我的 LoadBalancer 指向入口控制器,这不是暴露端口 80 并重定向到目标 8888 吗?

---
apiVersion: v1
kind: Service
metadata:
  name: jupyter-lab-lb
  namespace: default
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 8888
  selector:
    app: jupyter-lab-ingress

这是我的入口控制器,是否正确配置了指向 CIP 的入口对象?

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: jupyter-lab-ingress
  annotations:
    # nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io: /
spec:
  rules:
  - host: jupyter-lab.k8s.home
    http:                      
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: jupyter-lab-cip
            port:
              number: 8888

这是针对我的 jupyer-lab 部署的 CIP

---
apiVersion: v1
kind: Service
metadata:
  name: jupyter-lab-cip
  namespace: default
spec:
  type: ClusterIP
  ports:
    - port: 8888
      targetPort: 8888
  selector:
    app: jupyter-lab


这是我的部署 运行 jupyter-lab 端口 8888

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jupyter-lab-dpt
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jupyter-lab
  template:
    metadata:
      labels:
        app: jupyter-lab
    spec:
      volumes:
        - name: jupyter-lab-home
          persistentVolumeClaim:
            claimName: jupyter-lab-pvc
      containers:
        - name: jupyter-lab
          image: docker.io/jupyter/tensorflow-notebook
          ports:
            - containerPort: 8888
          volumeMounts:
            - name: jupyter-lab-home
              mountPath: /var/jupyter-lab_home
          env:
            - name: "JUPYTER_ENABLE_LAB"
              value: "yes"

我确实看到了 jupyter-lab.k8s.home:8888,但我无法使用从 kubectl logs -n default jupyter-lab-dpt-dfbd554b7-bf7fk

获得的令牌登录

如何设置配置以便我可以浏览到 http://jupyter-lab.k8s.home?noportnumber

安装 nginx ingress conrtoller 后(这是您上一个问题中的 link)应该会创建一个服务:

# Source: ingress-nginx/templates/controller-service.yaml
apiVersion: v1
kind: Service
metadata:
  annotations:
  labels:
    helm.sh/chart: ingress-nginx-3.23.0
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/version: 0.44.0
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/component: controller
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  type: NodePort
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: http
    - name: https
      port: 443
      protocol: TCP
      targetPort: https
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/component: controller

您可以通过 运行:

来确定它是否存在
kubectl  get svc -n ingress-nginx ingress-nginx-controller
NAME                       TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller   NodePort   10.105.157.46   <none>        80:30835/TCP,443:31421/TCP   17s

注意它的类型是 NodePort,你需要 LoadBalancer。 运行 kubectl edit svc -n ingress-nginx ingress-nginx-controller 并将 NodePort 更改为 LoadBalancer.

现在你应该看到这个:

kubectl get svc -n ingress-nginx ingress-nginx-controller 
NAME                       TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller   LoadBalancer   10.105.157.46   <pending>     80:30835/TCP,443:31421/TCP   83s

如果您的 metalLB 配置正确,应该有一个 IP 代替 。现在将您的域指向此 IP。

您提到:Local DNS resolves "jupyter-lab.k8s.home" to these ip addresses。不要解析到所有地址。使用分配给 LB 的那个。只有这个。

您的入口看起来不错,但您不需要此注释。

jupyter-lab-cip 服务看起来也不错。

我不喜欢 jupyter-lab-lb 服务。你不需要它。您需要的是一个负载均衡器,但如前所述指向入口控制器。

我也不确定这是什么:

  selector:
    app: jupyter-lab-ingress

您的 deploymet 没有 app: jupyter-lab-ingress 标签。 Nginx 入口控制器也没有它(除非你添加了它,但没有提到)。所以我不确定它背后的想法是什么以及你试图实现什么。不管怎样,你可能不需要它。


I do see jupyter-lab.k8s.home:8888, but I can't log in with the token I get from kubectl logs -n default jupyter-lab-dpt-dfbd554b7-bf7fk

我不确定为什么会这样,因为您提供的配置不允许这样做(除非我遗漏了某事)。