基于Kubernetes v1.25.0和Docker部署高可用集群(01部分)

简介: 基于Kubernetes v1.25.0和Docker部署高可用集群(01部分)

k8s.jpg


作者设置:由于当前各个常用镜像站无法正常代理下载镜像,这篇实验中所用到的镜像建议先从网络下载获取再导入到私仓使用,

或私信后台回复:9521 获取~ ~

另外这份实验材料总结下来出奇的字数多,提示超出字数,所以这篇分为了3章来发布


目录描述

  • Kubernetes高可用集群部署架构要求说明
  • Kubeadm部署Kubernetes v1.25.0高可用集群(一部分)
  • Kubeadm部署Kubernetes v1.25.0高可用集群(二部分)
  • Kubeadm部署Kubernetes v1.25.0高可用集群(完结)


一、实验环境配置要求

该次实验中的Kubernetes集群部署将基于以下环境进行:

1. 主机配置:

  • 共5台主机,角色分工如下:
  • 每个主机2G内存以上,2核CPU以上
  • 操作系统: Ubuntu 20.04.4
  • Kubernetes:v1.25.0
  • Container Runtime: Docker CE 20.10.17
  • CRI:cri-dockerd v0.2.5

2. 网络环境:

  • 节点网络:192.168.157.0/24(自定义),节点地址分配如下:
  • Pod网络:10.244.0.0/16(默认)
  • Service网络:10.96.0.0/12(默认)
  • 架构展示如下:

3. 基于Kubeadm实现Kubernetes v1.25.0集群部署流程说明

官方说明

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/

使用 kubeadm ,能创建一个符合最佳实践的最小化 Kubernetes 集群。 事实上,你可以使用 kubeadm配置一个通过 Kubernetes 一致性测试的集群。 kubeadm 还支持其他集群生命周期功能, 例如启动引导令牌和集群升级。

  • Kubernetes集群API访问入口的高可用
  • 每个节点主机的初始环境准备
  • 在所有Master和Node节点都安装容器运行时,实际Kubernetes只使用其中的Containerd
  • 在所有Master和Node节点安装kubeadm 、kubelet、kubectl
  • 在所有节点安装和配置 cri-dockerd
  • 在第一个 master 节点运行 kubeadm init 初始化命令 ,并验证 master 节点状态
  • 在第一个 master 节点安装配置网络插件
  • 在其它master节点运行kubeadm join 命令加入到控制平面集群中
  • 在所有 node 节点使用 kubeadm join 命令加入集群
  • 创建 pod 并启动容器测试访问 ,并测试网络通信


二、Kubeadm部署Kubernetes v1.25.0高可用集群

1. 部署集群API访问入口的高可用

在192.168.157.101和192.168.157.102上执行操作,利用 HAProxy 实现 Kubeapi 服务的负载均衡

1.1 安装Hapaoxy

#修改内核参数
root@master1ha1:~# cat >> /etc/sysctl.conf <<EOF
net.ipv4.ip_nonlocal_bind = 1
EOF
root@master1ha1:~# sysctl -p
net.ipv4.ip_nonlocal_bind = 1
#安装配置haproxy
root@master1ha1:~# apt update 
root@master1ha1:~# apt -y install haproxy
#添加下面行参数
root@master1ha1:~# cat >> /etc/haproxy/haproxy.cfg <<EOF
listen stats
        mode http
        bind 0.0.0.0:8888
        stats enable
        log global
        stats uri /status
        stats auth admin:123456
listen kubernetes-api-6443
        bind 192.168.157.100:16443  #备注:IP写*,端口改9443
        mode tcp
        server master1ha1 192.168.157.101:6443 check inter 3s fall 3 rise 3
        server master2ha2 192.168.157.102:6443 check inter 3s fall 3 rise 3
        server master3harbor1 192.168.157.103:6443 check inter 3s fall 3 rise 3
EOF
#测试配置是否正确,并做重启配置生效
root@master1ha1:~# haproxy -f /etc/haproxy/haproxy.cfg -c
[WARNING] 169/064553 (1896) : parsing [/etc/haproxy/haproxy.cfg:23] : 'option httplog' not usable with proxy 'kubernetes-api-6443' (needs 'mode http'). Falling back to 'option tcplog'.
Configuration file is valid
root@master1ha1:~# systemctl restart haproxy
#检查服务vip和端口监听正常后,做服务开机自启
root@master1ha1:~# ss -ntl
State         Recv-Q        Send-Q                   Local Address:Port                 Peer Address:Port        Process        
LISTEN        0             4096                     127.0.0.53%lo:53                        0.0.0.0:*                          
LISTEN        0             128                            0.0.0.0:22                        0.0.0.0:*                          
LISTEN        0             4096                           0.0.0.0:8888                      0.0.0.0:*                          
LISTEN        0             128                          127.0.0.1:6010                      0.0.0.0:*                          
LISTEN        0             4096                   192.168.157.100:6443                      0.0.0.0:*                          
LISTEN        0             128                               [::]:22                           [::]:*                          
LISTEN        0             128                              [::1]:6010                         [::]:*                          
root@master1ha1:~# systemctl enable haproxy

1.2 安装 Keepalived

安装 keepalived 实现 HAProxy的高可用

root@master1ha1:~# apt update
root@master1ha1:~# apt -y install keepalived
root@master1ha1:~# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
  
global_defs {
   router_id ha1.org            #指定router_id,#在ha2上为ha2.org
}
vrrp_script check_haproxy {     #定义检测脚本
   script "/etc/keepalived/check_haproxy.sh"
   interval 1
   weight -30
   fall 3
   rise 2
   timeout 2
}
vrrp_instance VI_1 {
    state MASTER                        #另一台ha2为BACKUP
    interface ens33
    virtual_router_id 60                #指定虚拟路由器ID,ha1和ha2此值必须相同
    priority 100                        #在ha2上为80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456                #指定验证密码,ha1和ha2此值必须相同
    }
    virtual_ipaddress {
        192.168.157.100                 #指定VIP,ha1和ha2此值必须相同
    }
    track_script {
        check_haproxy            #调用上面定义的检测脚本
    }
}
#添加keepalived中的执行脚本并赋权,最后操作服务重启和设置开机自启
root@master1ha1:~# cat > /etc/keepalived/check_haproxy.sh <<EOF
#!/bin/bash
/usr/bin/killall -0 haproxy || systemctl restart haproxy
EOF
root@master1ha1:~# chmod a+x /etc/keepalived/check_haproxy.sh
root@master1ha1:~# systemctl restart keepalived
root@master1ha1:~# systemctl enable keepalived

补充:我是在5台节点初始化操作系统后,就把hosts解析写进去了,在 5台节点的/etc/hosts添加一下

root@master1ha1:~# vim /etc/hosts
127.0.0.1 localhost
127.0.1.1 master1_ha1 #这里记得更正为当前台的
# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.157.100 vip
192.168.157.101 master1ha1
192.168.157.102 master2ha2
192.168.157.103 master3harbor1
192.168.157.104 node1
192.168.157.105 node2

后面的测试需要在本机上进行,所以本机host解析也得加一下,我这里偷懒用了huo绒自带的修改工具,修改添加如下:

1.3 测试访问

经过上面的本机hosts配置过,就可以在浏览器上测试vip地址的访问验证,用户名密码是前面配置的 admin:123456

http://vip:8888/status

2. 所有的主机做初始化配置

2.1 配置ssh key验证

配置 ssh key 验证,做免密后,方便集群内同步文件

#生成key,实验环境,直接把回车敲到底
root@master1ha1:~# ssh-keygen 
#将id_rsa.pub文件同步到所有节点
root@master1ha1:~# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.157.101
root@master1ha1:~# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.157.102
root@master1ha1:~# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.157.103
root@master1ha1:~# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.157.104
root@master1ha1:~# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.157.105
#测试一下能否免密登录到其他4个节点
root@master1ha1:~# ssh root@192.168.157.102
root@master1ha1:~# ssh root@192.168.157.103
root@master1ha1:~# ssh root@192.168.157.104
root@master1ha1:~# ssh root@192.168.157.105

2.2 设置主机名和解析

上面已经配置过了

2.3 禁用 swap

swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
#或者
systemctl disable --now swap.img.swap
systemctl mask swap.target

2.4 配时间同步

#借助于chronyd服务(程序包名称chrony)设定各节点时间精确同步
apt -y install chrony
chronyc sources -v

2.5 禁用默认防火墙

#禁用默认配置的iptables防火墙服务
ufw disable
ufw status

2.6 内核参数调整(可选)

允许 iptables 检查桥接流量,若要显式加载此模块,需运行 sudo modprobe br_netfilter,通过运行lsmod | grep br_netfilter 来验证 br_netfilter 模块是否已加载.

sudo modprobe br_netfilter
lsmod | grep br_netfilter

为了让 Linux 节点的 iptables 能够正确查看桥接流量,请确认 sysctl 配置中的 net.bridge.bridge-nf-call-iptables 设置为 1。

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF
# 应用 sysctl 参数而不重新启动
sysctl --system

最后~欢迎关注我! @Linux学习的那些事儿

我的个人资源整理,满满都是干货:可按需访问领取

200T免费资料,持续发布中...

如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
6月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
1002 108
|
5月前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
2017 10
|
4月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
402 1
|
4月前
|
弹性计算 监控 调度
ACK One 注册集群云端节点池升级:IDC 集群一键接入云端 GPU 算力,接入效率提升 80%
ACK One注册集群节点池实现“一键接入”,免去手动编写脚本与GPU驱动安装,支持自动扩缩容与多场景调度,大幅提升K8s集群管理效率。
289 89
|
9月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
406 9
|
9月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
本文介绍如何利用阿里云的分布式云容器平台ACK One的多集群应用分发功能,结合云效CD能力,快速将单集群CD系统升级为多集群CD系统。通过增加分发策略(PropagationPolicy)和差异化策略(OverridePolicy),并修改单集群kubeconfig为舰队kubeconfig,可实现无损改造。该方案具备多地域多集群智能资源调度、重调度及故障迁移等能力,帮助用户提升业务效率与可靠性。
|
4月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
614 5
|
5月前
|
Kubernetes Devops Docker
Kubernetes 和 Docker Swarm:现代 DevOps 的理想容器编排工具
本指南深入解析 Kubernetes 与 Docker Swarm 两大主流容器编排工具,涵盖安装、架构、网络、监控等核心维度,助您根据团队能力与业务需求精准选型,把握云原生时代的技术主动权。
391 1
|
8月前
|
存储 Kubernetes 监控
Docker与Kubernetes集成挑战及方案
面对这些挑战,并不存在一键解决方案。如同搭建灌溉系统需要考虑多种因素,集成Docker与Kubernetes也需要深思熟虑的规划、相当的技术知识和不断的调试。只有这样,才能建立起一个稳定、健康、高效的Docker-Kubernetes生态,让你的应用像花园中的植物一样繁荣生长。
363 63

相关产品

  • 容器服务Kubernetes版