为了便于学习容器编排,实践容器编排,本篇文章记录在本地虚拟机搭建一个准生产级别的Kubernetes集群。在此k8s集群的基础上,我们可以尝试着容器化工作或者学习场景中的各种中间件集群,以及微服务应用。
从学习的目的出发,准备搭建一个控制节点和两个工作节点的集群,为了节约成本,需要支持pod被调度到控制节点上。
无论是本地物理机还是公有云上的虚拟机,都应该保证以下几点要求
- 满足安装 Docker 项目所需的要求,比如 64 位的 Linux 操作系统、3.10 及以上的内核版本
- x86 或者 ARM 架构均可
- 机器之间网络互通,容器网络互通的前提
- 有外网访问权限,因为需要拉取镜像(也可手动下载好镜像)
- 节点之中不可以有重复的主机名、MAC 地址或 product_uuid
- 开启机器上的某些端口,详情参照k8s官网,k8s组件端口协议
- 禁用交换分区。为了保证 kubelet 正常工作
- 在所有节点上安装 Docker 和 kubeadm
- 部署 Kubernetes Master
- 部署容器网络插件
- 部署 Kubernetes Worker
- 部署 Dashboard 可视化插件
- 部署容器存储插件
k8s通过上层CRI接口对接容器运行时实现,这里我们采用docker引擎这个容器运行时实现。因为我们采用的是centos7的机器部署k8s集群,此处采用yum源安装docker引擎
- Centos7 yum源安装docker引擎
- 参考docker官网的安装手册
注意:配置 Docker 守护程序,尤其是使用 systemd 来管理容器的 cgroup,保持docker与kubelet的cgroup驱动一致
讯享网
3.2.1、配置主机名
k8s集群节点之中不可以有重复的主机名、MAC 地址或 product_uuid
讯享网
3.2.2、修改节点host
说明:以上是k8s三个节点的IP域名映射。
3.2.3、允许iptables检查桥接流量
- 确保br_netfilter模块被加载
讯享网
- 确保iptables能够正确地查看桥接流量
为了让你的 Linux 节点上的 iptables 能够正确地查看桥接流量,你需要确保在你的 sysctl 配置中将 net.bridge.bridge-nf-call-iptables 设置为 1
3.2.4、禁用swap交换分区
讯享网
3.2.5、配置kubernetes的yum源
- 配置官方的kubernetes yum源(网络允许的情况下)
- 配置采用阿里云镜像的kubernetes yum源
讯享网
3.2.6、yum源安装kubeadm、kubelet、kubectl
- 在上述安装 kubeadm 的过程中,kubeadm 和 kubelet、kubectl、kubernetes-cni 这几个二进制文件都会被自动安装好
讯享网
说明:kubelet现在每隔几秒就会重启,因为它陷入了一个等待kubeadm指令的死循环。
注意:如果校验签名报错,关闭校验,设置(gpgcheck=0、repo_gpgcheck=0)即可
讯享网
说明:kubernetes一切皆容器的思想体现,k8s控制平面的核心组件均采用pod管理容器部署。默认情况下, kubeadm 会从 k8s.gcr.io 仓库拉取镜像。如果请求的 Kubernetes 版本是 CI 标签 (例如 ci/latest),则使用 gcr.io/k8s-staging-ci-images,如果网络不允许,我们可以手动下载以上所有的容器镜像,也可以指定从自定义的镜像仓库拉取
- apiserver-advertise-address:API 服务器所公布的其正在监听的 IP 地址。如果未设置,则使用默认网络接口
- control-plane-endpoint:为控制平面指定一个稳定的IP地址或DNS名称,
- image-repository:选择用于拉取控制平面镜像的容器仓库,默认值:”k8s.gcr.io”
- kubernetes-version:为控制平面选择一个特定的Kubernetes版本, 默认值:”stable-1”
- service-cidr:为服务的虚拟IP地址另外指定IP地址段,默认值:”10.96.0.0/12”
- pod-network-cidr:指明pod网络可以使用的IP地址段。如果设置了这个参数,控制平面将会为每一个节点自动分配 CIDRs
3.3.2.1、初始化控制平面日志
讯享网
说明:以上日志中有两个比较重要的信息,如下:
- 集群添加工作节点的指令
- kubectl客户端依赖的集群配置
讯享网
说明:Kubernetes 集群默认需要加密方式访问。所以,这几条命令,就是将刚刚部署生成的 Kubernetes 集群的安全配置文件,保存到当前用户的.kube 目录下,kubectl 默认会使用这个目录下的授权信息访问 Kubernetes集群。
初始化控制平面后,我们首先来查看下节点的状态,会发现Master节点的状态是NotReady。
进一步,通过 kubectl describe 指令的输出,我们可以看到 NodeNotReady 的原因在于,我们尚未部署任何网络插件。
讯享网
另外,可以看到,CoreDNS这个依赖于网络的Pod处于Pending状态,即调度失败。这当然是符合预期的,因为这个 Master 节点的网络尚未就绪。
3.3.3.1、安装flannel网络插件
在Kubernetes项目一切皆容器的设计理念指导下,部署网络插件也是采用pod部署。
讯享网
- kube-flannel.yml文件内容
- 安装flannel网络插件日志
讯享网
- 网络插件部署完成后,我们可以通过 kubectl get重新检查Pod的状态
- 为节点打上“污点”(Taint)的命令是
讯享网
- Pod声明Toleration污点
这个 Toleration 的含义是,这个Pod能“容忍”所有键值对为foo=bar的Taint(operator: “Equal”,“等于”操作)。

- kubectl describe检查Master节点的Taint字段
讯享网
可以看到,Master节点默认被加上了node-role.kubernetes.io/master:NoSchedule这样一个“污点”,其中“键”是node-role.kubernetes.io/master,而没有提供“值”。
- 删除master节点的默认污点
为了方便起见,测试学习环境需要master节点也能被调度pod运行,简单粗暴地为master节点删除掉默认污点。
- 执行部署Master节点时生成的kubeadm join指令
讯享网
- worker节点加入集群日志输出
- 参考官方部署文档
3.5.1、部署Dashboard可视化插件
讯享网
- kubernetes-dashboard.yaml文件内容
- kubernetes-dashboard安装日志
讯享网
3.5.2、创建超级管理员的账号用于登录Dashboard
Dashboard是一个Web Server,很多人经常会在自己的公有云上无意地暴露 Dashboard 的端口,从而造成安全隐患。所以,1.7 版本之后的 Dashboard 项目部署完成后,默认只能通过 Proxy的方式在本地访问。
- 创建用户,并绑定集群admin权限
- 生成Bearer Token
讯享网
3.5.3、修改kubernetes-dashboard的service
为了更友好的访问dashboard服务,需要修改kubernetes-dashboard.yaml的service配置部分,将service type从ClusterIP修改为NodePort的方式。
- 更新以上配置文件后,执行kubectl apply更新资源对象
讯享网
- 查看更新后的service资源对象
3.5.4、访问kubernetes-dashboard
讯享网
- 更多信息参考rook官网
- 查看rook github
3.6.1、部署rook存储插件前置条件
以当前最新的rook版本为v1.8.7为例,进行以下的安装步骤。为了配置Ceph存储集群,至少需要以下本地存储选项之一。
- 原始设备(无分区或格式化文件系统)
- 原始分区(无格式化文件系统)
- 可通过block模式从存储类获得PV
- 集群至少需要三个节点,每个节点至少需要一个OSD(对象存储设备),保证存储类的创建
- 需要Kubernetesv1.16或更高版本
3.6.2、部署rook存储插件前置准备
由于本次搭建的环境,机器是通过VMware创建出来的,所以可以很方便地为每个虚拟机添加一块全新的硬盘。用于后续rook集群作为一个OSD(对象存储设备)。
- VMware添加虚拟机硬盘,参考vmware官方文档

- 查看磁盘块设备
讯享网
说明:注意FSTYPE字段的值,如果为空,则表示当前的设备尚未写入文件系统,例如以上的sdb设备就是刚新增的硬盘设备。
3.6.3、部署rook存储插件前置准备
- 克隆rook git仓库
- 查看rook集群部署的相关K8S资源配置文件
进入rook/deploy/examples目录,可查看rook项目提供了很多K8S资源配置文件。暂时我们只需要关注个别的资源配置文件。
讯享网
3.6.4、rook存储插件安装
rook各个资源对象依赖的镜像如下所示,这些镜像也是在谷歌的镜像仓库。
3.6.4.1、创建的CRD资源对象
创建rook集群前,首先需要被创建的CRD资源对象,让k8s认识rook的自定义资源;此资源文件未依赖镜像。
讯享网
- 执行日志
3.6.4.2、创建通用资源对象
启动operator和ceph cluster所必须得通用资源,必须先于operator.yaml、cluster.yaml资源被创建。此资源文件未依赖镜像。
讯享网
- 执行日志
3.6.4.3、创建rook operator控制器
依赖于rook/ceph:v1.8.7镜像,此镜像国内网络可以正常拉取。但是也默认依赖CSI相关的镜像,需要访问谷歌镜像仓库。
讯享网
- 如果无法拉取谷歌镜像,请修改相关依赖镜像仓库地址
- 修改过镜像后的operator.yaml文件内容
讯享网
- 执行日志
3.6.4.4、创建rook-ceph cluster
讯享网
- 查看pod状态
3.6.4.5、创建存储类
创建存储类,为k8s集群提供动态创建pv的能力
讯享网
- storageclass.yaml资源文件内容
讯享网
3.6.4.6、创建rook官方提供的mysql测试服务
rook官方提供的mysql测试服务,依赖于storageclass创建的pv持久化
讯享网
- mysql.yaml资源文件内容
3.6.4.7、创建toolbox
默认启动的Ceph集群,是开启Ceph认证的,这样你登陆Ceph组件所在的Pod里,是没法去获取集群状态,以及执行CLI命令,这时需要部署Ceph toolbox。
讯享网
3.6.4.8、创建rook官方提供的wordpress测试服务
rook官方提供的wordpress测试服务,依赖于storageclass创建的pv持久化
讯享网
说明:这里的pv会自动创建,当提交了包含StorageClass字段的PVC之后,Kubernetes 就会根据这个StorageClass创建出对应的PV,这是用到的是Dynamic Provisioning机制来动态创建pv。
- 访问wordpress

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/208389.html