前言
上一篇我們講述了使用Kubectl管理k8s叢集,那麼接下來,我們將使用kubeadm來啟動k8s叢集。
部署k8s叢集存在一定的挑戰,尤其是部署高可用的k8s叢集更是頗為複雜(後續會講)。因此本教程會在部署的過程中穿插講解一些部署相關知識、原理和步驟,比如kubeadm、kubelet以及啟動叢集時的實際部署動作等等。整個部署過程全部指令碼化,以便各位參考和學習。
因整個叢集部署教程篇幅較長,因此會拆分成幾篇進行說明。
目錄
使用Kubeadm建立k8s叢集
-
Kubeadm概述
-
Kubelet概述
-
定義叢集部署目標和規劃
-
部署規劃
使用Kubeadm建立k8s叢集
Kubeadm概述
Kubeadm 是一個命令列工具,它主要提供了“kubeadm init” 以及 “kubeadm join”這兩個命令來快速建立和初始化kubernetes 叢集。
Kubeadm通過執行必要的操作來啟動和執行一個最小可用的叢集。它被故意設計為只關心啟動叢集,而不是之前的節點準備工作。同樣的,諸如安裝各種各樣的外掛,例如 Kubernetes Dashboard、監控解決方案以及特定雲提供商的外掛,這些都不在它負責的範圍。
主要命令
其主要命令和說明如下表所示:
命令 |
說明 |
kubeadm init |
啟動一個Kubernetes主節點 |
kubeadm join |
啟動一個Kubernetes工作節點並且將其加入到叢集 |
kubeadm upgrade |
更新一個 Kubernetes 叢集到新版本 |
kubeadm config |
檢視儲存在叢集中的kubeadm配置,例如“kubeadm config images list”可以列出kubeadm需要的映象 |
kubeadm token |
令牌管理 |
kubeadm reset |
重置叢集,也就是將還原kubeadm init 或者 kubeadm join 對主機所做的任何更改 |
kubeadm version |
列印 kubeadm 版本 |
Kubelet概述
kubelet 是在每個節點上執行的主要“節點代理”。簡單地說,kubelet 的主要功能就是定時獲取節點上pod/container 的期望狀態(執行什麼容器、執行的副本數量、網路或者儲存如何配置等等),並呼叫對應的容器平臺介面達到這個狀態,並確保它們能夠健康的執行。因此,kubelet的主要功能為:
-
pod管理
-
容器健康檢查
-
容器監控
注意,不是 Kubernetes建立的容器將不在 kubelet 的管理範圍。
瞭解了這些,接下來,我們來使用Kubeadm來建立叢集。
定義叢集部署目標和規劃
有目標,我們才能有的放矢。在本節內容中,我們將基於三臺虛擬機器來搭建一個k8s叢集,其中一臺作為主節點,另外兩臺作為工作節點。
具體部署架構如下所示:
1.安裝規劃
伺服器規劃:
主機名稱 |
作業系統 |
IP |
系統配置 |
備註 |
k8s-master |
CentOS-7-x86_64 |
172.16.2.201 |
2核2G |
作為主節點 |
k8s-node1 |
CentOS-7-x86_64 |
172.16.2.202 |
2核2G |
作為工作節點 |
k8s-node2 |
CentOS-7-x86_64 |
172.16.2.203 |
2核2G |
作為工作節點 |
值得注意的是:
-
伺服器最小記憶體不得小於2G,CPU核心數最少為2;
-
群集中所有的計算機之間擁有完全的網路連線(公共或專用網路);
-
所有機器都有sudo許可權;
相關環境的搭建和初始化筆者這裡先行略過。
以下內容均使用root賬戶安裝和配置。
Pod 分配 IP 段:10.244.0.0/16
kubernetes-version:v1.15.0
apiserver-advertise-address:172.16.2.201
部署規劃
接下來,我們就開始按規劃進行部署。主體步驟如下所示:
1.主機和IP設定
各節點主機名稱和IP設定如表所示:
主機名稱 |
IP |
k8s-master |
172.16.2.201 |
k8s-node1 |
172.16.2.202 |
k8s-node2 |
172.16.2.203 |
接下來我們以master(k8s-master)為例,相關設定步驟如下所示(請注意替換相關引數):
-
設定主機名稱以及修改主機記錄
bash:
#設定Host名稱
hostnamectl set-hostname k8s-master #檢視host名稱
hostname #修改Host檔案,給127.0.0.1新增hostname
echo "127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 k8s-master
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6"> /etc/hosts #檢視修改結果
cat /etc/hosts
-
配置網路服務以及設定固定IP
bash:
#配置網路卡
echo "
DEVICE=eth0
TYPE=Ethernet
IPADDR=172.16.2.201
PREFIX=24
NETMASK=255.255.255.0
NETWORK=172.16.2.0
GATEWAY=172.16.2.254
BROADCAST=172.16.2.255
DEFROUTE=yes
ONBOOT=yes
USERCTL=yes
BOOTPROTO=static
NAME=eth0
IPV4_FAILURE_FATAL=yes
UUID=5ed1bf4a-4be2-4040-ad55-fea853b849d1
"> /etc/sysconfig/network-scripts/ifcfg-eth0 #編輯/etc/sysconfig/network
echo "NETWORKING=yes
HOSTNAME=k8s-master"> /etc/sysconfig/network #編輯/etc/resolv.conf,設定DNS
echo "nameserver 172.16.2.254
nameserver 114.114.114.114
nameserver 8.8.8.8
"> /etc/resolv.conf #重啟網路服務systemctl restart network.service #重啟網路服務
systemctl status network.service #檢視網路服務狀態
-
系統設定
bash: #關閉Selinux sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config #永久關閉 Swapswapoff -a sed -ri 's/.*swap.*/#&/' /etc/fstab echo "vm.swappiness = 0">> /etc/sysctl.conf #修改核心引數cat <<EOF > /etc/sysctl.d/k8s.confnet.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 vm.swappiness=0 EOF
2.Docker安裝
這裡推薦使用以下指令碼來安裝官方已經充分測試過的指定版本的Docker-ce以及設定加速器:
# 安裝必須的包 yum install yum-utils device-mapper-persistent-data lvm2 # 新增Docker倉庫 yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo # 安裝指定版本的Docker CEyum update && yum install docker-ce-18.06.2.ce # 建立 /etc/docker 目錄 mkdir /etc/docker # 設定守護程式 cat > /etc/docker/daemon.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ] , "registry-mirrors": ["https://mirror.ccs.tencentyun.com"] } EOF mkdir -p /etc/systemd/system/docker.service.d # 重啟Docker服務 systemctl daemon-reload systemctl enable docker systemctl restart docker
3.主機埠設定
-
主節點埠設定:
協議 |
方向 |
埠 |
說明 |
TCP |
入站 |
6443* |
Kubernetes API server |
TCP |
入站 |
2379-2380 |
etcd server client API |
TCP |
入站 |
10250 |
Kubelet API |
TCP |
入站 |
10251 |
kube-scheduler |
TCP |
入站 |
10252 |
kube-controller-manager |
-
工作節點埠設定:
協議 |
方向 |
埠 |
說明 |
TCP |
入站 |
10250 |
Kubelet API |
TCP |
入站 |
30000-32767 |
NodePort Services |
CentOS預設沒有安裝防火牆,需要使用以下命令安裝和啟用防火牆:
#安裝iptables服務
yum install iptables-services
systemctl enable iptables.servicesy
stemctl start iptables.service
然後使用編輯器按Demo編輯檔案/etc/sysconfig/iptables設定准入埠即可。
在開發實驗階段,為了方便,大家也可以直接禁用防火牆:
systemctl stop firewalld.service
systemctl disable firewalld.service