背景: 最近使用Hyper-V玩虚拟机,由于开启了安全机制,本身设置的NAT网络被禁止了,无奈设置了双网卡方式,一个网卡用于动态获取IP,相当于独立使用一个网卡自动从路由器获取IP来上网,这里为什么没有设置静态IP,是因为笔记本的网络环境可能更换,如果静态IP,可能在新的网络环境就无法上网了,然而动态IP也有弊端,一是MobaXterm的session无法保存动态IP记录,另一个k8s集群重新启动后,使用的CNI插件Flannel或者本身k8s的网络检测机制也无法适应动态IP,为此添加了一个静态IP网卡,这里静态IP只为满足刚才所说的弊端,然而这里出现了两个问题,一是静态网卡的优先级可能高于动态网卡,从而影响网关的配置,二来k8s节点无法确定使用对应的静态IP,可以说是理想很好,但是具体配置起来还比较麻烦,这里整理下具体配置的方法。
- 网卡配置 (ubuntu24)
network:
version: 2
ethernets:
eth0: # NAT网卡(自动获取IP)
dhcp4: yes
dhcp4-overrides:
route-metric: 1 # 设置最高优先级
nameservers:
addresses: [8.8.8.8, 114.114.114.114]
eth1: # Host-Only网卡(静态IP)
addresses: [192.168.56.100/24]
routes:
- to: 192.168.56.0/24
via: 192.168.56.254
metric: 100 # 低优先级,仅内网
# 禁止eth1成为默认网关
dhcp4: no
- kubeadm init --config /etc/kubernetes/kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.56.100 # 您的静态IP
bindPort: 6443
nodeRegistration:
criSocket: unix:///run/containerd/containerd.sock # 原来 --cri-socket 参数
imagePullPolicy: IfNotPresent
taints: null
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.35.0 # 原来 --kubernetes-version 参数
controlPlaneEndpoint: "k8s.master.org:6443" # 原来 --control-plane-endpoint 参数
networking:
podSubnet: "10.244.0.0/16" # 原来 --pod-network-cidr 参数
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers # 原来 --image-repository 参数
- kube join --config /etc/kubernetes/kubeadm-config-node.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: JoinConfiguration
nodeRegistration:
kubeletExtraArgs:
node-ip: "192.168.56.101" # 你的静态IP
criSocket: unix:///run/containerd/containerd.sock
discovery:
bootstrapToken:
token: "9t9glf.tqvh8wf3gwq757pu" # 原来 --token 参数
apiServerEndpoint: "k8s.master.org:6443"
caCertHashes:
- "sha256:bc4492f24a8c744cea9eb93eecd640424789bb21173a8982abf1326892638504" # 原来 --discovery-token-ca-cert-hash 参数
至此所有的配置结束,总结一是系统网卡的优先级需要明确,二是k8s集群在初始化的时候需要配置具体的静态IP,否则后面会自动获取IP, 然后本身的IP不会自动完全更新,导致实际的IP会有问题。