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

2.2 部署云部分——Kubernetes

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

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

2.2.1 Kubernetes相關的容器運行時部署

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

表2-1 Kubernetes支持的容器運行時

042-01

從Kubernetes支持的容器運行時列表,我們可知:

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

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

3)Frakti的目的是實現(xiàn)容器運行時的強隔離,基于Hypervisors實現(xiàn)容器運行時,使每個容器具有獨立的操作系統(tǒng)。

目前,業(yè)界普遍使用的容器運行時是Docker。下面詳細說明部署Docker的相關步驟和注意事項。

本書使用的操作系統(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)設置Docker的配置文件。

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

#mkdir /etc/docker

②設置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)啟動Docker,命令如下:

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

至此,Docker容器運行時就安裝成功了。接下來,分析Docker配置相關的注意事項。

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

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

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

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

# vi /etc/docker/daemon.json

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

2.2.2 Kubernetes的學習環(huán)境部署

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

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

044-01

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

1. Minikube的安裝與使用

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

下面對Minikube的安裝和使用進行說明。本書使用的操作系統(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的二進制壓縮包并進行安裝。

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

045-01

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

點擊CHANGELOG-1.16.md進入二進制文件下載列表,復制服務二進制壓縮包下載地址,使用wget命令下載服務二進制壓縮包,命令如下:

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

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

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

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

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

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

設置libvirtd開機自動啟動,命令如下:

# 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)啟動一個本地單節(jié)點集群,命令如下:

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

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

# minikube status

3)使用集群部署應用,命令如下:

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

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

2. Kind的安裝與使用

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

下面對Kind的安裝和使用進行說明。

(1)安裝Kind

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

1)安裝Go,命令如下:

# yum -y install Go

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

2)安裝Kind,命令如下:

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

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

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

使在/etc/profile中設置的環(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)建了一個本地單節(jié)點的Kubernetes集群。

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

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

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

049-02

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

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

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

050-01

(1)使用Kubeadm的注意事項

1)確保集群中所有主機網(wǎng)絡可達。

在集群中不同主機間通過ping命令進行檢測,命令如下:

# ping {被檢測主機ip}

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

查看主機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集群中主機需要打開的端口如表2-5所示。

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

050-02

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

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

#swapoff -a

(2)安裝Kubeadm

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

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

①在需要安裝Kubeadm的節(jié)點上設置安裝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設置為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設置為開機自啟動,命令如下:

#systemctl enable --now Kubelet

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

(3)使用Kubeadm

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

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

使用Kubeadm部署Kubernetes單節(jié)點集群,其實是在一個節(jié)點使用Kubeadm部署Kubernetes的控制平面,然后對該節(jié)點進行設置,使其能夠運行應用負載。

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

#kubeadm config images list

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

052-01

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

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

②使用Kubeadm創(chuàng)建Kubernetes單節(jié)點集群,在創(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集群時,多個控制平面共用的域名或負載均衡IP。
  • --pod-network-cidr:指定Kubernetes集群中Pod所用的IP池。
  • --cri-socket:指定Kubernetes集群使用的容器運行時。
  • --apiserver-advertise-address:指定kube-api-server綁定的IP地址——既可以是IPv4,也可以是IPv6。

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

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

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

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

# vim /etc/profile

export KUBECONFIG=/etc/Kubernetes/admin.conf

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

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

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

至此,一個完整的Kubernetes控制節(jié)點就搭建完成了,但這還不能算一個完整單節(jié)點集群,因為該控制節(jié)點默認不接受負載調(diào)度。要使其能夠接受負載調(diào)度,需要進行如下設置:

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

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

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

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

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

3)部署Kubernetes高可用集群。

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

054-01

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

055-01

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

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

主站蜘蛛池模板: 通榆县| 沙坪坝区| 五华县| 黎平县| 新沂市| 罗城| 崇阳县| 饶平县| 大同市| 金山区| 曲靖市| 乌恰县| 故城县| 巨野县| 黎川县| 大洼县| 保靖县| 中阳县| 麻阳| 青阳县| 尚义县| 济南市| 湖南省| 乐清市| 浮梁县| 镇康县| 青河县| 靖江市| 迭部县| 呼伦贝尔市| 湖南省| 凤城市| 安平县| 老河口市| 克什克腾旗| 罗城| 泰顺县| 新丰县| 中超| 山阳县| 和顺县|