使用kubeadm快速部署Kubernetes(v1.12.1)叢集---來源:馬哥教育馬哥原創
使用kubeadm快速部署Kubernetes(v1.12.1)叢集------來源:馬哥教育馬哥原創
Kubernetes技術已經成為了原生雲技術的事實標準,它是目前基礎軟體領域最為熱門的分散式排程和管理平臺。於是,Kubernetes也幾乎成了時下開發工程師和運維工程師必備的技能之一。
一、主機環境預設
1、測試環境說明
測試使用的Kubernetes叢集可由一個master主機及一個以上(建議至少兩個)node主機組成,這些主機可以是物理伺服器,也可以運行於vmware、virtualbox或kvm等虛擬化平臺上的虛擬機器,甚至是公有云上的VPS主機。
本測試環境將由master01、node01和node02三個獨立的主機組成,它們分別擁有4核心的CPU及4G的記憶體資源,作業系統環境均為CentOS 7.5 1804,域名為ilinux.io。此外,需要預設的系統環境如下:
(1)藉助於NTP服務設定各節點時間精確同步;
(2)通過DNS完成各節點的主機名稱解析,測試環境主機數量較少時也可以使用hosts檔案進行;
(3)關閉各節點的iptables或firewalld服務,並確保它們被禁止隨系統引導過程啟動;
(4)各節點禁用SELinux;
(5)各節點禁用所有的Swap裝置;
(6)若要使用ipvs模型的proxy,各節點還需要載入ipvs相關的各模組;
2、設定時鐘同步
若節點可直接訪問網際網路,直接啟動chronyd系統服務,並設定其隨系統引導而啟動。
~]# systemctl start chronyd.service
~]# systemctl enable chronyd.service
不過,建議使用者配置使用本地的的時間伺服器,在節點數量眾多時尤其如此。存在可用的本地時間伺服器時,修改節點的/etc/crhony.conf配置檔案,並將時間伺服器指向相應的主機即可,配置格式如下:
server CHRONY-SERVER-NAME-OR-IP iburst
3、主機名稱解析
出於簡化配置步驟的目的,本測試環境使用hosts檔案進行各節點名稱解析,檔案內容如下所示:
172.20.0.71 master01.ilinux.io master01
172.20.0.61 node01.ilinux.io node01
172.20.0.62 node02.ilinux.io node02
4、關閉iptables或firewalld服務
在CentOS7上,iptables或firewalld服務通常只會安裝並啟動一種,在不確認具體啟動狀態的前提下,這裡通過同時關閉並禁用二者即可簡單達到設定目標。
~]# systemctl stop firewalld.service
~]# systemctl stop iptables.service
~]# systemctl disable firewalld.service
~]# systemctl disable iptables.service
5、關閉並禁用SELinux
若當前啟用了SELinux,則需要編輯/etc/sysconfig/selinux檔案,禁用SELinux,並臨時設定其當前狀態為permissive:
~]# sed -i '[email protected]^\(SELINUX=\).*@\[email protected]' /etc/sysconfig/selinux
~]# setenforce 0
6、禁用Swap裝置
部署叢集時,kubeadm預設會預先檢查當前主機是否禁用了Swap裝置,並在未禁用時強制終止部署過程。因此,在主機記憶體資源充裕的條件下,需要禁用所有的Swap裝置,否則,就需要在後文的kubeadm init及kubeadm join命令執行時額外使用相關的選項忽略檢查錯誤。
關閉Swap裝置,需要分兩步完成。首先是關閉當前已啟用的所有Swap裝置:
~]# swapoff -a
而後編輯/etc/fstab配置檔案,註釋用於掛載Swap裝置的所有行。
7、啟用ipvs核心模組
建立核心模組載入相關的指令碼檔案/etc/sysconfig/modules/ipvs.modules,設定自動載入的核心模組。檔案內容如下:
#!/bin/bash
ipvs_modules_dir="/usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs"
for i in $(ls $ipvs_modules_dir | sed -r '[email protected](.*)[email protected]\[email protected]'); do
/sbin/modinfo -F filename $i &> /dev/null
if [ $? -eq 0 ]; then
/sbin/modprobe $i
fi
done
修改檔案許可權,並手動為當前系統載入核心模組:
~]# chmod +x /etc/sysconfig/modules/ipvs.modules
~]# bash /etc/sysconfig/modules/ipvs.modules
二、安裝程式包(在各主機上完成如下設定)
1、生成yum倉庫配置
首先獲取docker-ce的配置倉庫配置檔案:
~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker.repo
而後手動生成kubernetes的yum倉庫配置檔案/etc/yum.repos.d/kubernetes.repo,內容如下:
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
enabled=1
2、安裝相關的程式包
Kubernetes會對經過充分驗正的Docker程式版本進行認證,目前認證完成的最高版本是17.03,但docker-ce的最新版本已經高出了幾個版本號。管理員可忽略此認證而直接使用最新版本的docker-ce程式,不過,建議根據後面的說明,將安裝命令替換為安裝17.03版。
~]# yum install docker-ce
~]# yum install kubelet kubeadm kubectl
如果要安裝目前經過Kubernetes認證的docker-17版本,可以將上面第一條安裝命令替換為如下命令:
~]# yum install -y --setopt=obsoletes=0 docker-ce-17.03.2.ce docker-ce-selinux-17.03.2.ce
三、配置並啟動docker服務(在各節點執行)
若要通過預設的k8s.gcr.io映象倉庫獲取Kubernetes系統元件的相關映象,需要配置docker Unit File(/usr/lib/systemd/system/docker.service檔案)中的Environment變數,為其定義合用的HTTPS_PROXY,格式如下:
Environment="HTTPS_PROXY=PROTOCOL://HOST:PORT"
Environment="NO_PROXY=172.20.0.0/16,127.0.0.0/8"
另外,docker自1.13版起會自動設定iptables的FORWARD預設策略為DROP,這可能會影響Kubernetes叢集依賴的報文轉發功能,因此,需要在docker服務啟動後,重新將FORWARD鏈的預設策略裝置為ACCEPT,方式是修改/usr/lib/systemd/system/docker.service檔案,在“ExecStart=/usr/bin/dockerd”一行之後新增一行如下內容:
ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT
過載完成後即可啟動docker服務:
~]#systemctl daemon-reload
~]# systemctl start docker.service
而後設定docker和kubelet隨系統引導自動啟動:
~]# systemctl enable docker kubelet
四、初始化主節點(在master01上完成如下操作)
1、初始化master節點
若未禁用Swap裝置,則需要編輯kubelet的配置檔案/etc/sysconfig/kubelet,設定其忽略Swap啟用的狀態錯誤,內容如下:
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
(可選步驟)而後,在執行初始化命令之前先執行如下命令單獨獲取相關的映象檔案,而後再執行後面的kubeadm init命令,以便於觀察到映象檔案的下載過程。
~]# kubeadm config images pull
而後即可進行master節點初始化。kubeadm init命令支援兩種初始化方式,一是通過命令列選項傳遞關鍵的部署設定,另一個是基於yaml格式的專用配置檔案,後一種允許使用者自定義各個部署引數。下面分別給出了兩種實現方式的配置步驟,建議讀者採用第二種方式進行。
初始化方式一:
執行如下命令完成master01節點的初始化:
~]# kubeadm init --kubernetes-version=v1.12.1 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
命令中的各選項簡單說明如下:
(1) --kubernetes-version選項的版本號用於指定要部署的Kubenretes程式版本,它需要與當前的kubeadm支援的版本保持一致;
(2) --pod-network-cidr選項用於指定分Pod分配使用的網路地址,它通常應該與要部署使用的網路外掛(例如flannel、calico等)的預設設定保持一致,10.244.0.0/16是flannel預設使用的網路;
(3) --service-cidr用於指定為Service分配使用的網路地址,它由kubernetes管理,預設即為10.96.0.0/12;
(4) 最後一個選項“--ignore-preflight-errors=Swap”僅應該在未禁用Swap裝置的狀態下使用。
初始化方式二:
kubeadm也可通過配置檔案載入配置,以定製更豐富的部署選項。以下是個符合前述命令設定方式的使用示例,不過,它明確定義了kubeProxy的模式為ipvs,並支援通過修改imageRepository的值修改獲取系統映象時使用的映象倉庫。
apiVersion: kubeadm.k8s.io/v1alpha2
kind: MasterConfiguration
kubernetesVersion: v1.12.1
api:
advertiseAddress: 172.20.0.71
bindPort: 6443
controlPlaneEndpoint: ""
imageRepository: k8s.gcr.io
kubeProxy:
config:
mode: "ipvs"
ipvs:
ExcludeCIDRs: null
minSyncPeriod: 0s
scheduler: ""
syncPeriod: 30s
kubeletConfiguration:
baseConfig:
cgroupDriver: cgroupfs
clusterDNS:
- 10.96.0.10
clusterDomain: cluster.local
failSwapOn: false
resolvConf: /etc/resolv.conf
staticPodPath: /etc/kubernetes/manifests
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
將上面的內容保存於配置檔案中,例如kubeadm-config.yaml,而後執行相應的命令:
~]# kubeadm init --config kubeadm-config.yaml --ignore-preflight-errors=Swap
注意:對於Kubernetes系統的新使用者來說,無論使用上述哪種方法,命令執行結束後,請記錄最後的kubeadm join命令輸出的最後提示的操作步驟。下圖的內容是需要使用者記錄的一個命令輸出示例,它提示了後續需要的操作步驟:
另外,kubeadm init命令完整參考指南請移步官方文件。https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/。
2、初始化kubectl
kubectl是kube-apiserver的命令列客戶端程式,實現了除系統部署之外的幾乎全部的管理操作,是kubernetes管理員使用最多的命令之一。kubectl需經由API server認證及授權後方能執行相應的管理操作,kubeadm部署的叢集為其生成了一個具有管理員許可權的認證配置檔案/etc/kubernetes/admin.conf,它可由kubectl通過預設的“$HOME/.kube/config”的路徑進行載入。當然,使用者也可在kubectl命令上使用--kubeconfig選項指定一個別的位置。
下面複製認證為Kubernetes系統管理員的配置檔案至目標使用者(例如當前使用者root)的家目錄下:
~]# mkdir ~/.kube
~]# cp /etc/kubernetes/admin.conf ~/.kube/config
而後,即可通過kubectl進行客戶端命令測試,並藉此瞭解叢集元件的當前狀態:
~]# kubectl get componentstatus
一個正常的輸出應該類似如下輸出結果所示:
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health": "true"}
3、新增flannel網路附件
Kubernetes系統上Pod網路的實現依賴於第三方外掛進行,這類外掛有近數十種之多,較為著名的有flannel、calico、canal和kube-router等,簡單易用的實現是為CoreOS提供的flannel專案。下面的命令用於線上部署flannel至Kubernetes系統之上:
~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
而後使用如下命令確認其輸出結果中Pod的狀態為“Running”,類似如下所示:
~]# kubectl get pods -n kube-system -l app=flannel
NAME READY STATUS RESTARTS AGE
kube-flannel-ds-amd64-wscnz 1/1 Running 0 14m
4、驗正master節點已經就緒
~]# kubectl get nodes
上述命令應該會得到類似如下輸出:
NAME STATUS ROLES AGE VERSION
master01.ilinux.io Ready master 4m9s v1.12.1
五、新增節點到叢集中(在node01和node02上分別完成如下操作)
1、忽略Swap相關的預檢錯誤
若未禁用Swap裝置,編輯kubelet的配置檔案/etc/sysconfig/kubelet,設定其忽略Swap啟用的狀態錯誤,內容如下:
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
提示:若節點禁用了所有的Swap裝置,並無須執行此步驟。
2、新增節點
將節點加入第二步中建立的master的叢集中,要使用主節點初始化過程中記錄的kubeadm join命令,並且在未禁用Swap裝置的情況下,額外附加“--ignore-preflight-errors=Swap”選項;下面的命令來自於前面初始master時執行的kubeadm init命令的輸出結果。
~]# kubeadm join 172.20.0.71:6443 --token gwxgdg.igg5728t1vt8ahhx --discovery-token-ca-cert-hash sha256:9b63cd1530b50da4733d2e7dace9270782211e25ec2e4bbac395e59adc56a26c --ignore-preflight-errors=Swap
在每個節點新增完成後,即可通過kubectl驗正新增結果。下面的命令及其輸出是在node01和node02均新增完成後執行的,其輸出結果表明兩個Node已經準備就緒。
~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01.magedu.com Ready master 31m v1.12.1
node01.magedu.com Ready <none> 3m8s v1.12.1
node02.magedu.com Ready <none> 2m25s v1.12.1
到此為止,一個master,並附帶有兩個node的kubernetes叢集基礎設施已經部署完成,使用者隨後即可測試其核心功能。例如,下面的命令可將myapp以Pod的形式編排運行於叢集之上,並通過在叢集外部進行訪問:
~]# kubectl create deployment myapp --image=ikubernetes/myapp:v1
~]# kubectl create service nodeport myapp --tcp=80:80
而後,使用如下命令瞭解Service物件myapp使用的NodePort,以便於在叢集外部進行訪問:
~]# kubectl get svc -l app=myapp
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
myapp NodePort 10.102.254.75 <none> 80:31257/TCP 2m32s
myapp是一個web應用,因此,使用者可以於叢集外部通過“http://NodeIP:31257”這個URL訪問myapp上的應用,例如於叢集外通過瀏覽器訪問“http://172.20.0.61:31257”。