实验过程
- 从腾讯云租借3台服务器,搭建Kubenates网站数据库后台
- 部署主从模式Redis数据库,并进行负载均衡和容灾实验
购买配置云服务器
购买并配置云服务实例
- 在腾讯云上购买一个实例,确保实例的配置为4核CPU、8GB内存,操作系统选择Ubuntu 20.04。并在安全组中打开TCP: 80端口。
配置前置软件
1 | sudo apt-get update |
- 配置SSH以实现后续免密登录
1 | ssh-keygen -t rsa -C"Jason" |
- 创建镜像
对原实例创建镜像,用镜像创建三个新实例,master,slave1,slave2
- 配置主机名和主机映射
在master、child1、child2实例上,分别配置主机名和主机映射,以便在网络中方便地识别和访问彼此。用内网IP,降低使用成本。
配置主机映射(
/etc/hosts
):添加或确认主机IP与名称的映射关系。1
sudo vim /etc/hosts
配置主机名(
/etc/hostname
):设置或修改实例的主机名,使其更具标识性。1
sudo vim /etc/hostname
安装Docker
- 更新仓库
首先,需要更新系统,并安装一些必要的包,包括ca-certificates
,curl
,gnupg
。这些都是为了确保后续步骤中安全地添加Docker的官方GPG密钥和仓库。
1 | sudo apt-get update |
- 添加Docker的官方GPG密钥
为了验证下载的软件包的真实性,需要添加Docker的官方GPG密钥到系统中。
1 | sudo install -m 0755 -d /etc/apt/keyrings |
- 将Docker仓库添加到Apt源
这一步骤是为了让Apt软件包管理器知道Docker的下载地址,并设置为从这个地址安装Docker。
1 | echo \ |
接下来,再次更新Apt软件包列表,以确保Apt可以加载新添加的Docker仓库。
1 | sudo apt-get update |
- 安装Docker
首先,检查可安装的Docker版本,然后选择一个特定版本安装。最后运行一个Hello World示例来验证Docker安装是否成功。
1 | apt list -a docker-ce |
配置K8s——容器管理平台
- 安装Kubernetes 1.18的三个组件
Kubernetes是一个开源平台,用于自动部署,扩展和管理容器化应用程序。以下步骤将安装Kubernetes的三个核心组件:kubelet
,kubeadm
,kubectl
。
首先,安装apt-transport-https
以允许通过HTTPS使用apt仓库。
1 | sudo apt-get install apt-transport-https |
- 更换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 | sudo apt-get update |
设置 Kubernetes 集群的主节点
在主节点上初始化集群:
1
2
3sudo 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 地址。设置 kubectl 访问: 使其能够与Kubernetes集群交互。
1
2
3mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config安装网络插件 (例如,使用 Flannel): 应用Flannel网络插件以便在Kubernetes集群中管理网络。
1
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
将工作节点加入集群
关闭 swap 分区。
1
sudo swapoff -a
在每个工作节点上,运行由
kubeadm init
命令在主节点上生成的加入命令,格式类似于:1
sudo kubeadm join <主节点IP地址>:6443 --token <令牌> --discovery-token-ca-cert-hash sha256:<哈希>
在master查看节点情况
1
kubectl get nodes
配置Redis
在 Kubernetes 集群中部署 Redis 时,通常不需要在节点上手动下载 Redis 软件。相反,部署过程是通过 Kubernetes 配置文件(通常是 YAML 文件)来完成的,这些配置文件定义了应该从哪个容器镜像仓库拉取 Redis 容器镜像以及如何配置和运行这个容器。Kubernetes 会负责从指定的容器镜像仓库下载(拉取)镜像,并在集群的节点上运行它。
- 部署 Redis 到 Kubernetes 的基本步骤
- 创建 Redis 示例目录:为了组织相关文件,创建了一个名为
redis-example
的目录。
1 | mkdir 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 | vim redis-follower-deployment.yaml |
- 应用配置:
使用kubectl
命令应用这些配置,部署 Redis 并创建服务。
1 | kubectl apply -f redis-leader-deployment.yaml |
- 验证部署
查看 Pods:
1
kubectl get pods
查看服务:
1
kubectl get services
部署前端页面
- 创建Deployment配置文件
使用sudo vim frontend-deployment.yaml
命令创建一个名为frontend-deployment.yaml
的文件。这个文件定义了前端应用的部署(Deployment)配置,告诉Kubernetes如何创建和管理前端应用的副本。
- 创建Service配置文件
接下来,使用sudo vim frontend-service.yaml
命令创建一个名为frontend-service.yaml
的文件。这个文件定义了一个服务(Service),用于暴露前端应用到网络上。通过服务,其他应用或用户可以访问前端应用。
- 应用配置
1 | kubectl apply -f frontend-deployment.yaml |
验证部署
登录
由于服务设置为 NodePort
,Kubernetes 会在所有节点上为服务分配一个端口(nodePort
),使得服务可以通过 <任意节点的IP>:<nodePort>
的形式被外部访问。所以可以使用集群中任一节点的IP地址加上指定的 nodePort
来访问前端服务。
缩容
1
2kubectl scale deployment frontend --replicas=5
kubectl delete pod frontend-769fbdbdcc-7zsbm
总结
随着应用用户的增长,系统需要稳定运行和快速响应用户需求。通过K8s,前端应用可以自动缩容以适应用户变化,通过K8s的负载均衡能力,可以将用户分配到健康的容器中。本次实验设置了一个master节点和两个slave节点,这样即使一个节点发生故障,其它结果也可用。
考虑到用户的高频访问需求,使用Redis可以减少对后端的Api的访问的直接调用以提高速度。Redis相当于一个缓冲层,当有新需求进来时,它首先检查缓存中是否有最近的数据,如果缓存中没有数据,应用则向后端服务请求最新数据,然后将结果存储在Redis中,以供后续请求使用。
通过将Docker、Kubernetes和Redis结合使用,就成功地构建了一个既强大又灵活的前端网页应用部署解决方案。