基于Kubenates的高可用Redis网站数据库后台搭建

实验过程

  • 从腾讯云租借3台服务器,搭建Kubenates网站数据库后台
  • 部署主从模式Redis数据库,并进行负载均衡和容灾实验

购买配置云服务器

  1. 购买并配置云服务实例

    • 在腾讯云上购买一个实例,确保实例的配置为4核CPU、8GB内存,操作系统选择Ubuntu 20.04。并在安全组中打开TCP: 80端口。
  2. 配置前置软件

1
2
sudo apt-get update
sudo apt-get install vim openssh-server
  1. 配置SSH以实现后续免密登录
1
2
ssh-keygen -t rsa -C"Jason"
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
  1. 创建镜像

对原实例创建镜像,用镜像创建三个新实例,masterslave1slave2

  1. 配置主机名和主机映射

在master、child1、child2实例上,分别配置主机名和主机映射,以便在网络中方便地识别和访问彼此。用内网IP,降低使用成本。

  • 配置主机映射(/etc/hosts:添加或确认主机IP与名称的映射关系。

    1
    sudo vim /etc/hosts
  • 配置主机名(/etc/hostname:设置或修改实例的主机名,使其更具标识性。

    1
    sudo vim /etc/hostname
image-20240402160949129

安装Docker

  1. 更新仓库

首先,需要更新系统,并安装一些必要的包,包括ca-certificatescurlgnupg。这些都是为了确保后续步骤中安全地添加Docker的官方GPG密钥和仓库。

1
2
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
  1. 添加Docker的官方GPG密钥

为了验证下载的软件包的真实性,需要添加Docker的官方GPG密钥到系统中。

1
2
3
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
  1. 将Docker仓库添加到Apt源

这一步骤是为了让Apt软件包管理器知道Docker的下载地址,并设置为从这个地址安装Docker。

1
2
3
4
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

接下来,再次更新Apt软件包列表,以确保Apt可以加载新添加的Docker仓库。

1
sudo apt-get update
image-20240409101440558
  1. 安装Docker

首先,检查可安装的Docker版本,然后选择一个特定版本安装。最后运行一个Hello World示例来验证Docker安装是否成功。

1
2
3
apt list -a docker-ce
sudo apt-get install docker-ce=5:19.03.10~3-0~ubuntu-focal
sudo docker run hello-world

配置K8s——容器管理平台

  1. 安装Kubernetes 1.18的三个组件

Kubernetes是一个开源平台,用于自动部署,扩展和管理容器化应用程序。以下步骤将安装Kubernetes的三个核心组件:kubeletkubeadmkubectl

首先,安装apt-transport-https以允许通过HTTPS使用apt仓库。

1
sudo apt-get install apt-transport-https
  1. 更换Kubernetes的Aliyun源

为了提高下载速度,我们将使用位于中国的阿里云作为Kubernetes的软件源。

1
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add - 

编辑/etc/apt/sources.list.d/kubernetes.list文件,添加阿里云的Kubernetes源。

1
sudo vim /etc/apt/sources.list.d/kubernetes.list

添加内容:deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main

然后更新Apt软件包列表,并安装指定版本的Kubernetes组件。

1
2
3
4
sudo apt-get update
apt-cache madison kubeadm
sudo apt-get install -y kubelet=1.18.0-00 kubeadm=1.18.0-00 kubectl=1.18.0-00
kubeadm version #查看k8s版本
image-20240409185442606

设置 Kubernetes 集群的主节点

  1. 在主节点上初始化集群:

    1
    2
    3
    sudo swapoff -a
    sudo kubeadm init --apiserver-advertise-address=<主节点IP地址> --image-repository registry.aliyuncs.com/google_containers --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
    sudo kubeadm init --apiserver-advertise-address=172.19.0.9 --image-repository registry.aliyuncs.com/google_containers --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16

    请将 <主节点IP地址> 替换为主节点的内网 IP 地址。

    image-20240409190753694
  2. 设置 kubectl 访问: 使其能够与Kubernetes集群交互。

    1
    2
    3
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
  3. 安装网络插件 (例如,使用 Flannel): 应用Flannel网络插件以便在Kubernetes集群中管理网络。

    1
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  4. 将工作节点加入集群

  • 关闭 swap 分区。

    1
    sudo swapoff -a
  • 在每个工作节点上,运行由 kubeadm init 命令在主节点上生成的加入命令,格式类似于:

    1
    sudo kubeadm join <主节点IP地址>:6443 --token <令牌> --discovery-token-ca-cert-hash sha256:<哈希>
  1. 在master查看节点情况

    1
    kubectl get nodes
    image-20240409202725781

配置Redis

在 Kubernetes 集群中部署 Redis 时,通常不需要在节点上手动下载 Redis 软件。相反,部署过程是通过 Kubernetes 配置文件(通常是 YAML 文件)来完成的,这些配置文件定义了应该从哪个容器镜像仓库拉取 Redis 容器镜像以及如何配置和运行这个容器。Kubernetes 会负责从指定的容器镜像仓库下载(拉取)镜像,并在集群的节点上运行它。

  1. 部署 Redis 到 Kubernetes 的基本步骤
  • 创建 Redis 示例目录:为了组织相关文件,创建了一个名为 redis-example 的目录。
1
2
mkdir redis-example
cd redis-example/
  • 创建并应用 Redis 领导者部署配置:编辑 redis-leader-deployment.yaml 文件来定义 Redis 领导者的部署,然后通过 kubectl apply 命令部署到集群中。
1
vim redis-leader-deployment.yaml
  • 创建并应用 Redis 领导者服务配置:定义 Redis 领导者服务以允许网络访问,再次使用 kubectl apply 命令应用配置。
1
vim redis-leader-service.yaml
  • 创建并应用 Redis 跟随者部署和服务配置:类似地,定义 Redis 跟随者的部署和服务,然后部署到集群。
1
2
vim redis-follower-deployment.yaml
vim redis-follower-service.yaml
  • 应用配置
    使用 kubectl 命令应用这些配置,部署 Redis 并创建服务。
1
2
3
4
kubectl apply -f redis-leader-deployment.yaml
kubectl apply -f redis-leader-service.yaml
kubectl apply -f redis-follower-deployment.yaml
kubectl apply -f redis-follower-service.yaml
  1. 验证部署
  • 查看 Pods:

    1
    kubectl get pods
    image-20240409203142191
  • 查看服务:

    1
    kubectl get services
image-20240409203205879

部署前端页面

  1. 创建Deployment配置文件

使用sudo vim frontend-deployment.yaml命令创建一个名为frontend-deployment.yaml的文件。这个文件定义了前端应用的部署(Deployment)配置,告诉Kubernetes如何创建和管理前端应用的副本。

  1. 创建Service配置文件

接下来,使用sudo vim frontend-service.yaml命令创建一个名为frontend-service.yaml的文件。这个文件定义了一个服务(Service),用于暴露前端应用到网络上。通过服务,其他应用或用户可以访问前端应用。

  1. 应用配置
1
2
kubectl apply -f frontend-deployment.yaml
kubectl apply -f frontend-service.yaml
  1. 验证部署

    image-20240409203453283 image-20240409203504993
  2. 登录

由于服务设置为 NodePort,Kubernetes 会在所有节点上为服务分配一个端口(nodePort),使得服务可以通过 <任意节点的IP>:<nodePort> 的形式被外部访问。所以可以使用集群中任一节点的IP地址加上指定的 nodePort 来访问前端服务。

image-20240409205016487
  1. 缩容

    1
    2
    kubectl scale deployment frontend --replicas=5
    kubectl delete pod frontend-769fbdbdcc-7zsbm
    image-20240409205347668

总结

随着应用用户的增长,系统需要稳定运行和快速响应用户需求。通过K8s,前端应用可以自动缩容以适应用户变化,通过K8s的负载均衡能力,可以将用户分配到健康的容器中。本次实验设置了一个master节点和两个slave节点,这样即使一个节点发生故障,其它结果也可用。

考虑到用户的高频访问需求,使用Redis可以减少对后端的Api的访问的直接调用以提高速度。Redis相当于一个缓冲层,当有新需求进来时,它首先检查缓存中是否有最近的数据,如果缓存中没有数据,应用则向后端服务请求最新数据,然后将结果存储在Redis中,以供后续请求使用。

通过将Docker、Kubernetes和Redis结合使用,就成功地构建了一个既强大又灵活的前端网页应用部署解决方案。