解决公网下,k8s calico master节点无法访问node节点创建的pod

本文讲述了如何在Kubernetes集群中解决部署后只能在node节点访问,master节点无法访问的问题,通过配置公网IP、创建虚拟网卡及调整calico网络设置来实现跨节点访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目的:解决pod部署成功后,只能在node节点访问,而master节点无法访问

原因:集群搭建时,没有配置公网进行kubectl操作,从而导致系统默认node节点,使用内网IP加入k8s集群!如下:

解决方案:围绕公网IP进行搭建即可,其实就是在传统的搭建步骤下,给master节点和node节点添加下公网网卡就可以了


1、机器IP清单

  • 我的两台服务器的都是云服务器
  • 我的master节点IP为111.230开头的
  • 我只有一个node节点,IP为192.168.9.96(该IP与calico网段冲突)

2、重置master节点的kubeadm

kubeadm reset

3、在master节点上创建公网的虚拟网卡

  • 看一下你的公网IP是否在机器中存在
ip a | grep 你的公网IP
  • 如果没有就执行下面这段代码新增一个和公网IP一样的虚拟网卡IP 
cat > /etc/sysconfig/network-scripts/ifcfg-eth0:1 <<EOF
BOOTPROTO=static
DEVICE=eth0:1
IPADDR=111.230.19.178  #这里是你的公网IP
PREFIX=32
TYPE=Ethernet
USERCTL=no
ONBOOT=yes
EOF
  • 重置网络
systemctl restart network 

重置失败就直接去重启电脑就可以了 

4、初始化master主节点

  • 注意pod的网络范围为172.17.0.0/16,因为我有一台机器是192.168开头的
kubeadm init \
--apiserver-advertise-address=111.230.19.178 \
--control-plane-endpoint=cluster-endpoint \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=172.17.0.0/16

初始化成功后的日志:

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:

  kubeadm join cluster-endpoint:6443 --token wxt6jz.xf9g3va8xpggfoc9 \
    --discovery-token-ca-cert-hash sha256:2326cb4e54fe2fd92d112e01d1caf3e58735665e480f3d5aa364d47e52088b7c \
    --control-plane

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join cluster-endpoint:6443 --token wxt6jz.xf9g3va8xpggfoc9 \
    --discovery-token-ca-cert-hash sha256:2326cb4e54fe2fd92d112e01d1caf3e58735665e480f3d5aa364d47e52088b7c

 

5、修改calico.yaml中的网段

搜索:192.168

取消注释,并修改网段:

  • 与步骤3中的pod-network-cidr保持一致

6、kubectl应用calico

7、重置node节点

kubeadm reset

8、在node节点上创建公网的虚拟网卡

  • 看一下你的公网IP是否在机器中存在
ip a | grep 你的公网IP
  • 如果没有就执行下面这段代码新增一个和公网IP一样的虚拟网卡IP 
cat > /etc/sysconfig/network-scripts/ifcfg-eth0:1 <<EOF
BOOTPROTO=static
DEVICE=eth0:1
IPADDR=139.159.228.xx  #这里是你的公网IP
PREFIX=32
TYPE=Ethernet
USERCTL=no
ONBOOT=yes
EOF
  • 重置网络
systemctl restart network 

重置失败就直接去重启电脑就可以了 

9、去node节点重新加入到k8s集群

  • 这里一点要把行前的空格去掉!

kubeadm join cluster-endpoint:6443 --token wxt6jz.xf9g3va8xpggfoc9 \
--discovery-token-ca-cert-hash sha256:2326cb4e54fe2fd92d112e01d1caf3e58735665e480f3d5aa364d47e52088b7c

使用docker ps查看正在运行的容器:

发现node节点的calico正常运行了:

10、在主节点检查pod信息

在master节点执行:

kubectl get pod -A -owide

  • node节点上的pod已经全部变为外网IP了,master节点也能正常访问node节点上的pod

11、验证

验证master节点是否能正常访问node节点

直接在步骤10中,找一个node上的pod访问即可,如(上面如标框框的一个):

kubectl logs calico-node-rs4hj -n kube-system

### Kubernetes Master 节点网络配置方法 Kubernetes Master 节点网络配置方面涉及多个层面,包括集群内部通信、访问以及与其他节点之间的交互。以下是关于如何配置 Kubernetes Master 节点网络的具体说明。 #### 1. **设置 API Server 的绑定地址** Master 节点上的 kube-apiserver 是整个集群的核心组件之一,负责处理所有的 REST 请求并管理集群状态。为了使其他节点能够通过网络连接到 Master 节点,需要正确配置 `advertiseAddress` 和 `bindPort` 参数[^5]。 在初始化 Master 节点时,可以通过以下命令指定这些参数: ```bash kubeadm init --pod-network-cidr=10.244.0.0/16 --control-plane-endpoint="1.2.3.4" ``` 其中: - `--pod-network-cidr`: 定义 Pod 网络范围。 - `--control-plane-endpoint`: 设置 Master 节点暴露的服务 IP 地址。 此操作会生成类似于以下内容的配置文件: ```yaml apiVersion: kubeadm.k8s.io/v1beta3 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: 1.2.3.4 bindPort: 6443 nodeRegistration: criSocket: unix:///var/run/containerd/containerd.sock imagePullPolicy: IfNotPresent name: node taints: null ``` 这里的 `advertiseAddress` 字段定义了 apiserver 对广播的地址。 --- #### 2. **启用负载均衡器 (可选)** 如果计划扩展为多 Master 架构,则可以引入负载均衡器来分发流量至各个 Master 节点。常见的做法是使用 HAProxy 或 AWS ELB 来实现高可用性[^3]。 例如,在单节点环境中可以直接绑定 ECS 实例公网 IP;而在多节点环境下则需额配置 VIP(虚拟 IP),并通过 DNS 解析指向该 VIP。 --- #### 3. **配置 CNI 插件** Pod 网络插件决定了容器间如何相互通信。Flannel、Calico 和 Weave Net 是常用的解决方案[^4]。以 Flannel 为例,安装过程如下所示: ```bash kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml ``` 上述命令将创建必要的资源对象,并启动 flanneld DaemonSet 进程以构建覆盖网络。 注意:CNI 插件的选择会影响整体性能表现,请依据实际需求权衡利弊后再做决定。 --- #### 4. **防火墙规则调整** 确保操作系统级别的防火墙允许特定端口通行至关重要。对于 CentOS 平台而言,默认情况下 SELinux 可能会对某些功能造成干扰,因此建议临时关闭它以便验证连通性测试结果正常与否: ```bash setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config ``` 与此同时还需开放下列常用 TCP 端口号列表供界调用访问[^2]: | Port Range | Purpose | |------------|-----------------------------------| | 6443 | Kubernetes API server | | 2379-2380 | etcd server client API | | 10250 | Kubelet API | | 10251 | kube-scheduler | | 10252 | kube-controller-manager | 执行 iptables 命令添加相应条目即可完成初步设定工作。 --- ### 总结 通过对以上几个方面的细致规划与实施,可以有效提升 Kubernetes Master 节点及其关联子系统的稳定性与可靠性。合理利用官方文档中的最佳实践指南有助于减少潜在风险因素的影响程度。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

睡竹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值