如何使用 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
我不确定为什么会这样,因为您提供的配置不允许这样做(除非我遗漏了某事)。
我需要从端口 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 代替
您提到: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
我不确定为什么会这样,因为您提供的配置不允许这样做(除非我遗漏了某事)。