Kubernetes集群离线部署指南

一、概述

本文档旨在详细指导如何在离线环境下部署一个Kubernetes集群,采用kubeadm作为部署工具。通过本指南,读者可以完成从环境准备到集群搭建、网络配置以及应用部署的全过程。

二、部署方式选择

本次部署采用kubeadm工具,它提供了kubeadm initkubeadm 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服务。您可以根据实际需求进一步扩展和优化集群配置。