1

我暂时决定使用 Kubernetes,最好是使用 Rancher,这样我就可以在我的家庭办公室设置中轻松启动和关闭容器化应用程序并运行 Web 服务器等。我有一个相当正常的互联网设置,路由器通过我的 ISP 的静态 IP 连接到互联网。我希望能够在办公室 LAN 上的裸机服务器上安装 Web 应用程序,以便其中一些可以通过 Internet 访问,而另一些只能通过 LAN 访问。我已经决定将 k3s 作为 Kubernetes 发行版。

我打算使用从路由器到服务器上的 IP 地址的端口转发,并在其上托管不同域的多个 Web 服务器。路由器最初会通过路由器上的主机名条目找到应用程序,但稍后可能会通过托管在 k3s 上的 DNS 服务器找到应用程序。

仔细阅读,我需要 MetalLB 和 Kubernetes 安装上的某种 Ingress 控制器。
MetalLB 为 k3s “集群”和入口控制器提供 IP 地址,以执行到 k3s 集群中各个服务器的第 7 层路由。我发现 ingress-nginx 可能是一个合适的入口,但我的安装有几个我无法解决的问题。我希望 MetalLB 在服务器网络 i/f 上广播多个 IP 地址:

一个 IP 用于通过端口转发从外部访问的应用程序,另一个 IP 用于那些仅具有内部可访问应用程序的服务器。

我在下文中追求的是简洁而不是简洁,因为我认为这是一个足够复杂的设置,是必要的。我给出了各个部分的确切安装说明,以便人们可以准确地看到我在做什么:

安装 k3s:

curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.21.4+k3s1 sh -s -

然后通过编辑 /etc/systemd/system/k3s.service 禁用 Traefik 和 servicelb,使 ExecStart 行变为:

ExecStart=/usr/local/bin/k3s server --disable traefik --disable servicelb

安装 CertManager 如下:

kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.crds.yaml
kubectl create namespace cert-manager
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager --namespace cert-manager --version v1.5.3

安装 MetalLB:

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/metallb.yaml
kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"

在 metallb-config.yaml 中使用以下内容:

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: lan-facing
      protocol: layer2
      addresses:
      - 192.168.1.17/32
    - name: inetfa
      protocol: layer2
      addresses:
      - 192.168.1.16/32

跑:

kubectl apply -f metallb-config.yaml

安装 nginx:

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx-plain ingress-nginx/ingress-nginx --version 4.0.1

kubectl apply -f ingress-nginx-baremetal-github.yaml

其中 ingress-nginx-baremetal-github.yaml 是https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.1/deploy/static/provider/baremetal/deploy.yaml中引用的文件在https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal部分 Bare-metal 的 ingress-nginx 安装页面上进行了以下更改:

# Source: ingress-nginx/templates/controller-service.yaml
apiVersion: v1
kind: Service
metadata:
  annotations:
    metallb.universe.tf/address-pool: inetfa
...
spec:
  type: LoadBalancer

即,已添加注释“metallb.universe.tf/address-pool:inetfa”并将NodePort更改为LoadBalancer。

我已经使用 bitnami Apache 安装了服务器,如下所示:

helm install my-release -f apache1-configmap.yaml bitnami/apache

此设置更改的目的是使 ingress-nginx 安装使用 MetalLB 通过匹配的地址池名称“inetfa”分发的 IP 地址 192.168.1.16

我的服务器应用程序使用的 IP 地址是 192.168.1.17/32,尽管基于“apache1-configmap.yaml”文件,第 7 层路由工作正常,例如:

...
ingress:
...
  hostname: apache1.local
...
  ingressClassName: nginx
...

所以,回顾一下我所拥有的:

我可以拥有多个具有不同主机名的 apache 服务器。Ingress-nginx 基于主机的路由根据各自 apache configmap.yaml 文件中的主机名工作到每个服务器

它们都来自 MetalLB 在其地址池中看到的第一个 IP,而不是根据需要在 ingress-nginx 设置中由注释选择的 IP。

似乎它是使用的第一个地址池,它没有设置“自动分配:false”,无论 metallb.universe.tf/address-pool: 注释和地址池名称如何。这不好,因为我需要在所有地址池上使用“auto-assign: false”,以防止在 Web 上访问错误的服务应用程序。

谁能看到我做错了什么以及我需要改变什么才能让地址池选择在 MetalLB 和 ingress-nginx 之间工作?

当我为面向 Internet 的应用程序选择地址池时,我想让另一个地址池为面向 LAN 的应用程序工作,如果我需要单独安装 nginx,或者是否需要单独安装 nginx,我将不胜感激这是一种安装一个 ingress-nginx 以支持多个 IngressClass 的方法,因此“ingress-nginx-baremetal-github.yaml”提供的“nginx” IngressClass 可以通过例如“nginxlanonly”IngressClass 来补充,该 IngressClass 使用不同的地址池。如果该想法行不通,任何人都知道如何做到这一点或如何实现相同的目标?

4

0 回答 0