书籍来源:《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)主机时间同步
如果各主机可直接访问互联网,则直接启动各主机上的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这类编排工具收集并对比排查此类问题。
- 配置容器运行引擎
若同时检测到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
- 安装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
- 初始化控制平面
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
- 配置命令行工具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文件以访问控制平面,包括后面章节中部署的每个工作节点。
- 部署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
- 添加工作节点
在准备好基础环境的主机上运行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