官术网_书友最值得收藏!

2.2 部署云部分——Kubernetes

Kubernetes是一個(gè)全新的基于容器技術(shù)的分布式架構(gòu)的云部署方案,是Google開源的容器集群管理系統(tǒng),為部署容器化的應(yīng)用提供資源調(diào)度、服務(wù)發(fā)現(xiàn)和動(dòng)態(tài)伸縮等一系列完整功能,提高了大規(guī)模容器集群管理的便捷性。本書將Kubernetes作為邊緣計(jì)算系統(tǒng)的云部分解決方案。

本節(jié)會對Kubernetes的部署方式進(jìn)行梳理,主要對Kubernetes相關(guān)的容器運(yùn)行時(shí)部署、Kubernetes的學(xué)習(xí)環(huán)境部署、Kubernetes的生產(chǎn)環(huán)境部署三方面進(jìn)行梳理。

2.2.1 Kubernetes相關(guān)的容器運(yùn)行時(shí)部署

Kubernetes通過容器運(yùn)行時(shí)以Pod形式運(yùn)行容器,官方默認(rèn)支持Docker容器運(yùn)行時(shí)。除此之外,Kubernetes支持的容器運(yùn)行時(shí)還包括Containerd、Cri-o、Frakti等,具體如表2-1所示。

表2-1 Kubernetes支持的容器運(yùn)行時(shí)

042-01

從Kubernetes支持的容器運(yùn)行時(shí)列表,我們可知:

1)Docker和Containerd在實(shí)現(xiàn)原理上是相同的,只是Containerd裁剪了Docker原有的一些富功能。

2)Cri-o為了追求輕量級和簡潔,對CRI和OCI重新進(jìn)行了實(shí)現(xiàn)。

3)Frakti的目的是實(shí)現(xiàn)容器運(yùn)行時(shí)的強(qiáng)隔離,基于Hypervisors實(shí)現(xiàn)容器運(yùn)行時(shí),使每個(gè)容器具有獨(dú)立的操作系統(tǒng)。

目前,業(yè)界普遍使用的容器運(yùn)行時(shí)是Docker。下面詳細(xì)說明部署Docker的相關(guān)步驟和注意事項(xiàng)。

本書使用的操作系統(tǒng)都是CentOS 7+,所以部署Docker的步驟也是針對CentOS 7+操作環(huán)境。

1)安裝需要的依賴包,命令如下:

# yum install yum-utils device-Mapper-persistent-data lvm2

2)增加安裝Docker所需的Repository,命令如下:

# yum-config-manager --add-repo \
  https://download.docker.com/linux/centos/docker-ce.repo

3)安裝指定版本的Docker,命令如下:

# yum update && yum install containerd.io-1.2.10  docker-ce-19.03.4  docker-ce-cli-19.03.4

4)設(shè)置Docker的配置文件。

①創(chuàng)建配置文件目錄:

#mkdir /etc/docker

②設(shè)置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"
    ]
}
EOF

5)啟動(dòng)Docker,命令如下:

# mkdir -p /etc/systemd/system/docker.service.d
# systemctl daemon-reload
# systemctl restart docker

至此,Docker容器運(yùn)行時(shí)就安裝成功了。接下來,分析Docker配置相關(guān)的注意事項(xiàng)。

Docker的相關(guān)配置在/etc/docker/daemon.json文件中,包括設(shè)置私有倉庫、DNS解析服務(wù)器、Docker運(yùn)行時(shí)使用的路徑、鏡像加速地址、日志輸出、Cgroup Driver、Docker主機(jī)的標(biāo)簽等。本節(jié)重點(diǎn)介紹Cgroup Driver的設(shè)置。

Linux操作系統(tǒng)的發(fā)行版本中將Systemd作為其初始化系統(tǒng),并初始化進(jìn)程生成一個(gè)root控制組件。Systemd與Cgroup集成緊密,為每個(gè)進(jìn)程分配Cgroup。Docker容器運(yùn)行時(shí)默認(rèn)的Cgroup管理器是Cgroupfs,也就是說Kubelet使用Cgroupfs來管理Cgroup。這樣就造成在同一臺主機(jī)上同時(shí)使用Systemd和Cgroupfs兩種Cgroup管理器來對Cgroup進(jìn)行管理。

Cgroup用來約束分配給進(jìn)程的資源。單個(gè)Cgroup管理器能夠簡化分配資源的視圖,并且默認(rèn)情況下管理可用資源和使用中的資源時(shí)使用一致的視圖。當(dāng)有兩個(gè)Cgroup管理器時(shí),最終產(chǎn)生兩種視圖。我們已經(jīng)看到某些案例中的節(jié)點(diǎn)配置讓Kubelet和Docker使用Cgroupfs管理器,而節(jié)點(diǎn)上運(yùn)行的其余進(jìn)程則使用Systemd,這類節(jié)點(diǎn)在資源壓力下會變得不穩(wěn)定。

更改設(shè)置,令Docker和Kubelet使用Systemd作為Cgroup驅(qū)動(dòng),以便系統(tǒng)更穩(wěn)定。請注意在/etc/docker/daemon.json文件中設(shè)置native.cgroupdriver=systemd選項(xiàng),具體如下:

# vi /etc/docker/daemon.json

{
    ...
    "exec-opts": ["native.cgroupdriver=systemd"],
    ...
}

2.2.2 Kubernetes的學(xué)習(xí)環(huán)境部署

本節(jié)對部署Kubernetes學(xué)習(xí)環(huán)境的相關(guān)工具進(jìn)行梳理,如表2-2所示。

表2-2 搭建Kubernetes學(xué)習(xí)環(huán)境的工具

044-01

從搭建Kubernetes學(xué)習(xí)環(huán)境的工具列表可知,Minikube、Kind都可以搭建Kubernetes的學(xué)習(xí)環(huán)境,但兩者所需要的依賴和原理各不相同。Minikube和Kind都是用于搭建Kubernetes學(xué)習(xí)環(huán)境的工具,二者的安裝步驟和使用方法相對比較簡單。接下來,筆者對二者的安裝步驟和使用方法進(jìn)行詳細(xì)說明。

1. Minikube的安裝與使用

Minikube是一種可以在本地輕松運(yùn)行Kubernetes的工具。其首先通過在物理服務(wù)器或計(jì)算機(jī)上創(chuàng)建虛擬機(jī),然后在虛擬機(jī)(VM)內(nèi)運(yùn)行一個(gè)單節(jié)點(diǎn)Kubernetes集群。該Kubernetes集群可以用于開發(fā)和測試Kubernetes的最新版本。

下面對Minikube的安裝和使用進(jìn)行說明。本書使用的操作系統(tǒng)都是CentOS 7+,所以本節(jié)安裝Minikube的步驟也是針對CentOS 7+操作環(huán)境。

(1)安裝Minikube

1)檢查對虛擬化的支持,命令如下:

# grep -E --color 'vmx|svm' /proc/cpuinf

2)安裝Kubectl。

推薦在Kubernetes的GitHub上的發(fā)布主頁下載pre-built的二進(jìn)制壓縮包并進(jìn)行安裝。

進(jìn)入Kubernetes的GitHub倉庫上的發(fā)布主頁,找到需要下載的Kubernetes版本,比如本節(jié)要下載的版本是v1.16.6,如圖2-2所示。

045-01

圖2-2 Kubernetes v1.16.6發(fā)布版本

點(diǎn)擊CHANGELOG-1.16.md進(jìn)入二進(jìn)制文件下載列表,復(fù)制服務(wù)二進(jìn)制壓縮包下載地址,使用wget命令下載服務(wù)二進(jìn)制壓縮包,命令如下:

# wget https://dl.k8s.io/v1.16.6/Kubernetes-server-linux-amd64.tar.gz

下載Kubernetes具體如圖2-3所示。

046-01

圖2-3 下載Kubernetes

如圖2-4所示,解壓kubernetes-server-linux-amd64.tar.gz,命令如下:

# tar -zxvf kubernetes-server-linux-amd64.tar.gz
046-02

圖2-4 解壓Kubernetes

由圖2-4可知,Kubectl在kubernetes/server/bin下,只需將其放入/usr/bin下即可:

#cp kubernetes/server/bin/kubectl /usr/bin

3)安裝KVM。

在確認(rèn)所在的操作系統(tǒng)支持虛擬機(jī)的前提下,通過如下步驟安裝KVM及相關(guān)依賴。

更新安裝KVM所需的源,命令如下:

#yum -y update && # yum install epel-release 

安裝KVM及其所需的依賴包,命令如下:

#  yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install

設(shè)置libvirtd開機(jī)自動(dòng)啟動(dòng),命令如下:

# systemctl enable libvirtd && systemctl start libvirtd

4)安裝Minikube,命令如下:

# curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-1.6.2.rpm \
&&  rpm -ivh minikube-1.6.2.rpm

(2)使用Minikube

1)啟動(dòng)一個(gè)本地單節(jié)點(diǎn)集群,命令如下:

# minikube start --vm-driver=<driver_name>

2)檢查集群狀態(tài),命令如下:

# minikube status

3)使用集群部署應(yīng)用,命令如下:

# kubectl create deployment hello-minikube --image={image-name}

至此,我們已經(jīng)成功安裝了Minikube,并通過Minikube創(chuàng)建了一個(gè)本地單節(jié)點(diǎn)的Kubernetes集群。

2. Kind的安裝與使用

Kind是一種使用Docker容器節(jié)點(diǎn)(該容器可用于運(yùn)行嵌套容器,在該容器里可以使用Systemd運(yùn)行、管理Kubernetes的組件)運(yùn)行本地Kubernetes集群的工具。Kind主要是為了測試Kubernetes本身而設(shè)計(jì)的,可用于本地開發(fā)或持續(xù)集成。

下面對Kind的安裝和使用進(jìn)行說明。

(1)安裝Kind

由于安裝Kind需要Go語言環(huán)境,使用Kind運(yùn)行本地Kubernetes集群需要Docker容器運(yùn)行時(shí),因此在安裝Kind之前需要安裝Go和Docker。

1)安裝Go,命令如下:

# yum -y install Go

參考“部署Docker”小節(jié)來部署Docker容器運(yùn)行時(shí)。

2)安裝Kind,命令如下:

#GO111MODULE="on" go get sigs.k8s.io/kind@v0.7.0

上述步驟會將Kind安裝到GOPATH/bin目錄下。為了使用方便,建議將其在/etc/profile中進(jìn)行追加設(shè)置,命令如下:

# vi /etc/profile
export PATH=$GOPATH/bin:$PATH

使在/etc/profile中設(shè)置的環(huán)境變量立即生效,命令如下:

#source /etc/profile

(2)使用Kind

1)使用Kind創(chuàng)建Kubernetes集群(如圖2-5所示),命令如下:

# kind create cluster
048-01

圖2-5 使用Kind創(chuàng)建集群

2)檢查、使用Kind部署的集群(如圖2-6所示),命令如下:

#kubectl get pods --all-namespaces
049-01

圖2-6 檢查使用Kind部署的集群狀態(tài)

至此,我們已經(jīng)成功安裝了Kind,并通過Kind創(chuàng)建了一個(gè)本地單節(jié)點(diǎn)的Kubernetes集群。

2.2.3 Kubernetes的生產(chǎn)環(huán)境部署

本節(jié)對部署Kubernetes生產(chǎn)環(huán)境的相關(guān)工具進(jìn)行梳理,具體如表2-3所示。

表2-3 搭建Kubernetes生產(chǎn)環(huán)境的工具

049-02

從表2-3可知,Kops、KRIB有明顯局限性,因?yàn)镵ops主要在AWS上進(jìn)行自動(dòng)化部署Kubernetes集群;KRIB主要在裸機(jī)上進(jìn)行自動(dòng)化部署Kubernetes集群。Kubeadm和Kubespray可以在多種平臺上搭建Kubernetes的生產(chǎn)環(huán)境。Kubespray從v2.3開始支持Kubeadm,也就意味著Kubespray最終還是通過Kubeadm自動(dòng)化部署Kubernetes集群。

本節(jié)首先對使用Kubeadm的注意事項(xiàng)進(jìn)行說明,然后具體介紹如何安裝和使用Kubeam。Kubeadm支持的平臺和資源要求如表2-4所示。

表2-4 Kubeadm支持的平臺和資源要求

050-01

(1)使用Kubeadm的注意事項(xiàng)

1)確保集群中所有主機(jī)網(wǎng)絡(luò)可達(dá)。

在集群中不同主機(jī)間通過ping命令進(jìn)行檢測,命令如下:

# ping {被檢測主機(jī)ip}

2)確保集群中所有主機(jī)的Hostname、MAC Address和product_uuid唯一。

查看主機(jī)Hostname命令:#hostname

查看MAC Address命令:#ip link或者#ifconfig -a

查看product_uuid命令:#/sys/class/dmi/id/product_uuid

3)IPTables后端不用nftable,命令如下:

# update-alternatives --set iptables /usr/sbin/iptables-legacy

4)Kubernetes集群中主機(jī)需要打開的端口如表2-5所示。

表2-5 Kubernetes集群中主機(jī)需要打開的端口

050-02

由表2-5可知,上述需要打開的端口都是Kubernetes默認(rèn)打開的端口。我們也可以根據(jù)需要對一些端口進(jìn)行單獨(dú)指定,比如Kubernetes-api-server默認(rèn)打開的端口是6443,也可以指定打開其他與現(xiàn)有端口不沖突的端口。

5)在Kubernetes集群的所有節(jié)點(diǎn)上關(guān)閉Swap分區(qū),命令如下:

#swapoff -a

(2)安裝Kubeadm

安裝Kubeadm有兩種方式,即通過操作系統(tǒng)的包管理工具進(jìn)行安裝,從Kubernetes的GitHub倉庫的發(fā)布主頁下載Pre-build的二進(jìn)制壓縮包進(jìn)行安裝。下面對這兩種安裝方式進(jìn)行詳細(xì)說明。

1)通過操作系統(tǒng)的包管理工具安裝Kubeadm。

①在需要安裝Kubeadm的節(jié)點(diǎn)上設(shè)置安裝Kubeadm需要的倉庫,命令如下:

#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
EOF

②將SELINUX設(shè)置為permissive,命令如下:

#setenforce 0
#sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

③安裝Kubeadm、Kubelet、Kubectl,命令如下:

#yum install -y Kubelet kubeadm kubectl --disableexcludes=Kubernetes

④將Kubelet設(shè)置為開機(jī)自啟動(dòng),命令如下:

#systemctl enable --now Kubelet

2)通過在Kubernetes GitHub倉庫的發(fā)布主頁下載pre-build的二進(jìn)制壓縮包來安裝Kubeadm。

(3)使用Kubeadm

使用Kubeadm可以部署Kubernetes單節(jié)點(diǎn)集群、Kubernetes單控制節(jié)點(diǎn)集群和Kubernetes高可用集群。下面將詳細(xì)說明部署這3種集群的具體步驟。

1)部署Kubernetes單節(jié)點(diǎn)集群。

使用Kubeadm部署Kubernetes單節(jié)點(diǎn)集群,其實(shí)是在一個(gè)節(jié)點(diǎn)使用Kubeadm部署Kubernetes的控制平面,然后對該節(jié)點(diǎn)進(jìn)行設(shè)置,使其能夠運(yùn)行應(yīng)用負(fù)載。

①查看使用Kubeadm部署Kubernetes單節(jié)點(diǎn)集群時(shí)所需的鏡像,命令如下:

#kubeadm config images list

所需鏡像如圖2-7所示。

052-01

圖2-7 使用Kubeadm部署Kubernetes單節(jié)點(diǎn)集群所需鏡像

這些鏡像都是以k8s.gcr.io*開頭的。一般情況下,Kubeadm無法正常下載這些鏡像,需要提前準(zhǔn)備好。獲取這些鏡像的方法不止一種,筆者建議通過DockerHub獲得。

②使用Kubeadm創(chuàng)建Kubernetes單節(jié)點(diǎn)集群,在創(chuàng)建的過程中會用到圖2-10列出的所有鏡像,命令如下:

#kubeadm init {args}

在args中一般只需指定--control-plane-endpoint、--pod-network-cidr、--cri-socket、--apiserver-advertise-address參數(shù)。這些參數(shù)的具體作用如下。

  • --control-plane-endpoint:指定搭建高可用Kubernetes集群時(shí),多個(gè)控制平面共用的域名或負(fù)載均衡IP。
  • --pod-network-cidr:指定Kubernetes集群中Pod所用的IP池。
  • --cri-socket:指定Kubernetes集群使用的容器運(yùn)行時(shí)。
  • --apiserver-advertise-address:指定kube-api-server綁定的IP地址——既可以是IPv4,也可以是IPv6。

我們可以根據(jù)具體情況指定以上參數(shù)。

③根據(jù)non-root用戶和root用戶,設(shè)置Kubectl使用的配置文件。

  • 若是non-root用戶,設(shè)置命令如下:
$mkdir -p $HOME/.kube
$sudo cp -i /etc/Kubernetes/admin.conf $HOME/.kube/config
$sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 若是root用戶,設(shè)置命令如下:
export KUBECONFIG=/etc/Kubernetes/admin.conf

為了方便,我們也可以將KUBECONFIG設(shè)置成自動(dòng)生效的系統(tǒng)環(huán)境變量,命令如下:

# vim /etc/profile

export KUBECONFIG=/etc/Kubernetes/admin.conf

④安裝Pod所需的網(wǎng)絡(luò)插件,命令如下:

# kubectl apply -f https://docs.projectCalico.org/v3.8/manifests/Calico.yaml

本節(jié)使用的網(wǎng)絡(luò)插件是Calico,我們也可以根據(jù)具體需求選擇其他的網(wǎng)絡(luò)插件,比如Flannel、Weave Net、Kube-router等。

至此,一個(gè)完整的Kubernetes控制節(jié)點(diǎn)就搭建完成了,但這還不能算一個(gè)完整單節(jié)點(diǎn)集群,因?yàn)樵摽刂乒?jié)點(diǎn)默認(rèn)不接受負(fù)載調(diào)度。要使其能夠接受負(fù)載調(diào)度,需要進(jìn)行如下設(shè)置:

# kubectl taint nodes --all node-role.Kubernetes.io/master-

2)部署Kubernetes單控制節(jié)點(diǎn)集群。

Kubernetes單控制節(jié)點(diǎn)集群是指該Kubernetes集群只有一個(gè)控制節(jié)點(diǎn),但可以有不止一個(gè)計(jì)算節(jié)點(diǎn)。部署該集群只需在部署Kubernetes單節(jié)點(diǎn)集群中安裝Pod所需的網(wǎng)絡(luò)插件之后,將計(jì)算節(jié)點(diǎn)加入該控制節(jié)點(diǎn),具體命令如下:

ubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

使用kubeadm join命令將多個(gè)計(jì)算節(jié)點(diǎn)加入已經(jīng)部署成功的控制節(jié)點(diǎn),與控制節(jié)點(diǎn)組成一個(gè)單控制節(jié)點(diǎn)的Kubernetes集群。

3)部署Kubernetes高可用集群。

Kubeadm除了可以部署Kubernetes單節(jié)點(diǎn)集群和Kubernetes單控制節(jié)點(diǎn)集群外,還可以部署Kubernetes高可用集群。Kubeadm部署Kubernetes高可用集群的架構(gòu)包含兩種,即Etcd集群與Kubernetes控制節(jié)點(diǎn)集群一起部署的Kubernetes高可用集群,以及Etcd集群與Kubernetes控制節(jié)點(diǎn)集群分開部署的Kubernetes高可用集群,具體架構(gòu)如圖2-8和圖2-9所示。

054-01

圖2-8 Etcd集群與Kubernetes控制節(jié)點(diǎn)集群一起部署

055-01

圖2-9 Etcd集群與Kubernetes控制節(jié)點(diǎn)集群分開部署

由圖2-8和圖2-9可知,Kubernetes集群高可用即Kubernetes集群中Master節(jié)點(diǎn)和Etcd集群高可用。部署Kubernetes高可用集群是面向生產(chǎn)環(huán)境的,需要的資源比較多,部署步驟也相對比較復(fù)雜,限于篇幅本書就不展開說明了,感興趣的讀者可以參考Kubernetes官網(wǎng)進(jìn)行實(shí)踐。

主站蜘蛛池模板: 昌平区| 弥渡县| 邵东县| 磐安县| 普格县| 玛纳斯县| 买车| 宝坻区| 靖远县| 陵川县| 怀仁县| 绥阳县| 米脂县| 花垣县| 灵璧县| 四子王旗| 巴林右旗| 阿勒泰市| 乐平市| 民和| 岳阳市| 周宁县| 元朗区| 汝州市| 鄯善县| 台中县| 浏阳市| 宜兰县| 东方市| 墨江| 连城县| 海口市| 南宫市| 淮阳县| 洪江市| 岑巩县| 祁阳县| 汉源县| 沙洋县| 龙门县| 河北区|