一些限制
- k8s中,master节点必须部署在linux节点上,windows节点只能以工作结点的方式加入集群
- windows节点系统需要windows server 2016(1703)以上
- windows节点系统内核版本和window容器的操作系统内核版本需要匹配(17xx 版本需要大小版本都匹配 18xx 19xx 只要大版本匹配就可以)才能使用进程隔离,节点大于容器时只能使用内核隔离,不能小于
- kubernters 本版需要1.14以上,但是用1.17之后更好,因为这个版本之后node有自动加上lable,标识这个节点的操作系统类型和版本号,有利于部署
- 需要给windows server 2019打补丁kb4489899
准备flannel网络
在文档01中我们已经下载了flannel.yaml
我们先将它备份一下
cp flannel.yaml flannel_backup.yaml
然后 修改flannel.yaml里的net-conf.json
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
改为
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan",
"VNI" : 4096,
"Port": 4789
}
}
应用flannel配置
kubectl apply -f flannel.yaml
创建结点选择器flanel补丁
vim node-selector-patch.yml
spec:
template:
spec:
nodeSelector:
kubernetes.io/os: linux
查看daemonset
[root@m1 k8s]# kubectl get ds -A
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kube-system kube-flannel-ds-amd64 1 1 1 1 1 93m
kube-system kube-flannel-ds-arm 0 0 0 0 0 <none> 93m
kube-system kube-flannel-ds-arm64 0 0 0 0 0 <none> 93m
kube-system kube-flannel-ds-ppc64le 0 0 0 0 0 <none> 93m
kube-system kube-flannel-ds-s390x 0 0 0 0 0 <none> 93m
kube-system kube-flannel-ds-windows-amd64 1 1 1 1 1 <none> 53m
kube-system kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 157m
kube-system kube-proxy-windows 1 1 1 1 1 kubernetes.io/os=windows 89m
打补丁
kubectl patch -n kube-system ds/kube-flannel-ds-amd64 --patch "$(cat node-selector-patch.yml)"
这个时候查看daemonset 看到已经打上linux标签就算成功了
[root@m1 k8s]# kubectl get ds -A
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kube-system kube-flannel-ds-amd64 1 1 1 1 1 kubernetes.io/os=linux 93m
触类旁通 一通百通, 接下来的windows容器 也要会打window节点选择器补丁,或在写yaml时时候就写进去
创建一个windows 的工作结点 并加入集群
打开hyper-v新建一个虚拟机w1,4GB内存,不钩选动态内存,存盘40G,系统盘选择一个下载好的windows server 2019镜像文件,这里不要用中文版本,否则会滑铁卢。。。
看到安装画面一直下一步,选择数据中心桌面版, 因为纯命令行操作起来比较菜怕操作不来
之后就是安装画面完成要你设置密码,我设置Abc12345
计算机名改为w1
ip地址规划到10.7.1.221
更新补丁
需要给windows server 2019打补丁kb4489899
如果补丁打不上也不要惊慌,因为你的系统可能已经有更新的更新了,最好的方法是联网更新一下系统,本文使用1809内核版本。
导入需要的docker images
需要的docker images
PS C:k> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sigwindowstools/kube-proxy v1.18.1 1df35c13f175 4 weeks ago 5.04GB
microsoft/nanoserver latest 716bb79b7dcd 4 weeks ago 251MB
mcr.microsoft.com/windows/nanoserver 1809 716bb79b7dcd 4 weeks ago 251MB
sigwindowstools/flannel 0.12.0 9499a92cb176 7 weeks ago 5.06GB
mcr.microsoft.com/k8s/core/pause 1.2.0 a74290a8271a 10 months ago 253MB
在windows虚拟机中安装docker
#添加docker repo
Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
#安装docker
Install-Package -Name Docker -ProviderName DockerMsftProvider
#如果要安装指定的版本在后面加上可选参数 --MaximumVersiona或RequireVersion
Install-Package -Name docker -ProviderName DockerMSFTProvider -Force -MaximumVersion 19.03
Install-Package Docker -ProviderName DockerMSFTProvider -Force -RequiredVersion 19.03
#重启
Restart-Computer -Force
#重启后看一下docker有无正常工作
PS C:UsersAdministrator> docker -v
Docker version 19.03.5, build 2ee0c57608
复制master上的kubeconf到window节点 w1
在w1上创建 c:k文件夹
mkdir c:k
cd c:k
将master的 $HOME/.kube/config
复制到w1的c:k
下载kubernetes的windows二进制
k8s github 下载地址
我的集群安装的版本是1.18.1,所以下载的版本要相匹配
在自己自己电脑上下载下来解压了再用复制过去w1 的c:k
最终c:k文件夹里要有这些东西
用powershell把kubernetes二进制文件添加到path
#临时
$env:Path += ";C:k"
#永久(需要管理员权限的powershell)
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:k", [EnvironmentVariableTarget]::Machine)
设置环境变量设置kubectl读配置文件
#临时
$env:KUBECONFIG="C:kconfig"
#永久
[Environment]::SetEnvironmentVariable("KUBECONFIG", "C:kconfig", [EnvironmentVariableTarget]::User)
#验证
PS C:k> kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://haoyun.k8s.vip:8443
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
PS C:k>
#如果错误则要检查一下上面的操作
在主节点上配置windows的flannel和kube-proxy相关的daemonset
curl -L https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/kube-proxy.yml | sed 's/VERSION/v1.18.1/g' | kubectl apply -f -
kubectl apply -f https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/flannel-overlay.yml
下载kuberentes官网上的脚本把windows结点加入集群
下载
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
wget https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/PrepareNode.ps1
修改一下下载来的脚本
- windows 1809没有curl,改为wget
- 我们前面已经下载了kubernetes二进制,不用重复下载,所以要注释掉
执行脚本,把windows 节点加入kubernetes集群
PS C:k> .PrepareNode.ps1 -KubernetesVersion v1.18.1
顺利的话,windows节点就已经加进去了 节点状态应该如下
[root@m1 k8s]# kubectl get no
NAME STATUS ROLES AGE VERSION
m1 Ready master 179m v1.18.1
w1 Ready <none> 57m v1.18.1
pod
[root@m1 k8s]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-66bff467f8-7mc92 1/1 Running 0 3h
kube-system coredns-66bff467f8-sr6vs 1/1 Running 0 3h
kube-system etcd-m1 1/1 Running 1 3h
kube-system kube-apiserver-m1 1/1 Running 3 3h
kube-system kube-controller-manager-m1 1/1 Running 2 3h
kube-system kube-flannel-ds-amd64-z5w4j 1/1 Running 0 113m
kube-system kube-flannel-ds-windows-amd64-fg4zr 1/1 Running 0 57m
kube-system kube-proxy-s8sn8 1/1 Running 1 3h
kube-system kube-proxy-windows-htp85 1/1 Running 0 57m
kube-system kube-scheduler-m1 1/1 Running 3 3h