使用 KubeKey 在 AWS 高可用部署 Kubernetes

作者:李耀宗

介绍

对于生产环境,我们需要考虑 Kubernetes 集群的高可用性。本文教您部署如何在多台 AWS EC2 实例快速部署一套高可用的生产环境。要满足 Kubernetes 集群服务需要做到高可用,需要保证 kube-apiserver 的 HA ,可使用下列两种方式:

  • AWS ELB(推荐)
  • keepalived + haproxy 对 kube-apiserver 进行负载均衡,实现高可用 Kubernetes 集群。

本教程重点介绍配置 AWS ELB 服务高可用安装。

前提条件

  • 考虑到数据的持久性,对于生产环境,我们不建议您使用存储 OpenEBS,建议 NFS、GlusterFS、Ceph 等存储(需要提前准备)。文章为了进行开发和测试,集成了 OpenEBS 将 LocalPV 设置为默认的存储服务;
  • SSH 可以访问所有节点;
  • 所有节点的时间同步;
  • Red Hat 在其 Linux 发行版本中包括了 SELinux,建议关闭 SELinux 或者将 SELinux 的模式切换为 Permissive [宽容]工作模式。

准备主机

本示例创建 3 台 Ubuntu 18.04 server 64bit 的 EC2 云服务器,每台配置为 2 核 4 GB。

主机 IP主机名称角色
192.168.1.10master1master, node, etcd
192.168.1.11master2master, node, etcd
192.168.1.12master3master, node, etcd

注意:本教程仅作部署演示,在生产环境建议角色分离,单独部署 etcd 和 node 节点,提高稳定性。

创建 VPC

进入 AWS 控制台,在全部服务中选择 VPC,创建一个 VPC,配置如下图所示:

创建子网

为该 VPC 创建子网,配置如下图所示:

创建互联网网关

选择互联网网关,创建网关并绑定对应的 VPC:

配置路由表

配置 VPC 自动创建的路由表,增加一条 0.0.0.0/0 的路由:

创建安全组

配置 VPC 自动创建的默认安全组,设置如下入方向规则:

创建主机

在计算中选择 EC2,按如下配置创建三台 EC2 主机:

  • 选择镜像

  • 选择规格

  • 配置对应的 VPC 和子网

  • 配置对应安全组

  • EC2 主机创建成功后,将一台主机绑定一个弹性 IP 地址,用于远程终端连接:

创建负载均衡器

选择负载均衡-目标群组,创建负载均衡目标群组,并注册 EC2 主机的 6443 端口:

  • 创建 Network Load Balancer 类型的负载均衡器,并配置对应的 VPC 和子网:

  • 配置监听器监听 6443 端口并连接对应的目标群组:

查询负载均衡器的 IP 地址

选择网络接口,可以看到自动生成的 ELB 网络接口的公有 IP 地址和私有 IP 地址:

配置 AWS 服务器 SSH 密码登录

依次登录到每台服务器,重置 ubuntu 用户的密码:

sudo passwd ubuntu

修改 SSH 配置:

# 查找 PasswordAuthentication,将 PasswordAuthentication no 修改为: PasswordAuthentication yes
sudo vi /etc/ssh/sshd_config

重启 SSH 服务:

sudo systemctl restart sshd

获取 KubeKey 部署程序

Github Realese Page 下载 KubeKey 或直接使用以下命令:

curl -sfL https://get-kk.kubesphere.io | VERSION=v1.2.0 sh -

使用 KubeyKey 部署

在当前位置创建部署配置文件 config-HA.yaml:

./kk create config -f config-HA.yaml

集群配置调整

根据当前集群信息修改配置文件内容,有关更多信息,请参见多节点安装 Kubernetes 集群配置

apiVersion: kubekey.kubesphere.io/v1alpha1
kind: Cluster
metadata:
  name: sample
spec:
  hosts:
  - {name: master1, address: 192.168.0.10, internalAddress: 192.168.0.10, user: ubuntu, password: password}
  - {name: master2, address: 192.168.0.11, internalAddress: 192.168.0.11, user: ubuntu, password: password}
  - {name: master3, address: 192.168.0.12, internalAddress: 192.168.0.12, user: ubuntu, password: password}
  roleGroups:
    etcd:
    - master1
    - master2
    - master3
    master:
    - master1
    - master2
    - master3
    worker:
    - master1
    - master2
    - master3
  controlPlaneEndpoint:
    domain: lb.kubesphere.local
    address: "192.168.0.151"
    port: 6443
  kubernetes:
    version: v1.19.8
    imageRepo: kubesphere
    clusterName: cluster.local
  network:
    plugin: calico
    kubePodsCIDR: 10.233.64.0/18
    kubeServiceCIDR: 10.233.0.0/18
  registry:
    registryMirrors: []
    insecureRegistries: []
  addons: []

执行命令创建集群

./kk create cluster -f config-HA.yaml

KubeKey 可能会提示缺少 conntrack,可执行命令安装:sudo apt-get install conntrack

检查结果

可执行命令检查部署结果,主要可通过以下命令进行检查:

  1. kubectl get nodekubectl get po 两个命令返回的结果中 STATUS 的值为 Ready则表示集群部署成功且组件运行正常。
  2. kubectl get ep 命令返回的结果中 ENDPOINTS 包含所有控制平面即 master 节点的 IP 地址。
ubuntu@master1:~$ kubectl get node -owide
NAME      STATUS   ROLES           AGE     VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION   CONTAINER-RUNTIME
master1   Ready    master,worker   3m45s   v1.19.8   192.168.0.10   <none>        Ubuntu 18.04.5 LTS   5.4.0-1045-aws   docker://20.10.7
master2   Ready    master,worker   95s     v1.19.8   192.168.0.11   <none>        Ubuntu 18.04.5 LTS   5.4.0-1045-aws   docker://20.10.7
master3   Ready    master,worker   2m      v1.19.8   192.168.0.12   <none>        Ubuntu 18.04.5 LTS   5.4.0-1045-aws   docker://20.10.7

ubuntu@master1:~$ kubectl get po -A
NAMESPACE     NAME                                      READY   STATUS              RESTARTS   AGE
kube-system   calico-kube-controllers-8f59968d4-gchrc   1/1     Running             0          104s
kube-system   calico-node-c65wl                         1/1     Running             0          105s
kube-system   calico-node-kt4qd                         1/1     Running             0          105s
kube-system   calico-node-njxsh                         1/1     Running             0          105s
kube-system   coredns-86cfc99d74-ldx9b                  1/1     Running             0          3m59s
kube-system   coredns-86cfc99d74-pg5lj                  1/1     Running             0          3m59s
kube-system   kube-apiserver-master1                    1/1     Running             0          4m19s
kube-system   kube-apiserver-master2                    1/1     Running             0          115s
kube-system   kube-apiserver-master3                    1/1     Running             0          2m33s
kube-system   kube-controller-manager-master1           1/1     Running             0          4m19s
kube-system   kube-controller-manager-master2           1/1     Running             0          115s
kube-system   kube-controller-manager-master3           1/1     Running             0          2m34s
kube-system   kube-proxy-klths                          1/1     Running             0          2m12s
kube-system   kube-proxy-nm79t                          1/1     Running             0          3m59s
kube-system   kube-proxy-nsvmh                          1/1     Running             0          2m37s
kube-system   kube-scheduler-master1                    1/1     Running             0          4m19s
kube-system   kube-scheduler-master2                    1/1     Running             0          115s
kube-system   kube-scheduler-master3                    1/1     Running             0          2m34s
kube-system   nodelocaldns-nblsl                        1/1     Running             0          2m12s
kube-system   nodelocaldns-q78k4                        1/1     Running             0          3m54s
kube-system   nodelocaldns-q9244                        1/1     Running             0          2m37s

ubuntu@master1:~$ kubectl get ep
NAME         ENDPOINTS                                               AGE
kubernetes   192.168.0.10:6443,192.168.0.11:6443,192.168.0.12:6443   5m10s

本文由博客一文多发平台 OpenWrite 发布!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AWS高可用弹性架构是一种设计原则,旨在确保应用程序在发生故障或中断时仍能保持可靠的运行。高可用性是指系统连续工作时间的指标,弹性则是指系统对资源需求变化的适应能力。 AWS高可用弹性架构的关键要素包括: 1. 高可用性:采用多个可用区域(Availability Zones)部署应用程序,每个可用区域都是独立的数据中心,具备冗余的网络、电力和硬件设施。这样,在一个可用区域发生故障时,系统可以切换到另一个可用区域,保证应用的可用性。 2. 自动化扩展:利用自动化服务(如Auto Scaling),根据应用程序的负载情况动态调整所需的计算资源。当负载增加时,自动增加服务器数量,负载降低时则自动缩减服务器数量。这种弹性的资源调整能够确保应用程序具有稳定的性能,并避免资源浪费。 3. 数据备份与恢复:通过使用Amazon S3等存储服务,将数据备份至多个可用区域,并实施定期的备份策略。这样可以确保数据的安全性和完整性,并能够快速恢复应用程序的运行。 4. 负载均衡:利用Amazon Elastic Load Balancer等负载均衡服务,将流量分配至多个服务器上,实现负载的平衡,提高系统的吞吐量和可靠性。当某个服务器发生故障时,负载均衡服务会自动将新的请求转发至其他正常运行的服务器上。 5. 服务监控与告警:使用CloudWatch等监控服务,定期监控应用程序的运行状态和性能指标,并设置相应的告警机制。一旦检测到异常,系统会自动发送告警通知,使管理员能够及时采取措施,确保系统正常运行。 总之,AWS高可用弹性架构是一种依托于AWS云服务的设计原则,通过利用多个可用区域、自动化服务、数据备份与恢复、负载均衡以及监控与告警等技术手段,实现应用程序在故障或中断时的持续运行和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值