基于昇腾910B搭建多节点K8s集群

自从 2013 年 Docker 诞生以来,容器一跃成为 IT 界最热门的话题。而 Kubernetes 趁着容器的东风,击败众多竞争对手,成为了"容器编排"领域的King。可以说,现在 Kubernetes 已经没有了实际意义上的竞争对手,它的地位就如同 Linux 一样,成为了事实上的云原生操作系统,是构建现代应用的基石。

一、创建多节点K8s集群

Kubernetes 是很多模块构成的,实现核心功能的组件像 apiserver、etcd、scheduler 等本质上都是可执行文件,所以也可以采用和其他系统差不多的方式,使用 Shell 脚本或者 Ansible 等工具打包发布到服务器上。

不过 Kubernetes 里的这些组件的配置和相互关系实在是太复杂了,用 Shell、Ansible 来部署的难度很高,需要具有相当专业的运维管理知识才能配置、搭建好集群,而且即使这样,搭建的过程也非常麻烦。为了简化 Kubernetes 的部署工作,社区里的人整了一个专门用来在集群中安装 Kubernetes 的工具,名字就叫"kubeadm",意思就是"Kubernetes 管理员"。

kubeadm,原理和 minikube 类似,也是用容器和镜像来封装 Kubernetes 的各种组件,但它的目标不是单机部署,而是要能够轻松地在集群环境里部署 Kubernetes,并且让这个集群接近甚至达到生产级质量。而在保持这个高水准的同时,kubeadm 还具有了和 minikube 一样的易用性,只要很少的几条命令,如 init、join、upgrade、reset 就能够完成 Kubernetes 集群的管理维护工作,这让它不仅适用于集群管理员,也适用于开发、测试人员。

多节点集群,要求服务器应该有两台或者更多,我部署的 Kubernetes 集群就只有两台910B主机,一台是 Master 节点,另一台是 Worker 节点。当然,后续可以在这个集群里添加更多的节点。Master 节点需要运行 apiserver、etcd、scheduler、controller-manager 等组件,管理整个集群。

Worker 节点没有管理工作,只运行业务应用,所以配置可以低一些。

基于模拟生产环境的考虑,在 Kubernetes 集群之外还需要有一台起辅助作用的服务器。它就是 Console,要在上面安装命令行工具 kubectl,所有对 Kubernetes 集群的管理命令都是从这台主机发出去的。这也比较符合实际情况,因为安全的原因,集群里的主机部署好之后应该尽量少直接登录上去操作。

Console 这台主机只是逻辑上的概念,不一定要是独立,你在实际安装部署的时候完全可以复用 minikube 的虚拟机,或者直接使用 Master/Worker 节点作为控制台。这 3 台主机共同组成了我们的实验环境,所以在配置的时候要注意它们的网络选项,必须是在同一个网段,保证它们使用的是同一个"Host-Only"(VirtualBox)或者"自定"(VMWare Fusion)网络。

二、实操

Kubernetes 对系统有一些特殊要求,必须还要在 Master 和 Worker 节点上做一些准备。这些工作的详细信息都可以在 Kubernetes 的官网上找到,但它们分散在不同的文档里,比较凌乱,所以我把它们整合到了这里,包括改主机名、改 Docker 配置、改网络设置、改交换分区这四步。

  • 第一,由于 Kubernetes 使用主机名来区分集群里的节点,所以每个节点的 hostname 必须不能重名。需要修改"/etc/hostname"这个文件,把它改成容易辨识的名字,比如 Master 节点就叫 master,Worker 节点就叫 worker:
    sudo vi /etc/hostname
  • 第二,虽然 Kubernetes 目前支持多种容器运行时,但 Docker 还是最方便最易用的一种,所以我们仍然继续使用 Docker 作为 Kubernetes 的底层支持,使用 apt 安装 Docker Engine

安装完成后需要你再对 Docker 的配置做一点修改,在"/etc/docker/daemon.json"里把 cgroup 的驱动程序改成 systemd ,然后重启 Docker 的守护进程

bash 复制代码
cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker
  • 第三,为了让 Kubernetes 能够检查、转发网络流量,需要修改 iptables 的配置,启用"br_netfilter"模块:
bash 复制代码
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1 # better than modify /etc/sysctl.conf
EOF

sudo sysctl --system
  • 第四,需要修改"/etc/fstab",关闭 Linux 的 swap 分区,提升 Kubernetes 的性能:
    sudo swapoff -asudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab
相关推荐
脚踏实地的大梦想家24 分钟前
【Docker】P5 Docker Compose 实战指南:一键部署 WordPress + MySQL
mysql·docker·容器
闲人编程1 小时前
现代Python开发环境搭建(VSCode + Dev Containers)
开发语言·vscode·python·容器·dev·codecapsule
老年DBA4 小时前
Kubernetes 上的 GitLab + ArgoCD 实践(三):使用 ArgoCD 打通 CD 流程
kubernetes·gitlab·argocd
帅帅梓9 小时前
docker图形化管理
docker·容器·eureka
努力搬砖的咸鱼15 小时前
容器之间怎么通信?Docker 网络全解析
网络·docker·云原生·容器
liming49518 小时前
Ubuntu18.04部署k8s
云原生·容器·kubernetes
YC运维20 小时前
Kubernetes资源管理全解析
java·容器·kubernetes
Leinwin20 小时前
微软发布Azure Kubernetes Service Automatic国际版
microsoft·kubernetes·azure
不爱笑的良田21 小时前
从零开始的云原生之旅(六):DaemonSet 实战日志采集器
云原生
chinesegf21 小时前
Docker篇6-项目app.py和flask_app.service配置和映射到docker中
docker·容器·flask