Kubernetes集群的安装记录
Step 0. Kubernets集群安装的准备工作
本次安装测试的基础硬件是Intel NUC5i3 & NUC8i3,基准软件是:
- Centos 7.8(启动速度快、版本稳定性好)
- Docker-ce 19.03.12
- Kubernetes 1.18.2 (v1.18.4拉取国内镜像不成功!!!)
- Calico 3.8.9
- Nginx-ingress 1.5.3
本Kubernetes集群包含了2个Node,分别是:
- 1个Master节点:Hostname = master1,IPADDR = 192.168.0.132
- 1个Worker节点:Hostname = worker1,IPADDR = 192.168.0.130
2台已安装Linux的服务器,分别作为Master和Worker节点。
- 确认服务器支持并已开启硬件虚拟化支持(NUC各个型号均默认支持)
- 刚刚完成安装的Centos尚未配置网络,需要激活网卡并确认可以访问公网,具体方法请参见Centos 7.8安装步骤
Step 1. 修改操作系统配置
关闭SElinux和Firewalld服务
SELinux是一个安全体系结构,它通过LSM(Linux Security Modules)框架被集成到Linux Kernel 2.6.x中。关闭selinux的目的是允许容器直接访问宿主机的文件系统。
SELinux 有三种工作模式,分别是:enforcing强制模式 / permissive宽容模式 / disabled禁用模式,可以在
/etc/selinux/config中设定。enforcing 和 permissive 模式可以通过
setenforce 1|0命令快速切换。如果想从 disabled 切换到 enforcing 或者 permissive 的话,需要重启系统。反过来也一样。Iptables防火墙,会对所有网络流量进行过滤、转发,如果是内网机器一般都会直接关闭,省的影响网络性能,但k8s不能直接关了,k8s需要用防火墙做ip转发和修改的,关闭firewalld的目的是防止产生重复的防火墙规则。
1 | sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config |
- 关闭swap服务
1 | swapoff -a |
修改Linux内核参数以启用bridge功能
br_netfilter通过和linux bridge功能联动,以实现透明防火墙功能,具体方法是在Bridge层的通过执行Netfilter钩子来实现IP报文过滤。
sysctl命令用于运行时配置内核参数,这些参数位于
/proc/sys目录下,可以用sysctl来设置或重新设置联网功能,如IP转发、IP碎片去除以及源路由检查等
1 | modprobe br_netfilter |
- 安装几个基础的工具软件
1 | yum -y install yum-utils lvm2 device-mapper-persistent-data nfs-utils xfsprogs wget net-tools bind-utils bzip2 tar tree |
Step 2. 安装Docker服务
如果已安装过Docker的旧版本,需要全部卸载,指令是:
yum -y remove docker-client docker-client-latest docker-common docker-latest docker-logrotate docker-latest-logrotate docker-selinux docker-engine-selinux docker-engine添加阿里云的yum源设置,并安装Docker服务,本次Docker安装的stable版本号为
19.03.12
1 | yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo |
确认Docker服务启动正常后,还需要设置国内的image镜像源
exec-opts:必须的!目的是修改Docker Cgroup Driver为systemd,如果不修改则在后续添加Worker节点时可能会遇到detected cgroupfs as ths Docker driver.xx”`的报错信息,导致Docker镜像库配置为本地源,而无法正常拉取image。registry-mirrors:设置了几个国内可用的镜像源,可以根据实现情况调整
1 | cat > /etc/docker/daemon.json <<EOF |
- 再次启动Docker,确认配置已修改
1 | systemctl daemon-reload |
Step 3. 安装Kubernets软件包
如果已安装过Docker的旧版本,需要删除,指令是:
yum -y remove kubelet kubadm kubctl在Yum仓库源的配置目录
/etc/yum.repos.d/中,新增kubernetes.repo并指向阿里云的国内镜像站点
1 | cat <<EOF > /etc/yum.repos.d/kubernetes.repo |
安装Kubernets软件包,本次安装的stable版本号为
1.18.4,其中:kubelet:此组件是运行在每一个集群节点上的代理程序。它确保 Pod 中的容器处于运行状态。Kubelet 通过多种途径获得 PodSpec 定义,并确保 PodSpec 定义中所描述的容器处于运行和健康的状态。Kubelet不管理不是通过 Kubernetes 创建的容器。
kubeadm:Kubernetes的安装工具。
kubectl:作为Kubernetes的客户端CLI工具,可以让用户通过命令行的方式对Kubernetes集群进行操作。Master节点必备,Worker节点可以选装
1 | 原来是1.18.2版本,现在是1.20.1 |
注意:此时系统重复启动
kubelet不成功,原因是kubeadm尚未完成初始化,不要管他,后面自然就好了!
Step 4. 在Master节点设置运行环境,并初始化启动Kubernetes
- 设置Kubernetes运行环境
1 | hostnamectl set-hostname master1 |
- Master节点初始化,如果失败,可以输入
kubeadm reset回滚,观察错误提示并修改配置后重试
1 | kubeadm init \ |
- apiserver-advertise-address:公布API 服务器所正在监听的 IP 地址,指定
0.0.0.0以使用默认网络接口的地址。切记只可以是内网IP,不能是外网IP,如果有多网卡,可以使用此选项指定某个网卡- control-plane-endpoint:为控制平面指定一个稳定的 IP 地址或 DNS 名称,指定的 master1 已经在
/etc/hosts配置解析为本机IP- image-repository:选择用于拉取Control-plane的镜像的容器仓库,默认值:
k8s.gcr.io,因为GW的原因必须修改为国内源- kubernetes-version:为Control-plane选择一个特定的 Kubernetes 版本, 默认值:
stable-1,本次指定1.18.4- node-name: 指定节点的名称,不指定的话为主机hostname,默认可以不指定
- apiserver-bind-port:API 服务器绑定的端口,默认
6443- cert-dir: 保存和存储证书的路径,默认值:
/etc/kubernetes/pki- pod-network-cidr: 指定pod的IP地址范围
- service-cidr: 指定Service的IP地址范围,默认”10.96.0.0/12”
- service-dns-domain: 为Service另外指定域名,默认”cluster.local”
- upload-certs: 指定Control-plane 将证书上传到 kubeadm-certs Secret
- 如果Master节点启动成功,可以根据如下屏幕提示生成
$HOME/.kube/config配置文件,完成后就可以使用kubectl了
1 | mkdir -p $HOME/.kube |
安装Calico网络插件
集群必须安装网络插件以实现Pod间通信,只需要在Master节点操作,其他Node节点会自动创建相关Pod。
该配置文件默认采用的Pod的IP地址为192.168.0.0/16,需要修改为集群初始化参数中采用的值,本例中为10.10.0.0/16;
1 | wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml |
- 监控容器状态,等待所有容器状态处于Running状态
1 | watch -n 2 kubectl get pods -n kube-system -o wide |
- 检查Master的状态,看到下面的结果就说明初始化成功了!!!
1 | [root@localhost ~]# kubectl get nodes -o wide |
Step 5. 安装Kuboard监控面板
- 在Master节点,安装Ingress Controller
1 | kubectl apply -f https://kuboard.cn/install-script/v1.16.0/nginx-ingress.yaml |
- 在Master节点执行,在线下载并启用Kuboard监控工具包(由kuboard.cn提供,不是默认的Dashboard)
1 | kubectl apply -f https://kuboard.cn/install-script/kuboard.yaml |
- 持续监控pod运行情况,直到如下信息就说明成功了
1 | $ kubectl get pods -l k8s.kuboard.cn/name=kuboard -n kube-system |
- 在第一个Master节点,以admin角色获取登录的Token,当然也可以是普通用户的角色
1 | 获取admin用户的Token |
注意:Mac OS的base64指令有差异,
base64 -d更改为base64 -D
- 浏览器打开地址:
http://192.168.0.210:32567,访问主监控界面,并粘贴上一步的屏幕显示输入Token
Step 6: Worker节点部署(可选)
每一个Worker节点都需要完成步骤1-3,设置操作系统,并安装docker、kubertnetes等软件包
在Worker节点上,配置 APISERVER 的地址信息,实际上就是在
/etc/hosts中增加如下域名:
1 | 192.168.0.210 master1 |
在Master节点上,获得允许Worker节点加入的Token信息,有两种方法:
方式1: 初始化第一个 master 节点时的输出内容中,第25、26行就是用来初始化 worker 节点的命令。该 token 的有效时间为 2 个小时,2小时内可以使用此 token 初始化任意数量的 worker 节点。
方式2: 如果Master节点的初始化Token已经失效,则使用命令
kubeadm token create --print-join-command,输出内容就包含该Token和指令样板在Worker节点上,按照上一步骤中Master节点提供的信息,粘贴并执行以下类似的命令
1 | kubeadm join master1:6443 --token c4y5zm.rarmxapvrozfslcr \ |
如果Worker节点加入集群重,在Dashboard上将可以看到新的Node节点
如果失败,请执行
kubeadm reset重新初始化,并分析错误原因再次尝试初始化第一个 master 节点时的输出内容中,第25、26行就是用来初始化 worker 节点的命令,如下所示:此时请不要执行该命令
Step 7. 移除Worker节点(参考)
在准备移除的 worker 节点上,执行
kubeadm reset在第一个 master 节点上,执行
kubectl delete node worker1。worker节点的名字可执行
kubectl get nodes命令获得
Step 8. 移除Master节点(参考)
在准备移除的 Master 节点上,执行
kubeadm reset如果想要再次启动Master节点,重复Step4、Step5即可
问题记录
1. 关于Docker的Cgroup Driver驱动程序
Cgroups是control groups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:cpu,memory,IO等等)的机制。最初由google的工程师提出,后来被整合进Linux内核。Cgroups也是LXC为实现虚拟化所使用的资源管理手段,可以说没有cgroups就没有LXC。
要理解 systemd 与 cgroups 的关系,我们需要先区分 cgroups 的两个方面:层级结构(A)和资源控制(B)。首先 cgroups 是以层级结构组织并标识进程的一种方式,同时它也是在该层级结构上执行资源限制的一种方式。我们简单的把 cgroups 的层级结构称为 A,把 cgrpups 的资源控制能力称为 B。
对于 systemd 来说,A 是必须的,如果没有 A,systemd 将不能很好的工作。而 B 则是可选的,如果你不需要对资源进行控制,那么在编译 Linux 内核时完全可以去掉 B 相关的编译选项。
docker 17.03使用的Cgroup Driver为cgroupfs,而kubelet 1.8.1 使用的cgroup driver为systemd,这里需要修改docker的Cgroup Driver,和kubelet 保持一致!
2. 关于kubelet启动报错
在使用systemctl启动kubelet以后,其日志显示错误信息:Process: 11794 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS (code=exited, status=255)
问题分析:该错误说明kubelet尚未启动,原因是Master节点尚未完成初始化
解决办法:不管他!等Master节点init完成后,自然就恢复正常了。
3. Master节点启动 kubeadm init 失败
本次安装默认K8s的版本是1.18.4,报错信息显示时无法正常拉取默认镜像版本。
解决办法是:强制修改K8s的版本号为1.18.2,结果下载成功!!!
4. Master节点无法启动metrics-server
1 | [root@localhost ~]# kubectl get pods -A |
1 | [root@localhost ~]# kubectl describe nodes |
这就是为什么master1+worker1的配置时,metrics自动好了的原因,因为默认master1不运行应用pod
1 | kubectl taint nodes --all node-role.kubernetes.io/master- |