How to join windows node in K8S on GCP

最近在嘗試建立windows的node in K8S

以下是我的筆記,有興趣的同學可以參考一下

大部分步驟都跟微軟的文件差不多
Kubernetes on Windows

只有一小部分有些差異,主要是因為我的測試環境是在GCP上,所以在GCP firewall的設定上記得要allow pods跟service的網段,還有在建instance時在網路部分要將IP forwarding的功能開起來,以及routing要加,這樣不同node之間的pod才有辦法正常溝通

firewall allow for K8S pods and service
enable IP forwarding when create instance
routing for K8S pods
  1. build up a master node (Linux)
    由於目前windows server只能作為K8S的work node,所以我們還是需要建立一台Linux的server作為master node,在GCP我是使用CentOS 7的 image來作為master node,至於要怎麼建立master node我相信在網路上都有很多文件,以下是我的作法
    1. update system and install docker
      yum update -y
      
      yum install docker -y
      
      service docker start
      
      chkconfig docker on
    2. 由於只是測試環境,為了方便我會關閉firewall跟SELINUX
      service firewalld stop
      
      chkconfig firewalld off
      
      setenforce 0
      
      sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
    3. create repo for K8S
      cat <<EOF > /etc/yum.repos.d/kubernetes.repo
      
      [kubernetes]
      
      name=Kubernetes
      
      baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
      
      enabled=1
      
      gpgcheck=1
      
      repo_gpgcheck=1
      
      gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
      
      exclude=kube*
      
      EOF
    4. install kubeadm
      yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
      
      systemctl enable kubelet && systemctl start kubelet
      
      cat <<EOF > /etc/sysctl.d/k8s.conf
      
      net.bridge.bridge-nf-call-ip6tables = 1
      
      net.bridge.bridge-nf-call-iptables = 1
      
      EOF
      
      sysctl --system
      
      sysctl -w net.ipv4.ip_forward=1
    5. initial master node
      kubeadm init --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12
      
      mkdir -p $HOME/.kube
      
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
      
      sudo sysctl net.bridge.bridge-nf-call-iptables=1
    6. 安裝網路模組for K8S
      根據微軟的文件如果要可以跟windows server相容建議是安裝flannel並使用host-gw模式
      1. 下載flannel yml檔
        yum install wget -y
        
        wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
      2. 將yml中的vxlan改成host-gw
      3. apply flannel
        kubectl apply -f kube-flannel.yml
    7. 將特定DS(daemonset)設定成只能跑在Linux node
      因為目前這些DS只能跑在Linux的container上,所以會把他們設成只跑在Linux server上
      kubectl patch ds/kube-proxy --patch "$(cat node-selector-patch.yml)" -n=kube-system
      
      kubectl patch ds/kube-flannel-ds-amd64 --patch "$(cat node-selector-patch.yml)" -n=kube-system

      patch的yml檔可以從這下載node-selector-patch.yml

    8. 到這windows node的K8S master node就完成了,接下來就是確認kube-system pods是否都有正常運作,還有DS的設定有沒有生效跟DS是否設成rolling update
      確認pods是否running
      確認DS的是否有限制只跑在linux node
      確認DS是否設成RollingUpdate
  2. join a windows work node
    1. 這邊我是使用GCP的Windows Server version 1803 Datacenter Core image作為work node,K8S的文件上是說windows 1709以上的版本都有支援,但要注意container的image只能使用跟OS同版本號的,不然會跑不起來,以下command都是使用Powerhsell操作

    2. install docker(這邊會需要重開機)
      Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
      
      Install-Package -Name Docker -ProviderName DockerMsftProvider
      
      Restart-Computer -Force
    3. pull docker image
      請下載與你OS相同的版本,這邊根據微軟的文件是要下載microsoft/nanoserver,但我後來發現k8s的docker file image不是用microsoft/nanoserver而是用mcr.microsoft.com/windows/nanoserver,所以我這邊就直接下載mcr.microsoft.com/windows/nanoserver
      docker pull mcr.microsoft.com/windows/nanoserver:1803
    4. tag docker image
      docker tag mcr.microsoft.com/windows/nanoserver:1803 mcr.microsoft.com/windows/nanoserver:latest
    5. 準備工作目錄for K8S
      mkdir c:\k
    6. copy master node的驗證檔($HOME/.kube/config)到c:\k目錄,有了這個才可以連到master node(可以用SCP copy,現在powershell也有SCP可以用喔)
    7. 下載安裝7-zip
    8. 下載Kubernetes binaries for windwos,並用7-zip將它解壓縮到c:\k目錄,其中會包含kubectl, kubelet, and kube-proxy這些binaries,我是下載1.13.1版,可以從這下載kubernetes
    9. 設定環境變數for K8S
      $env:Path += ";C:\k"
      
      [Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\k", [EnvironmentVariableTarget]::Machine)
      
      $env:KUBECONFIG="C:\k\config"
      
      [Environment]::SetEnvironmentVariable("KUBECONFIG", "C:\k\config", [EnvironmentVariableTarget]::User)

      以上都設定好就可以使用kubectl連到master node

    10. 下載Flannel for window

      [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
      
      wget https://github.com/Microsoft/SDN/archive/master.zip -o master.zip
      
      Expand-Archive master.zip -DestinationPath master
      
      mv master/SDN-master/Kubernetes/flannel/l2bridge/* C:/k/
      
      rm -recurse -force master,master.zip
    11. join node
      cd c:\k
      .\start.ps1 -ManagementIP <Windows Node IP> -ClusterCIDR <pod-network-cidr> -ServiceCIDR <service-cidr> -KubeDnsServiceIP <Kube-dns Service IP>

      到這就成功join windows node到K8S了,請確定3支Powershell(kubelet, flanneld, kube-proxy)都有順利跑起來,有時Flannel 會跑不起來,需要手動再跑一次

      [Environment]::SetEnvironmentVariable("NODE_NAME", "<Windows_Worker_Hostname>")
      .\flanneld.exe --kubeconfig-file=c:\k\config --iface=<Windows_Worker_Node_IP> --ip-masq=1 --kube-subnet-mgr=1

  3. deploy a win-webserver on windows node
    wget https://raw.githubusercontent.com/Microsoft/SDN/master/Kubernetes/flannel/l2bridge/manifests/simpleweb.yml -O win-webserver.yaml
    
    kubectl apply -f win-webserver.yaml
    記得要把yml檔裡container的版本改成與你的windows node OS相同
    確認pods是否running
    確認service port
    access from internet

k8s in 5 minutes for Windows 10

前一陣子看了 William 大的 k8s in 5 minutes 之後,才發現原來要在本機跑 Kubernetes 不用再裝 minikube 了,尤其是在 Windows 環境下,要玩 k8s 還得要有特別的安裝方法,這讓我們這些用 Windows 當成日常環境的人總有些不得其門而入的感覺,現在 docker for desktop (下載時可能會叫做 Docker for Windows) 原生支援 k8s (本機版)之後,對於想要很快的看看 k8s 是啥的 Windows 使用者算是個很好的入門磚。

其實 5 分鐘所有的步驟都和 William 大寫的差距很小,只有小部分 Windows 環境下該注意的事項,但小弟資質駑頓,記性太差,還是寫清楚些以便日後參考:

  1. 要先啟用你 Windows 下的 Hyper-V (對 Windows 家用版就別試了)
  2. Docker for Windows 版 (現在也沒有所謂的 Edge 版本了)
  3. 如果你之前有裝過 minikube 的話,記得把 Kubernetes 的環境從 minikube 改成 Docker for Windows
    01
    02
  4. 在我的機器上 kubectl.exe 看來沒有加到搜尋路徑下,請自行加入 (我的安裝路徑在 C:\Program Files\Docker\Docker\resources\bin),不然就切換到該目錄下:
    C:\> cd C:\Program Files\Docker\Docker\resources\bin
  5. 裝個 k8s dashboard (非必須)
    C:\> kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
  6. 把 proxy 跑起來,跑起來之後不能關掉這個視窗,得另外開一個命令列視窗出來繼續,
    C:\> kubectl proxy
    Starting to serve on 127.0.0.1:8001
    ...

    跑起來之後你可以用瀏覽器開下列網址存取 dashboard 來:

    http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
  7. 開另外一個命令視窗把範例裡的 echo-server 裝起來:
    C:\> kubectl apply -f https://raw.githubusercontent.com/coder-society/kubernetes-with-telepresence/master/echo-server/echo-server.yaml
  8. 最後一個步驟和 William 大的不一樣,由於 telepresence 這個工具在 Windows 下執行會有問題,所以用瀏覽器透過 proxy 的方式來測試這個 echo-server (其實這裡我卡了很久… 因為第一次用 k8s,才發現 William 大用了這個 telepresence,而 Windows 下這東西目前又跑不起來)
    http://localhost:8001/api/v1/namespaces/default/services/http:echo-server:/proxy/

    由於我們沒有指定 echo-server 的 namespace,所以這個服務會被放在 default namespace 下,與剛剛的 kube-dashboard 的 namespace 不同,一開始我搞錯也是卡很久

  9. 這個 echo-server 的功能看起來很簡單,就是 show 出目前是從哪台 server (k8s 的術語叫 pod) 跑出來的,你每次 refresh 一次,就會換一台 pod 來跑
    03
  10. 也可以看一下 k8s-dashboard,網址在剛剛啟用 proxy 之後有 show:http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
    04

同事 J 問我說這個 Docker for Windows 是不是開一個 Windows node 出來,仔細看了一下應該不是,它會在你的 Hyper-V 下起一個 Linux VM,所以要試 Windows node 的還是得等等其他人的文章了

05

06

其實昨天剛好有和一位 Google 的業務員聊到天,她自己認為 k8s 改版的速度實在是太快了,有些舊東西淘汰了、新東西加進來之類的都沒人知道。例如這一本台灣有的翻譯書:Kubernetes 使用指南,用到的是 k8s 1.0,裡頭講到的 Replication Controller 在新版本裡都改用 Deployment 和 Replica Set 了,現在去 Google 開一個 k8s cluster 也預設是 1.9.7 了,照著書來做大概只會覺得常常都對不上台詞吧。就算去翻對岸的簡體紀念版:Kubernetes 权威指南(纪念版),出版時也只是 cover 到 1.6 版,更遑論 k8s 官方的網站上已經放了 1.12 版讓人下載了,所以要學這個除了得花時間之外,手腳還得快一點,現在(2018/11/07)拿著最新的簡體中文書可能還對得上環境,可能再過幾個月又得另外找書或文章來學了。