在AWS的KOPS创建的K8s 1.8集群中添加Windows节点求助
我明白你现在的处境——用kops在AWS搭了K8s 1.8集群,想加Windows节点却卡在了网络选项和节点加入方式上,这确实有点棘手,毕竟kops和kubeadm的集群初始化逻辑完全不一样。下面我一步步给你梳理可行的方案,帮你搞定这个问题:
首先得明确,K8s 1.8的Windows支持还处于Beta阶段,有几个硬限制必须遵守:
- 仅支持Windows Server 2016/2019作为节点系统
- 网络插件只能用Flannel(vxlan或host-gw模式),Calico这类插件在1.8版本对Windows的支持还不完善
- kube-proxy只能用
userspace模式,iptables模式不支持Windows
kops创建的集群是通过AWS IAM角色+集群CA证书来做节点认证的,和kubeadm的token机制完全不同,所以直接用kubeadm join肯定行不通。得这么做:
1. 从kops管理机获取集群配置文件
在你用来管理kops集群的机器上,执行以下操作:
- 导出集群的kubeconfig:
kops export kubecfg --name <你的集群名称> --state <你的state存储路径(比如s3://my-kops-state)> - 把生成的kubeconfig文件(默认在
~/.kube/config)复制到Windows节点的C:\k\config路径下(先手动创建C:\k目录) - 同时,获取集群的CA证书:你可以从kubeconfig里提取,或者直接从kops的state存储拉取:
然后把这个aws s3 cp s3://<你的state桶>/<集群名>/pki/issued/ca/ca.crt ./ca.crtca.crt也复制到Windows节点的C:\k目录下
2. 配置并启动Windows节点的kubelet
在Windows节点上,先创建kubelet的配置文件C:\k\kubelet-config.yaml,内容参考下面(注意替换集群DNS的IP):
apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration clusterDomain: cluster.local clusterDNS: - 10.0.0.10 # 这里要替换成你kops集群中kube-dns的实际IP,用kubectl get svc kube-dns -n kube-system就能查到 runtimeRequestTimeout: 15m
然后用命令启动kubelet:
kubelet --config=C:\k\kubelet-config.yaml --kubeconfig=C:\k\config --hostname-override=<Windows节点的主机名> --register-node=true --pod-infra-container-image=mcr.microsoft.com/windows/servercore:1809
⚠️ 注意:
hostname-override必须和AWS实例的私有主机名一致,不然kops无法正确识别节点pod-infra-container-image要和你的Windows节点系统版本匹配,比如Server 2019就用1809版本的镜像
K8s 1.8里Windows节点只能用Flannel,步骤如下:
1. 确认集群已用Flannel
先在kops管理机上检查集群的网络插件:
kubectl get pods -n kube-system | grep flannel
如果能看到flannel的Pod在运行,说明没问题;如果用的是其他插件,你可能需要先切换成Flannel(kops创建集群时可以用--networking flannel指定)
2. 在Windows节点部署Flannel
- 下载对应K8s 1.8版本的Flannel Windows二进制(比如v0.10.0,要和集群的Flannel版本一致)
- 从集群的Flannel ConfigMap里获取网络配置:
把输出的内容复制到Windows节点的kubectl get configmap kube-flannel-cfg -n kube-system -o jsonpath='{.data.net-conf.json}'C:\k\flannel-config.json文件中 - 启动Flannel:
网卡名称可以用flanneld.exe --kubeconfig=C:\k\config --iface=<Windows节点的主网卡名称>ipconfig查看,比如“以太网”
3. 启动kube-proxy
Windows版本的kube-proxy要和K8s 1.8版本对应,下载后用以下命令启动:
kube-proxy.exe --kubeconfig=C:\k\config --proxy-mode=userspace
⚠️ K8s 1.8的Windows kube-proxy只支持userspace模式,别用其他模式!
回到kops管理机,执行:
kubectl get nodes
如果Windows节点的状态变成Ready,就说明成功了。可以部署一个简单的Windows Pod测试:
apiVersion: v1 kind: Pod metadata: name: windows-test-pod spec: containers: - name: iis image: mcr.microsoft.com/windows/servercore:1809 ports: - containerPort: 80 nodeSelector: beta.kubernetes.io/os: windows
用kubectl apply -f test-pod.yaml创建后,用kubectl get pods看是否正常运行。
- 版本匹配:Windows节点的系统版本必须和容器镜像的版本完全一致,否则Pod会启动失败
- 安全组:确保Windows节点的安全组开放了必要端口:kubelet的10250、Flannel的8472(vxlan)、kube-proxy的相关端口,和Linux节点的安全组配置对齐
- K8s 1.8的Windows支持是Beta,可能存在一些稳定性问题,比如网络偶尔断连,需要做好测试
内容的提问来源于stack exchange,提问作者user1852104

