Kubernetes集群离线部署指南
一、概述
本文档旨在详细指导如何在离线环境下部署一个Kubernetes集群,采用kubeadm作为部署工具。通过本指南,读者可以完成从环境准备到集群搭建、网络配置以及应用部署的全过程。
二、部署方式选择
本次部署采用kubeadm工具,它提供了kubeadm init和kubeadm join命令,用于快速搭建Kubernetes集群。
三、环境准备
(一)硬件要求
建议最小硬件配置:2核CPU、2G内存、20G硬盘。
(二)网络规划
表格
复制
| 名称 | IP地址 |
|---|---|
| master | 192.168.32.128 |
| node1 | 192.168.32.129 |
| node2 | 192.168.32.130 |
| repo | 192.168.32.131 |
(三)软件环境
- 操作系统:CentOS Linux release 7.8.2003 (Core)
- Docker:20.10.16
- Kubernetes:1.23
四、下载安装包至本地
(一)搭建yum仓库服务器
选择一台可连接外网的机器(如192.168.32.131),下载所需依赖包作为yum仓库服务器。
bash
复制
# 下载工具依赖包
yum install --downloadonly --downloaddir=/opt/repo ntpdate wget httpd createrepo vim telnet netstat lrzsz
# 清理并更新yum缓存
yum clean all
yum makecache
# 下载Docker和Kubernetes相关包
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum install --downloadonly --downloaddir=/opt/repo docker-ce
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 下载kubelet、kubeadm、kubectl
yum install --downloadonly --downloaddir=/opt/repo kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0
# 下载Calico和Dashboard配置文件
wget --no-check-certificate https://docs.projectcalico.org/manifests/calico.yaml
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml
(二)制作本地yum源
将下载的安装包拷贝至192.168.32.131,并制作本地yum源。
bash
复制
# 创建仓库目录并生成repodata
mkdir /opt/repo
createrepo /opt/repo/
# 启动httpd服务并创建软链接
yum install -y httpd
systemctl start httpd && systemctl enable httpd
ln -s /opt/repo /var/www/html/
五、初始化配置
(一)安装环境准备(所有节点)
bash
复制
# 关闭防火墙和selinux
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
# 关闭swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
# 设置主机名并添加hosts解析
hostnamectl set-hostname k8s-node2
cat >> /etc/hosts << EOF
192.168.32.128 master
192.168.32.129 node1
192.168.32.130 node2
192.168.32.131 repo
EOF
# 创建本地yum源
cat > /etc/yum.repos.d/local.repo << EOF
[local]
name=local
baseurl=http://192.168.32.131/repo/
enabled=1
gpgcheck=0
EOF
# 清理并更新yum缓存
yum clean all
yum makecache
(二)安装Docker和Kubernetes组件(所有节点)
bash
复制
# 安装Docker
yum -y install docker-ce
systemctl enable docker && systemctl start docker
# 配置Docker镜像加速器
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://l51yxa8e.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl restart docker
# 安装Kubernetes组件
yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0
systemctl enable kubelet
六、部署Kubernetes Master
(一)拉取所需镜像
在192.168.32.131上下载并保存镜像,然后传输到master节点加载。
bash
复制
# 需要拉取的镜像列表
images=(
registry.aliyuncs.com/google_containers/kube-apiserver:v1.23.0
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.23.0
registry.aliyuncs.com/google_containers/kube-scheduler:v1.23.0
registry.aliyuncs.com/google_containers/kube-proxy:v1.23.0
registry.aliyuncs.com/google_containers/pause:3.6
registry.aliyuncs.com/google_containers/etcd:3.5.1-0
registry.aliyuncs.com/google_containers/coredns:v1.8.6
)
# 拉取并保存镜像
for imageName in ${images[@]}; do
docker pull $imageName
key=`echo $imageName | awk -F '/' '{print $3}' | awk -F ':' '{print $1}'`
docker save -o $key.tar $imageName
done
# 将镜像文件传输到master节点
scp *.tar root@192.168.32.128:/root/
# 在master节点加载镜像
for imageName in ${images[@]}; do
key=`echo $imageName | awk -F '/' '{print $3}' | awk -F ':' '{print $1}'`
docker load -i $key.tar
done
(二)初始化Kubernetes Master
在master节点执行以下命令:
bash
复制
kubeadm init \
--apiserver-advertise-address=192.168.32.128 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all
# 配置kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
七、部署容器网络插件
选择Calico作为网络插件,部署步骤如下:
(一)下载并修改Calico配置文件
在192.168.32.131上下载Calico配置文件并修改Pod网络配置。
bash
复制
wget --no-check-certificate https://docs.projectcalico.org/manifests/calico.yaml
# 修改CALICO_IPV4POOL_CIDR为10.244.0.0/16
sed -i 's|192.168.0.0/16|10.244.0.0/16|' calico.yaml
# 添加网卡配置
sed -i '/CLUSTER_TYPE/a\ \ \ \ \ \ \ \ - name: IP_AUTODETECTION_METHOD\n\ \ \ \ \ \ \ \ value: "interface=eth0"' calico.yaml
(二)拉取Calico镜像并加载
在192.168.32.131上拉取Calico镜像并保存,然后传输到master节点加载。
bash
复制
# 需要拉取的Calico镜像
calico_images=(
docker.io/calico/cni:v3.22.1
docker.io/calico/pod2daemon-flexvol:v3.22.1
docker.io/calico/node:v3.22.1
docker.io/calico/kube-controllers:v3.22.1
)
# 拉取并保存镜像
for imageName in ${calico_images[@]}; do
docker pull $imageName
key=`echo $imageName | awk -F '/' '{print $3}' | awk -F ':' '{print $1}'`
docker save -o $key.tar $imageName
done
# 将镜像文件传输到master节点
scp *.tar root@192.168.32.128:/root/
# 在master节点加载镜像
for imageName in ${calico_images[@]}; do
key=`echo $imageName | awk -F '/' '{print $3}' | awk -F ':' '{print $1}'`
docker load -i $key.tar
done
(三)部署Calico网络
在master节点执行以下命令:
bash
复制
kubectl apply -f calico.yaml
八、加入Node节点
在每个node节点执行kubeadm join命令,加入集群。
bash
复制
kubeadm join 192.168.32.128:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
九、部署Kubernetes Dashboard
在master节点部署Dashboard,步骤如下:
(一)下载并修改Dashboard配置文件
在192.168.32.131上下载Dashboard配置文件并修改Service类型为NodePort。
bash
复制
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml
# 修改Service类型为NodePort
sed -i '/kind: Service/a\ \ \ \ type: NodePort\n\ \ \ \ nodePort: 30001' recommended.yaml
(二)部署Dashboard
在master节点执行以下命令:
bash
复制
kubectl apply -f recommended.yaml
# 创建ServiceAccount并绑定ClusterRole
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
# 获取访问Token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
十、部署Nginx服务
在master节点部署Nginx服务,步骤如下:
(一)创建Namespace
创建nginx-namespase.yaml文件并应用。
bash
复制
cat > nginx-namespase.yaml << EOF
apiVersion: v1
kind: Namespace
metadata:
name: ssx-nginx-ns
labels:
name: lb-ssx-nginx-ns
EOF
kubectl create -f nginx-namespase.yaml
(二)创建Deployment
创建nginx-deployment.yaml文件并应用。
bash
复制
cat > nginx-deployment.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: ssx-nginx-dm
namespace: ssx-nginx-ns
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: ssx-nginx-c
image: nginx:latest
ports:
- containerPort: 80
volumeMounts:
- name: volume
mountPath: /usr/share/nginx/html
volumes:
- name: volume
hostPath:
path: /opt/web/dist
EOF
kubectl create -f nginx-deployment.yaml
(三)创建Service
创建nginx-service.yaml文件并应用。
bash
复制
cat > nginx-service.yaml << EOF
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx
name: ssx-nginx-sv
namespace: ssx-nginx-ns
spec:
ports:
- port: 80
name: ssx-nginx-last
protocol: TCP
targetPort: 80
nodePort: 31090
selector:
app: nginx
type: NodePort
EOF
kubectl create -f nginx-service.yaml
十一、验证部署
在master节点执行以下命令,验证集群状态和Nginx服务。
bash
复制
kubectl get nodes
kubectl get pods,svc -n ssx-nginx-ns -owide
# 测试Nginx服务
curl 192.168.32.129:31090
curl 192.168.32.130:31090
十二、总结
通过本指南,您已成功在离线环境下部署了一个完整的Kubernetes集群,包括Master节点、Node节点、容器网络插件、Dashboard以及Nginx服务。您可以根据实际需求进一步扩展和优化集群配置。