隨着Kubernetes在公司內的應用日益廣泛,我也不得不趕快補充一下相關知識,否則將會面臨無法應對日常工作的窘境。 前些日子算是完成了自學的第一步,在CentOS7 虛擬機上搭建了個最簡單的Kubernetes Cluster, 包含一個Master node和兩個Worker node。現在將我的搭建經歷分享給大家。
基礎環境說明
- 主機: MacBookPro
- 虛擬機軟件:VirtualBox
- 虛擬機: 1 CPU + 2GB 內存 + 20GB 硬盤空間
- 虛擬機 OS: CentOS-7-x86_64-Minimal-1804.iso
初始化虛擬機
按以上配置創建三個虛擬機,每個虛擬機配置兩個網絡,一個NAT,一個Host-Only,以便同時支持虛擬機之間的互通,主機與虛擬機之間的互通,以及虛擬機通過主機連接Internet。再從 https://www.centos.org/download/ 下載CentOS 7 的最小安裝鏡像。啟動虛擬機安裝CentOS 7,在安裝完成后重啟。
默認情況下虛擬機網絡是Disconnected狀態,可使用"nmcli d" 查看:
使用“nmtui”開啟網絡,並重啟虛擬機。之后再使用"nmcli d" 查看,可以看到網絡已開啟:
此時使用 “ip addr show” 也就可以看到IP地址了。使用 "hostnamectl set-hostname <host name>" 為三個虛擬機設置所需要的機器名。我將其命名為kub-master, kub-node01, kub-node02。
至此,安裝操作系統的准備工作就結束了。接下來就可以使用Terminal或者Iterm2等客戶端SSH登陸虛擬機了。
安裝Kubernetes之前的准備工作
永久關閉Swap。"vi /etc/fstab", 注釋掉“/dev/mapper/centos-swap swap”,保存並重啟虛擬機。使用 “free -h“, 顯示swap都為 0 就對了。
關閉Selinux。 "vi /etc/sysconfig/selinux", 設置“SELINUX=disabled”
使用如下命令關閉防火牆:
systemctl disable firewalld
systemctl stop firewalld”
編輯 /etc/sysctl.conf, 加一行:net.bridge.bridge-nf-call-iptables = 1. 運行"modprobe br_netfilter" 和 “sysctl -p”,輸出“net.bridge.bridge-nf-call-iptables = 1”就對了。
運行 "yum install -y docker" 和 “systemctl enable docker && systemctl start docker”安裝並啟動Docker. 運行“systemctl status docker”查看一下Docker 服務是active(running)狀態就行。當前的Docker版本是1.13.1
保險起見,再reboot一下吧。
安裝 kubeadm, kubelet 和 kubectl
添加Kubernetes Yum源。運行如下代碼:
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
如果要使用上述google源的話請自行解決連接問題。如果連不上google源的話可以改為阿里的鏡像源:
cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 EOF
使用yum 安裝Kubernetes 組件:
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
如下組件將會被安裝:
安裝完畢后啟動Kubelet:
systemctl enable kubelet && systemctl start kubelet
如果此時使用 "systemctl status kubelet" 查看kubelet 服務狀態的話會發現服務狀態是 "Active: activating (auto-restart)",這是正常現象,因為此時還沒有使用kubeadm做初始化。
最后再跑一下 "yum update -y",更新一下各種package,再重啟一下。(這一步可有可無)
至此,對master node和worker nodes的基礎配置及軟件安裝工作已經完成。請確保以上步驟在每一個node上都執行完成。
初始化Master Node
以下操作只在master node 上操作:
初始化master node 就是跑一下"kubeadm init". Kubeadm 在初始化Cluster的時候可以附帶許多參數,此處我不指定任何參數,就用其默認值即可。運行成功后會得到如下的輸出:
如果使用非root用戶啟動Cluster,則需要執行如下命令:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
如果是使用root用戶啟動Cluster,則可簡化為:
export KUBECONFIG=/etc/kubernetes/admin.conf
接下來就是安裝Pod Network Plugin。 這一步至關重要,否則Cluster無法正常運作。Pod Network Plugin有很多種可選,我這里就隨便選了Weave Net。運行如下指令安裝Weave Net:
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
最后保留好“kubeadm join ”命令行的內容,這是用於在node上操作將node加入到cluster里。
至此,Master Node 初始化完成,運行 “kubectl get nodes”,應該可以看到如下輸出:
在接下來的配置worker node的過程中,可以用如下指令在Master node 的Terminal里監控Cluster里Node數量和狀態的變化:
watch -n 2 kubectl get nodes,svc,namespaces
向cluster中添加node
以下操作只在worker nodes 上操作。
運行在之前步驟中保存的 "kubeadm join " 語句,並在worker node上執行,最后得到如下結果說明該worker已經成功注冊到master:
重復此操作將所需的worker node上都加入到cluster中。
返回master node查看cluster狀態
如果之前在Master Node的Terminal里運行了 “”, 此時應該可以看到Cluster中已將包含了3個node上,其中一個是Master:
至此,最基本的 包含3個 nodes 的 Kubernetes Cluster 就已經初始化完成了。我當時的環境是可以連接google的,所以如果在不能連接google的環境中可能還會遇到某些需要 pull image的步驟過不去或報錯的狀況。詳細錯誤信息可以用 “tail -f /var/log/message”來查看並有針對性的加以解決。
Master node和 Worker Node之間的路由問題
有時候在將worker node加入到Master node之后,worker node始終處於NotReady狀態,並且可以看到對應的Weave-net pod狀態異常:
[root@kub-master01 ~]# kubectl get pods -n kube-system | grep weave weave-net-6s47v 2/2 Running 8 28m weave-net-rglfd 1/2 CrashLoopBackOff 1 87s weave-net-zjhm2 2/2 Running 5 35m
這可能是因為worker node上運行的Weave-net pod 因為沒有路由所以無法連接到Cluster IP:
[root@kub-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 133m
此時就需要在worker node上加一條路由:
[root@kub-node01 ~]# ip route add <Cluster IP> via <master node IP> dev enp0s3
參考文獻
- https://kubernetes.io/docs/setup/independent/install-kubeadm/
- https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/
- https://kubernetes.io/docs/reference/setup-tools/kubeadm
今天就寫到這里吧。