-
Notifications
You must be signed in to change notification settings - Fork 0
/
k8s-install-offline
executable file
·287 lines (269 loc) · 11 KB
/
k8s-install-offline
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
#!/bin/bash
set -e
source variable.sh
podnetwork=10.244.0.0/16
runtime_type=docker
baseline=129 #default
baseinstall=0
goinstall=0
runcinstall=0
containerdinstall=0
dockerinstall=0
k8sinstall=0
install_on_docker=0
ip=$(hostname -I | awk '{print $1}')
name=$(hostname)
ARCH=`arch`
help() {
echo "Usage:"
echo "Install: $0 <-i ONLYINSTALL> <-d DIST> <-b BASELINE>"
echo "Setup: $0 <-d DIST> <-b BASELINE> <-n NODETYPE> <-t CONTAINERTYPE>"
echo "Other options: $0 [-c] [-h]"
echo "Description:"
echo "without -i will install and setup current node with -d -n and -t"
echo "-c reset and clean current node"
echo "-h print help message"
echo "-i ONLYINSTALL package docker or k8s, without any config"
echo "-b BASELINE,120, 125, 129(default)"
echo "-d DIST, ctl2, ctl3, ctl4, oe2309, oe2403"
echo "-n NODETYPE, master or worker"
echo "-t CONTAINERTYPE, docker or containerd"
exit -1
}
[[ $# == 0 ]] && help && exit
while getopts 'i:d:n:t::b:uch' OPT; do
case $OPT in
i) case "$OPTARG" in
"docker"|"k8s")
onlyinstall=$OPTARG
echo "only install $OPTARG..."
;;
*)
echo "unsupported onlyinstall value $OPTARG..." && exit 1
;;
esac
;;
d) case "$OPTARG" in
"ctl2"|"ctl3"|"ctl4"|"oe2403"|"oe2309")
if [[ ".$OPTARG" != `rpm --eval %{dist}` ]];then
echo "$OPTARG is not suitable for current distrubution" && exit
else
dist=$OPTARG && echo "dist is set as $OPTARG..."
fi
;;
*)
echo "unsupported dist type $OPTARG..." && exit 1
;;
esac
;;
n) if [ "$OPTARG" == "master" ] || [ "$OPTARG" == "worker" ];then
nodetype=$OPTARG && echo "nodetype is set as $OPTARG..."
else
echo "unsupport node type $OPTARG..." && exit
fi
;;
t) if [ "$OPTARG" == "docker" ] || [ "$OPTARG" == "containerd" ];then
runtime_type=$OPTARG && echo "runtime_type is set as $OPTARG..."
else
echo "unsupport container engine type $OPTARG..." && exit
fi
;;
b) case "$OPTARG" in
"120"|"125"|"129")
baseline=$OPTARG && echo "baseline is set as $OPTARG.."
set_version_${OPTARG}
;;
*)
echo "unsupport k8s baseline $OPTARG.."&& exit 1
;;
esac
;;
u) for package in $online_install_pkg; do
if rpm -q "$package" > /dev/null 2>&1; then
rpm -Uvh rpms/$package-*.rpm
else
echo "Package $package is not installed, skipping update."
fi
done
exit 0
;;
c) echo "clean k8s setup..."
kubeadm reset -f
rm -rf /etc/cni/*
ifconfig cni0 down > /dev/null 2>&1
ifconfig flannel.1 down > /dev/null 2>&1
ifconfig docker0 down > /dev/null 2>&1
ip link delete cni0 > /dev/null 2>&1
ip link delete flannel.1 > /dev/null 2>&1
echo "k8s reset and network all deleted!" && exit
;;
h) help && exit;;
?) help && exit;;
esac
done
# 检查是否指定了 -d 参数
if [ -z "$dist" ]; then
help
echo "Error: -d DIST parameter is required."
fi
if [[ $baseline != "120" && "x$runtime_type" == "xdocker" && "x$onlyinstall" != "xdocker" ]]; then
echo "${baseline}基线暂不支持使用docker部署k8s,该基线只能用-t containerd部署k8s; 仅安装docker请使用 -i docker"
exit
fi
echo "开始一键安装模式,该过程需要使用root"
[ `whoami` == "root" ] || exit
rpm -q cri-tools || baseinstall=1
if [ $baseinstall -eq 0 ]; then # test:1
echo "检查到基础库已安装!"
else
echo -e "\033[44;37m 安装基础库 \033[0m"
cd rpms
if [ "$baseline" == "120" ]; then
rpm -ivh --force --nodeps protobuf-*.rpm zlib-devel-*.rpm vim-filesystem-*.rpm vim-common-*.rpm libnetfilter_queue-*.rpm libnetfilter_cttimeout-*.rpm libnetfilter_cthelper-*.rpm gpm-libs-*.rpm vim-enhanced-*.rpm emacs-filesystem-*.rpm protobuf-devel-*.rpm protobuf-c-*.rpm conntrack-tools-help-*.rpm conntrack-tools-*.rpm socat-*.rpm libcgroup-*.rpm cri-tools-*.rpm
else
rpm -ivh --force --nodeps conntrack-tools-*.rpm socat-*.rpm libcgroup-*.rpm container-selinux-*.rpm tar-*.rpm cri-tools-*.rpm
fi
cd -
fi
# go version || goinstall=1
# if [ $goinstall -eq 0 ]; then
# echo "检查到golang已安装!"
# else
# echo -e "\033[44;37m 安装 golang \033[0m"
# rpm -ivh rpms/golang-*${dist}*.rpm
# fi
echo -e "\033[44;37m 安装 runc/containerd/docker, 如果有老版本请先自行御载!!! \033[0m"
runc -v || runcinstall=1
if [ $runcinstall -eq 0 ]; then
echo "检查到runc已安装!"
else
echo "安装runc..."
rpm -ivh rpms/runc-*${dist}.${ARCH}.rpm
fi
containerd -v || containerdinstall=1
if [ $containerdinstall -eq 0 ]; then
echo "检查到contained已安装!"
else
echo "安装contained..."
rpm -ivh rpms/containerd-*${dist}.${ARCH}.rpm
systemctl enable containerd.service
fi
if [ "x$runtime_type" == "xcontainerd" ];then
mkdir -p /etc/containerd && containerd config default | sudo tee /etc/containerd/config.toml > /dev/null 2>&1
if [ $baseline != "120" ]; then
sed -i "s#sandbox_image = \"registry.k8s.io/pause:.*\"#sandbox_image = \"${IMAGE_REPO}/pause:${PAUSE_VERSION}\"#" /etc/containerd/config.toml
sed -i 's#SystemdCgroup = false#SystemdCgroup = true#' /etc/containerd/config.toml
else
#sed -i "s#sandbox_image = \"k8s.gcr.io/pause:.*\"#sandbox_image = \"docker.ctyun.cn:60001/base-x86_64/pause:$PAUSE_VERSION\"#" /etc/containerd/config.toml
sed -i "s#sandbox_image = \"k8s.gcr.io/pause:.*\"#sandbox_image = \"${IMAGE_REPO}/pause:${PAUSE_VERSION}\"#" /etc/containerd/config.toml
fi
systemctl restart containerd.service
sockoption="--cri-socket /run/containerd/containerd.sock"
sedcmd='-e "s,dockershim.sock,containerd/containerd.sock,g"'
fi
if [[ "x$runtime_type" == "xdocker" || "x$onlyinstall" == "xdocker" ]];then
docker -v || dockerinstall=1
if [ $dockerinstall -eq 0 ]; then
echo "检查到Docker已安装!"
[ $(rpm -q $(rpm -qf $(which docker)) --qf %{version} | awk -F '.' '{print $1}') -le 18 ] && \
(rpm -e runc --nodeps; rpm -ivh rpms/runc-*${dist}.${ARCH}.rpm;)
else
echo "安装docker..."
if [[ $baseline == "120" || $baseline == "129" ]]; then
dockername="docker"
else
dockername="moby"
fi
rm -rf /etc/docker/daemon.json #This file should be delete, or start service will fail. Offline mode does NOT need this file
rpm -ivh rpms/${dockername}-*${dist}.${ARCH}.rpm
fi
sleep 5
systemctl enable docker
systemctl daemon-reload
systemctl restart docker
echo "Docker 安装完成. "
if [ "x$onlyinstall" == "xdocker" ]; then
exit
fi
fi
echo -e "\033[44;37m 安装 k8s \033[0m"
rpm -qa | grep kubelet && k8sinstall=1
if [ $k8sinstall -eq 1 ]; then
echo "检查到k8s已安装!"
else
echo "安装k8s rpms..."
cd rpms
if [ "$nodetype" == "worker" ];then
rpm -ivh --nodeps --force kubernetes-kubelet-*${dist}.${ARCH}.rpm kubernetes-client-*${dist}.${ARCH}.rpm kubernetes-node-*${dist}.${ARCH}.rpm kubernetes-kubeadm-*${dist}.${ARCH}.rpm
elif [ "$nodetype" == "master" ];then
rpm -ivh --nodeps --force kubernetes-*${dist}.${ARCH}.rpm
else
echo "Please specify the 'nodetype' correctly through the '-n' option." && exit
fi
cd -
systemctl enable kubelet
fi
if [ ! -d /opt/cni ];then
echo -e "\033[44;37m 安装k8s cni插件 \033[0m"
rpm -ivh rpms/containernetworking-plugins-*${dist}.${ARCH}.rpm
mkdir -p /opt/cni
ln -s /usr/libexec/cni /opt/cni/bin
fi
if [ ! -f /etc/kubernetes/admin.conf ];then
echo -e "\033[44;37m 设置k8s \033[0m"
iptables -P FORWARD ACCEPT
systemctl stop firewalld.service
systemctl disable firewalld.service
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
swapoff -a
grep ^nameserver /etc/resolv.conf || (chmod a+w /etc/resolv.conf && echo "nameserver 114.114.114.114" >> /etc/resolv.conf)
modprobe br_netfilter
sed -i 's/net.ipv4.ip_forward=0/net.ipv4.ip_forward=1/g' /etc/sysctl.conf
sysctl --system > /dev/null 2>&1
echo -e "\033[44;37m 加载k8s镜像 \033[0m"
cd tar-${ARCH}/
if ls *.tar 1> /dev/null 2>&1; then
for i in *.tar; do
if [ "x$runtime_type" == "xdocker" ]; then
docker load -i "$i"
else
ctr -n k8s.io images import "$i"
fi
done
cd -
if [ "x$onlyinstall" == "xk8s" ]; then
echo "rpm和镜像已安装完成!Exit." && exit
fi
else
echo "没有找到 *.tar 文件,镜像未完成安装。"&& exit
fi
if [ "$nodetype" == "master" ];then
kubeadm init $sockoption --image-repository=${IMAGE_REPO} --pod-network-cidr=$podnetwork --apiserver-advertise-address=$ip --kubernetes-version=${KUBERNETES_VERSION}
#默认使用参数配置(因为可做到无人工修改),也可以解注如下代码并手工修改kubeadm-template.yaml,通过config方式完成init。
#cp config/kubeadm-template.yaml kubeadm.yaml
#sed -i -e "s/advertiseAddress: ip/advertiseAddress: $ip/g" -e "s/name: master/name: $name/g" -e "s/ARCH/`arch`/g" $sedcmd kubeadm.yaml
#kubeadm init --config kubeadm.yaml
mkdir -p $HOME/.kube
cp /etc/kubernetes/admin.conf $HOME/.kube/config
cp /etc/kubernetes/admin.conf ~/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
sed "s/ARCH/`arch`/g" config/flannel.yaml | kubectl apply -f -
#mkdir -p /run/flannel;cp config/subnet.env /run/flannel/;cp config/10-flannel.conflist /etc/cni/net.d/ #In case files missing
sleep 5
echo -e "\033[44;37m 去除k8s污点 \033[0m"
master_name=$(kubectl get node | grep master | awk '{print $1}')
master_taint=$(kubectl describe node $master_name | grep Taints | awk '{print $2}')
if [[ $master_taint = "<none>" ]];then
echo "不存在污点!"
else
kubectl taint node --all $master_name $master_taint-
kubectl taint node --all $master_name node.kubernetes.io/not-ready-
fi
#rm -rf kubeadm.yaml
echo -e "\033[44;37m master结点全部部署完成,请拷贝kubeadm join命令行备用 \033[0m"
elif [ "$nodetype" == "worker" ];then
echo -e "\033[44;37m 请运行master配置完成后提示的kubeadm join命令行 \033[0m"
else
exit # echo "Please specify the \'nodetype\' correctly through the \'-n option."
fi
fi