前言
前段时间工作太忙,好久没更新了。最近搞了一项“大工程”,现在想起来觉得自己有点搞笑。因为高配云主机太贵,自己想实验一些大软件或者集群根本搞不起,就突然心血来潮花了2千多大洋买了个N手洋垃圾服务器(32线程CPU、64G内存)。买回来一看,乖乖,这么大、几十斤重,以后搬家真是要老命了!既来之则安之,用它发挥一些作用吧?第一个想法就是自己搭个K8S集群玩玩,毕竟心痒好久了。
简介
搭建K8S集群的方式很多,我这里主要是使用kubeAdm来搭建的,好处有一个,就是有问题的时候支持kubeadm reset,对于我这样的新手来说非常受用。搭建的步骤很长,怕自己以后忘记了,就在这里仅做个记录和以后的问题查看。
环境
VMVare节点名称 | VMVare操作系统 | 主机名 | 配置 | NAT模式下的IP |
---|---|---|---|---|
C1 | Centos 7.7 | master-c1 | 8核、16g | 192.168.136.129 |
C2 | Centos 7.7 | node-c2 | 8核、16g | 192.168.136.130 |
C3 | Centos 7.7 | node-c3 | 8核、16g | 192.168.136.131 |
一、公共安装和配置(所有节点执行)
如下是3个节点都需要进行的安装和配置步骤,这部分有参考网上文章《Centos7安装K8s》
配置hostname
设置自己的主机名(例如master节点)1
hostnamectl set-hostname master-c1
host映射配置1
vim /etc/hosts
加入如下内容:1
2
3192.168.136.129 master-c1
192.168.136.130 node-c2
192.168.136.131 node-c3
配置静态IP
注意每个节点的IPADDR自己设置成不一样的,另外注意的是:VMVare中的系统在NAT模式下的网关IP是x.x.x.2,不是x.x.x.1哦。(这个我吃过亏的)1
vim /etc/sysconfig/network-scripts/ifcfg-ens33
修改或新增如下配置1
2
3
4
5
6BOOTPROTO="static"
IPADDR=192.168.136.129
GATEWAY=192.168.136.2
NETMASK=255.255.255.0
DNS1=114.114.114.114
DNS2=8.8.8.8
重启网络1
service network restart
关闭防火墙
1 | systemctl stop firewalld |
关闭Selinux
- 临时关闭
1 | setenforce 0 |
- 永久关闭
1 | sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux |
禁用交换分区
- 临时禁用
1 | swapoff -a |
- 永久禁用(打开/etc/fstab注释掉swap那一行)
1 | sed -i 's/.*swap.*/#&/' /etc/fstab |
修改内核参数
1 | cat <<EOF > /etc/sysctl.d/k8s.conf |
二、Master节点相关安装
配置yum源
由于官方k8s源在google,这里使用阿里云yum源1
2
3
4
5
6
7
8
9 cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装kubeadm、kubectl、kubelet
1 | yum install -y kubectl kubeadm kubelet |
启动kubelet
1 | systemctl enable kubelet && systemctl start kubelet |
使用kubeAdm进行配置初始化
注意这里的第一个ip要改成自己主机的ip,我之前直接复制的网上的,结果出了一大堆莫名其妙的问题。(如果遇到问题需要重置,可以执行:kubeadm reset)1
2
3
4
5 kubeadm init \
--apiserver-advertise-address=192.168.136.129 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
安装成功后会输出”Then you can join any number of worker nodes by running the following on each as root: kubeadm join …”的语句,后续在node节点中执行这个kubeadm join语句,即可加入到集群中。
可能遇到的问题
由于不同仓库里的镜像命名不一定规范,比如有的版本是V1,有的直接是1,这时候就会报找不到镜像的错误,我的解决方法是下载其他仓库的镜像,重命名成脚本需要的镜像名称。比如我的报找不到coredns/coredns:v1.8.0镜像,我的解决方法如下:1
2
3
4 kubeadm reset
docker pull coredns/coredns:1.8.0
docker tag 296a6d5035e2 registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0
kubeadm init --apiserver-advertise-address=192.168.136.129 --image-repository registry.aliyuncs.com/google_containers --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16
安装flannel
忘了从哪里下载的kube-flannel.yml文件了,直接把内容放下面吧,虽然很长,但省得再去翻墙下载了。注意这里配置的ip要和上一节kubeadm init时的-pod-network-cidr参数的ip一致。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
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: psp.flannel.unprivileged
annotations:
seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/default
seccomp.security.alpha.kubernetes.io/defaultProfileName: docker/default
apparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/default
apparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default
spec:
privileged: false
volumes:
- configMap
- secret
- emptyDir
- hostPath
allowedHostPaths:
- pathPrefix: "/etc/cni/net.d"
- pathPrefix: "/etc/kube-flannel"
- pathPrefix: "/run/flannel"
readOnlyRootFilesystem: false
# Users and groups
runAsUser:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
fsGroup:
rule: RunAsAny
# Privilege Escalation
allowPrivilegeEscalation: false
defaultAllowPrivilegeEscalation: false
# Capabilities
allowedCapabilities: ['NET_ADMIN', 'NET_RAW']
defaultAddCapabilities: []
requiredDropCapabilities: []
# Host namespaces
hostPID: false
hostIPC: false
hostNetwork: true
hostPorts:
- min: 0
max: 65535
# SELinux
seLinux:
# SELinux is unused in CaaSP
rule: 'RunAsAny'
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: flannel
rules:
- apiGroups: ['extensions']
resources: ['podsecuritypolicies']
verbs: ['use']
resourceNames: ['psp.flannel.unprivileged']
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- apiGroups:
- ""
resources:
- nodes
verbs:
- list
- watch
- apiGroups:
- ""
resources:
- nodes/status
verbs:
- patch
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: flannel
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: flannel
subjects:
- kind: ServiceAccount
name: flannel
namespace: kube-system
apiVersion: v1
kind: ServiceAccount
metadata:
name: flannel
namespace: kube-system
kind: ConfigMap
apiVersion: v1
metadata:
name: kube-flannel-cfg
namespace: kube-system
labels:
tier: node
app: flannel
data:
cni-conf.json: |
{
"name": "cbr0",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
}
]
}
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: kube-flannel-ds
namespace: kube-system
labels:
tier: node
app: flannel
spec:
selector:
matchLabels:
app: flannel
template:
metadata:
labels:
tier: node
app: flannel
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/os
operator: In
values:
- linux
hostNetwork: true
priorityClassName: system-node-critical
tolerations:
- operator: Exists
effect: NoSchedule
serviceAccountName: flannel
initContainers:
- name: install-cni
image: quay.io/coreos/flannel:v0.14.0-rc1
command:
- cp
args:
- -f
- /etc/kube-flannel/cni-conf.json
- /etc/cni/net.d/10-flannel.conflist
volumeMounts:
- name: cni
mountPath: /etc/cni/net.d
- name: flannel-cfg
mountPath: /etc/kube-flannel/
containers:
- name: kube-flannel
image: quay.io/coreos/flannel:v0.14.0-rc1
command:
- /opt/bin/flanneld
args:
- --ip-masq
- --kube-subnet-mgr
resources:
requests:
cpu: "100m"
memory: "50Mi"
limits:
cpu: "100m"
memory: "50Mi"
securityContext:
privileged: false
capabilities:
add: ["NET_ADMIN", "NET_RAW"]
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
volumeMounts:
- name: run
mountPath: /run/flannel
- name: flannel-cfg
mountPath: /etc/kube-flannel/
volumes:
- name: run
hostPath:
path: /run/flannel
- name: cni
hostPath:
path: /etc/cni/net.d
- name: flannel-cfg
configMap:
name: kube-flannel-cfg
执行部署:1
kubectl apply -f kube-flannel.yml
三、Node节点相关安装
配置yum源
1 | cat <<EOF > /etc/yum.repos.d/kubernetes.repo |
安装kubeadm、kubectl、kubelet
1 | yum install -y kubectl kubeadm kubelet |
启动kubelet服务
1 | systemctl enable kubelet && systemctl start kubelet |
加入集群
使用master节点输出的kubeadm join语句即可加入到K8S集群中,如果当时没保存,可以登录master节点,使用kubeadm token create –print-join-command来重新获取。
可能遇到的问题
在执行kubectl命令时如果遇到无法连接8080端口的问题,需要将master节点配置复制到node节点,注意替换节点的主机名:1
2
3 scp -r /etc/kubernetes/admin.conf node-c2:/etc/kubernetes/admin.conf
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
source /etc/profile
四、Dashboard UI相关
这一块当时安装的有些乱,虽然最后安装好了,但步骤不一定正规,所以这里暂时不放安装步骤了,只记录几个重要点。
- 如果需要对外的端口能够访问,需要设置NodePort类型的端口映射:
1 | kind: Service |
- 获取Dashboard的token
1 | kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}') |
五、效果展示
因为没有有效的https证书,用谷歌浏览器是禁止访问的,可以选择用火狐浏览器输入token进行访问,效果如下:
后面除了使用kubectl命令,还可以根据用管理界面进行应用的配置和管理了。
结束语
搭建K8S很费事,中间也遇到了很多问题,都要查资料以及不断尝试解决。除此之外,在服务器应用及虚拟机方面也遇到了一些问题,也小记一下:
1、在操作服务器问题上,也遇到了一些问题,主要在于服务器远程启动上。关于远程启动,我尝试了好多方法都不是太智能,最后发现最简单的莫过于二十块钱买一个天猫精灵远程开关,加上服务器上安装向日葵客户端(免费版的软件,开机棒还是感觉有点贵就没买,能省则省,哈哈)设成开机启动,然后在服务器BIOS中设置成系统断电重启搞定。
2、对于虚拟机里的应用映射到外网,我还是选择的frp内网穿透方案,运用阿里云服务器当外网代理,实现多个应用的对外映射。同时还要提到经常用的cloudflare的DNS代理,对于HTTPS代理非常方便,不需要再申请证书了。
3、小插曲:为了实现我的实验数据定期备份(毕竟二手服务器的硬盘不一定什么时候就挂了),我决定写个脚本定期往我的NAS服务器上备份现在这台服务器的部分应用数据。然而,发现同一个路由器上有线传输却不超过10M/s,在排查了各个网口包括路由器插口都是千兆网口后,才觉醒我连接服务器的网线只是普通的4类网线。最后花了十块钱买根5类千兆网线搞定。
后面要好好学习K8S的知识,然后基于这个集群再体验部署应用的过程吧。进步很慢,一直在路上。
本文链接: https://www.xiajunyi.com/pages/p78.html
版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。转载请注明出处!