kubeasz/docs/setup/kubeasz_on_aws_cloud.md

5.7 KiB
Raw Permalink Blame History

AWS EC2 Amazon Linux 系统 kubernetes 集群高可用部署

文档中脚本默认均以 root 用户执行
Amazon Linux默认不能以root用户登录只能先登录到ec2-user,再通过sudo su - root切换root用户

高可用集群所需节点配置如下


角色 数量 IP 描述
deploy节点 1 172.31.16.81 运行这份 ansible 脚本的节点
etcd节点 3 172.31.9.100, 172.31.9.192, 172.31.11.185 注意etcd集群必须是1,3,5,7...奇数个节点
master节点 2 172.31.9.100, 172.31.9.192 共用etcd节点master VIP(虚地址)采用内部ELB域名代替可根据需要提升机器配置或增加节点数
node节点 2 172.31.11.185, 172.31.14.4 运行应用负载的节点,可根据需要提升机器配置或增加节点数

环境准备


创建 EC2 实例
  • 准备5台虚机搭建一个多主高可用集群Node 节点内存不低于 4GB
  • 生产环境一个节点只担任一个角色
  • 1个 deploy 节点 网段 172.31.16.0/20
  • 2个 master 节点 网段 172.31.0.0/20 ,建议采用 SSD 类型磁盘
  • 2个 node 节点 网段 172.31.0.0/20
  • 2个弹性IP、1个NAT网关其中1个弹性IP绑定到deploy节点、另1个绑定到NAT网关
  • master节点和node节点不分配公网IP仅通过NAT连接外网

注意:

  • master和node所在的子网需添加路由表到NAT网关, 否则无法连接到外网
  • NAT子网需与deploy节点相同因为最终都是通过同一个Internet网关访问外网在主路由表
创建 master ELB
  • 云负载均衡中创建 经典型内网ELB, 区域与 EC2 相同,取名为 k8s-master-lb,假定内网域名为 internal-k8s-master-lb-42488333.xxxx.elb.amazonaws.com
  • 创建 TCP 类型监听器,前端监听 8443 端口,转发后端 6443 端口
  • 绑定 master 节点到监听器子网选择master和node节点相同
创建 ingress ELB (收费类型 可在集群创建成功后操作)
  • 云负载均衡中创建 经典型外网ELB, 区域与 EC2 相同,取名为 k8s-ingress-lb
  • 创建 TCP 类型监听器,前端监听 80 端口,转发后端 23456 端口
  • 绑定 master和node 节点到监听器(这里也可以只负载到master或node)
  • 运行状态检查Ping协议: TCPPing端口: 23456
  • 如果想要访问traefik dashboard,需要再创建一个 TCP 类型监听器,前端后端都监听traefik admin暴露的nodePort端口
开启安全组
  • 集群节点间的安全组要所有协议都开放

部署步骤


0. 基础系统配置
  • 使用社区AMI amzn2-ami 安装系统
  • 配置SSH root免密登陆等
  • 下载kubernetes对应版本bin文件
1. 在deploy节点安装及准备ansible

pip 安装 ansible

yum install python-pip -y

# pip安装ansible
pip install pip --upgrade
pip install ansible

# pip安装ansible(国内如果安装太慢可以直接用pip阿里云加速)
pip install pip --upgrade -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
pip install --no-cache-dir ansible -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
2. 资源准备
  • 克隆源码

    git clone --depth=1 https://github.com/easzlab/kubeasz.git /etc/ansible
    
  • 下载 k8s 二进制文件 从分享的百度云链接,下载解压到 /etc/ansible/bin 目录

    # 以安装k8s v1-14-1为例
    tar -xvf k8s.1-14-1.tar.gz -C /etc/ansible/
    
3. 配置集群参数
cd /etc/ansible && cp example/hosts.cloud.example hosts

编辑此 hosts 文件

vi /etc/ansible/hosts

更新以下内容

[deploy]
172.31.16.81 NTP_ENABLED=yes

# etcd集群请提供如下NODE_NAME注意etcd集群必须是1,3,5,7...奇数个节点
[etcd]
172.31.9.100 NODE_NAME=etcd1
172.31.9.192 NODE_NAME=etcd2
172.31.11.185 NODE_NAME=etcd3

[kube-master]
172.31.9.100
172.31.9.192

[kube-node]
172.31.11.185
172.31.14.4

MASTER_IP="internal-k8s-master-lb-42488333.xxxx.elb.amazonaws.com"     # 即 master vip 负载均衡内网地址
5. 编排k8s安装

如果你对集群安装流程不熟悉,请阅读项目首页 安装步骤 讲解后分步安装,并对 每步都进行验证

验证 ansible 执行 正常能看到所有节点返回 SUCCESS

ansible all -m ping

执行安装

cd /etc/ansible
# 一步安装
ansible-playbook 90.setup.yml
# 分步安装
ansible-playbook 01.prepare.yml
ansible-playbook 02.etcd.yml
ansible-playbook 03.docker.yml
ansible-playbook 04.kube-master.yml
ansible-playbook 05.kube-node.yml
ansible-playbook 06.network.yml
ansible-playbook 07.cluster-addon.yml

# 把 k8s 集群 ca 证书加入本机信任列表
cp /etc/kubernetes/ssl/ca.pem /etc/pki/ca-trust/source/anchors/ && update-ca-trust

查看集群状态

kubectl cluster-info
kubectl get cs
kubectl get node
kubectl get pod,svc --all-namespaces -o wide
kubectl top node

ingress访问

可访问外部ELB自动分配的域名地址,正式环境可以将域名做个CNAME到该地址。
测试示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:alpine

---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
  - name: nginx-port
    port: 80
  selector:
    app: nginx

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx
spec:
  rules:
  - host: aws.xxxx.cn
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx
          servicePort: nginx-port