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 | # 文档中脚本默认均以root用户执行 |
2. 在部署节点安装ansible
1 | [root@haifly-bj-dev-k8s-harbor ~]# yum install git python-pip -y |
3. 部署节到各个节点的免秘钥登录
1 | [root@haifly-bj-dev-k8s-harbor ~]# ssh-keygen -t rsa -b 2048 回车 回车 回车 |
4. 在部署节点编排k8s安装
- 4.1 下载项目源码(部署节点要避免和master节点重用)
1 | # 方式一:使用git clone |
- 4.2 下载二进制文件 请从分享的百度云链接,下载解压到/etc/ansible/bin目录,如果你有合适网络环境也可以按照/down/download.sh自行从官网下载各种tar包
1 | [root@haifly-bj-dev-k8s-harbor ~]# tar zxvf k8s.1-14-2.tar.gz |
- 4.3 配置集群参数
1 | cd /etc/ansible && cp example/hosts.m-masters.example hosts |
对文档的服务定义部分做修改(选用于物理服务器)
1 | # 变量 NTP_ENABLED (=yes/no) 设置集群是否安装 chrony 时间同步 |
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: falseLOG_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 | # 分步安装 |
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
,然后执行增加/删除