¶一、概念
¶1. 定义
k8s是Google开源的一个容器集群管理系统。
k8s用于容器化应用程序部署、扩展和管理。
k8s提供了容器编排,资源调度,自动修复,弹性伸缩(自动根据服务器的并发情况扩增或者缩减容器数量),自动部署,回滚处理,服务发现,负载均衡等一些列功能。
k8s目标是让容器化应用简单高效。
官方中文文档:https://kubernetes.io/zh/docs/home
简单理解:仅用 Docker,则只能管理单个服务器节点的容器,而无法同时维护多个服务器节点。通过使用k8s则可以使用同一入口即可同时维护多个服务器节点的所有容器,并可以实现多服务器之间的自动修复,弹性伸缩,回滚处理,服务发现,负载均衡等。
¶2. 核心对象
Kubernetes 对象
- 最小可部署单元(k8s不能直接启动容器,而是需要通过Pod间接启动容器)
- 一组容器(docker)集合
- 一个Pod中的所有容器共享网络命名空间
- Pod是短暂的,运行完就结束了
Service 服务
- 将一组Pod(比如mysql Pod)关联起来,提供统一的入口
- 防止pod失联,Pod地址发生改变,入口不受影响
Volume 数据卷
- 类似于Docker的Volume
Namespace 命名空间
- 用于隔离Pod的运行环境(默认情况Pod可以互相访问)
- 使用场景:
- ①为开发环境、测试环境、生产环境准备不同的命名空间
- ②为不同的用户提供不同的隔离的运行环境
Controller 控制器
Controller控制器基本对象构建并提供额外的功能和方便使用的特性,用于控制pod启动、停止、删除等。
¶3. 节点分类和重要组件
master node:主控节点
worker node:工作节点
(1)master node 相关的组件(程序)
- apiserver:接收客户端操作k8s的指令(唯一入口),此外也是其他组件互调的桥梁。提供认证、授权、访问控制、API 注册和发现等机制。
- schduler:负责资源调度,根据规定的调度策略,在多个worker node服务器的pod中选举一个来部署容器。
- controller manager:管理控制器,负责维护技巧的状态,包括故障检测、自动扩展、滚动更新等,以及用于向work node的kubelet发送指令。
- etcd:分布式键值对数据库。用于保存整个集群的状态数据,比如pod、service等对象信息。
(2)worker node 相关的组件(程序)
- kubelet:向容器发送指令以管理容器,同时负责 Volume(CVI)和网络(CNI)的管理。并汇报节点状态给apiserver,再保存状态至etcd。
- kubeproxy:管理docker容器的网络(包括服务发现与负载均衡等,主要提供 iptables、ipvs 规则)。

¶二、部署 k8s 集群
¶1. 集群规划
| 主机名 | ip | 组件 |
|---|---|---|
| k8s-master | 192.168.60.101 | kube-apiserver、kube-controller-manager、kube-scheduler、etcd |
| k8s-node1 | 192.168.60.201 | kubelet、kube-proxy |
| k8s-node2 | 192.168.60.202 | kubelet、kube-proxy |
¶2. 系统环境
- 操作系统:centos7
- k8s版本:1.23.6
- docker版本:18.09.9-3
- 硬件配置:至少2G内存,2核CPU
¶3. 初始化服务器
(1)关闭防火墙
1 | systemctl stop firewalld |
如为云服务器,则需要注意开放相关安全组端口:
- master 节点:TCP至少开放:6443、2379、2380、60080、60081;UDP协议端口全开
- worker 节点:UDP协议端口全开
(2)关闭selinux
1 | # 临时生效 |
(3)关闭交换分区
1 | # 临时生效 |
(4)配置主机名
1 | #在k8s-master上执行 |
(5)配置名称解析
三台主机都做如下配置
1 | cat << EOF >> /etc/hosts |
然后互相ping查看是否都能通过主机名连接
1 | $ ping 主机名 |
(6)修改内核参数(开启数据包转发功能)
所有服务器都执行如下命令:
1 | cat > /etc/sysctl.d/k8s.conf << EOF |
(7)配置时间同步
所有服务器都执行如下命令以同步时间:
1 | yum install ntpdate -y |
(8)安装 ipset 和 ipvsadm
所有服务器都执行如下命令:
在kubernetes中service有两种代理模型,一种是基于iptables,另一种是基于ipvs的。ipvs的性能要高于iptables的,但是如果要使用它,需要手动载入ipvs模块
1 | # 安装 |
¶4. 安装 Docker
所有服务器都执行如下命令:
1 | #安裝Docker源 |
注意:K8s 和 Docker 之间有一些版本兼容性要求,以确保它们可以正常协作工作
¶5. 安裝 k8s 相关工具
所有服务器都执行如下命令:
1 | #添加k8s的yum源 |
¶6. 初始化 Master 节点
在 Master 节点上执行:
1 | #初始化k8s集群(自动运行必要组件到Docker容器中) |
¶7. 初始化 Node 节点
1 | #在Master节点获取token(在Master执行) |
其他相关 token 令牌的命令:
1 | #列出当前有效的token令牌列表 |
¶8. 部署 CNI 网络插件
在 Master 节点部署CNI网络插件:
1 | wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml |
1 | #修改flannel配置文件 |
具体修改如下:
1 | net-conf.json: | |
1 | kubectl apply -f kube-flannel.yml |
¶9. 通过 k8s 启动 nginx 容器
待 k8s 集群部署好后,就可以在集群中运行容器了。在master节点上执行操作:
1 | #创建Pod控制器(通过部署间接创建容器) |
¶10. 部署 Dashboard
在 Matser 上执行下面操作安装 Dashboard
1 | #下载yaml配置文件 |
默认 Chrome 等浏览器由于 SSL 证书不受信任的原因无法正常访问 Dashboard,需要如下操作:
1 | #生成自签证书 |
以上操作完成就可以使用 Chrome 访问 Dashboard 了。
提示:火狐浏览器不需要如上操作也能默认可以访问
参考:https://blog.csdn.net/qq_35078688/article/details/130662916
效果如下:


¶拓展知识
¶重置节点
如果集群部署出问题了,需要重新部署,可以先重置所有节点然后再重新部署,其中重置节点操作如下:
1 | #重置节点(Master或Node节点通用) |
1 | #如果仅重置Node节点,需要在Master节点中执行如下命令从集群中删除相关节点 |
¶卸载 k8s
1 | #停止并删除 Kubernetes 服务 |
¶在任意节点使用 kubectl
1 | # 1. 将 master 节点中 /etc/kubernetes/admin.conf 拷贝到需要运行的服务器的 /etc/kubernetes 目录中 |
