Kubernetes學習筆記-1:在CentOS7上搭建簡易Kubernetes Cluster


隨着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

 

今天就寫到這里吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM