2018-05-20

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)

4 則留言:

  1. 1. 修改 root 的密碼是沒有必要的事情,每一次 sudo su 會比較好,讓 root 可以遠登風險更大
    2. 內建的 docker 會比較舊,建議蹲照 Docker 官網的方式以取得、安裝和維護
    3. SELinux 關掉當然會比較危險,但是去研究 SELinux 也不會比較好,把心思放在 Entity Framework 會比較實在(誤)
    4. 防火牆關掉比較危險,應該是在某一個地方可以開啟他
    5. Docker 在 Linux 的世界開啟的埠是立於防火牆之外,也就是容器運行所開啟的連接埠,不會受防火牆影響

    回覆刪除
    回覆
    1. 感謝這位大大說明
      小弟不懂 linux,遇到問題就是 google,如果可行就紀錄一下,感謝您的分享讓小弟可以學到正確做法

      刪除
  2. 大師~~~~
    有3個issue記得補
    1. [ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1

    解決方案:cat /etc/sysctl.conf    
    新增這一段 net.bridge.bridge-nf-call-ip6tables = 1
    sudo sysctl -p

    2. [discovery] Failed to request cluster info, will try again: [Get https://172.16.49.74:6443/api/v1/namespaces/kube-public/configmaps/cluster-info: x509: certificate has expired or is not yet valid]

    解決方案: node跟server時間不同步,改同步就好

    3. Master show: Unable to connect to the server: x509: certificate has expired or is not yet valid
    解決方案: kubeadm reset
    在 kubeadm init --pod-network-cidr=10.244.0.0/16

    回覆刪除