1. 程式人生 > >使用kubeadm快速部署Kubernetes(v1.12.1)叢集---來源:馬哥教育馬哥原創

使用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”。