如何在AWS中正确使用Keepalived


虚拟IP(VIP)是一种网络模式,它允许管理员快速将IP地址从一台服务器移动到另一台服务器,而几乎不会停机,也称为浮动IP,如果手动切换服务器的速度超过DNS 的TTL时,最好配上keepalived。

在私有环境中部署keepalived本身并没有好说的,但是aws中存在诸多限制,其中三个需要明确指出的:
1. VRRP协议的组播被禁止,也就是说keepalived需要调整心跳的通知方式,修改/etc/keepalived/keepalived.conf配置文件中的通知为单播模式,一般配web 服务器上数量较少,所以也不会损失太多网络带宽。
2. 配置了VIP(floating ip)以后,AWS的VPC并不知道,尝试下arp也学习不到该vip的mac地址,所以必须要通过配置ENI(Elastic Network Interface弹性网络接口)使得该VIP可达。
3. 然而当你关了Master以后,ENI的网络配置并不会自动切换漂移IP,为了故障切换,我利用切换VIP的通知机制,通过调用添加和移除private-ip-addresses的方式达到漂移IP的效果。下面详细介绍。


1. 准备

  • IAM 账户
    进入控制台/服务/IAM中去创建一个账号,然后创建一个系统管理员的组,把这个账号加入到组中,这个过程中会得到Access Key ID和Secret Access Key。在服务器上运行aws configure,填入Access Key ID和Secret Access Key(其中Access Key ID是用于集群查Secret Access Key的一个key,而Secret Access Key用作客户端数据的加密和服务端数据的解密)还有region就完成注册了。
    region是指你服务器所在的区域,比如us-east-2。同时脚本还需要安装jq, aws cli。在部署keepalived的节点上安装下:
    apt install jq
    apt install aws cli

  • 添加/移除IP的脚本
    assign_private_ip.sh

#!/bin/bash

###### ###### ###### ###### ###### ###### ###### ######
# Description:
#
# attaches an IP of your choice to the primary NIC
# an instance you specify
#
# Setup:
#
# You need, at a minimum, the following permissions:
# {
#  "Statement": [
#    {
#      "Action": [
#        "ec2:AssignPrivateIpAddresses",
#        "ec2:DescribeInstances"
#      ],
#      "Effect": "Allow",
#      "Resource": "*"
#    }
#  ]
# }
#
# Usage:
#
# ./assign_private_ip.sh ip_address instance_id
#
# Example:
# ./assign_private_ip.sh '10.0.3.15' 'i-100ffabd'
#
###### ###### ###### ###### ###### ###### ###### ######


# http://www.davidpashley.com/articles/writing-robust-shell-scripts/
set -o errexit
set -o nounset

IP=$1
INSTANCE_ID=$2

ENI=$(\
  aws ec2 describe-instances \
  --instance-ids $INSTANCE_ID | \
  jq -r \
  '.Reservations[0].Instances[0].NetworkInterfaces[0].NetworkInterfaceId' \
)

echo "Adding IP $IP to ENI $ENI"

aws ec2 assign-private-ip-addresses \
  --network-interface-id $ENI \
  --private-ip-addresses $IP \
  --allow-reassignment

unassign_private_ip.sh

#!/bin/bash

###### ###### ###### ###### ###### ###### ###### ######
# Description:
#
# attaches an IP of your choice to the primary NIC
# an instance you specify
#
# Setup:
#
# You need, at a minimum, the following permissions:
# {
#  "Statement": [
#    {
#      "Action": [
#        "ec2:AssignPrivateIpAddresses",
#        "ec2:DescribeInstances"
#      ],
#      "Effect": "Allow",
#      "Resource": "*"
#    }
#  ]
# }
#
# Usage:
#
# ./unassign_private_ip.sh ip_address instance_id
#
# Example:
# ./unassign_private_ip.sh '10.0.3.15' 'i-100ffabd'
#
###### ###### ###### ###### ###### ###### ###### ######


# http://www.davidpashley.com/articles/writing-robust-shell-scripts/
set -o errexit
set -o nounset

IP=$1
INSTANCE_ID=$2

ENI=$(\
  aws ec2 describe-instances \
  --instance-ids $INSTANCE_ID | \
  jq -r \
  '.Reservations[0].Instances[0].NetworkInterfaces[0].NetworkInterfaceId' \
)

echo "Removing IP $IP from ENI $ENI"

aws ec2 unassign-private-ip-addresses \
  --network-interface-id $ENI \
  --private-ip-addresses $IP
  • 安装/配置keepalived

    /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
 router_id LVS_DEVEL
}

vrrp_script check_apiserver {
 script "/etc/keepalived/check_apiserver.sh"
 interval 3
 weight -2
 fall 10
 rise 2
}

vrrp_instance VI_1 {
   state MASTER
   notify_master "/root/assign_private_ip.sh 172.31.40.156 i-04257c267fb6923f7"
   notify_backup "/root/unassign_private_ip.sh 172.31.40.156 i-04257c267fb6923f7"
   unicast_src_ip 172.31.40.155
   unicast_peer {
    172.31.38.87
   }
   interface eth0
   virtual_router_id 51
   priority 101
   authentication {
       auth_type PASS
       auth_pass 4be37dc3b4c90194d1600c483e10ad1d
   }
   virtual_ipaddress {
      172.31.40.156
   }
   track_script {
       check_apiserver
   }
}

其他节点类似。只是state,改为backup就好了,backup节点的优先级改为100,下面对掉下:
unicast_src_ip 172.31.40.155
unicast_peer {
172.31.38.87
}

现在验证下,systemctl stop keepalived.service。发现vip发生了漂移,并且集群内可达。


参考1
参考2

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是在 AWS EC2 实例使用 Terraform 部署 Nginx 的步骤: 1. 在 AWS 控制台创建一个 IAM 用户,并为该用户授权 AWS 访问密钥和安全凭证。 2. 安装 Terraform,并配置 AWS 访问密钥和安全凭证: ``` $ terraform init $ export AWS_ACCESS_KEY_ID="your_access_key_here" $ export AWS_SECRET_ACCESS_KEY="your_secret_key_here" ``` 3. 创建一个 Terraform 项目,并在 main.tf 文件定义以下资源: ``` provider "aws" { region = "us-west-2" } resource "aws_instance" "nginx" { ami = "ami-0c55b159cbfafe1f0" instance_type = "t2.micro" tags = { Name = "nginx-server" } provisioner "remote-exec" { inline = [ "sudo apt-get update", "sudo apt-get install -y nginx", ] } connection { type = "ssh" user = "ubuntu" private_key = file("~/.ssh/id_rsa") host = aws_instance.nginx.public_ip } lifecycle { create_before_destroy = true } # Allow HTTP traffic ingress { from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } # Allow SSH traffic ingress { from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } # Allow HTTPS traffic ingress { from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } # Allow ICMP traffic ingress { from_port = -1 to_port = -1 protocol = "icmp" cidr_blocks = ["0.0.0.0/0"] } } ``` 上述代码定义了一个 AWS EC2 实例和一些安全组规则,以允许 HTTP、SSH、HTTPS 和 ICMP 流量通过。还在 provisioner 部分安装了 Nginx。 4. 运行 Terraform 命令创建实例: ``` $ terraform apply ``` 5. 在浏览器输入实例 IP 地址,应该可以看到 Nginx 的欢迎页面。 现在,您已经成功在 AWS EC2 实例部署了 Nginx,而且使用 Terraform 进行自动化管理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值