安装方式介绍

  • 目前创建K8S集群的安装程序最受欢迎的有Kops,Kubespray,kubeadm,rancher,以及提供的脚本集等。
  • 网页快捷安装推荐使用 rancher
  • ansible 脚本学习安装 推荐使用 kubeasz (这里我用的是ubuntu-1804)

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

master:三台(实验环境和etcd部署在同一台服务器上)
ectd :三台 (生产环境建议分开)
haproxy结合keepalived:一台(高可用方案可以做两台主从)
harbor:一台 (高可用方案可以做两台主从)
  • 首先所有主机名添加解析,修改主机名(k8s中主机名必须是不同的)

    root@ubuntu1804:# hostnamectl set-hostname k8s-master1.example.com
    root@ubuntu1804:
    # hostnamectl set-hostname k8s-node1.example.com
    root@ubuntu1804:~# hostnamectl set-hostname k8s-harbor1.example.com
    echo “127.0.1.1 k8s-master1.example.com” >> /etc/hosts
    echo “127.0.1.1 k8s-node1.example.com” >> /etc/hosts

  • 添加源 安装需要下载一些基础服务

    如果下载失败就更换阿里云 或者别的源

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multivers
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
    




## keepalived配置

首先我们把负载均衡安装好,如果是两台的话机器配置一样 (keepalived和haproxy只需要两台作为高可用)
1 root@k8s-ha1:~# apt install keepalived haproxy -y
root@k8s-ha1:~# systemctl start keepalived.service haproxy.service && systemctl enable --now keepalived.service haproxy.service
root@k8s-ha1:~# cp /usr/share/doc/keepalived/samples/keepalived.conf.vrrp /etc/keepalived/keepalived.conf

## Haproxy配置

k8s默认端口是6443
root@k8s-ha1:~# ss -ntl'grep 6443
root@k8s-ha1:~# scp /etc/haproxy/haproxy.cfg 10.0.0.84:/etc/haproxy/

- 最好两台haproxy都进行以下优化
默认没有VIP的 haproxy无法启动 ,是因为无法绑定没有的IP,需要添加参数,修改为 1 就可以
root@k8s-ha2:~# sysctl -a'grep "nonlocal_bind"

echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf #绑定不存在的虚拟IP
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf #开启路由转发
-生效参数 root@k8s-ha2:~# sysctl -p
这个时候就可以重启服务 systemctl restart haproxy.service

## harbor安装

安装docker和docker-compos,可以直接二进制安装 或者gitlab上面搜索,然后解压harbor
#tar xvf harbor-offline-installer-v2.2.3.tgz
#cp harbor.yml.tmpl harbor.yml
然后编辑harbor配置文件,不想走证书就注释https,修改密码等就可以安装harbor
#./install.sh --with-trivy

# k8s集群部署准备

> 基础环境准备进入www.github.com搜索 (kubeasz)里面有教程
> 基于ansibale部署k8s harbor用于我们的镜像分发,到公司做一些服务部署的时候最好是画一个图,方便日后我们观看 . 首先k8s会访问我们的keepalived 然后在把 请求转发给Apiserver,然后再由Api把请求转发到etcd里面

**集群规划和基础参数设定**

* 注意1:确保各个节点的时间是一致的,推荐chrony
* 注意2:确保在干净的系统上开始安装,不要使用曾经装过kubeadm或其他k8s发行版的环境
* 注意3:建议操作系统升级到新的稳定内核 ,1804以下需要升级
- **在部署节点安装ansible及准备ssh免密登陆**

$ansible部署,主节点一台即可
#可以直接下载 apt-cache madison ansible 查看版本2.5以上都可以
curl -O https://bootstrap.pypa.io/pip/2.7/get-ip.py python get-pip.py
python -m pip install --upgrade "pip < 21.0"
#pip安装ansible(国内如果安装太慢可以直接用pip阿里云加速)
pip install ansible -i https://mirrors.aliyun.com/pypi/simple/

# 在node节点以及master节点和etcd节点做免秘钥认证

#!/bin/bash
IP="
10.0.0.8
10.0.0.18
"
for node in ${IP};do
sshpass -p 123456 ssh-copy-id ${node} -o StrictHostKeyChecking=no
if [ $? -eq 0 ];then
echo "${node} 秘钥拷贝完成"
else
echo "${node} 秘钥拷贝失败"
fi
done

# 部署节点k8s安装

- 1 docker可以自己手动安装
#因为需要用到docker 默认脚本可能有些慢,docker可以选择自己手动安装或者直接脚本安装 上方的步骤,https://mirrors.aliyun.com/ 进去之后搜索doceker-ce 有安装步骤

vim docker_install.sh
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg ' sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装Docker-CE
sudo apt-get -y update
apt install docker-ce=5:19.03.15~3-0~ubuntu-bionic docker-ce-cli=5:19.03.15~3-0~ubuntu-bionic -y

2 - # 下载工具脚本ezdown,举例使用kubeasz版本3.1.0
export release=3.1.0
curl -C- -fLO --retry 3 https://github.com/easzlab/kubeasz/releases/download/${release}/ezdown
chmod +x ./ezdown
# 使用工具脚本下载,如果想更换下载的版本就修改ezdown,下面有key安装的服务版本号。是从清华源修改的
sed -i 's/DOCKER_VER=20.10.5/DOCKER_VER=19.03.15/g' ezdown
./ezdown -D #他会先判断docker等服务是否下载好 ,如果需要更改版本可以手动指定版本号

root@k8s-master1:~# /etc/kubeasz/bin/kube-apiserver --version
root@k8s-master1:/usr/src/trojan# ls /etc/kubeasz/down/
calico_v3.15.3.tar dashboard_v2.2.0.tar flannel_v0.13.0-amd64.tar kubeasz_3.1.0.tar metrics-server_v0.3.6.tar pause_3.4.1.tar
coredns_1.8.0.tar docker-20.10.5.tgz k8s-dns-node-cache_1.17.0.tar metrics-scraper_v1.0.6.tar nfs-provisioner_v4.0.1.tar pause.tar

* **指定k8s集群**

先进入指定目录下面
root@k8s-master1:~# cd /etc/kubeasz/
-执行创建,创建好之后会在这个目录下面生成一个cluster目录,然后在创建 k8s01,后面管理需要进入这个目录去修改主机
root@k8s-master1:/etc/kubeasz# ./ezctl new k8s-01
root@k8s-master1:/etc/kubeasz# ./ezctl new k8s-02
root@k8s-master1:/etc/kubeasz/clusters/k8s-01# pwd
/etc/kubeasz/clusters/k8s-01#定义我们k8s有哪些主机,支持多集群

- 编辑配置文件然后指定我们的集群名称(etcd,master,node)
root@k8s-master1:/etc/kubeasz/clusters/k8s-01# vim hosts
::%s/192.168.1/10.0.0/g #搜索替换,我的服务器地址是10.0.0开头的,后期需要添加或者删除集群就在这里面删除地址
[etcd]
10.0.0.78
10.0.0.88
10.0.0.98
# work node(s)
[kube_node]
10.0.0.48
10.0.0.58
10.0.0.68
# [optional] loadbalance for accessing k8s from outside 指定负载均衡地址
[ex_lb]
10.0.0.83 LB_ROLE=backup EX_APISERVER_VIP=10.0.0.22 EX_APISERVER_PORT=6443
Harbor不需要写
# Network plugins supported: calico, flannel, kube-router, cilium, kube-ovn 经常用的网络插件还有calico
CLUSTER_NETWORK="calico"

# K8S Service CIDR, not overlap with node(host) networking 指定Service网段
SERVICE_CIDR="10.100.0.0/16"
# Cluster CIDR (Pod CIDR), not overlap with node(host) networking Cluster容器启动网段,注意不要和公司网段冲突
CLUSTER_CIDR="10.200.0.0/16"
# NodePort Range 指定Service需要暴露端口范围
NODE_PORT_RANGE="30000-65000"
# Cluster DNS Domain 指定域名
CLUSTER_DNS_DOMAIN="ythzjy.local"
# Binaries Directory 放在/usr/bin方便执行命令路径
bin_dir="/usr/bin"

#修改Cnfig.yml文件
- 修改好之后还需要修改config文件才能部署,定义集群版本信息(以及证书有效期)
root@k8s-master1:/etc/kubeasz/clusters/k8s-01# vim config.yml
# node节点最大pod 数 -默认110
MAX_PODS: 300
# coredns 自动安装 我们自己手动安装,dns加速也关闭
dns_install: "no"
corednsVer: "1.8.0"
ENABLE_LOCAL_DNS_CACHE: false #提供DNS域名缓存加速
# metric server 自动安装
metricsserver_install: "no"
metricsVer: "v0.3.6"

# dashboard 自动安装
dashboard_install: "no"

- 部署k8s集群
root@k8s-master1:/etc/kubeasz# cat roles/prepare/templates/95-k8s-sysctl.conf.j2
#删除下面两个配置,不让k8s执行以下操作(我们已经安装好了)
vim playbooks/01.prepare.yml
- ex_lb
- chrony

- 部署k8s-01,会连接我们刚才指定的主机#代表部署我们k8s的第一个集群,后期还有集群就配置k8s-02,如果我们那个任务配置错误 是可以反复执行的 ,后期在添加服务器直接再跑一次这个脚本
root@k8s-master1:/etc/kubeasz# ./ezctl setup k8s-01 01

# 部署etcd

- 查看etcd的规则
root@k8s-master1:/etc/kubeasz# cat playbooks/02.etcd.yml
root@k8s-master1:/etc/kubeasz# cat roles/etcd/tasks/main.yml
- 开始安装etcd
root@k8s-master1:/etc/kubeasz# ./ezctl setup k8s-01 02
部署好之后就可以对外提供服务了

起来之后进入etcd服务器检查是否监听端口
root@k8s-etcd1:~# ss -ntl'grep 2379
LISTEN 0 32768 10.0.0.78:2379 0.0.0.0:*
LISTEN 0 32768 127.0.0.1:2379 0.0.0.0:*

验证etcd服务,指定etcd集群,监测etcd心跳,如果是success代表正确
root@k8s-etcd1:~# export NODE_IPS="10.0.0.78 10.0.0.88 10.0.0.98"
root@k8s-etcd1:~# for ip in ${NODE_IPS};do ETCDCTL_API=3 /usr/bin/etcdctl --endpoints=https://${ip}:2379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/kubernetes/ssl/etcd.pem --key=/etc/kubernetes/ssl/etcd-key.pem endpoint health; done
https://10.0.0.78:2379 is healthy: successfully committed proposal: took = 6.618167ms
https://10.0.0.88:2379 is healthy: successfully committed proposal: took = 6.315989ms
https://10.0.0.98:2379 is healthy: successfully committed proposal: took = 6.916101ms

# 部署运行时 docker

1 、修改配置文件,设置我们的harbor镜像仓库
root@k8s-master1:/etc/kubeasz# vim clusters/k8s-01/config.yml
# [docker]信任的HTTP仓库
INSECURE_REG: '["127.0.0.1/8","10.0.0.81"]'
# [containerd]基础容器镜像 (这里修改为上传docker后的镜像,node下载会加速下载)
SANDBOX_IMAGE: "10.0.0.81/baseimages/pause-amd64:3.4.1"

root@k8s-master1:/etc/kubeasz# docker pull easzlab/pause-amd64:3.4.1
root@k8s-master1:/etc/kubeasz# docker tag docker.io/easzlab/pause-amd64:3.4.1 10.0.0.81/baseimages/pause-amd64:3.4.1
root@k8s-master1:/etc/kubeasz# docker push 10.0.0.81/baseimages/pause-amd64:3.4.1
- 在node节点测试是否可以下载镜像

2、$所有服务器都需要有这个文件,然后重启docker,默认没有在master节点安装 ,因为已经安装docker了
root@k8s-master1:/etc/kubeasz# cat /etc/docker/daemon.json
{
"data-root": "/var/lib/docker",
"exec-opts": ["native.cgroupdriver=systemd"],
"insecure-registries": ["127.0.0.1/8","10.0.0.81"],
root@k8s-node1:~# scp /etc/docker/daemon.json 10.0.0.18:/etc/docker/
root@k8s-master1:/etc/kubeasz# systemctl restart docker.service

3、 登录harbor测试是否可以登录,账号admin
- 然后开始安装docker,软连接报错没事
root@k8s-master1:/etc/kubeasz# ./ezctl setup k8s-01 03
root@k8s-master1:/etc/kubeasz# docker login 10.0.0.81

# 添加master

master启动之后 负载均衡就可以访问了
root@k8s-master1:/etc/kubeasz# ./ezctl setup k8s-01 04

- 起来之后就可以访问验证kubectl命令是否可以用,查看状态 Ready 是因为mmaster不运行容器,所以调度关掉了
root@k8s-master1:/etc/kubeasz# kubectl get node
NAME STATUS ROLES AGE VERSION
10.0.0.18 Ready,SchedulingDisabled master 111s v1.21.0
10.0.0.28 Ready,SchedulingDisabled master 112s v1.21.0
10.0.0.38 Ready,SchedulingDisabled master 112s v1.21.0

# 添加node

root@k8s-master1:/etc/kubeasz# ./ezctl setup k8s-01 05
这个文件会像nginx一样动态生成,监听在我们本机的6443端口
root@k8s-master1:/etc/kubeasz# cat roles/ex-lb/templates/l4lb.conf.j2
root@k8s-node1:~# cat /etc/kube-lb/conf/kube-lb.conf
upstream backend {
server 10.0.0.18:6443 max_fails=2 fail_timeout=3s;
server 10.0.0.28:6443 max_fails=2 fail_timeout=3s;
server 10.0.0.38:6443 max_fails=2 fail_timeout=3s;

这个时候就可以访问node节点了
root@k8s-master1:/etc/kubeasz# kubectl get node
NAME STATUS ROLES AGE VERSION
10.0.0.18 Ready,SchedulingDisabled master 14h v1.21.0
10.0.0.28 Ready,SchedulingDisabled master 14h v1.21.0
10.0.0.38 Ready,SchedulingDisabled master 14h v1.21.0
10.0.0.48 Ready node 14h v1.21.0
10.0.0.58 Ready node 14h v1.21.0
10.0.0.68 Ready node 14h v1.21.0

- kubelet的service文件路径
cat /etc/systemd/system/kubelet.service

# 部署网络组件calico

网络组件一定要定义好,生产环境一旦更改是无法更改的,除非迁移
查看他们的镜像是在哪儿下载的,服务器需要上外网 ,不然还需要提前传
root@k8s-master1:/etc/kubeasz# cat playbooks/06.network.yml
root@k8s-master1:/etc/kubeasz# vim /etc/docker/daemon.json
"data-root": "/var/lib/docker",
"registry-mirrors": ["https://99162low.mirror.aliyuncs.com"], #添加阿里云的源,提高下载速度
- node节点手动下载镜像,也可以把master的镜像上传 node本地下载
#Master修改镜像
docker tag calico/node:v3.15.3 10.0.0.81/baseimages/calico-node:v3.15.3
docker tag calico/pod2daemon-flexvol:v3.15.3 10.0.0.81/baseimages/pod2daemon-flexvol:v3.15.3
docker tag calico/cni:v3.15.3 10.0.0.81/baseimages/calico-cni:v3.15.3
docker tag calico/kube-controllers:v3.15.3 10.0.0.81/baseimages/kube-controllers:v3.15.3
docker push 10.0.0.81/m44/calico-node:v3.15.3
docker login 10.0.0.81
#上传仓库
docker push 10.0.0.81/m44/calico-node:v3.15.3
docker push 10.0.0.81/m44/pod2daemon-flexvol:v3.15.3
docker push 10.0.0.81/m44/calico-cni:v3.15.3
docker push 10.0.0.81/m44/kube-controllers:v3.15.3

- 把maser的calico修改为本地镜像,这样在node节点下载就会很快
root@k8s-master1:/etc/kubeasz# vim roles/calico/templates/calico-v3.15.yaml.j2
image: 10.0.0.81/m44/kube-controllers:v3.15.3
image: 10.0.0.81/m44/calico-cni:v3.15.3
image: 10.0.0.81/m44/pod2daemon-flexvol:v3.15.3
image: 10.0.0.81/m44/calico-node:v3.15.3

- 如果部署calico网络不通需要查看网段是否和本机地址一致
root@k8s-master1:/etc/kubeasz# cat clusters/k8s-01/hosts'grep CLUSTER_CIDR
CLUSTER_CIDR="10.200.0.0/16"

- 开始部署calico
root@k8s-master1:/etc/kubeasz# ./ezctl setup k8s-01 06

- 部署完成之测试
root@k8s-master1:/etc/kubeasz# kubectl get node
NAME STATUS ROLES AGE VERSION
10.0.0.18 Ready,SchedulingDisabled master 21m v1.21.0
10.0.0.28 Ready,SchedulingDisabled master 21m v1.21.0
10.0.0.38 Ready,SchedulingDisabled master 21m v1.21.0
10.0.0.48 Ready node 17m v1.21.0
10.0.0.58 Ready node 17m v1.21.0
root@k8s-master1:/etc/kubeasz# calicoctl node status
#查看网络状态,这个时候node节点是互联状态(状态是 Established)
Calico process is running.

IPv4 BGP status
+--------------+-------------------+-------+----------+-------------+
' PEER ADDRESS ' PEER TYPE ' STATE ' SINCE ' INFO '
+--------------+-------------------+-------+----------+-------------+
' 10.0.0.48 ' node-to-node mesh ' up ' 16:29:45 ' Established '
' 10.0.0.58 ' node-to-node mesh ' up ' 16:29:48 ' Established '
' 10.0.0.28 ' node-to-node mesh ' up ' 16:29:50 ' Established '
' 10.0.0.38 ' node-to-node mesh ' up ' 16:29:50 ' Established '
+--------------+-------------------+-------+----------+-------------+

IPv6 BGP status
No IPv6 peers found.

#创建容器测试网络是否正常
kubectl run net-test1 --image=alpine sleep 360000
# 状态正常就可以 (NODE 查看调度在那台服务器上)
kubectl get pod -o wide

# 进入容器查看网络是否正常 (容器网段就是指定的10.200 网段)
kubectl exec -it net-test1 sh
/ # ping (另外一个启动容器的IP 是否可以通讯)

* **这个时候我们的k8s集群已经部署完成!如果calico网络插件出现轮训启动失败,可以参照之前文章Trojan代理去下载镜像
本人就踩过这样的坑,安装3遍都是calico无法启动,辗转反侧,彻夜难眠终于找到了这个好用的代理,下载速度贼快!!**