一、Kubernetes概述
- Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态,其服务、支持和工具的使用范围相当广泛。
- Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。K8s 这个缩写是因为 K 和 s 之间有 8 个字符的关系。 Google 在 2014 年开源了 Kubernetes 项目。 Kubernetes 建立在 Google 大规模运行生产工作负载十几年经验的基础上, 结合了社区中最优秀的想法和实践。
1、为什么需要K8S,它能做什么
- Kubernetes 为你提供了一个可弹性运行分布式系统的框架。 Kubernetes 会满足你的扩展要求、故障转移你的应用、提供部署模式等。
- 服务发现和负载均衡
Kubernetes 可以使用 DNS 名称或自己的 IP 地址来暴露容器。 如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。 - 存储编排
Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。 - 自动部署和回滚
你可以使用 Kubernetes 描述已部署容器的所需状态, 它可以以受控的速率将实际状态更改为期望状态。 例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。 - 自动完成装箱计算
你为 Kubernetes 提供许多节点组成的集群,在这个集群上运行容器化的任务。 你告诉 Kubernetes 每个容器需要多少 CPU 和内存 (RAM)。 Kubernetes 可以将这些容器按实际情况调度到你的节点上,以最佳方式利用你的资源。 - 自我修复
Kubernetes 将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端。 - 密钥与配置管理
Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。 - 批处理执行 除了服务外,Kubernetes 还可以管理你的批处理和 CI(持续集成)工作负载,如有需要,可以替换失败的容器。
- 水平扩缩 使用简单的命令、用户界面或根据 CPU 使用率自动对你的应用进行扩缩。
- IPv4/IPv6 双栈 为 Pod(容器组)和 Service(服务)分配 IPv4 和 IPv6 地址。
- 为可扩展性设计 在不改变上游源代码的情况下为你的 Kubernetes 集群添加功能
二、安装K8S
1、预置条件
- 需要关闭防火墙,关闭swap分区,时间同步等
- 下面的步骤,所有主机都需要执行
主机环境:
# 都是centos7.9,虚拟机环境,最小化安装 |
Centos7.9升级内核
- 网上搭建资料全是升级内核的
- 我尝试了下,使用Centos7.9的默认内核:
3.10.0-1160.71.1.el7.x86_64
集群搭建成功 - 测试安装nginx,任意节点正常访问,没有部署比较复杂的应用,不确定是否出现不稳定的情况
- 可以不装,但是需要的时候,得知道怎么升级
#查看现在的内核版本 |
设置hostname
- 不设置也问题不大,但是hosts文件要设置
|
1、安装NTP时间同步
- 配置NTP时间同步服务
|
2、安装cri-dockerd
CRI
是 Kubernetes 项目引入的一个标准化接口,旨在解耦Kubernetes与底层容器运行时的直接依赖。它定义了一套API,使得Kubernetes可以与任何符合CRI规范的容器运行时进行通信,而不需要知道具体运行时的实现细节。这意味着Kubernetes可以支持多种容器运行时,如Docker、containerd、CRI-O等,增强了平台的灵活性和可移植性。- 在 Kubernetes v1.24 版本之前,Docker 是默认的容器运行时。由于Docker并未直接实现CRI接口,Kubernetes引入了一个叫作Dockershim的组件作为适配层,它的作用是将Kubernetes的CRI调用转换为Docker API调用。简单来说,Dockershim起到了桥梁的作用,使得Kubernetes能够通过CRI接口与Docker容器引擎进行通信。
- 随着Kubernetes的发展,为了进一步减少依赖并优化架构,从Kubernetes 1.20版本开始,官方宣布计划废弃Dockershim,并鼓励使用直接支持CRI接口的容器运行时。
- 从Kubernetes 1.24 +版本开始,Dockershim 已从 Kubernetes 项目中移除,改为默认使用Containerd
- cri-dockerd 是一种替代方案,它直接实现了CRI接口,允许Kubernetes直接与Docker交互,而无需依赖Dockershim,是随着Dockershim废弃计划出现的解决方案之一,旨在提供更直接、更高效且未来更可持续的Docker集成方式。
- cri-dockerd的Github地址:https://github.com/Mirantis/cri-dockerd
- 最新发布的版本:https://github.com/Mirantis/cri-dockerd/releases
|
3、环境配置
|
4、配制iptables规则
- 清理iptables规则
- iptables -F:清除iptables的filter表的所有规则链中的规则。
- iptables -X:删除iptables的filter表中所有非默认的空链。
- iptables -F -t nat:清除iptables的nat表的所有规则链中的规则。
- iptables -X -t nat:删除iptables的nat表中所有非默认的空链。
- iptables -P FORWARD ACCEPT:设置iptables filter表的FORWARD链的默认策略为ACCEPT,允许数据包转发。这对于Kubernetes集群中的Pod间通信是必要的。
# 清理iptables规则 |
5、安装docker
- 使用docker作为k8s的CRI接口的容器运行时,所以需要安装docker
# 删除旧版本 |
2、开始安装
1、安装k8s组件
- kubeadm、kubelet 和 kubectl 是 Kubernetes 集群管理中的三个核心组件
- kubeadm 是 Kubernetes 社区提供的一种简化集群部署和管理的工具。
- kubelet 是运行在每一个 Kubernetes 节点上的代理进程,它是节点与集群控制平面之间的桥梁。
- kubelet 的主要职责包括:
- Pod 管理:根据 API server 的指令,创建、修改和监控节点上的容器(Pods),确保它们按照预期状态运行。
- 健康检查:定期检查容器状态并向 API server 报告,支持节点级和 Pod 级别的健康检查。
- 资源管理:管理节点资源,如 CPU、内存和存储,确保 Pod 的资源请求和限制得到满足。
- 日志和监控:收集容器日志,提供给集群的监控系统
- kubectl 是 Kubernetes 的命令行工具,用于与 Kubernetes 集群进行交互。它提供了强大的命令集,使得用户能够从本地机器上执行各种集群操作
# 配置yum为阿里镜像仓库 |
2、初始化K8S集群
- 只需要在master节点初始化即可
|
- 等待初始化成功,如果不出问题,出现成功:
Your Kubernetes control-plane has initialized successfully!
- 我的返回如下:
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key |
- 返回的信息中,让我们配置环境变量,然后还要配置k8s集群的pod网络
- 然后先执行如下命令,配置环境变量
# 在master节点执行,配置环境变量 |
3、安装网络插件
- 目前比较常用的是flannel和calico,
- flannel的功能比较简单,不具备复杂网络的配置能力,不支持网络策略;
- calico是比较出色的网络管理插件,单具备复杂网络配置能力的同时,
- 往往意味着本身的配置比较复杂,所以相对而言,比较小而简单的集群使用flannel,
- 考虑到日后扩容,未来网络可能需要加入更多设备,配置更多策略,则使用calico更好。
- 官网地址:https://docs.tigera.io/calico/latest/getting-started/kubernetes/self-managed-onprem/onpremises
calico
# 下载calico.yaml |
flannel
- 如果不想装calico就安装flannel
- Github地址:https://github.com/flannel-io/flannel#deploying-flannel-manually
# 下载flannel |
4、node节点加入集群
- 网络也配置好之后,node节点执行加入
查看所有命名空间的pod |
5、验证集群的可用性
#检查节点 |
其他命令:
- 移除节点
# 在要移除的节点上,禁用调度以阻止新的Pod在这个节点上运行 |
3、测试部署
- 测试部署Nginx
- 在k8s-master机器上执行
# 创建一次deployment部署 |
- 访问Nginx地址: http://任意节点的ip:图中Nginx的对外映射端口,http://192.168.80.132:31129/