Windows 慣用者如何在 Red Hat Enterprise Linux 7.5 (CentOS ) 上使用 kubeadm 架設 Kubernetes (K8s)

之前筆記 Windows 慣用者如何在 Ubuntu Server 16.04 LTS 上使用 kubeadm 架設 Kubernetes (K8s) 紀錄到如何在 Ubuntu 上使用 kubeadm 建立 Kubernetes cluster,考量到公司使用的 linux 都為 CentOS (RHEL) 所以趁著印象還新鮮時趕緊紀錄一下在 CentOS 上架設 Kubernetes 的做法

開始安裝前的小提醒

  1. 指令常需要以 root (類似 Windows 的系統管理員角色) 執行

    在每個指令前加上 sudo 來執行

  2. 切換成 root 使用者

    • 切換前需先為 root 設定密碼,否則切換時會一直遇到認證失敗 (Authentication failure)

      使用 sudo passwd 設定密碼

    • 實際切換為 root

      su root
      

      su
      

安裝 Docker

記得執行指令前加上 sudo 或是切換為 root

  1. 直接從 OS 中內建的 CentOS-Extras 庫安裝 Docker

    yum( Yellow dog Updater, Modified)是一個在 Fedora 和 RedHat 以及 SUSE 中基於 RPM 檔的軟體管理工具,能夠從指定的伺服器自動下載 RPM 檔並且安裝,可以處理依賴性關係,並且一次安裝所有相依賴的軟體,無須自行下載、安裝,作用等同於 Windows 的 Chocolatey ,只是在 Windows 上 Chocolatey 需要自行安裝

    yum install -y docker
    
    • -y:安裝過程選項提示皆預設選擇 “yes”
  2. 設定 Docker 在系統開機時自動啟動

    systemctl enable docker
    

    1enabledocker

  3. 立即啟動 Docker 服務

    systemctl start docker
    

    2startdocker

  4. 確認安裝成功

    docker version
    

    3dockerversion

安裝 kubeadm, kubelet 跟 kubectl

記得執行指令前加上 sudo 或是切換為 root

  1. 將 yum 來源位置覆寫至 kubernetes.repo

    這邊要留意一下從 Windows 貼上因為換行符號與 linux 不同,可能會有問題

    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
    EOF
    

    4catrepo

  2. 關閉 SELinux

    SELinuxSecurity Enhanced Linux 縮寫,原意是為了加強安全性避免被攻擊,但因為 container 需要存取 host 上的檔案系統,而目前 kubelet 暫時未支援 SELinux,需先行關閉

    setenforce 0
    
  3. 安裝 kubeletkubeadmkubectl

    • kubelet

      安裝於 cluster 所有機器上的元件,用來啟動 pod 跟 container

    • kubeadm

      是 Kubernetes 官方提供的快速安裝和初始化 Kubernetes cluster 的工具

    • kubectl

      Kubernetes 的命令列工具

      yum install -y kubelet kubeadm kubectl
      
  4. 設定 kubelet 在系統開機時自動啟動並立即啟動 kubelet 服務

    systemctl enable kubelet && systemctl start kubelet
    

    5startkubelet

  5. 確認安裝成功

    kubeadm version
    

    6kubeadmversion

關閉系統 Swap

Swap 類似 Windows 中的虛擬記憶體,從 Kubernetes 1.8 開始要求關閉系統的 Swap

  • 關閉 Swap

    swapoff -a
    
  • 修改 /etc/fstab,避免 Swap 自動掛載

    sed -e '/swap/ s/^#*/#/' -i /etc/fstab
    
  • 確認關閉

    free -m
    

    7swapoff

建立 cluster

  1. 初始化 master

    --pod-network-cidr 是為後面的 Pod 網路套件 (flannel) 做準備

    kubeadm init --pod-network-cidr=10.244.0.0/16
    

    8kubeadminit

  2. 確保有權限執行 kubectl

    • 非 root user

      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
      
    • root user

      export KUBECONFIG=/etc/kubernetes/admin.conf
      
  3. 安裝 Pod 網路套件

    這邊以 flannel 為例

    kubectl apply --namespace kube-system -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    

    9flannel

加入其他 Node

  1. 新的 Node 上需先完成前面的 安裝 Docker安裝 Kubernetes關閉系統 Swap
  2. 執行 join 指令

    指令內容會在 master 執行 kubeadm init 時產生

    kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>
    

    10joinscript

    • 出現如下錯誤訊息

      Failed to request cluster info, will try again: [Get https://x.x.x.x:xxxx/api/v1/namespaces/kube-public/configmaps/cluster-info: dial tcp x.x.x.x:xxxx: getsockopt: no route to host
      

      10joinerror

    • 請先將 master 的防火牆關閉

      systemctl disable firewalld
      systemctl stop firewalld
      

      11firewall

  3. 加入成功

    12nodejoined

  4. 至 master 上確認

    kubectl get nodes
    

    13getnodes

心得

大致安裝流程與 Windows 慣用者如何在 Ubuntu Server 16.04 LTS 上使用 kubeadm 架設 Kubernetes (K8s) 相同,只是語法上跟 Ubuntu 有些不同,另外需要特別留意的是 CentOS 安全性較高,需要自行關閉

但對於關閉 SELinux 與防火牆,我還是覺得有點害怕,或許日後的版本會再做調整吧

參考資訊

  1. Installing kubeadm
  2. Using kubeadm to Create a Cluster
  3. linux yum 命令
  4. systemd (正體中文)
  5. kubeadm join - Failed to request cluster info - getsockopt: no route to host
  6. sysctl 讀取 / 修改 Kernel 變數
  7. Windows 慣用者如何在 Ubuntu Server 16.04 LTS 上使用 kubeadm 架設 Kubernetes (K8s)