搭建 k8s 环境平台规划
单 master 集群
单个 master 节点,然后管理多个 node 节点
多 master 集群
多个 master 节点,管理多个 node 节点,同时中间多了一个负载均衡的过程
服务器硬件配置要求
测试环境
master:2 核 4G 20G
node: 4 核 8G 40G
生产环境
master:8 核 16G 100G
node: 16 核 64G 200G
目前生产部署 Kubernetes 集群主要有两种方式
kubeadm
kubeadm 是一个 K8S 部署工具,提供 kubeadm init 和 kubeadm join,用于快速部署 Kubernetes 集群
官网地址:点我传送
二进制包
从 github 下载发行版的二进制包,手动部署每个组件,组成 Kubernetes 集群。
Kubeadm 降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署 Kubernetes 集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。
Kubeadm 部署集群
kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具,这个工具能通过两条指令完成一个 kubernetes 集群的部署:
1 | # 创建一个 Master 节点 |
步骤
使用 kubeadm 方式搭建 K8s 集群主要分为以下几步
- 准备三台虚拟机,同时安装操作系统 CentOS 7.x
- 对三个安装之后的操作系统进行初始化操作
- 在三个节点安装 docker kubelet kubeadm kubectl
- 在 master 节点执行 kubeadm init 命令初始化
- 在 node 节点上执行 kubeadm join 命令,把 node 节点添加到当前集群
- 配置 CNI 网络插件,用于节点之间的连通【失败了可以多试几次】
- 通过拉取一个 nginx 进行测试,能否进行外网测试
安装要求
在开始之前,部署 Kubernetes 集群机器需要满足以下几个条件:
- 一台或多台机器,操作系统 CentOS7.x-86_x64
- 硬件配置:2GB 或更多 RAM,2 个 CPU 或更多 CPU,硬盘 30GB 或更多【注意 master 需要两核】
- 可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
- 禁止 swap 分区
准备环境
根据自己实际的开发环境来
角色 | IP |
---|---|
master | 192.168.177.130 |
node1 | 192.168.177.131 |
node2 | 192.168.177.132 |
然后开始在每台机器上执行下面的命令
1 | # 关闭防火墙 |
所有节点安装 Docker/kubeadm/kubelet
所有节点安装 Docker/kubeadm/kubelet ,Kubernetes 默认 CRI(容器运行时)为 Docker,因此先安装 Docker
安装 Docker
这个地方可以根据我的那篇docker博客文章配置
首先配置一下 Docker 的阿里 yum 源
1 | # 可以使用 docker info 查看,yum源是否是阿里云的,不是的话,执行以下命令 |
然后 yum 方式安装 docker
1 | # yum安装 |
配置 docker 的镜像源,可以到阿里云容器镜像那里获取
1 | cat >> /etc/docker/daemon.json << EOF |
然后重启 docker
1 | systemctl restart docker |
添加 kubernetes 软件源
然后我们还需要配置一下 yum 的 k8s 软件源
1 | cat > /etc/yum.repos.d/kubernetes.repo << EOF |
安装 kubeadm,kubelet 和 kubectl
由于版本更新频繁,这里指定版本号部署:
1 | # 安装kubelet、kubeadm、kubectl,同时指定版本 |
部署 Kubernetes Master【master 节点】
在 192.168.177.130 执行,也就是 master 节点
1 | kubeadm init \ |
由于默认拉取镜像地址 k8s.gcr.io 国内无法访问,这里指定阿里云镜像仓库地址,【执行上述命令会比较慢,因为后台其实已经在拉取镜像了
】,我们 另开窗口 docker images 命令即可查看已经拉取的镜像
当我们出现下面的情况时,表示 kubernetes 的镜像已经安装成功
使用 kubectl 工具 【master 节点操作】
1 | mkdir -p $HOME/.kube |
执行完成后,我们使用下面命令,查看我们正在运行的节点
1 | kubectl get nodes |
能够看到,目前有一个 master 节点已经运行了,但是还处于未准备状态
下面我们还需要在 Node 节点执行其它的命令,将 node1 和 node2 加入到我们的 master 节点上
加入 Kubernetes Node【Slave 节点】
下面我们需要到 node1 和 node2 服务器,执行下面的代码向集群添加新节点
执行 kubeadm init 输出的 kubeadm join 命令:
注意,以下的命令是在 master 初始化完成后,每个人的都不一样!!!需要复制自己生成的!
1 | kubeadm join 192.168.177.130:6443 --token 8j6ui9.gyr4i156u30y80xf \ |
默认 token 有效期为 24 小时,当过期之后,该 token 就不可用了。这时就需要重新创建 token,操作如下:
1 | kubeadm token create --print-join-command |
当我们把两个节点都加入进来后,我们就可以去 Master 节点 执行下面命令查看情况
1 | kubectl get node |
部署 CNI 网络插件
上面的状态还是 NotReady,下面我们需要网络插件,来进行联网访问
1 | # 下载网络插件配置 |
默认镜像地址无法访问,sed 命令修改为 docker hub 镜像仓库。
1 | # 添加 |
运行后的结果
运行完成后,我们查看状态可以发现,已经变成了 Ready 状态了
如果上述操作完成后,还存在某个节点处于 NotReady 状态,可以在 Master 将该节点删除
1 | # master节点将该节点删除 |
测试 kubernetes 集群
我们都知道 K8S 是容器化技术,它可以联网去下载镜像,用容器的方式进行启动
在 Kubernetes 集群中创建一个 pod,验证是否正常运行:
1 | # 下载nginx 【会联网拉取nginx镜像】 |
如果我们出现 Running 状态的时候,表示已经成功运行了
下面我们就需要将端口暴露出去,让其它外界能够访问
1 | # 暴露端口 |
能够看到,我们已经成功暴露了 80 端口 到 30529 上
我们到我们的宿主机浏览器上,访问如下地址,ip 地址可以是三台机器的任何一台的 ip,因为是集群搭建
1 | http://192.168.177.130:30529/ |
发现我们的 nginx 已经成功启动了
到这里为止,我们就搭建了一个单 master 的 k8s 集群
使用二进制方式搭建 K8S 集群
准备工作
在开始之前,部署 Kubernetes 集群机器需要满足以下几个条件
- 一台或多台机器,操作系统 CentOS 7.x
- 硬件配置:2GB ,2 个 CPU,硬盘 30GB
- 集群中所有机器之间网络互通
- 可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像导入节点
- 禁止 swap 分区
步骤
- 创建多态虚拟机,安装 Linux 系统
- 操作系统的初始化
- 为 etcd 和 apiserver 自签证书
- 部署 etcd 集群
- 部署 master 组件【安装 docker、kube-apiserver、kube-controller-manager、kube-scheduler、etcd】
- 部署 node 组件【安装 kubelet、kube-proxy、docker、etcd】
- 部署集群网络
准备虚拟机
首先我们准备了两台虚拟机,来进行安装测试
主机名 | ip |
---|---|
k8s_2_master | 192.168.177.140 |
k8s_2_node | 192.168.177.141 |
操作系统的初始化
然后我们需要进行一些系列的初始化操作
1 | # 关闭防火墙 |
部署 Etcd 集群
Etcd 是一个分布式键值存储系统,Kubernetes 使用 Etcd 进行数据存储,所以先准备一个 Etcd 数据库,为了解决 Etcd 单点故障,应采用集群方式部署,这里使用 3 台组建集群,可容忍一台机器故障,当然也可以使用 5 台组件集群,可以容忍 2 台机器故障
自签证书
提到证书,我们想到的就是下面这个情况
这个 https 证书,其实就是服务器颁发给网站的,代表这是一个安全可信任的网站。
而在我们 K8S 集群的内部,其实也是有证书的,如果不带证书,那么访问就会受限
同时在集群内部 和 外部的访问,我们也需要签发证书
如果我们使用二进制的方式,那么就需要自己手动签发证书。
自签证书:我们可以想象成在一家公司上班,然后会颁发一个门禁卡,同时一般门禁卡有两种,一个是内部员工的门禁卡,和外部访客门禁卡。这两种门禁卡的权限可能不同,员工的门禁卡可以进入公司的任何地方,而访客的门禁卡是受限的,这个门禁卡其实就是自签证书
准备 cfssl 证书生成工具
cfssl 是一个开源的证书管理工具,使用 json 文件生成证书,相比 openssl 更方便使用。找任意一台服务器操作,这里用 Master 节点。
1 | wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 |
由于本人没有用二进制方式搭建,所以具体流程没有记录下来。
可以参考这片文章(具体不知道对不对):https://www.toutiao.com/i6898268150220489220/
Kubeadm 和二进制方式对比
Kubeadm 方式搭建 K8S 集群
安装虚拟机,在虚拟机安装 Linux 操作系统【3 台虚拟机】
对操作系统初始化操作
所有节点安装 Docker、kubeadm、kubelet、kubectl【包含 master 和 slave 节点】
- 安装 docker、使用 yum,不指定版本默认安装最新的 docker 版本
- 修改 docker 仓库地址,yum 源地址,改为阿里云地址
- 安装 kubeadm,kubelet 和 kubectl
- k8s 已经发布最新的 1.19 版本,可以指定版本,不指定的话则默认安装最新版本
yum install -y kubelet kubeadm kubectl
在 master 节点执行初始化命令操作
kubeadm init
- 默认拉取镜像地址 K8s.gcr.io 国内地址,需要使用国内地址
安装网络插件(CNI)
kubectl apply -f kube-flannel.yml
在所有的 node 节点上,使用 join 命令,把 node 添加到 master 节点上
测试 kubernetes 集群
二进制方式搭建 K8S 集群
- 安装虚拟机和操作系统,对操作系统进行初始化操作
- 生成 cfssl 自签证书
ca-key.pem
、ca.pem
server-key.pem
、server.pem
- 部署 Etcd 集群
- 部署的本质,就是把 etcd 集群交给 systemd 管理
- 把生成的证书复制过来,启动,设置开机启动
- 为 apiserver 自签证书,生成过程和 etcd 类似
- 部署 master 组件,主要包含以下组件
- apiserver
- controller-manager
- scheduler
- 交给 systemd 管理,并设置开机启动
- 如果要安装最新的 1.19 版本,下载二进制文件进行安装
- 部署 node 组件
- docker
- kubelet
- kube-proxy【需要批准 kubelet 证书申请加入集群】
- 交给 systemd 管理组件- 组件启动,设置开机启动
- 批准 kubelet 证书申请 并加入集群
- 部署 CNI 网络插件
- 测试 Kubernets 集群【安装 nginx 测试】
错误汇总
错误一
在执行 Kubernetes init 方法的时候,出现这个问题
1 | error execution phase preflight: [preflight] Some fatal errors occurred: |
是因为 VMware 设置的核数为 1,而 K8S 需要的最低核数应该是 2,调整核数重启系统即可
错误二
我们在给 node1 节点使用 kubernetes join 命令的时候,出现以下错误
1 | error execution phase preflight: [preflight] Some fatal errors occurred: |
错误原因是我们需要关闭 swap
1 | # 关闭swap |
错误三
在给 node1 节点使用 kubernetes join 命令的时候,出现以下错误
1 | The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get http://localhost:10248/healthz: dial tcp [::1]:10248: connect: connection refused |
解决方法,首先需要到 master 节点,创建一个文件
1 | # 创建文件夹 |
然后删除刚刚创建的配置目录
1 | rm -rf $HOME/.kube |
然后 在 master 重新初始化
1 | kubeadm init --apiserver-advertise-address=202.193.57.11 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 |
初始完成后,我们再到 node1 节点,执行 kubeadm join 命令,加入到 master
1 | kubeadm join 202.193.57.11:6443 --token c7a7ou.z00fzlb01d76r37s \ |
添加完成后,我们使用下面命令,查看节点是否成功添加
1 | kubectl get nodes |
错误四
我们再执行查看节点的时候, kubectl get nodes 会出现问题
1 | Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes") |
这是因为我们之前创建的配置文件还存在,也就是这些配置
1 | mkdir -p $HOME/.kube |
我们需要做的就是把配置文件删除,然后重新执行一下
1 | rm -rf $HOME/.kube |
然后再次创建一下即可
1 | mkdir -p $HOME/.kube |
这个问题主要是因为我们在执行 kubeadm reset 的时候,没有把 $HOME/.kube 给移除掉,再次创建时就会出现问题了
错误五
安装的时候,出现以下错误
1 | Another app is currently holding the yum lock; waiting for it to exit... |
是因为 yum 上锁占用,解决方法
1 | yum -y install docker-ce |
错误六
在使用下面命令,添加 node 节点到集群上的时候
1 | kubeadm join 192.168.177.130:6443 --token jkcz0t.3c40t0bqqz5g8wsb --discovery-token-ca-cert-hash sha256:bc494eeab6b7bac64c0861da16084504626e5a95ba7ede7b9c2dc7571ca4c9e5 |
然后出现了这个错误
1 | [root@k8smaster ~]# kubeadm join 192.168.177.130:6443 --token jkcz0t.3c40t0bqqz5g8wsb --discovery-token-ca-cert-hash sha256:bc494eeab6b7bac64c0861da16084504626e5a95ba7ede7b9c2dc7571ca4c9e5 |
出于安全考虑,Linux 系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的 ip 地址将包发往本机另一网卡,该网卡根据路由表继续发送数据包。这通常就是路由器所要实现的功能。也就是说 /proc/sys/net/ipv4/ip_forward 文件的值不支持转发
- 0:禁止
- 1:转发
所以我们需要将值修改成 1 即可
1 | echo “1” > /proc/sys/net/ipv4/ip_forward |
修改完成后,重新执行命令即可
发布时间: 2021-01-12
最后更新: 2024-06-24
本文标题: Kubernetes学习之搭建集群
本文链接: https://blog-yilia.xiaojingge.com/posts/86dbe51c.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可。转载请注明出处!
