Zer0e's Blog

【架构之路1】k8s集群搭建

字数统计: 1.6k阅读时长: 7 min
2024/07/10 Share

前言

k8s集群是目前中大型公司的首选微服务部署方案,包括高可用,便捷性等等,但是也有人建议中小厂最好不用k8s去部署,因为这意味着你需要有一个专门的精通k8s的运维工程师去解决各种大大小小的问题,但说实话不难,你遇到的问题,99%都能在网上搜索到。

所以我个人的观点是能用则用,当然如果是裸金属服务器的话,成本那就比较高了,但是如果你是用虚拟化技术来创建集群的话成本就小一点。

正文

废话少说,开始干!

环境准备

以我本次的demo为例,环境准备3台centOS7虚拟机。

配置好国内源

1
2
3
wget http://mirrors.aliyun.com/repo/Centos-7.repo
// 没有wget用curl
curl -o Cenos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo

安装ntp,同步时钟

1
2
3
4
5
yum install ntp
systemctl enable ntpd
// 手动同步时钟
ntpdate ntp1.aliyun.com
// 需要持续可用的话需要配合cron做定时同步

关闭防火墙!!

1
2
systemctl stop firewalld
systemctl disable firewalld

安装新一点的docker

1
2
3
4
yum remove docker docker-common docker-selinux docker-engine
// 添加docker仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce

修改三台虚拟机的hostname分别为worker1, worker2, worker3

1
2
vi /etc/hostname
worker1

固定三台虚拟机的ip地址,子网根据vmnet8所分配的,你也可以自行更改。ip分别为192.168.28.138,192.168.28.139,192.168.28.140.

1
2
3
4
5
6
7
8
9
10
// vmware的虚拟机网卡基本上都叫ens33
vi /etc/sysconfig/network-scripts/ifcfg-ens33
修改BOOTPROTO=static和ONBOOT=yes
增加
IPADDR=192.168.28.138
NETMASK=255.255.255.0
NETWORK=192.168.28.0
BROADCAST=192.168.28.255
DNS1=192.168.28.2
GATEWAY=192.168.28.2

增加dns映射,三台都加

1
2
3
4
vi /etc/hosts
192.168.28.138 worker1
192.168.28.139 worker2
192.168.28.140 worker3

由于目前国内的网络环境,不管是rpm包还是docker镜像,都有可能拉取不下来,强烈建议在本机开放允许局域网的连接来使用飞机。在需要时可能会用到。

1
2
3
export https_proxy="https://192.168.28.1:10801/"
export http_proxy="http://192.168.28.1:10801/"
export no_proxy="localhost,127.0.0.1,.example.com,192.168.28.0/16"

配置docker代理或镜像源。镜像源我就不配置了,目前国内源懂得都懂,这里介绍配置docker pull使用代理。

1
2
3
4
5
6
7
mkdir /etc/systemd/system/docker.service.d
vi /etc/systemd/system/docker.service.d/proxy.conf
// 把以下代理内容写进去,注意不需要写http(s)协议
[Service]
Environment="HTTP_PROXY=192.168.28.1:10801"
Environment="HTTPS_PROXY=192.168.28.1:10801"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com,192.168.28.0/16"

重启下docker

1
2
3
4
systemctl daemon-reload
systemctl restart docker

docker info出现HTTP Proxy说明配置完成

至此准备工作就此完成!

创建k8s集群

这里我推荐使用k3s, 一个轻量的k8s集群,没有etcd作为存储,因此如果需要使用在生产环境中建议配置etcd,这里我们采取默认脚本来安装,十分简单。

先在终端中将代理export下,然后执行

1
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--docker" sh -

这里我们依旧采用docker作为容器运行时。

安装完成后kubeconfig文件被放在/etc/rancher/k3s/k3s.yaml中。

接着执行cat /var/lib/rancher/k3s/server/node-toke获取主节点的token。然后在其他节点上执行(也是记得export)

1
curl -sfL https://get.k3s.io | K3S_URL=https://worker1:6443 K3S_TOKEN=获取的token INSTALL_K3S_EXEC="--docker" sh -

子节点全部启动agent成功后,在主节点执行kubectl get nodes看见其他节点就说明安装完成了,前后不超过5分钟。

当然此时子节点还没有标签,我们可以打上

1
2
3
4
kubectl label node worker2 node-role.kubernetes.io/worker=worker
kubectl label node worker3 node-role.kubernetes.io/worker=worker
// 当然主节点worker1也可以标上工作节点
kubectl label node worker1 node-role.kubernetes.io/worker=worker

这里还有个小点,就是当终端中有那些代理的变量时,这些变量会写入到/etc/systemd/system/k3s.service.env,作为后续kubectl的使用代理,如果没有配置no_proxy需要加上,当然你也可以去掉代理,然后重启k3s服务,否则例如kubectl logs可能会提示代理出错。可以参考官方wiki.

安装kubepi面板

kubepi是一个开源的k8s面板,个人觉得挺好用的,装一个可以清楚看到容器的运行状态,不用再去一个个敲命令。官方wiki中也有详细的部署教程,但是持久化部署官方用的nfs,集群刚搭建起来怎么会有呢,因此我稍微改了一下,把存储放到本地了。

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
vim kubepi-pvc.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
name: kubepi-user
namespace: kube-system

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubepi-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: kubepi-user
namespace: kube-system

---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
namespace: kube-system
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

---
apiVersion: v1
kind: PersistentVolume
metadata:
name: kubepi-pv
namespace: kube-system
labels:
app.kubernetes.io/name: kubepi
spec:
storageClassName: local-storage
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Delete
local:
path: /home/k8s/kubepi
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- worker1

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: kubepi-pv-claim
namespace: kube-system
labels:
app.kubernetes.io/name: kubepi
spec:
storageClassName: local-storage
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi

---

apiVersion: v1
kind: Service
metadata:
name: kubepi
namespace: kube-system
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
selector:
app.kubernetes.io/name: kubepi

---

apiVersion: apps/v1
kind: Deployment
metadata:
name: kubepi
namespace: kube-system
labels:
app.kubernetes.io/name: kubepi
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: kubepi
template:
metadata:
labels:
app.kubernetes.io/name: kubepi
spec:
containers:
- name: kubepi
image: kubeoperator/kubepi-server:latest
imagePullPolicy: Always
ports:
- containerPort: 80
protocol: TCP
securityContext:
privileged: true
volumeMounts:
- name: kubepi-persistent-storage
mountPath: /var/lib/kubepi
volumes:
- name: kubepi-persistent-storage
persistentVolumeClaim:
claimName: kubepi-pv-claim


需要修改的是节点亲和性相关,由于local-path使用的是本机存储需要指定主机,因此pv创建需要有节点条件,修改matchExpressions的[0].value改为你想部署的节点hostname即可。然后/home/k8s/kubepi可以提前创建目录出来,不确定k8s会不会自动创建。

接下来就是获取nodePort暴露的端口,这个官方有。

export NODE_PORT=$(kubectl -n kube-system get services kubepi -o jsonpath="{.spec.ports[0].nodePort}")

由于上述我们改了节点亲和性,因此访问的地址就是http://worker1:$NODE_PORT,账号为admin,密码为kubepi

当然我们也可以固定下来端口,例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: v1
kind: Service
metadata:
name: kubepi
namespace: kube-system
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
nodePort: 31779
selector:
app.kubernetes.io/name: kubepi

至此就完成了一个简单的三节点k8s集群的搭建了。

原文作者:Zer0e

原文链接:https://re0.top/2024/07/10/devops1/

发表日期:July 10th 2024, 11:30:00 pm

更新日期:July 10th 2024, 10:50:06 pm

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

CATALOG
  1. 1. 前言
  2. 2. 正文
    1. 2.1. 环境准备
    2. 2.2. 创建k8s集群
    3. 2.3. 安装kubepi面板