使用Kubeadm搭建Kubernetes集群

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

Kubernetes架构


1.png


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/


2.png


内容如下,大家可以直接复制粘贴。


[kubernetes]
name=KubernetesRepobaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/gpgcheck=1gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgenable=1EOF


  • 查看yum源是否可用yum repolist


3.png


做好上面的准备工作后,我们来安装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


systemctldaemon-reloadsystemctlrestartdockersystemctlenablekubelet&&systemctlstartkubelet


  • 查看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/v1beta2bootstrapTokens:
-groups:
-system:bootstrappers:kubeadm:default-node-tokentoken: abcdef.0123456789abcdefttl: 24h0m0susages:
-signing-authenticationkind: InitConfigurationlocalAPIEndpoint:
advertiseAddress: 192.168.136.128bindPort: 6443nodeRegistration:
criSocket: /var/run/dockershim.sockname: kubernetes-mastertaints:
-effect: NoSchedulekey: node-role.kubernetes.io/master---apiServer:
timeoutForControlPlane: 4m0sapiVersion: kubeadm.k8s.io/v1beta2certificatesDir: /etc/kubernetes/pkiclusterName: kubernetescontrollerManager: {}
dns:
type: CoreDNSetcd:
local:
dataDir: /var/lib/etcdimageRepository: k8s.gcr.iokind: ClusterConfigurationkubernetesVersion: v1.18.0networking:
dnsDomain: cluster.localpodSubnet: "192.168.0.0/16"serviceSubnet: 10.96.0.0/12scheduler: {}


主要做三处修改:


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


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


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


  • 查看并拉取镜像


#查看所需镜像列表kubeadmconfigimageslist--configkubeadm.yml#拉取镜像kubeadmconfigimagespull--configkubeadm.yml


4.png


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


5.png


  • 再次查看kebelet状态
    systemctl status kubelet


6.png


  • 此时kubelet为active,运行状态。


  • 配置kubelet


rm-rf/root/.kube/mkdir/root/.kube/cp-i/etc/kubernetes/admin.conf/root/.kube/config


  • 验证是否安装成功kubectl get node


7.png


此时节点的状态为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


kubeadmjoin192.168.136.128:6443--tokenbk1hs7.bxxz26xkzamtpn64--discovery-token-ca-cert-hashsha256:a3ce56bb691c996e2b842ccfc08dbec834e295f30e582be0ca258500e02f49cc


Node2节点安装过程略。。。


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


20.png


至此  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状态。


9.png


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


10.png


这样我们整个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节点时可能会出现如下的错误


[ERRORFileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptablescontentsarenotsetto1


11.png


解决方法:


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


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


12.png


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

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
4月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
151 9
|
4月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
本文介绍如何利用阿里云的分布式云容器平台ACK One的多集群应用分发功能,结合云效CD能力,快速将单集群CD系统升级为多集群CD系统。通过增加分发策略(PropagationPolicy)和差异化策略(OverridePolicy),并修改单集群kubeconfig为舰队kubeconfig,可实现无损改造。该方案具备多地域多集群智能资源调度、重调度及故障迁移等能力,帮助用户提升业务效率与可靠性。
|
6月前
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
592 33
|
6月前
|
Kubernetes 开发者 Docker
集群部署:使用Rancher部署Kubernetes集群。
以上就是使用 Rancher 部署 Kubernetes 集群的流程。使用 Rancher 和 Kubernetes,开发者可以受益于灵活性和可扩展性,允许他们在多种环境中运行多种应用,同时利用自动化工具使工作负载更加高效。
338 19
|
6月前
|
人工智能 分布式计算 调度
打破资源边界、告别资源浪费:ACK One 多集群Spark和AI作业调度
ACK One多集群Spark作业调度,可以帮助您在不影响集群中正在运行的在线业务的前提下,打破资源边界,根据各集群实际剩余资源来进行调度,最大化您多集群中闲置资源的利用率。
|
9月前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
6月前
|
Prometheus Kubernetes 监控
OpenAI故障复盘丨如何保障大规模K8s集群稳定性
OpenAI故障复盘丨如何保障大规模K8s集群稳定性
198 0
OpenAI故障复盘丨如何保障大规模K8s集群稳定性
|
8月前
|
缓存 容灾 网络协议
ACK One多集群网关:实现高效容灾方案
ACK One多集群网关可以帮助您快速构建同城跨AZ多活容灾系统、混合云同城跨AZ多活容灾系统,以及异地容灾系统。
|
7月前
|
运维 分布式计算 Kubernetes
ACK One多集群Service帮助大批量应用跨集群无缝迁移
ACK One多集群Service可以帮助您,在无需关注服务间的依赖,和最小化迁移风险的前提下,完成跨集群无缝迁移大批量应用。
|
9月前
|
Kubernetes Ubuntu 网络安全
ubuntu使用kubeadm搭建k8s集群
通过以上步骤,您可以在 Ubuntu 系统上使用 kubeadm 成功搭建一个 Kubernetes 集群。本文详细介绍了从环境准备、安装 Kubernetes 组件、初始化集群到管理和使用集群的完整过程,希望对您有所帮助。在实际应用中,您可以根据具体需求调整配置,进一步优化集群性能和安全性。
652 13

推荐镜像

更多