基于昇腾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
相关推荐
lzjava20247 分钟前
安装K8s集群
云原生·容器·kubernetes
桂月二二7 小时前
Java与容器化:如何使用Docker和Kubernetes优化Java应用的部署
java·docker·kubernetes
Smile丶凉轩10 小时前
Docker核心技术和实现原理
运维·docker·容器
清风细雨_林木木10 小时前
Docker使用——国内Docker的安装办法
运维·docker·容器
运维&陈同学10 小时前
【Kibana01】企业级日志分析系统ELK之Kibana的安装与介绍
运维·后端·elk·elasticsearch·云原生·自动化·kibana·日志收集
一休哥助手11 小时前
深入理解 Docker 网桥配置与网络管理
docker·容器·eureka
time_silence13 小时前
微服务——数据管理与一致性
微服务·云原生·架构
颜淡慕潇16 小时前
【K8S问题系列 | 20 】K8S如何删除异常对象(Pod、Namespace、PV、PVC)
后端·云原生·容器·kubernetes
lmxnsI16 小时前
docker使用笔记
笔记·docker·容器
didiplus18 小时前
Kubernetes 镜像拉取策略全解析:如何根据需求选择最佳配置?
云原生·容器·kubernetes