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

OpenStack – Failed to connect to server (code: 1006) issue

最近在OpenStack的lab遇到了無法使用console的問題

情況如下,當環境中只架設一台controller node時,console 可以正常使用

不過當controller node增加到2台以上時,console就會無法使用

以下為錯誤畫面

Failed to connect to server (code: 1006)

2016-11-01_001459

後來問過Google大神才知道,當架設多台controller node時會因為每台controller node對instance的token都不同造成驗證失敗,使得console無法使用

解決的方法就是在nova.conf中設定memcache servers來存放token

設定如下:

[cache]

backend = oslo_cache.memcache_pool

enabled = true

memcache_servers = controller1IP:11211,controller2IP:11211,controller3IP:11211

3台controller node都設定完並重啟nova-consoleauth service,就可以正常使用console了