# 修改 Kubelet NodePort 地址范围暴露80,443端口 通过修改 Kubelet 配置,将 NodePort 的地址范围扩展至 1~32767,并将 Nginx Ingress Controller 的 Service NodePort 端口映射到 80 和 443。 ## **步骤:** ### 1. **修改 kube-apiserver 启动参数**: 在 controlplane(master)节点,修改 kube-apiserver 启动参数,将 `--service-node-port-range` 参数设置为 `1-32767`。 - 在 `kubeadm` 部署中,编辑 `/etc/kubernetes/manifests/kube-apiserver.yaml`。更新文件,添加`--service-node-port-range=1-32767`。 ```yaml ...... - --service-cluster-ip-range=10.96.0.0/16 - --service-node-port-range=1-32767 ...... ``` - 在手动以服务部署 kube-apiserver 时,通常文件在 `/etc/systemd/system/kube-apiserver.service` ```sh ...... --service-cluster-ip-range=10.96.0.0/16 \ --service-node-port-range=1-32767 \ ...... ``` ### 2. **重启 kube-apiserver**: 在 `kubeadm` 部署中,修改了`/etc/kubernetes/manifests/kube-apiserver.yaml` 。Kubelet 会自动重启 kube-apiserver Pod。 在手动以服务部署 kube-apiserver 时,运行如下命令重启: ```sh sudo systemctl restart kube-apiserver ``` ### 3. **部署 Nginx Ingress Controller**: 使用 Helm 安装 Nginx Ingress Controller,将其 Service NodePort 端口设置为 80 和 443。 为了确保客户端的真实 IP 地址能够在 NodePort 类型的服务中正确传递,你需要将 `externalTrafficPolicy` 设置为 `Local`。这将确保源地址转换(source IP preservation)在负载均衡到具体的节点上时得到应用。 还需要将 `controller.kind` 设置成 `DaemonSet` 。这样设置才能保证 `externalTrafficPolicy` 设置为 `Local` 时,每个节点都可以转发80,443 端口。 ```sh helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx kubectl create namespace ingress-nginx helm install ingress-nginx ingress-nginx/ingress-nginx \ --set controller.kind=DaemonSet \ --set controller.service.type=NodePort \ --set controller.service.nodePorts.http=80 \ --set controller.service.nodePorts.https=443 \ --set controller.service.externalTrafficPolicy=Local \ --set ingressClassResource.default=true \ --set controller.watchIngressWithoutClass=true \ --namespace ingress-nginx ``` ### 4. 配置 Ingress Controller 以支持 Proxy Protocol 如果还有反向代理并开启了Proxy Protocol,可以配置 Nginx Ingress Controller 支持 Proxy Protocol,以便正确处理客户端的真实 IP 地址。 **!!如果没有反向代理,或者没有开启 Proxy Protocol,请勿配置Nginx Ingress Controller 支持 Proxy Protocol,这会导致异常。** **步骤 1:检查 Nginx Ingress Controller 配置** ```sh kubectl get configmap -n ingress-nginx ingress-nginx-controller -o yaml > nginx-configmap.yaml ``` **步骤 2:确认 Proxy Protocol 配置** 确保 ConfigMap 中包含 `use-proxy-protocol: "true"` 配置。如果没有,请创建或更新 ConfigMap: ```yaml apiVersion: v1 kind: ConfigMap metadata: name: nginx-configuration namespace: ingress-nginx data: use-proxy-protocol: "true" ``` 应用更新的 ConfigMap: ```sh kubectl apply -f nginx-configmap.yaml ``` 或者通过 patch 方式更新: ``` kubectl -n ingress-nginx patch configmaps ingress-nginx-controller -p '{"data": {"use-proxy-protocol": "true"}}' ``` **步骤 3:重启 Nginx Ingress Controller** 重新启动 Nginx Ingress Controller 以使配置更改生效: ```sh kubectl rollout restart deployment ingress-nginx-controller -n ingress-nginx ``` ### 5. **DNS 配置**: 将域名的 DNS A 记录指向集群中任意一台节点的 IP 地址,或多个节点。 ## 总结 通过以下步骤,你可以调整 NodePort 地址范围并配置 NodePort 服务的 `externalTrafficPolicy`: - **修改 Kubelet 配置**:调整 NodePort 地址范围为 `1-32767`。 - **配置 NodePort 服务**:将 `externalTrafficPolicy` 设置为 `Local`,以确保源地址转换。 - **配置 Ingress Controller**:确保 Proxy Protocol 支持,以正确处理客户端 IP 地址。 这些步骤将确保你的 NodePort 服务能够正确处理客户端 IP 地址,并且符合你的网络配置要求。