kubeasz 部署k8s 1.14.2多主集群

kubeasz github地址 https://github.com/easzlab/kubeasz

集群规划和基础参数设定

注意:请确保各节点时区设置一致、时间同步。如果你的环境没有提供NTP 时间同步,推荐集成安装chrony

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

  • 部署节点——x1 : 运行这份 ansible 脚本的节点
  • etcd节点——x3 : 注意etcd集群必须是1,3,5,7…奇数个节点
  • master节点—-x2 : 根据实际集群规模可以增加节点数,需要额外规划一个master VIP(虚地址)
  • lb节点——–x2 : 负载均衡节点两个,安装 haproxy+keepalived
  • node节点——x3 : 真正应用负载的节点,根据需要提升机器配置和增加节点数
部署节点etcd节点master节点lb节点node节点
192.168.9.148
192.168.9.149
192.168.9.150
192.168.9.177
192.168.9.178

系统环境

内存16G/硬盘1T

CentOS Linux release 7.4.1708

Docker version 17.03.2-ce

部署步骤

一切以root用户运行

1. 在每个节点安装依赖工具

1
2
3
4
5
# 文档中脚本默认均以root用户执行
# 安装 epel 源
[root@haifly-bj-dev-k8s-harbor ~]# yum install epel-release -y
# 安装python
[root@haifly-bj-dev-k8s-harbor ~]# yum install python -y

2. 在部署节点安装ansible

1
2
3
4
5
6
[root@haifly-bj-dev-k8s-harbor ~]# yum install git python-pip -y
# pip安装ansible(国内如果安装太慢可以直接用pip阿里云加速)
#pip install pip --upgrade
#pip install ansible
[root@haifly-bj-dev-k8s-harbor ~]# pip install pip --upgrade -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
[root@haifly-bj-dev-k8s-harbor ~]# pip install --no-cache-dir ansible -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

3. 部署节到各个节点的免秘钥登录

1
2
[root@haifly-bj-dev-k8s-harbor ~]# ssh-keygen -t rsa -b 2048 回车 回车 回车
[root@haifly-bj-dev-k8s-harbor ~]# ssh-copy-id $IPs #$IPs为所有节点地址包括自身,按照提示输入yes 和root密码

4. 在部署节点编排k8s安装

  • 4.1 下载项目源码(部署节点要避免和master节点重用)
1
2
3
4
5
# 方式一:使用git clone
[root@haifly-bj-dev-k8s-harbor ~]# git clone https://github.com/gjmzj/kubeasz.git
[root@haifly-bj-dev-k8s-harbor ~]# mkdir -p /etc/ansible
[root@haifly-bj-dev-k8s-harbor ~]# mv kubeasz/* /etc/ansible
# 方式二:从发布页面 https://github.com/gjmzj/kubeasz/releases 下载源码解压到同样目录
  • 4.2 下载二进制文件 请从分享的百度云链接,下载解压到/etc/ansible/bin目录,如果你有合适网络环境也可以按照/down/download.sh自行从官网下载各种tar包
1
2
[root@haifly-bj-dev-k8s-harbor ~]# tar zxvf k8s.1-14-2.tar.gz
[root@haifly-bj-dev-k8s-harbor ~]# mv bin/* /etc/ansible/bin
  • 4.3 配置集群参数
1
cd /etc/ansible && cp example/hosts.m-masters.example hosts

对文档的服务定义部分做修改(选用于物理服务器)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 变量 NTP_ENABLED (=yes/no) 设置集群是否安装 chrony 时间同步
[deploy]
192.168.0.158 NTP_ENABLED=yes

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

[kube-master]
192.168.0.158
192.168.0.159

# 负载均衡(目前已支持多于2节点,一般2节点就够了) 安装 haproxy+keepalived
[lb]
192.168.0.158 LB_IF="enp0s31f6" LB_ROLE=backup # 注意根据实际使用网卡设置 LB_IF变量
192.168.0.159 LB_IF="enp0s31f6" LB_ROLE=master

[kube-node]
192.168.0.160
192.168.0.161
192.168.0.162
  • 4.4 为了适配自己的集群,这里做以下修改

    docker修改:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    [root@haifly-bj-dev-k8s-master1 ansible]# vim roles/docker/templates/daemon.json.j2
    {
    "registry-mirrors": [
    "https://dockerhub.azk8s.cn",
    "https://docker.mirrors.ustc.edu.cn",
    "http://hub-mirror.c.163.com"
    ],
    "insecure-registries":["harbor.feiersmart.local","harbor.feiersmart.com"],
    "storage-driver": "overlay2",
    "storage-opts": [ "overlay2.override_kernel_check=true" ],
    "max-concurrent-downloads": 10,
    "log-driver": "{{ LOG_DRIVER }}",
    "log-level": "{{ LOG_LEVEL }}",
    "log-opts": {
    "max-size": "{{ LOG_MAX_SIZE }}",
    "max-file": "{{ LOG_MAX_FILE }}"
    },
    "data-root": "{{ STORAGE_DIR }}"
    {% if ENABLE_REMOTE_API %}
    , "hosts": ["tcp://0.0.0.0:2376", "unix:///var/run/docker.sock"]
    {% endif %}
    }

    这里增加了 insecure-registries 私有仓库地址,集群使用内网下载镜像,我测试了一下需要为harbor.feiersmart.com配置hosts地址,与harbor.feiersmart.local指向同一内网地址,harbor.feiersmart.local使用的内部DNS解析。

    storage-driver存储驱动改为 overlay2 ,虽然docker会根据系统自动选择合适的存储驱动,但用习惯了overlay2不想换成别的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [root@haifly-bj-dev-k8s-master1 ansible]# vim roles/docker/defaults/main.yml
    # docker日志相关

    LOG_DRIVER: "json-file"
    LOG_LEVEL: "warn"
    LOG_MAX_SIZE: "100m"
    LOG_MAX_FILE: 3

    # docker容器存储目录
    STORAGE_DIR: "/work/admin/docker"

    # 开启Restful API
    ENABLE_REMOTE_API: false

    LOG_MAX_SIZE docker容器日志大小改为100m

    STORAGE_DIR docker运行目录,我的系统默认会挂载200G数据盘到/work/目录下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [root@haifly-bj-dev-k8s-master1 ansible]# vim roles/docker/tasks/main.yml 

    # 配置 docker 命令软链接,方便单独安装 docker
    - name: 配置 docker 命令软链接
    file: src={{ bin_dir }}/docker dest=/usr/bin/docker state=link
    ignore_errors: true

    - name: 写harbor.feiersmart.com解析到hosts
    shell: "echo '192.168.9.150 harbor.feiersmart.com' >> /etc/hosts"
    tags: upgrade_docker
    when: "'kubeasz' not in install_info.stdout"

    最终参数(阿里云服务器)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    # 集群部署节点:一般为运行ansible 脚本的节点
    # 变量 NTP_ENABLED (=yes/no) 设置集群是否安装 chrony 时间同步, 公有云上虚机不需要
    [deploy]
    192.168.9.148 NTP_ENABLED=no

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

    [kube-master]
    192.168.9.148
    192.168.9.149

    [kube-node]
    192.168.9.177
    192.168.9.178

    # 参数 NEW_INSTALL:yes表示新建,no表示使用已有harbor服务器
    # 如果不使用域名,可以设置 HARBOR_DOMAIN=""
    [harbor]
    #192.168.9.150 HARBOR_DOMAIN="harbor.yourdomain.com" NEW_INSTALL=no

    [all:vars]
    # ---------集群主要参数---------------
    #集群部署模式:allinone, single-master, multi-master
    DEPLOY_MODE=multi-master

    # 公有云上一般都有提供负载均衡产品,且不允许自己创建lb
    # 创建公有云内网负载均衡,然后配置:前端监听 tcp 8443,后端 tcp 6443,后端节点即 master 节点
    MASTER_IP="192.168.9.148" # 即负载均衡内网地址
    KUBE_APISERVER="https://{{ MASTER_IP }}:6443"

    # 集群容器运行时,支持 docker, containerd
    CONTAINER_RUNTIME="docker"

    # 集群网络插件,目前支持calico, flannel, kube-router, cilium, kube-ovn
    CLUSTER_NETWORK="calico"

    # 服务网段 (Service CIDR),注意不要与内网已有网段冲突
    SERVICE_CIDR="10.1.0.0/16"

    # POD 网段 (Cluster CIDR),注意不要与内网已有网段冲突
    CLUSTER_CIDR="172.20.0.0/16"

    # 服务端口范围 (NodePort Range)
    NODE_PORT_RANGE="20000-40000"

    # kubernetes 服务 IP (预分配,一般是 SERVICE_CIDR 中第一个IP)
    CLUSTER_KUBERNETES_SVC_IP="10.1.0.1"

    # 集群 DNS 服务 IP (从 SERVICE_CIDR 中预分配)
    CLUSTER_DNS_SVC_IP="10.1.100.100"

    # 集群 DNS 域名
    CLUSTER_DNS_DOMAIN="cluster.local."

    # ---------附加参数--------------------
    #默认二进制文件目录
    bin_dir="/work/admin/kubernetes/bin"

    #证书目录
    ca_dir="/work/admin/kubernetes/ssl"

    #部署目录,即 ansible 工作目录,建议不要修改
    base_dir="/etc/ansible"

    阿里云服务器已不提供VIP功能,而SLB在被负载的服务器上访问会出现不通现象,这里高可用如何解决?

    我使用内部DNS解析加haproxy,两台master部署haproxy,dns优先解析master1

5. 开始安装

1
2
3
4
5
6
7
8
9
10
# 分步安装
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
# 一步安装
#ansible-playbook 90.setup.yml

easzctl 命令行介绍

为什么使用 easzctl

作为 kubeasz 项目的推荐命令行脚本,easzctl 十分轻量、简单;(后续会不断完善补充)

  • 命令集 1:集群层面操作
    • 切换/创建集群 context
    • 删除当前集群
    • 显示所有集群
    • 创建集群
    • 创建单机集群(类似 minikube)
  • 命令集 2:集群内部操作
    • 增加工作节点
    • 增加主节点
    • 增加 etcd 节点
    • 删除 etcd 节点
    • 删除任意节点
    • 升级集群
  • 命令集3:额外操作
    • 开启/关闭基础认证

集群 context 由 ansible hosts 配置、roles 配置等组成,用以区分不同的 k8s 集群,从而实现多集群的创建和管理;当然 easzctl 命令行不是必须的,你仍旧可以使用之前熟悉的方式安装/管理集群。

使用 easzctl 举例

  • 随时运行 easzctl help 获取命令行提示信息
  • 1.创建 context:准备集群名称(例如:test-cluster1),运行 easzctl checkout test-cluster1
    • 如果 context: test-cluster1 不存在,那么会根据 default 配置创建它;如果存在则切换当前 context 为 test-cluster1
  • 2.准备 context 以后,根据你的需要配置 ansible hosts 文件和其他配置,然后运行 easzctl setup
  • 3.安装成功后,运行 easzctl list 显示当前所有集群信息
  • 4.重复步骤 1/2 可以创建多个集群
  • 5.切换到某个集群 easzctl checkout xxxx,然后执行增加/删除
-------------本文结束感谢您的阅读-------------