使用 kubeadm 創建 kubernetes 1.9 集羣

簡介

kubeadm是一個kubernetes官方提供的快速安裝和初始化擁有最佳實踐(best practice)kubernetes集羣的工具,雖然目前還處於 beta 和 alpha 狀態,還不能用在生產環境,但是我們可以通過學習這種部署方法來體會一些官方推薦的kubernetes最佳實踐的設計和思想。

kubeadm的目標是提供一個最小可用的可以通過Kubernetes一致性測試的集羣,所以並不會安裝任何除此之外的非必須的addon。

kubeadm默認情況下並不會安裝一個網絡解決方案,所以用kubeadm安裝完之後 需要自己來安裝一個網絡的插件。

使用

系統環境

kubeadm支持多種系統,這裏簡單介紹一下需要的系統要求:

  1. Ubuntu16.04+ / Debian 9 / CentOS 7 / RHEL 7 / Fedora 25/26(best-effort) / HypriotOS v1.0.1+ / Other
  2. 2GB或者以上的RAM(否則將沒有足夠空間留給app)
  3. 2核以上CPU
  4. 集羣的機器之間必須能通過網絡互相通信
  5. SWAP必須被關閉,否則kubelet會出錯!

具體的詳細信息可以在官方網站上看到。

本篇內容基於aws的ap-northeast-1的ec2,CentOS 7的操作系統(ami-4dd5522b),實例類型t2.medium 2核4GB,3臺機器,1 master,2 nodes,kubernetes 1.9 版本。爲了方便起見,在安全組裏面打開了所有的端口和IP訪問。

機器配置:

[centos@ip-172-31-24-49 ~]$ uname -a Linux ip-172-31-24-49.ap-northeast-1.compute.internal 3.10.0-693.5.2.el7.x86_64 #1 SMP Fri Oct 20 20:32:50 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

首先 ,我們關閉selinux:

$ sudo vim /etc/sysconfig/selinux

把SELINUX改成disabled,然後保存退出。

在我用的ami中,swap是默認關閉的,所以不需要我手動關閉,大家需要確認 自己的環境中swap是否有關閉掉,否則會在之後的環節中出問題。

爲了方便我們安裝,我們將sshd設置爲keepalive

$ sudo -i $ echo "ClientAliveInterval 10" >> /etc/ssh/sshd_config $ echo "TCPKeepAlive yes" >> /etc/ssh/sshd_config $ systemctl restart sshd.service

接下來我們重啓一下機器:

$ sudo sync $ sudo reboot

至此,準備階段結束。

安裝kubeadm

首先,我們需要在所有機器上都安裝docker, kubeadm, kubeletkubectl

切記:kubeadm不會自動去安裝和管理 kubeletkubectl,所以需要自己去確保安裝的版本和你想要安裝的kubernetes版本相同。

安裝docker

$ sudo yum install -y docker $ sudo systemctl enable docker && sudo systemctl start docker

在RHEL/CentOS 7 系統上可能會路由失敗,我們需要設置一下:

$ sudo -i $ cat <<EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF $ sudo sysctl --system

接下來我們需要安裝kubeadm, kubeletkubectl了,我們需要先加一個repo:

$ 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

然後安裝:

$ sudo yum install -y kubelet kubeadm kubectl $ sudo systemctl enable kubelet && sudo systemctl start kubelet

至此,在所有機器上安裝所需的軟件已經結束。

使用kubeadm初始化master

安裝完所有的依賴之後,我們就可以用kubeadm初始化master了。

最簡單的初始化方法是:

$ kubeadm init

除此之外,kubeadm還支持多種方法來配置,具體可以查看一下官方文檔。

我們在初始化的時候指定一下kubernetes版本,並設置一下pod-network-cidr(後面的flannel會用到):

$ sudo -i $ kubeadm init --kubernetes-version=v1.9.0 --pod-network-cidr=10.244.0.0/16

在這個過程中kubeadm執行了一系列的操作,包括一些pre-check,生成ca證書,安裝etcd和其它控制組件等。

最下面的這行kubeadm join什麼的,就是用來讓別的node加入集羣的,可以看出非常方便。我們要保存好這一行東西,這是我們之後讓node加入集羣的憑據,一會兒會用到。

這個時候,我們還不能通過kubectl來控制集羣,要讓kubectl可用,我們需要做:

# 對於非root用戶 $ mkdir -p $HOME/.kube $ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config $ sudo chown $(id -u):$(id -g) $HOME/.kube/config # 對於root用戶 $ export KUBECONFIG=/etc/kubernetes/admin.conf # 也可以直接放到~/.bash_profile $ echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

接下來要注意,我們必須自己來安裝一個network addon。

network addon必須在任何app部署之前安裝好。同樣的,kube-dns也會在network addon安裝好之後才啓動。kubeadm只支持CNI-based networks(不支持kubenet)。

比較常見的network addon有:Calico, Canal, Flannel, Kube-router, Romana, Weave Net等。這裏我們使用Flannel

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

安裝完network之後,你可以通過kubectl get pods --all-namespaces來查看kube-dns是否在running來判斷network是否安裝成功。

默認情況下,爲了保證master的安全,master是不會被調度到app的。你可以取消這個限制通過輸入:

$ kubectl taint nodes --all node-role.kubernetes.io/master-

加入nodes

終於部署完了我們的master!

現在我們開始加入一些node到我們的集羣裏面吧!

ssh到我們的node節點上,執行剛纔下面給出的那個 kubeadm join的命令(每個人不同):

$ sudo -i $ kubeadm join --token 72a8a4.2ed9076cd668b8b7 172.31.31.60:6443 --discovery-token-ca-cert-hash sha256:f0894e55d475f882dd40d52c6d01f758017ec5729be632294049f687330f60d2

這時候,我們去master上輸入kubectl get nodes查看一下:

[root@i-071abd86ed304dc84 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION i-071abd86ed304dc84 Ready master 12m v1.9.0 i-0c559ad3c0b16fd36 Ready <none> 1m v1.9.0 i-0f3f7462b0a004b5e Ready <none> 47s v1.9.0

成功!

總結

我們可以看到,用kubeadm部署可以讓我們比手動部署方便得多,雖然比不上kops這樣的一鍵部署生產Kubernetes集羣的工具,但是kubeadm最初的設計也並非是傻瓜式使用。

kubeadm給了用戶很多的靈活性,讓用戶可以完全自定義地去配置自己的集羣。

不過目前(截止博客發佈爲止),kubeadm還只是在測試,官方還不建議在生產環境中使用,不過預計會在2018年春季可以投入生產使用。

最後,我們總結一下kubeadm最核心的幾個概念:

  • 官方認爲的 最佳實踐(best-practice)
  • 合理的安全(reasonably secure)
  • 可擴展(extensible)
  • 最小可用(minimum viable)
本文轉自kubernetes中文社區-使用 kubeadm 創建 kubernetes 1.9 集羣
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章