前言
之前我们搭建的集群,只有一个 master 节点,当 master 节点宕机的时候,通过 node 将无法继续访问,而 master 主要是管理作用,所以整个集群将无法提供服务
高可用集群
下面我们就需要搭建一个多 master 节点的高可用集群,不会存在单点故障问题
但是在 node 和 master 节点之间,需要存在一个 LoadBalancer 组件,作用如下:
- 负载
- 检查 master 节点的状态
对外有一个统一的 VIP:虚拟 ip 来对外进行访问
高可用集群技术细节
高可用集群技术细节如下所示:
- keepalived:配置虚拟 ip,检查节点的状态
- haproxy:负载均衡服务【类似于 nginx】
- apiserver:
- controller:
- manager:
- scheduler:
高可用集群步骤
我们采用 2 个 master 节点,一个 node 节点来搭建高可用集群,下面给出了每个节点需要做的事情
初始化操作
我们需要在这三个节点上进行操作
1 | # 关闭防火墙 |
部署 keepAlived
下面我们需要在所有的 master 节点【master1 和 master2】上部署 keepAlive
安装相关包
1 | # 安装相关工具 |
配置 master 节点
添加 master1 的配置
1 | cat > /etc/keepalived/keepalived.conf <<EOF |
添加 master2 的配置
1 | cat > /etc/keepalived/keepalived.conf <<EOF |
启动和检查
在两台 master 节点都执行
1 | # 启动keepalived |
启动后查看 master 的网卡信息
1 | ip a s ens33 |
部署 haproxy
haproxy 主要做负载的作用,将我们的请求分担到不同的 node 节点上
安装
在两个 master 节点安装 haproxy
1 | # 安装haproxy |
启动后,我们查看对应的端口是否包含 16443
1 | netstat -tunlp | grep haproxy |
配置
两台 master 节点的配置均相同,配置中声明了后端代理的两个 master 节点服务器,指定了 haproxy 运行的端口为 16443 等,因此 16443 端口为集群的入口
1 | cat > /etc/haproxy/haproxy.cfg << EOF |
安装 Docker、Kubeadm、kubectl
所有节点安装 Docker/kubeadm/kubelet ,Kubernetes 默认 CRI(容器运行时)为 Docker,因此先安装 Docker
安装 Docker
首先配置一下 Docker 的阿里 yum 源
1 | cat >/etc/yum.repos.d/docker.repo<<EOF |
然后 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 节点】
创建 kubeadm 配置文件
在具有 vip 的 master 上进行初始化操作,这里为 master1
1 | # 创建文件夹 |
yaml 内容如下所示:
1 | apiServer: |
然后我们在 master1 节点执行
1 | kubeadm init --config kubeadm-config.yaml |
执行完成后,就会在拉取我们的进行了【需要等待…】
按照提示配置环境变量,使用 kubectl 工具
1 | # 执行下方命令 |
按照提示保存以下内容,一会要使用:
1 | kubeadm join master.k8s.io:16443 --token jv5z7n.3y1zi95p952y9p65 \ |
–control-plane : 只有在添加 master 节点的时候才有
查看集群状态
1 | # 查看集群状态 |
安装集群网络
从官方地址获取到 flannel 的 yaml,在 master1 上执行
1 | # 创建文件夹 |
安装 flannel 网络
1 | kubectl apply -f kube-flannel.yml |
检查
1 | kubectl get pods -n kube-system |
master2 节点加入集群
复制密钥及相关文件
从 master1 复制密钥及相关文件到 master2
1 | # ssh root@192.168.44.156 mkdir -p /etc/kubernetes/pki/etcd |
master2 加入集群
执行在 master1 上 init 后输出的 join 命令,需要带上参数--control-plane
表示把 master 控制节点加入集群
1 | kubeadm join master.k8s.io:16443 --token ckf7bs.30576l0okocepg8b --discovery-token-ca-cert-hash sha256:19afac8b11182f61073e254fb57b9f19ab4d798b70501036fc69ebef46094aba --control-plane |
检查状态
1 | kubectl get node |
加入 Kubernetes Node
在 node1 上执行
向集群添加新节点,执行在 kubeadm init 输出的 kubeadm join 命令:
1 | kubeadm join master.k8s.io:16443 --token ckf7bs.30576l0okocepg8b --discovery-token-ca-cert-hash sha256:19afac8b11182f61073e254fb57b9f19ab4d798b70501036fc69ebef46094aba |
集群网络重新安装,因为添加了新的 node 节点
检查状态
1 | kubectl get node |
测试 kubernetes 集群
在 Kubernetes 集群中创建一个 pod,验证是否正常运行:
1 | # 创建nginx deployment |
然后我们通过任何一个节点,都能够访问我们的 nginx 页面
发布时间: 2021-01-13
最后更新: 2024-06-24
本文标题: Kubernetes学习之搭建高可用集群
本文链接: https://blog-yilia.xiaojingge.com/posts/c7ce6db0.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可。转载请注明出处!
