本文将从零开始在干净的机器上安装 Docker、Kubernetes (使用 kubeadm)、Calico、NFS StorageClass等
,通过手把手的教程演示如何搭建一个 Kubernetes集群
,并在 K8s集群之上安装开源的KubeSphere
容器平台可视化运营集群环境。
环境和版本
所有机器处于同一内网网段,并且可以互相通信。
机器IP | 工作内容 |
---|---|
10.220.170.240 | NFS |
10.209.208.238 | master |
10.145.197.182 | nodes0 |
10.145.197.176 | nodes1 |
10.145.197.120 | nodes2 |
10.209.33.24 | nodes3 |
Docker版本: v19.03.4
k8s集群(kubeadm、kubelet 和 kubectl等)版本:v1.17.3
kubesphere版本:v3.0
准备环境
在所有节点上执行
1 | # 为了方便本操作关闭了防火墙,也建议你这样操作 |
更换CentOS YUM源为阿里云yum源
1 | # 安装wget |
时间同步并确认
1 | timedatectl |
安装 Docker
安装 Docker
每台机器上也都要安装Docker
1 | # 安装 Docker CE |
修改Cgroup Driver
需要将Docker的Cgroup Driver 修改为 systemd,不然在为Kubernetes 集群添加节点时会报如下错误:
1 | # 执行 kubeadm join 的 WARNING 信息 |
目前 Docker 的 Cgroup Driver 看起来应该是这样的:
1 | docker info|grep "Cgroup Driver" |
需要将这个值修改为 systemd 。同时将registry替换成国内的一些仓库地址,以免直接在官方仓库拉取镜像会很慢,操作如下。
1 | # Setup daemon. |
安装 kubeadm、kubelet 和 kubectl
安装准备
需要在每台机器上安装以下的软件包:
- kubeadm:用来初始化集群的指令。
- kubelet:在集群中的每个节点上用来启动 pod 和容器等。
- kubectl:用来与集群通信的命令行工具(Worker 节点可以不装,但是我装了,不影响什么)。
1 | # 配置K8S的yum源 |
开始安装
安装指定版本 kubelet、 kubeadm 、kubectl, 这里选择当前较新的稳定版 Kubernetes 1.17.3,如果选择的版本不一样,在执行集群初始化的时候,注意 –kubernetes-version 的值。
1 | # 增加配置 |
使用 Kubeadm创建集群
初始化Master节点
在 Master上执行初始化,执行初始化使用 kubeadm init 命令。
1 | # 设置hosts |
下面有不带注释的初始化命令,建议先查看带注释的每个参数对应的意义,确保与你的当前配置的环境是一致的,然后再执行初始化操作,避免踩雷。
1 | # 初始化 Control-plane/Master 节点 |
不带注释的内容如下,如果初始化超时,可以修改DNS为8.8.8.8后重启网络服务再次尝试。
1 | kubeadm init \ |
接下来这个过程有点漫长(初始化会下载镜像、创建配置文件、启动容器等操作),泡杯茶,耐心等待。你也可以执行 tailf /var/log/messages 来实时查看系统日志,观察 Master 的初始化进展,期间碰到一些报错不要紧张,可能只是暂时的错误,等待最终反馈的结果即可。
如果初始化最终成功执行,你将看到如下信息:
1 | Your Kubernetes control-plane has initialized successfully! |
为普通用户添加 kubectl 运行权限,命令内容在初始化成功后的输出内容中可以看到。
1 | mkdir -p $HOME/.kube |
建议root用户也进行以上操作,作者使用的是root用户执行的初始化操作,然后在操作完成后查看集群状态的时候,出现如下错误:
1 | The connection to the server localhost:8080 was refused - did you specify the right host or port? |
这时候请备份好 kubeadm init 输出中的 kubeadm join 命令,因为将会需要这个命令来给集群添加节点。
安装Pod网络附加组件
集群必须安装Pod网络插件,以使Pod可以相互通信,只需在Master节点操作,其他新加入的节点会自动创建相关pod。必须在任何应用程序之前部署网络组件。另外,在安装网络之前,CoreDNS将不会启动,你可以通过命令 来查看CoreDNS 的状态
1 | # 查看 CoreDNS 的状态,并不是 Running 状态 |
kubeadm 支持多种网络插件,我们选择Calico 网络插件(kubeadm 仅支持基于容器网络接口(CNI)的网络(不支持kubenet),默认情况下,它给出的pod的IP段地址是 192.168.0.0/16 ,如果你的机器已经使用了此IP段,就需要修改这个配置项,将其值改为在初始化 Master 节点时使用 kubeadm init –pod-network-cidr=x.x.x.x/x 的IP地址段,即我们上面配置的 10.10.0.0/16 ,大概在625行左右,操作如下:
1 | # 获取配置文件 |
稍等片刻查询 pod 详情,你也可以使用 watch 命令来实时查看 pod 的状态,等待 Pod 网络组件部署成功后,就可以看到一些信息了,包括 Pod 的 IP 地址信息,这个过程时间可能会有点长。
1 | watch -n 2 kubectl get pods --all-namespaces -o wide |
将Worker节点添加到Kubernetes
请首先确认所有Worker节点满足第一部分的环境说明,并且已经安装了 Docker 和 kubeadm、kubelet 、kubectl,并且已经启动 kubelet。
1 | # 添加 Hosts 解析 |
将 Worker 节点添加到集群,这里注意,执行后可能会报错,有幸的话你会跳进这个坑,这是因为 Worker 节点加入集群的命令实际上在初始化 master 时已经有提示出来了,不过两小时后会删除上传的证书,所以如果你此时加入集群的时候提示证书相关的错误,请执行 kubeadm init phase upload-certs –upload-certs 重新加载证书。
1 | kubeadm join kuber4s.api:6443 --token 0y1dj2.ih27ainxwyib0911 \ |
执行加入操作,你可能会发现卡着不动,大概率是因为令牌ID对此集群无效或已过 2 小时的有效期(通过执行 kubeadm join –v=5 来获取详细的加入过程,看到了内容为 ”token id “0y1dj2” is invalid for this cluster or it has expired“ 的提示),接下来需要在 Master 上通过 kubeadm token create 来创建新的令牌。
1 | $ kubeadm token create --print-join-command |
在 Worker节点上重新执行加入集群命令
1 | kubeadm join kuber4s.api:6443 \ |
接下来在Master上查看 Worker 节点加入的状况,直到 Worker 节点的状态变为 Ready 便证明加入成功,这个过程可能会有点漫长,30 分钟以内都算正常的,主要看你网络的情况或者说拉取镜像的速度;另外不要一看到 /var/log/messages 里面报错就慌了,那也得看具体报什么错,看不懂就稍微等一下,一般在 Master 上能看到已经加入(虽然没有Ready)就没什么问题。
1 | watch kubectl get nodes -o wide |
安装nfs服务
kubesphere安装条件是必须k8s集群有StorageClass,这里用nfs。所以需要安装nfs服务来作为StorageClass。
安装
1 | yum install -y nfs-utils |
修改配置文件
1 | mkdir -p /data/k8s --创建一个存储目录 |
启动服务
先启动rpcbind,再启动nfs
1 | systemctl start rpcbind |
安装 StorageClass
Kubernetes 支持多种 StorageClass,这选择NFS 作为集群的 StorageClass。
下载所需文件
下载所需文件,并进行内容调整
1 | mkdir nfsvolume && cd nfsvolume |
修改 deployment.yaml 中的两处 NFS 服务器 IP 和目录
1 | ... |
部署创建
1 | kubectl create -f rbac.yaml |
在集群内所有机器上安装nfs-utils并启动。
1 | yum -y install nfs-utils |
查看storageclass
1 | $ kubectl get storageclass |
标记默认的 StorageClass
操作命令格式如下
1 | kubectl patch storageclass managed-nfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' |
请注意,最多只能有一个 StorageClass 能够被标记为默认。
验证标记是否成功
1 | $ kubectl get storageclass |
安装KubeSphere3.0
KubeSphere 是在 Kubernetes 之上构建的以应用为中心的容器平台,提供简单易用的操作界面以及向导式操作方式,在降低用户使用容器调度平台学习成本的同时,极大减轻开发、测试、运维的日常工作的复杂度,旨在解决 Kubernetes 本身存在的存储、网络、安全和易用性等痛点。除此之外,平台已经整合并优化了多个适用于容器场景的功能模块,以完整的解决方案帮助企业轻松应对敏捷开发与自动化运维、DevOps、微服务治理、灰度发布、多租户管理、工作负载和集群管理、监控告警、日志查询与收集、服务与网络、应用商店、镜像构建与镜像仓库管理和存储管理等多种场景。后续版本将提供和支持多集群管理、大数据、AI 等场景。
安装要求
1 | k8s集群版本必须是1.15.x, 1.16.x, 1.17.x, or 1.18.x |
按照上面教程操作,完全符合要求。
安装yaml文件
1 | kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.0.0/kubesphere-installer.yaml |
查看安装日志
1 | kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l 'app in (ks-install, ks-installer)' -o jsonpath='{.items[0].metadata.name}') -f |
查看所有pod
1 | kubectl get pods -A |
登陆kubesphere
浏览器访问ip:30880 用户名:admin 默认密码:P@88w0rd
补充内容
- kubeadm init 初始化Kubernetes主节点
- kubeadm token 管理 kubeadm join 的令牌,包括查看、创建和删除等
- kubeadm reset 将kubeadm init或kubeadm join对主机的更改恢复到之前状态,一般与 -f 参数使用
POD创建流程
Ingress与Service关系图
nfs异常排查
1 | kubectl get sc |
添加- –feature-gates=RemoveSelfLink=false