Kubernetes进阶自学系列 | 部署分布式Kubernetes集群

书籍来源:《Kubernetes进阶实战(第2版)》

一边学习一边整理读书笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:Kubernetes进阶自学系列 | 汇总_COCOgsta的博客-CSDN博客


2.2.1 准备基础环境

kubeadm可以支持在Ubuntu 16.04+、Debian 9+、CentOS 7与RHEL 7、Fedora 25+、HypriotOS v1.0.1+和Container Linux等系统环境上构建Kubernetes集群。部署的基础环境要求还包括每个独立的主机应该有2GB以上的内存及2个以上的CPU核心,禁用了Swap设备且各主机彼此间具有完整意义上的网络连通性。

部署Kubernetes集群的基本前提是准备好所需要的机器,本节的示例中会用到4个主机,如表2-2所示,其中k8s-master01是控制平面节点,另外3个是工作节点。

下面讲解具体的基础环境的准备工作。

  1. 基础系统环境设置

(1)主机时间同步

如果各主机可直接访问互联网,则直接启动各主机上的chronyd服务即可。否则需要使用本地网络中的时间服务器,例如可以把Master配置为chrony server,而后其他节点均从Master同步时间。

~$ sudo systemctl start chronyd.service
~$sudo systemctl enable chronyd.service

(2)各节点防火墙设定

各Node运行的kube-proxy组件要借助iptables或ipvs构建Service资源对象,该资源对象是Kubernetes的核心资源类型之一。出于简化问题复杂度之需,这里事先关闭所有主机之上的iptables相关的服务。

~$ sudo ufw disable  && sudo ufw status

(3)禁用Swap设备

系统内存资源吃紧时,Swap能在一定程度上起到缓解作用,但Swap是磁盘上的空间,性能与内存相差很多,进而会影响Kubernetes调度和编排应用程序运行的效果,因而需要将其禁用。

~$ sudo swapoff -a

(4)确保MAC地址及product_id的唯一性

一般来讲,网络接口卡会拥有唯一的MAC地址,非唯一的MAC地址或product_id可能会导致安装失败。建议用户在部署或模板化生成主机及操作系统时直接规避这些问题,或借助Ansible这类编排工具收集并对比排查此类问题。

  1. 配置容器运行引擎

若同时检测到Docker和containerd,则优先选择Docker,因为Docker自18.09版本起附带了containerd,并且两者都可以被检测到。本示例将使用目前应用最为广泛的Docker-CE引擎。

1)更新apt索引信息后安装必要的程序包。

~$ sudo apt update
~$ sudo apt install  apt-transport-https  ca-certificates  \
      curl  gnupg-agent  software-properties-common

2)添加Docker官方的GPG证书,以验证程序包签名,代码如下。

~$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

3)为apt添加稳定版本的Docker-CE仓库。

~$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) stable"

4)更新apt索引后安装docker-ce。

~$ sudo apt update
~$ sudo apt install docker-ce docker-ce-cli containerd.io

5)配置Docker。编辑配置文件/etc/docker/daemon.json,并确保存在如下配置内容。

{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}

6)启动Docker服务,并设置服务可随系统引导启动。

~$ sudo systemctl  daemon-reload
~$ sudo systemctl  -start docker.service
~$ sudo systemctl  -enable docker.service
  1. 安装kubeadm、kubelet和kubectl

需要用户确保kubelet和kubectl与通过kubeadm安装的控制平面的版本相匹配,否则可能存在版本偏差的风险,从而导致一些预料之外的错误和问题。

1)更新apt索引信息后安装必要的程序包:

~$ sudo apt update && apt install -y apt-transport-https

2)添加Kubernetes官方程序密钥:

~$ sudo curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -

3)在配置文件
/etc/apt/sources.list.d/kubernetes.list中添加如下内容,为apt添加Kubernetes程序包仓库:

deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main

4)更新程序包索引并安装程序包:

~$ sudo apt update
~$ sudo apt install -y kubelet kubeadm kubectl

2.2.2 单控制平面集群

本节将使用kubeadm部署由1个Master主机和3个Node主机组成的Kubernetes集群,用到的各主机分别是k8s-master01、k8s-node01、k8s-node02和k8s-node3,各主机和网络规划等如图2-8所示。

分布式系统环境中的多主机通信通常基于主机名称进行,这里将采用hosts文件进行主机名称解析,因此需要编辑Master和各Node上的/etc/hosts文件,确保其内容类似如下所示。

172.29.9.1      k8s-master01.ilinux.io k8s-master01 k8s-api.ilinux.io
172.29.9.11     k8s-node01.ilinux.io k8s-node01 
172.29.9.12     k8s-node02.ilinux.io k8s-node02
172.29.9.13     k8s-node03.ilinux.io k8s-node03
  1. 初始化控制平面

kubeadm init初始化的控制平面组件kube-apiserver、kube-controller-manager和kube-scheduler,以及集群状态存储系统etcd均以静态Pod方式运行。

kubeadm init命令可从命令行选项读取简单配置参数,它也支持使用配置文件进行精细化配置设定。下面给出以命令行选项方式进行初始化的常用命令格式,并在k8s-master01主机上运行。

~$ sudo kubeadm init \
    --image-repository registry.aliyuncs.com/google_containers \
    --kubernetes-version v1.19.0 \
    --control-plane-endpoint k8s-api.ilinux.io \
    --apiserver-advertise-address 172.29.9.1 \
    --pod-network-cidr 10.244.0.0/16 \
    --token-ttl 0
  1. 配置命令行工具kubectl

使用kubeadm init命令初始化控制平面时会自动生成一个用于管理员权限的配置文件
/etc/kubernetes/admin.conf,将它复制为常用用户的$HOME/.kube/config文件便可以集群管理员身份进行访问。在k8s-master01主机以普通用户身份运行如下命令。

  ~$ mkdir -p $HOME/.kube
  ~$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  ~$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

接下来可通过kubectl get nodes命令获取集群节点相关的状态信息。输出结果的NotReady(未就绪)状态是因为集群中尚未部署网络插件所致。

~$ kubectl get nodes
NAME             STATUS     ROLES   AGE  VERSION
k8s-master01.ilinux.io   NotReady   master   3m29s     v1.19.0

用户可在任何能够通过k8s-api.ilinux.io与API Server通信的主机上安装kubectl,并为其复制或生成kubeconfig文件以访问控制平面,包括后面章节中部署的每个工作节点。

  1. 部署Flannel网络插件

较为流行的为Kubernetes提供Pod网络的插件有Flannel、Calico和WeaveNet等。Flannel以其简单、模式丰富、易部署、易使用等特性颇受用户欢迎。

Kubernetes资源对象的创建一般要基于JSON或YAML格式的配置清单进行。

~$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

在当前节点获取到Flannel的Docker镜像并启动Pod资源对象后,该命令才算真正运行完成,当前节点也会随之转为Ready(就绪)状态。

~$ kubectl get nodes
NAME            STATUS   ROLES    AGE    VERSION
k8s-master01.ilinux.io   Ready    master     12m   v1.19.0
  1. 添加工作节点

在准备好基础环境的主机上运行kubeadm join命令便可将其加入集群中,该命令需要借助共享令牌进行首次与控制平面通信时的认证操作。例如,在k8s-node01上运行如下命令将其加入集群中。

~$ sudo kubeadm join k8s-api.ilinux.io:6443 --token dnacv7.b15203rny85vendw \
>     --discovery-token-ca-cert-hash sha256:61ea08553de1cbe76a3f8b14322cd276c57cbebd5369bc362700426e21d70fb8

为满足后续Master与Node组件间的双向TLS认证的需求,kubeadm join命令发起的TLS Bootstrap在节点上生成私钥及证书签署请求,并提交给控制平面的CA,由其自动进行签署。

随后,分别在k8s-node02和k8s-node03上重复上面的步骤便可将它们也加入集群中,将来集群需要进一步扩容时,其添加过程与此处类似。当本节部署示例中设定的3个节点全部添加到集群中并启动后,再次获取节点信息的命令结果应该类似如下命令结果所示。

~$ kubectl get nodes
NAME            STATUS   ROLES    AGE     VERSION
k8s-master01.ilinux.io   Ready    master     16m       v1.19.0
k8s-node01.ilinux.io     Ready    <none>   2m49s     v1.19.0
k8s-node02.ilinux.io     Ready    <none>   110s       v1.19.0
k8s-node03.ilinux.io     Ready    <none>   70s       v1.19.0

猜你喜欢

转载自blog.csdn.net/guolianggsta/article/details/130668067