阿里云部署高可用K8S集群

环境:

部署主集群

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
# 部署节点:运行这份 ansible 脚本的节点
[deploy]
10.102.54.42

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

[kube-master]
10.102.54.42 NODE_IP="10.102.54.42"
10.102.54.43 NODE_IP="10.102.54.43"
10.102.54.44 NODE_IP="10.102.54.44"

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

#确保node节点有变量NODE_ID=node1
[kube-node]
10.102.54.45 NODE_ID=node1 NODE_IP="10.102.54.45"
10.102.54.46 NODE_ID=node2 NODE_IP="10.102.54.46"
10.102.54.47 NODE_ID=node3 NODE_IP="10.102.54.47"

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

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

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

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

# 服务网段 (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="2000-8000"

# 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://10.102.54.42:2380,etcd2=https://10.102.54.43:2380,etcd3=https://10.102.54.44:2380"

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

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

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

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

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

#私有仓库 harbor服务器 (域名或者IP)
#需要把 harbor服务器证书复制到roles/harbor/files/harbor-ca.crt
HARBOR_SERVER="harbor.com"

部署addons

注意需要修改svc kubernetest-dashbord里的typenodeport,这样可以从集群外进行访问
dashbord的权限问题
采用了token认证的方式,首先建一个admin role,创建 admin 用户并赋予管理员权限

1
kubectl apply -f https://raw.githubusercontent.com/rootsongjc/kubernetes-handbook/master/manifests/dashboard-1.7.1/admin-role.yaml

创建完成后获取 secrettoken 的值

1
2
token=`kubectl -n kube-system get secret|grep admin-token | awk '{print $1}'`    
kubectl -n kube-system describe secret $token

获取到的token既可以用来登录
或者也可以用kubeconfig文件进行登录,位置是每台node机器上的/root/.kube/config

1
2
3
4
"log-driver": "gelf",
"log-opts": {
"gelf-address": "udp://10.102.54.11:12202"
},