使用Kubeadm搭建Kubernetes集群

本文涉及的产品
云防火墙,500元 1000GB
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 使用Kubeadm搭建Kubernetes集群

Kubernetes架构


Kubernetes 主要由以下几个核心组件组成:

  • etcd 保存了整个集群的状态;
  • kube-apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;
  • kube-controller-manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
  • kube-scheduler 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;
  • kubelet 负责维持容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管理;
  • Container runtime 负责镜像管理以及 Pod 和容器的真正运行(CRI),默认的容器运行时为 Docker;
  • kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡;

今天我们先重点说一下kubelet组件,kubelet 主要负责同容器运行时(比如 Docker 项目)打交道。而这个交互所依赖的,是一个称作 CRI(Container Runtime Interface)的远程调用接口,这个接口定义了容器运行时的各项核心操作,比如:启动一个容器需要的所有参数。

此外,kubelet 还通过 gRPC 协议同一个叫作 Device Plugin 的插件进行交互。这个插件,是 Kubernetes 项目用来管理 GPU 等宿主机物理设备的主要组件,也是基于 Kubernetes 项目进行机器学习训练、高性能作业支持等工作必须关注的功能。

而kubelet 的另一个重要功能,则是调用网络插件和存储插件为容器配置网络和持久化存储。这两个插件与 kubelet 进行交互的接口,分别是 CNI(Container Networking Interface)和 CSI(Container Storage Interface)。

kubelet 完全是为了实现 Kubernetes 项目对容器的管理能力而实现的一个组件。

了解完Kubernetes架构后,我们今天使用Kubeadm部署一个Kubernetes集群。使用Kubeadm部署Kubernetes集群很简单,只需要两步操作即可:kubeadm init,kubeadm join,当然在正式安装之前咱们先需要做一下基础准备!


基础环境准备


安装一个Kubernates最小集群需要三台机器,一台Master节点,两台Node节点,机器规划如下:

虚拟机版本 主机名 IP 角色
centos7 kubernetes-master 192.168.136.128 master
centos7 kubernetes-node1 192.168.136.129 node
centos7 kubernetes-node2 192.168.136.130 node
  • 安装并启动Docker
    安装过程略,可参看我之前的Docker系列文章,安装完成后使用 systemctl start docker 命令启动Docker
  • 使用命令将docker服务设置开机启动
    systemctl enable docker
  • 查看docker 版本,确保各个节点安装的docker版本一致
  • 关闭禁用各节点的防火墙
    停止防火墙:systemctl stop firewalld.service
    禁用防火墙:systemctl disable firewalld.service
    查看防火墙状态:systemctl list-unit-files|grep firewalld.service
  • 关闭各节点的selinux
    编辑/etc/selinux/config 文件并设置 SELINUX 的值为 disabled
  • 关闭各节点的swap
    如果不关闭kubernetes运行会出现错误, 即使安装成功了,node重启后也会出现kubernetes server运行错误。
    sudo swapoff -a
  • 给各节点添加kubernetes的yum源
    进入目录 cd /etc/yum.repos.d/
  • 内容如下,大家可以直接复制粘贴。
[kubernetes]
name=Kubernetes Repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
enable=1
EOF
  • 查看yum源是否可用yum repolist

做好上面的准备工作后,我们来安装Kubeadm。


Kubeadm 安装


Master安装

  • 修改master主机名为kubernetes-master
    hostnamectl set-hostname kubernetes-master
  • 卸载原kubeadm(若有):
    yum remove -y kubelet kubeadm kubectl
  • 安装kubeadm:
    yum install -y kubelet kubeadm kubectl
  • 重启 docker,并启动 kubelet
systemctl daemon-reload
systemctl restart docker
systemctl enable kubelet && systemctl start kubelet
  • 查看kubelet状态:
    systemctl status kubelet

如果此时执行 service status kubelet 命令,将得到 kubelet 启动失败的错误提示,请忽略此错误,因为必须完成后续步骤中 kubeadm init 的操作,kubelet 才能正常启动

  • 生成kubeadm配置文件kubeadm.yml
    进入文件夹 cd /app/k8s,执行命令生成配置文件kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml在文件夹下,会生成一个kubeadm.yml文件,需要对kubeadm.yml进行修改。
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.136.128
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: kubernetes-master
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.18.0
networking:
  dnsDomain: cluster.local
  podSubnet: "192.168.0.0/16"
  serviceSubnet: 10.96.0.0/12
scheduler: {}

主要做三处修改:

修改imageRepository为registry.aliyuncs.com/google_containers 阿里镜像源;

修改kubernetesVersion,我们使用v1.18.0作为kubernetes版本;

修改podSubnet,配置成Calico默认网段

  • 查看并拉取镜像
# 查看所需镜像列表
kubeadm config images list --config kubeadm.yml
# 拉取镜像
kubeadm config images pull --config kubeadm.yml


  • master初始化
    执行以下命令初始化主节点,该命令指定了初始化时需要使用的配置文件,其中添加 --upload-certs 参数可以在后续执行加入节点时自动分发证书文件。追加的 tee kubeadm-init.log 用以输出日志。
    kubeadm init --config=kubeadm.yml --upload-certs | tee kubeadm-init.log


  • 再次查看kebelet状态
    systemctl status kubelet
  • 此时kubelet为active,运行状态。
  • 配置kubelet
rm -rf /root/.kube/
mkdir /root/.kube/
cp -i /etc/kubernetes/admin.conf /root/.kube/config
  • 验证是否安装成功kubectl get node
  • 此时节点的状态为NotReady,这是由于我们还没部署任何网络插件,是正常的。

Node 节点安装

Node节点只需要在安装docker的基础上安装kubeadm组件即可。

  • 修改主机名
    hostnamectl set-hostname kubernetes-node1
  • 卸载原kubeadm(若有):
    yum remove -y kubelet kubeadm kubectl
  • 安装kubeadm:
    yum install -y kubeadm
  • 获取join命令(在Master节点执行)
    kubeadm token create --print-join-command
kubeadm join 192.168.136.128:6443 --token bk1hs7.bxxz26xkzamtpn64     --discovery-token-ca-cert-hash sha256:a3ce56bb691c996e2b842ccfc08dbec834e295f30e582be0ca258500e02f49cc

Node2节点安装过程略。。。

完成两个节点的join后可以在master节点查看节点状态,kubectl get nodes -o wide

至此  Node节点都已经加入Master。

安装网络插件Calico

在Master节点使用命令kubectl apply -f https://docs.projectcalico.org/v3.13/manifests/calico.yaml 进行Calico网络插件的安装。

安装完成后我们可以使用命令kubectl get pods -n kube-system -o wide 查看pod状态。

再次查看node节点状态kubectl get nodes -o wide,发现处于Ready状态

这样我们整个Kubernetes集群已经搭建完成,大家可以开始部署你的服务应用了!


重新加入节点

若节点需要重新加入节点可以按照如下步骤进行:

  • 先在node节点执行kubeadm reset -f 命令,重置kubeadm
  • 在Master节点删除原节点
    kubectl delete node kubernetes-node1
  • 在Master节点获取join命令
    kubeadm token create --print-join-command
  • 在Node节点执行命令重新加入集群kubeadm join 192.168.136.128:6443 --token bk1hs7.bxxz26xkzamtpn64 --discovery-token-ca-cert-hash sha256:a3ce56bb691c996e2b842ccfc08dbec834e295f30e582be0ca258500e02f49cc

安装错误

在安装Node节点时可能会出现如下的错误

[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1

解决方法:

echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables

重启Master节点后执行kubectl 相关命令出现如下错误,则很可能是没关闭swap导致kubelet无法正常启动,可以使用free -m 命令查看

若swap所在行不为0则表示未关闭swap,可以使用swapoff -a命令关闭,然后使用命令systemctl start kubelet 重新启动kubelet 。

好了,各位朋友们,本期的内容到此就全部结束啦,能看到这里的同学都是优秀的同学,下一个升职加薪的就是你了!

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
9天前
|
存储 Kubernetes 负载均衡
CentOS 7.9二进制部署K8S 1.28.3+集群实战
本文详细介绍了在CentOS 7.9上通过二进制方式部署Kubernetes 1.28.3+集群的全过程,包括环境准备、组件安装、证书生成、高可用配置以及网络插件部署等关键步骤。
72 3
CentOS 7.9二进制部署K8S 1.28.3+集群实战
|
9天前
|
Kubernetes 网络虚拟化 Docker
K8S镜像下载报错解决方案(使用阿里云镜像去下载kubeadm需要的镜像文件)
文章提供了一个解决方案,用于在无法直接访问Google镜像仓库的情况下,通过使用阿里云镜像来下载kubeadm所需的Kubernetes镜像。
25 3
K8S镜像下载报错解决方案(使用阿里云镜像去下载kubeadm需要的镜像文件)
|
9天前
|
Kubernetes 负载均衡 前端开发
二进制部署Kubernetes 1.23.15版本高可用集群实战
使用二进制文件部署Kubernetes 1.23.15版本高可用集群的详细教程,涵盖了从环境准备到网络插件部署的完整流程。
18 2
二进制部署Kubernetes 1.23.15版本高可用集群实战
|
8天前
|
存储 Kubernetes 测试技术
k8s使用pvc,pv,sc关联ceph集群
文章介绍了如何在Kubernetes中使用PersistentVolumeClaim (PVC)、PersistentVolume (PV) 和StorageClass (SC) 来关联Ceph集群,包括创建Ceph镜像、配置访问密钥、删除默认存储类、编写和应用资源清单、创建资源以及进行访问测试的步骤。同时,还提供了如何使用RBD动态存储类来关联Ceph集群的指南。
24 7
|
8天前
|
存储 Kubernetes 数据安全/隐私保护
k8s对接ceph集群的分布式文件系统CephFS
文章介绍了如何在Kubernetes集群中使用CephFS作为持久化存储,包括通过secretFile和secretRef两种方式进行认证和配置。
19 5
|
9天前
|
Kubernetes Ubuntu 网络安全
Ubuntu基于kubeadm快速部署K8S实战
关于如何在Ubuntu系统上使用kubeadm工具快速部署Kubernetes集群的详细实战指南。
45 2
|
9天前
|
Kubernetes 负载均衡 应用服务中间件
kubeadm快速构建K8S1.28.1高可用集群
关于如何使用kubeadm快速构建Kubernetes 1.28.1高可用集群的详细教程。
25 2
|
9天前
|
Kubernetes Linux API
CentOS 7.6使用kubeadm部署k8s 1.17.2测试集群实战篇
该博客文章详细介绍了在CentOS 7.6操作系统上使用kubeadm工具部署kubernetes 1.17.2版本的测试集群的过程,包括主机环境准备、安装Docker、配置kubelet、初始化集群、添加节点、部署网络插件以及配置k8s node节点管理api server服务器。
37 0
CentOS 7.6使用kubeadm部署k8s 1.17.2测试集群实战篇
|
18天前
|
Kubernetes Ubuntu Windows
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
|
18天前
|
存储 Kubernetes Go
【Azure K8S | AKS】在AKS集群中创建 PVC(PersistentVolumeClaim)和 PV(PersistentVolume) 示例
【Azure K8S | AKS】在AKS集群中创建 PVC(PersistentVolumeClaim)和 PV(PersistentVolume) 示例