从零搭建K8s集群是理解其内部架构最直接的方式。
通过手动的方式去部署每一个组件,这可以使得你能够明确地看到主节点对于工作节点是怎样进行控制的,API Server又是怎样开展通信的,etcd是如何去存储集群状态的,这种方式所具备的学习价值要远远超过直接运用一键安装脚本所带来的价值,这是毋庸置疑的。
理解集群节点规划与资源分配
搭建K8s集群的第一步是确定节点规模。
生产环境之中,一般采用的是主从架构,其中涵盖着一个具备控制平面功能的节点,以及多个用于工作的节点。
做实验时的环境,建议最少准备三个节点,其中有一个要当作主节点,另外两个要当作工作节点,只有这样开展,才能够观察任务调度以及跨节点通信的完整过程。
硬件资源分配直接影响集群运行稳定性。
建议针对每个节点选用Ubuntu 20.04.3系统,内存至少分配2GB,存储空间至少分配20GB。
要是本地电脑的配置存在一定限制,那么能够适度地把内存降低到1GB,然而过低的资源配置情形下将会致使相关系统组件在运行的时候又慢还要么崩溃。
准备核心安装文件与证书工具
K8s部署需要多种配置文件和二进制工具。
为了能够节省那寻找之际的时间,是可以预先去把所有同K8s v1.10.1相关联的那个安装包予以打包的,这里面涵盖了kubeadm、kubelet、kubectl之类作为组件的东西。
现将这些文件,进行统一上传,至主节点的那个目录,也就是 /usr/local/src 目录之下,以此方便后续,能够进行集中管理,以及实现分发。
安全通信是分布式系统的基础要求。
K8s各个组件相互之间运用TLS证书进行加密通信,要先去生成CA证书当作信任根。
借助cfssl工具,能够以高效的方式创建自签名CA,利用该自签名CAST,为API Server签发独立的证书文件,为kubelet签发独立的证书文件,为etcd等组件签发独立的证书文件。
部署高可用的etcd存储集群
etcd是K8s绝无仅有的数据存储中心,它留存着全部集群状态信息。
要先于主节点那儿解压etcd软件包,接着把二进制文件以及证书文件分发给所有的节点。
针对每个节点之上的etcd服务,均要进行单独化配置安排,从而保证能够构建起分布式集群,而不是出现单点故障情况。
启动etcd集群后需要验证健康状态。
经由etcdctl命令,能够对成员列表予以检查,还可查看集群健康状况,以此保证所有节点均能够正常地参与到数据同步之中。
整个K8s集群将无法记录任何状态,整个K8s集群也将无法恢复任何状态,这一步至关重要,因为一旦etcd出现问题。
安装容器运行时与kubelet
容器技术是K8s依其来运行应用的依靠所在,所以,预先装配容器运行时这一操作是所有节点都必须要做的事情。
最常用的选择被Docker占据,进行安装时将正确的仓库源以及版本予以配置,与K8s版本的兼容性得以确保。
# 在每个节点配置自己的ip(注意每个节点address那里,只填自己对应的ip)
[root@linux-node1 ~]# vim /etc/network/interfaces
auto ens33
iface ens33 inet static
address 192.168.185.131
netmask 255.255.255.0
gateway 192.168.185.2
dns-nameserver 8.8.8.8
# 配置每台机器hostname名字(注意每个节点都只填自己对应的hostname)
[root@linux-node1 ~]# vim /etc/hostname
linux-node1
# 在每台机器上配置hosts解析文件(注意:这里,每个节点的hosts文件都是一样的,要配置集群所有节点的信息)
[root@linux-node1 ~]# vim /etc/hosts
192.168.185.131 linux-node1
192.168.185.132 linux-node2
192.168.185.133 linux-node3
192.168.185.134 linux-node4
192.168.185.135 linux-node5
# 每个节点都重启
[root@linux-node1 ~]# reboot
# 测试一下看看
[root@linux-node1 ~]# ifconfig
[root@linux-node1 ~]# ping www.baidu.com
# 节点之间都相互ping一下看看
[root@linux-node1 ~]# ping 192.168.185.132
# 各节点关闭防火墙
[root@linux-node1 ~]# ufw disable
# 设置ssh免密登录
[root@linux-node1 ~]# ssh-keygen -t rsa
# 上面这条命令,遇到什么都别管,一路回车键敲下去
# 拷贝本密钥到五个节点上
[root@linux-node1 ~]# ssh-copy-id linux-node1
[root@linux-node1 ~]# ssh-copy-id linux-node2
[root@linux-node1 ~]# ssh-copy-id linux-node3
[root@linux-node1 ~]# ssh-copy-id linux-node4
[root@linux-node1 ~]# ssh-copy-id linux-node5
# 注意!!!将上面“设置ssh免密登录”和“拷贝本密钥到五个节点上”这两个步骤在其他所有节点上都要分别做一遍
# 每个节点都做完后,都要像下面这样测试一下,是否能在一个节点上免密登录到其他任何一个节点
[root@linux-node1 ~]# ssh linux-node1
# 免密登录到其他节点上后,若要退出回到本身节点,直接敲logout命令就行了
[root@linux-node1 ~]# ssh linux-node2
[root@linux-node1 ~]# ssh linux-node3
[root@linux-node1 ~]# ssh linux-node4
[root@linux-node1 ~]# ssh linux-node5
安装完成后需验证容器命令能否正常执行。
kubelet是运行在每个节点上的核心代理服务。
它负责接收主节点指令,管理本机的Pod和容器生命周期。
要安装kubelet、kubeadm以及kubectl工具,之后得借助systemd进行配置,以此让其在开机时自动启动,并且还要去设定正确的cgroup驱动,借此去适配容器运行时。
[root@linux-node1:/usr/local/src]# ll
total 579824
-rw-r--r-- 1 root root 593725046 Nov 9 19:16 k8s-v1.10.1-manual.zip
[root@linux-node1:/usr/local/src]# unzip k8s-v1.10.1-manual.zip
[root@linux-node1:/usr/local/src]# ls
k8s-v1.10.1-manual k8s-v1.10.1-manual.zip
[root@linux-node1:/usr/local/src]# cd k8s-v1.10.1-manual/k8s-v1.10.1/
[root@linux-node1:/usr/local/src/k8s-v1.10.1-manual/k8s-v1.10.1]# tar zxvf kubernetes-server-linux-amd64.tar.gz
[root@linux-node1:/usr/local/src/k8s-v1.10.1-manual/k8s-v1.10.1]# tar zxvf kubernetes-client-linux-amd64.tar.gz
[root@linux-node1:/usr/local/src/k8s-v1.10.1-manual/k8s-v1.10.1]# tar zxvf kubernetes-node-linux-amd64.tar.gz
使用kubeadm初始化控制平面
主节点初始化是整个搭建过程的关键步骤。
要是运用kubeadm init命令,那就得去指定API Server地址,还有Pod网络网段,以及Service网段等这些参数。
# 在每个节点都建立K8s的安装目录
[root@linux-node1 ~]# mkdir -p /opt/kubernetes/{
cfg,bin,ssl,log}
# 说明一下,其中子目录cfg/下为相关配置文件,bin/目录下为可执行文件,/ssl文件下为网络安全通信相关文件,log/下为日志文件
# 该/opt/kubernetes/才是我们真正的安装目录,每个节点都要配置
# 我们以后的工作,说白了就是从我们上一步准备好的相关安装配置文件中,
# 找到需要的文件,配置好后,分发到各个节点安装目录/opt/kubernetes/下对应的位置
# 在每个节点都配置kubernetes的环境变量
[root@linux-node1 ~]# vim /etc/profile
export PATH=$PATH:/opt/kubernetes/bin
[root@linux-node1 ~]# source /etc/profile
进行初始化之时,过程会自行生成,针对控制平面组件的Pod配置,并且会输出,可供工作节点加入集群的令牌命令。
初始化完成后必须记录令牌信息。
[root@linux-node1 ~]# apt-get update
[root@linux-node1 ~]# curl -s https://get.docker.com | sh
[root@linux-node1 ~]# docker version
这个用于后续工作节点向集群注册的令牌,若遗失,可借由kubeadm token命令重新生成。
首先,得去配置kubectl的认证文件,接着呢,要把生成的admin.conf给复制到用户目录下,如此这般,才能够运用kubectl命令管理集群。
配置网络插件与节点加入
Pod网络插件是集群通信的基础。
能够挑选Calico、Flannel或者Weave等CNI兼容的方案,借助kubectl apply来部署其YAML文件。
网络插件会于每个节点那儿去创建虚拟网桥,给Pod分配单独的IP,进而实现跨节点容器之间的互通。
root@linux-node1:/usr/local/src/k8s-v1.10.1-manual/k8s-v1.10.1# chmod +x cfssl*
root@linux-node1:/usr/local/src/k8s-v1.10.1-manual/k8s-v1.10.1# mv cfssl-certinfo_linux-amd64 /opt/kubernetes/bin/cfssl-certinfo
root@linux-node1:/usr/local/src/k8s-v1.10.1-manual/k8s-v1.10.1# mv cfssljson_linux-amd64 /opt/kubernetes/bin/cfssljson
root@linux-node1:/usr/local/src/k8s-v1.10.1-manual/k8s-v1.10.1# mv cfssl_linux-amd64 /opt/kubernetes/bin/cfssl
# 然后使用scp命令分别拷到其余4个节点:
root@linux-node1:/usr/local/src/k8s-v1.10.1-manual/k8s-v1.10.1# scp -r /opt/kubernetes/bin/cfssl* 192.168.185.132:/opt/kubernetes/bin
root@linux-node1:/usr/local/src/k8s-v1.10.1-manual/k8s-v1.10.1# scp -r /opt/kubernetes/bin/cfssl* 192.168.185.133:/opt/kubernetes/bin
root@linux-node1:/usr/local/src/k8s-v1.10.1-manual/k8s-v1.10.1# scp -r /opt/kubernetes/bin/cfssl* 192.168.185.134:/opt/kubernetes/bin
root@linux-node1:/usr/local/src/k8s-v1.10.1-manual/k8s-v1.10.1# scp -r /opt/kubernetes/bin/cfssl* 192.168.185.135:/opt/kubernetes/bin
# 在每个节点上/usr/local/src下建立ssl目录用来以后放相关的证书文件
root@linux-node1:/usr/local/src# mkdir ssl && cd ssl
工作节点加入集群只需执行一条命令。
把主节点在初始化之际所生成的kubeadm join命令,复制到各个工作节点去实行,节点便会自行下载镜像并且启动必需组件。
root@linux-node1:/usr/local/src/ssl# vim ca-config.json
{
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "8760h"
}
}
}
}
于主节点之上,运用kubectl get nodes这个命令,能够对节点状态予以监控,等候所有节点全都变为Ready,这便意味着加入成功了。
你在手动搭建K8s集群的过程中,遇到最多的报错信息是什么?
root@linux-node1:/usr/local/src/ssl# vim ca-csr.json
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
欢迎在评论区分享你的踩坑经历,帮助更多人绕过这些常见障碍。
root@linux-node1:/usr/local/src/ssl# cfssl gencert -initca ca-csr.json | cfssljson -bare ca
# 拷贝到我们之前创建的用来放证书的目录下
root@linux-node1:/usr/local/src/ssl# cp ca.csr ca.pem ca-key.pem ca-config.json /opt/kubernetes/ssl

Comments NOTHING