离线本地测试环境资源计划说明:

hostname IP 配置 系统版本 角色
aly8-hn1-k8s-master-001 Centos7.4 master节点&etcd集群
aly8-hn1-k8s-master-002 Centos7.4 master节点&etcd集群
aly8-hn1-k8s-master-003 Centos7.4 master节点&etcd集群
aly8-hn1-ops-001 Centos7.4 ansible部署节点
Aly8-hn1-k8s-node-001 Centos7.4 node节点

各节点安装python

1
2
3
4
5
6
# 文档中脚本默认均以root用户执行
# 安装 epel 源并更新
yum install epel-release -y
yum update
# 安装python
yum install python -y

在deploy节点安装及准备ansible

1
2
3
4
5
6
yum install git python-pip -y
# 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
# pip install pip --upgrade
# pip install ansible

在deploy节点配置免密码登陆

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

kubeasz配置

下载源码解压到同样目录

1
2
3
4
git clone https://github.com/gjmzj/kubeasz.git
mkdir -p /etc/ansible
mv kubeasz/* /etc/ansible
tar xf /root/k8sfile/k8s.1-13-2.tar.gz -C /etc/ansible/

配置集群参数

1
2
3
cd /etc/ansible
cp example/hosts.m-masters.example hosts
vim hosts # 根据实际情况修改此hosts文件

Hosts配置文件:

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# 集群部署节点:一般为运行ansible 脚本的节点
# 变量 NTP_ENABLED (=yes/no) 设置集群是否安装 chrony 时间同步
[deploy]
10.1.2.66 NTP_ENABLED=no

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

[kube-master]
10.1.2.30
10.1.2.1
10.1.2.2

# 负载均衡(目前已支持多于2节点,一般2节点就够了) 安装 haproxy+keepalived
[lb]
10.1.2.30 LB_ROLE=master
10.1.2.1 LB_ROLE=backup

[kube-node]
10.1.2.67

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

# 预留组,后续添加master节点使用
[new-master]
#192.168.1.5

# 预留组,后续添加node节点使用
[new-node]
#192.168.1.xx

#【可选】外部负载均衡,用于自有环境负载转发 NodePort 暴露的服务等
[ex-lb]
#192.168.1.6 LB_ROLE=backup EX_VIP=10.1.2.150
#192.168.1.7 LB_ROLE=master EX_VIP=10.1.2.150

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

#集群主版本号,目前支持: v1.8, v1.9, v1.10,v1.11, v1.12, v1.13
K8S_VER="v1.13"

# 集群 MASTER IP即 LB节点VIP地址,为区别与默认apiserver端口,设置VIP监听的服务端口8443
# 公有云上请使用云负载均衡内网地址和监听端口
MASTER_IP="10.1.2.166"
KUBE_APISERVER="https://{{ MASTER_IP }}:8443"

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

# 服务网段 (Service CIDR),注意不要与内网已有网段冲突
SERVICE_CIDR="10.68.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.68.0.1"

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

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

# 集群basic auth 使用的用户名和密码
BASIC_AUTH_USER="admin"
BASIC_AUTH_PASS="test1234"

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

#证书目录
ca_dir="/etc/kubernetes/ssl"

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

测试节点主机可达

1
ansible all -m ping

Deploy

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

验证集群功能

查看集群状态

1
2
3
4
kubectl get node
kubectl cluster-info
kubectl top node
kubectl get ep --all-namespaces -o yaml

创建测试文件

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
cat > nginx-ds.yml <<EOF
apiVersion: v1
kind: Service
metadata:
name: nginx-ds
labels:
app: nginx-ds
spec:
type: NodePort
selector:
app: nginx-ds
ports:
- name: http
port: 80
targetPort: 80
---
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: nginx-ds
labels:
addonmanager.kubernetes.io/mode: Reconcile
spec:
template:
metadata:
labels:
app: nginx-ds
spec:
containers:
- name: my-nginx
image: nginx:1.7.9
ports:
- containerPort: 80
EOF

kubectl create -f nginx-ds.yml

kubectl get pods -o wide|grep nginx-ds
kubectl get svc -o wide|grep nginx-ds

# 检查nodeport可用性
curl node节点ip:svc端口
# 出现nginx欢迎页

验证coredns

1
2
3
4
kubectl exec  -it nginx-ds-8sd6z /bin/bash
cat /etc/resolv.conf
ping nginx-ds
# 能成功解析服务到ip证明dns正常

验证dashboard

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
# kube-apiserver 访问 dashboard
kubectl cluster-info
# 也可以通过nodeport 访问
kubectl get svc -n kube-system

# 创建登录 Dashboard 的 token 和 kubeconfig 配置文件
# 上面提到,Dashboard 默认只支持 token 认证,所以如果使用 KubeConfig 文件,需要在该文件中指定 token,不支持使用 client 证书认证。

# 创建登录 token
kubectl create sa dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
ADMIN_SECRET=$(kubectl get secrets -n kube-system | grep dashboard-admin | awk '{print $1}')
DASHBOARD_LOGIN_TOKEN=$(kubectl describe secret -n kube-system ${ADMIN_SECRET} | grep -E '^token' | awk '{print $2}')
echo ${DASHBOARD_LOGIN_TOKEN}

# 创建使用 token 的 KubeConfig 文件
# 设置集群参数
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=https://172.16.68.14:8443 \
--kubeconfig=dashboard.kubeconfig

# 设置客户端认证参数,使用上面创建的 Token
kubectl config set-credentials dashboard_user \
--token=${DASHBOARD_LOGIN_TOKEN} \
--kubeconfig=dashboard.kubeconfig

# 设置上下文参数
kubectl config set-context default \
--cluster=kubernetes \
--user=dashboard_user \
--kubeconfig=dashboard.kubeconfig

# 设置默认上下文
kubectl config use-context default --kubeconfig=dashboard.kubeconfig

自定义修改

04.kube-master.yml # 去除了roles kube-node

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# to set up 'kube-master' nodes
- hosts: kube-master
roles:
- kube-master
tasks:
- name: Making master nodes SchedulingDisabled
shell: "{{ bin_dir }}/kubectl cordon {{ inventory_hostname }} "
delegate_to: "{{ groups.deploy[0] }}"
when: DEPLOY_MODE != "allinone"
ignore_errors: true

- name: Setting master role name
shell: "{{ bin_dir }}/kubectl label node {{ inventory_hostname }} kubernetes.io/role=master --overwrite"
ignore_errors: true
delegate_to: "{{ groups.deploy[0] }}"

公有云部署k8s集群hosts模板

hosts.m-masters.example

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# 部署节点:运行这份 ansible 脚本的节点
[deploy]
192.168.1.1

# etcd集群请提供如下NODE_NAME、NODE_IP变量
# 请注意etcd集群必须是1,3,5,7...奇数个节点
[etcd]
192.168.1.1 NODE_NAME=etcd1 NODE_IP="192.168.1.1"
192.168.1.2 NODE_NAME=etcd2 NODE_IP="192.168.1.2"
192.168.1.3 NODE_NAME=etcd3 NODE_IP="192.168.1.3"

[kube-master]
192.168.1.1 NODE_IP="192.168.1.1"
192.168.1.2 NODE_IP="192.168.1.2"

# 负载均衡至少两个节点,安装 haproxy+keepalived
# 根据master节点数量同步修改roles/lb/templates/haproxy.cfg.j2
[lb]
192.168.1.1 LB_IF="eth0" LB_ROLE=backup
192.168.1.2 LB_IF="eth0" LB_ROLE=master
[lb:vars]
LB_EP1="192.168.1.1:6443" # api-server 实际成员地址端口
LB_EP2="192.168.1.2:6443" # api-server 实际成员地址端口
MASTER_IP="192.168.1.10" # api-server 虚地址
MASTER_PORT="8443" # api-server 服务端口

#确保node节点有变量NODE_ID=node1
[kube-node]
192.168.1.2 NODE_ID=node1 NODE_IP="192.168.1.2"
192.168.1.3 NODE_ID=node2 NODE_IP="192.168.1.3"
192.168.1.4 NODE_ID=node3 NODE_IP="192.168.1.4"

[kube-cluster:children]
kube-node
kube-master

# 如果启用harbor,请配置后面harbor相关参数
[harbor]
#192.168.1.8 NODE_IP="192.168.1.8"

# 预留组,后续添加node节点使用
[new-node]
#192.168.1.xx NODE_ID=node6 NODE_IP="192.168.1.xx"
#192.168.1.xx NODE_ID=node7 NODE_IP="192.168.1.xx"

[all:vars]
# ---------集群主要参数---------------
#集群 MASTER IP, 需要负载均衡,一般为VIP地址
MASTER_IP="192.168.1.10"
KUBE_APISERVER="https://192.168.1.10:8443"

#pause镜像地址
POD_INFRA_CONTAINER_IMAGE=mirrorgooglecontainers/pause-amd64:3.0

#TLS Bootstrapping 使用的 Token,使用 head -c 16 /dev/urandom | od -An -t x | tr -d ' ' 生成
BOOTSTRAP_TOKEN="c30302226d4b810e08731702d3890f50"

# 集群网络插件,目前支持calico和flannel
CLUSTER_NETWORK="calico"

# 部分calico相关配置,更全配置可以去roles/calico/templates/calico.yaml.j2自定义
# 设置 CALICO_IPV4POOL_IPIP=“off”,可以提高网络性能,条件限制详见 05.安装calico网络组件.md
CALICO_IPV4POOL_IPIP="always"
# 设置 calico-node使用的host IP,bgp邻居通过该地址建立,可手动指定端口"interface=eth0"或使用如下自动发现
IP_AUTODETECTION_METHOD="can-reach=223.5.5.5"

# 部分flannel配置,详见roles/flannel/templates/kube-flannel.yaml.j2
FLANNEL_BACKEND="vxlan"

# 服务网段 (Service CIDR),部署前路由不可达,部署后集群内使用 IP:Port 可达
SERVICE_CIDR="10.68.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.68.0.1"

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

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

# etcd 集群间通信的IP和端口, **根据实际 etcd 集群成员设置**
ETCD_NODES="etcd1=https://192.168.1.1:2380,etcd2=https://192.168.1.2:2380,etcd3=https://192.168.1.3:2380"

# etcd 集群服务地址列表, **根据实际 etcd 集群成员设置**
ETCD_ENDPOINTS="https://192.168.1.1:2379,https://192.168.1.2:2379,https://192.168.1.3:2379"

# 集群basic auth 使用的用户名和密码
BASIC_AUTH_USER="admin"
BASIC_AUTH_PASS="test1234"

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

#证书目录
ca_dir="/etc/kubernetes/ssl"

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

#私有仓库 harbor服务器 (域名或者IP)
#HARBOR_IP="192.168.1.8"
#HARBOR_DOMAIN="harbor.yourdomain.com"

公有云deploy文件

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
# 在deploy节点生成CA相关证书,以供整个集群使用
# 以及初始化kubedns.yaml配置文件
- hosts: deploy
roles:
- deploy

# 集群节点的公共配置任务
- hosts:
- kube-cluster
- deploy
- etcd
- lb
roles:
- prepare

# [可选]多master部署时的负载均衡配置
- hosts: lb
roles:
- lb

# 创建etcd集群
- hosts: etcd
roles:
- etcd

# kubectl 客户端配置
- hosts:
- kube-cluster
- deploy
roles:
- kubectl

# docker服务安装
- hosts: kube-cluster
roles:
- docker

# master 节点部署
- hosts: kube-master
roles:
- kube-master

# node 节点部署
- hosts: kube-node
roles:
- kube-node

# 集群网络插件部署,只能选择一种安装
- hosts: kube-cluster
roles:
- { role: calico, when: "CLUSTER_NETWORK == 'calico'" }
- { role: flannel, when: "CLUSTER_NETWORK == 'flannel'" }

参考资料