简介
K8S是目前已经是业界最为流行的开源技术框架,但是苦于其学习难度较大,并且初学者在开始的时候需要自己进行安装搭建部署,以供后续的学习使用,但是国内经常会出现无法访问外网的官方网站,导致很多镜像和依赖包无法自动安装部署。
本博客主要讲解了如何在离线环境下安装搭建k8s集群,以及最终的验证效果。
部署架构如下:
具体操作步骤如下:
安装过程
操作系统相关配置(所有服务器执行)
操作系统层面,需要先确保时区为东八区、hostname名称每台服务器均不一致、并且关闭swap
关闭swap
swapoff -a
vim /etc/fstab
设置时区
timedatectl set-timezone Asia/Shanghai
设置hostname
每台服务器设置hostname,并且配置/etc/hosts
hostnamectl set-hostname <对应主机hostname名称>
配置hosts
vim /etc/hosts
关闭服务器防火墙
systemctl stop firewalld
systemctl disable firewalld
安装conntrack应用
yum install -y conntrack
工作节点安装socat
yum install -y socat
安装基础依赖环境(所有服务器执行)
基础依赖环境已经打包完成,可以点击k8s离线安装包下载安装。或者点击百度网盘下载,提取码:2unp。
文件下载后得到k8s.packages.tgz
压缩包,解压后可以得到如下三个文件夹,对应3个不同模块
将3个目录全部上传到所有服务器的/opt
路径下
安装docker
1、 安装docker 环境
cd docker_installer
tar -zxvf docker-26.1.4.tgz
cp docker/* /usr/bin/
2、安装docker-compose(非必要)
chmod +x docker-compose
cp docker-compose /usr/bin/
3、docker.service文件
cp docker-config/docker.service /usr/lib/systemd/system
若没有自己的代理服务器,需要注释掉配置文件中的代理服务器ip。
4、daemon.json文件
mkdir /etc/docker
cp docker-config/daemon.json /etc/docker/
5、设置docker开机自启动
systemctl start docker
systemctl enable docker
6、 安装cri-docker容器运行时引擎
创建docker用户组
groupadd docker
解压二进制文件到: /usr/local/bin
cd /opt/cri-docker_installer
tar -zxvf cri-dockerd-0.3.14.amd64.tgz
cp cri-dockerd/cri-dockerd /usr/local/bin/
cp cri-docker.service /etc/systemd/system/
cp cri-docker.socket /etc/systemd/system/
systemctl start cri-docker
systemctl enable cri-docker
配置开机自启动
自此,k8s的依赖环境已经安装完成,可以开始k8s应用主题的安装。
k8s主体应用安装(所有服务器执行)
导入docker镜像
由于k8s镜像国内无法正常访问,安装包中已经打包了k8s主体需要的所有镜像文件,直接加载导入即可
cd /opt/k8s_installer
docker load -i k8s.images.tgz
k8s组件离线安装
安装cni
mkdir -p /opt/cni/bin
tar -zxvf cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/bin
保险起见,重启一下cri-docker
systemctl restart cri-docker
安装crictl
tar -zxvf crictl-v1.30.0-linux-amd64.tar.gz
cp crictl /usr/local/bin
安装kubeadm、kubelet、kubectl
复制
二进制文件到: /usr/local/bin
cp kubeadm /usr/local/bin/
cp kubectl /usr/local/bin/
cp kubelet /usr/local/bin/
一定要将文件复制到目录而不是移动(mv)到目录,否则会一直启动失败,未查明是什么原因。
上传/usr/lib/systemd/system/kubelet.service文件
cp kubelet.service /usr/lib/systemd/system/
上传/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf文件
cp -r kubelet.service.d/ /usr/lib/systemd/system/
上传/etc/sysconfig/kubelet文件
cp sysconfig/kubelet /etc/sysconfig/
启动kubelet
systemctl enable --now kubelet
systemctl status kubelet
系统会尝试启动kubelet并且配置开机自启动, 默认会不断重启,直到创建集群为止
为了方便后续的操作,建议配置一下k8s的自动补全功能,操作如下:
yum -y install bash-completion
kubectl completion bash
source /usr/share/bash-completion/bash_completion
echo "source /usr/share/bash-completion/bash_completion" >> ~/.bashrc
自此,k8s的基础环境已经安装完成,后续需要在master节点上创建k8s集群,并且在worker节点上将工作节点加入该集群
创建K8S集群(其中一台master机器上执行)
主节点创建集群:
kubeadm init \
--control-plane-endpoint="k8s-master-01" \
--kubernetes-version v1.30.2 \
--cri-socket unix:///run/cri-dockerd.sock
这里需要指定版本为
v1.30.2
,因为安装包中封装的k8s镜像是v1.30.2版本,若要安装其他版本,需要另行下载其他版本对应的docker镜像包。执行到这个地方的时候,可能会卡主一段时间(大约5分钟左右,根据电脑性能等待时间长度有所不同)
安装网络插件
集群创建成功后,需要安装集群的网络插件,这里选择使用calico
,相关镜像之前已经封装在安装包中,可以直接启动即可。
cd /opt/k8s_installer/
kubectl apply -f calico.yaml
kubectl get pods -n kube-system
主节点创建证书:
kubeadm init phase upload-certs --upload-certs
保存好上面的证书字符串,后面会用到
配置集群访问:
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
第二个主节点加入原有集群:
通过回显内容可以看到具体的加入具体口令,将其复制,并且做适当修改(使其支持docker容器运行时)
修改后内容如下:
kubeadm join k8s-master-01:6443 --token 886zto.jlvko62yfrlrymwu \
--discovery-token-ca-cert-hash sha256:053749d9ab0725d9bad5e09ee67637cb8593f63cd65f8d59ee57e96de7afed05 \
--control-plane \
--certificate-key b2cf805959c144f5123202f349bf51712ca5723badbb473a1f98040787400587 \
--cri-socket unix:///run/cri-dockerd.sock
将以上命令张贴到第二个主节点服务器上执行即可
看到以上内容表明另外一个主节点已经加入集群,可以通过kubelet查看所有节点
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes
同样,配置一下自动补齐,以便后期使用
kubectl completion bash
source /usr/share/bash-completion/bash_completion
echo "source /usr/share/bash-completion/bash_completion" >> ~/.bashrc
echo 'source <(kubectl completion bash)' >>~/.bashrc
工作节点加入集群:
从第一个master节点创建好集群后,可以得到加入集群的口令,如下:
同样,做出适当修改,添加证书语句和docker兼容语句,得到如下:
kubeadm join k8s-master-01:6443 --token 886zto.jlvko62yfrlrymwu \
--discovery-token-ca-cert-hash sha256:053749d9ab0725d9bad5e09ee67637cb8593f63cd65f8d59ee57e96de7afed05 \
--certificate-key b2cf805959c144f5123202f349bf51712ca5723badbb473a1f98040787400587 \
--cri-socket unix:///run/cri-dockerd.sock
将其复制到其他所有worker服务器上执行即可
执行结束后,从任意master节点上即可看到所有节点以及对应节点状态
至此,k8s集群安装完成。
验证集群可用性
上传测试服务启动文件和测试服务镜像(镜像需要上传到所有服务器上,除非docker配置了镜像仓库并且镜像已经加载到docker仓库中)
测试应用启动文件内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # 告知 Deployment 运行 2 个与该模板匹配的 Pod
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
服务器上自行上传并下载nginx:1.14.2
镜像即可。
创建应用,并查看状态
通过port-forward映射出来效果如下
kubectl port-forward deployments/nginx-deployment --address 0.0.0.0 8888:80
至此,k8s集群搭建并验证完毕