K8S(三)—— 基于kubeadm 1.20版本部署Kubernetes集群与Harbor私有仓库实战

文章目录

  • 前言
  • 一、集群节点规划
    • [1.1 安装步骤](#1.1 安装步骤)
  • 二、所有节点环境准备
    • [2.1 关闭系统安全机制](#2.1 关闭系统安全机制)
    • [2.2 加载IPVS模块](#2.2 加载IPVS模块)
    • [2.3 配置主机名与Hosts映射](#2.3 配置主机名与Hosts映射)
      • [2.3.1 分别设置节点主机名](#2.3.1 分别设置节点主机名)
      • [2.3.2 所有节点配置Hosts映射](#2.3.2 所有节点配置Hosts映射)
    • [2.4 调整内核参数](#2.4 调整内核参数)
  • 三、所有节点安装Docker
    • [3.1 安装Docker依赖与YUM源](#3.1 安装Docker依赖与YUM源)
    • [3.2 安装Docker并配置核心参数](#3.2 安装Docker并配置核心参数)
  • 四、K8S集群节点安装kubeadm、kubelet、kubectl
    • [4.1 添加Kubernetes YUM源](#4.1 添加Kubernetes YUM源)
    • [4.2 安装并配置kubelet](#4.2 安装并配置kubelet)
  • 五、部署Kubernetes集群
    • [5.1 初始化Master节点(仅在master01执行)](#5.1 初始化Master节点(仅在master01执行))
      • [5.1.1 加载K8S镜像(离线/在线两种方式)](#5.1.1 加载K8S镜像(离线/在线两种方式))
      • [5.1.2 方法一:配置文件方式](#5.1.2 方法一:配置文件方式)
        • [5.1.2.1 准备初始化配置文件](#5.1.2.1 准备初始化配置文件)
        • [5.1.2.2 执行Master初始化](#5.1.2.2 执行Master初始化)
      • [5.1.3 方法二:命令行参数方式](#5.1.3 方法二:命令行参数方式)
    • [5.2 配置kubectl命令行工具(仅在master01执行)](#5.2 配置kubectl命令行工具(仅在master01执行))
    • [5.3 部署flannel网络插件(master节点执行)](#5.3 部署flannel网络插件(master节点执行))
      • [5.3.1 方法一:加载flannel镜像(离线方式)](#5.3.1 方法一:加载flannel镜像(离线方式))
      • [5.3.2 方法二:在线拉取yaml(依赖网络)](#5.3.2 方法二:在线拉取yaml(依赖网络))
      • [5.3.3 验证flannel状态](#5.3.3 验证flannel状态)
    • [5.4 Node节点加入集群(仅在node01、node02执行)](#5.4 Node节点加入集群(仅在node01、node02执行))
    • [5.5 验证集群状态(仅在master01执行)](#5.5 验证集群状态(仅在master01执行))
  • 六、集群功能验证(部署Nginx示例)(Master节点执行)
    • [6.1 创建Nginx Deployment](#6.1 创建Nginx Deployment)
    • [6.2 暴露Nginx服务(NodePort类型)](#6.2 暴露Nginx服务(NodePort类型))
    • [6.3 测试服务访问](#6.3 测试服务访问)
    • [6.4 扩展Nginx副本(验证调度功能)](#6.4 扩展Nginx副本(验证调度功能))
  • [七、部署Kubernetes Dashboard(可视化管理)](#七、部署Kubernetes Dashboard(可视化管理))
    • [7.1 准备Dashboard配置文件](#7.1 准备Dashboard配置文件)
    • [7.2 部署Dashboard(仅在master01执行)](#7.2 部署Dashboard(仅在master01执行))
    • [7.3 创建管理员账号并获取Token](#7.3 创建管理员账号并获取Token)
    • [7.4 访问Dashboard](#7.4 访问Dashboard)
  • 八、部署Harbor私有仓库(hub.simon.com)
    • [8.1 环境准备(仅在Harbor节点执行)](#8.1 环境准备(仅在Harbor节点执行))
      • [8.1.1 安装docker-compose](#8.1.1 安装docker-compose)
    • [8.2 配置Harbor证书(仅在Harbor节点执行)](#8.2 配置Harbor证书(仅在Harbor节点执行))
      • [8.2.1 创建证书目录并生成证书](#8.2.1 创建证书目录并生成证书)
    • [8.3 配置并安装Harbor(仅在Harbor节点执行)](#8.3 配置并安装Harbor(仅在Harbor节点执行))
    • [8.4 访问Harbor并上传镜像](#8.4 访问Harbor并上传镜像)
      • [8.4.1 浏览器访问Harbor](#8.4.1 浏览器访问Harbor)
      • [8.4.2 节点登录Harbor并上传镜像](#8.4.2 节点登录Harbor并上传镜像)
      • [8.4.3 K8S使用Harbor镜像部署应用](#8.4.3 K8S使用Harbor镜像部署应用)
  • 总结

前言

随着容器化技术的普及,Kubernetes(简称K8S)已成为容器编排领域的事实标准,而kubeadm作为K8S官方推荐的集群部署工具,能极大简化集群搭建流程。本文基于kubeadm 1.20.11版本,详细讲解从环境准备到K8S集群部署、Dashboard可视化管理、Harbor私有仓库搭建的完整流程,适合刚接触K8S的开发者或运维人员参考。

本文将严格按照"节点规划→环境准备→组件安装→集群部署→功能验证"的逻辑展开,所有节点IP和Harbor域名已根据实际需求调整(master:192.168.10.14,node01:192.168.10.15,node02:192.168.10.16,Harbor:192.168.10.17/hub.simon.com),步骤中涉及的命令均经过验证,可直接复用。

一、集群节点规划

在部署前需明确各节点的角色、硬件配置、IP地址及所需组件,避免后续配置混乱。本次集群规划如下表所示:

节点角色 硬件配置 IP地址 主机名/域名 核心组件
Master节点 2C/4G(≥2核) 192.168.10.14 master01 Docker、kubeadm、kubelet、kubectl、flannel
Node01节点 2C/2G 192.168.10.15 node01 Docker、kubeadm、kubelet、kubectl、flannel
Node02节点 2C/2G 192.168.10.16 node02 Docker、kubeadm、kubelet、kubectl、flannel
Harbor私有仓库 2C/4G 192.168.10.17 hub.simon.com Docker、docker-compose、harbor-offline-v1.9.2

注意:Master节点CPU核心数必须≥2,否则K8S组件(如etcd)无法正常启动;所有节点需处于同一局域网,确保网络互通。

1.1 安装步骤

  1. 在所有节点上安装Docker和kubeadm
  2. 部署Kubernetes Master
  3. 部署容器网络插件
  4. 部署Kubernetes Node,将节点加入Kubernetes集群中
  5. 部署 Dashboard Web页面,可视化查看Kubernetes资源
  6. 部署 Harbor 私有仓库,存放镜像资源

二、所有节点环境准备

环境准备是K8S集群部署的基础,需在master01、node01、node02、Harbor节点上统一执行以下操作,避免因系统配置差异导致部署失败。

2.1 关闭系统安全机制

K8S集群中,防火墙、SELinux会干扰组件间的网络通信,Swap分区会影响K8S对内存的管理,需全部关闭并设置永久生效。

bash 复制代码
# 1. 关闭防火墙(临时+永久)
systemctl stop firewalld
systemctl disable firewalld

# 2. 关闭SELinux(临时+永久)
setenforce 0  # 临时关闭
sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久关闭(重启生效)

# 3. 清空iptables规则(避免遗留规则干扰)
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

# 4. 关闭Swap分区(临时+永久)
swapoff -a  # 临时关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab  # 永久关闭(&代表匹配到的Swap行)

2.2 加载IPVS模块

K8S的kube-proxy支持iptables和IPVS两种模式,IPVS在负载均衡性能上更优(支持更多调度算法),需提前加载IPVS相关内核模块。

bash 复制代码
# 遍历IPVS模块并加载
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done

2.3 配置主机名与Hosts映射

为方便节点间通过主机名通信,需为每个节点设置唯一主机名,并在所有节点配置Hosts映射。

2.3.1 分别设置节点主机名

  • Master节点(192.168.10.14)

    bash 复制代码
    hostnamectl set-hostname master01
  • Node01节点(192.168.10.15)

    bash 复制代码
    hostnamectl set-hostname node01
  • Node02节点(192.168.10.16)

    bash 复制代码
    hostnamectl set-hostname node02
  • Harbor节点(192.168.10.17)

    bash 复制代码
    hostnamectl set-hostname hub.simon.com

2.3.2 所有节点配置Hosts映射

编辑/etc/hosts文件,添加以下内容(确保所有节点的Hosts一致):

bash 复制代码
vim /etc/hosts
# 添加以下行
192.168.10.14 master01
192.168.10.15 node01
192.168.10.16 node02
192.168.10.17 hub.simon.com

2.4 调整内核参数

K8S对Linux内核有特定要求(如开启网桥模式、关闭IPv6等),需通过配置文件设置内核参数并生效。

bash 复制代码
# 1. 创建内核参数配置文件
cat > /etc/sysctl.d/kubernetes.conf << EOF
# 开启网桥模式:将网桥流量传递给iptables链
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
# 关闭IPv6协议(避免干扰K8S网络)
net.ipv6.conf.all.disable_ipv6=1
# 开启IP转发(容器间通信需依赖)
net.ipv4.ip_forward=1
EOF
================================================================
cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF
================================================================
# 2. 生效内核参数
sysctl --system

三、所有节点安装Docker

Docker是K8S的容器运行时(kubeadm 1.24+推荐containerd,但1.20版本仍以Docker为主),需在所有节点安装并配置符合K8S要求的参数。

3.1 安装Docker依赖与YUM源

bash 复制代码
# 1. 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2 

# 2. 添加阿里云Docker YUM源(国内源速度更快)
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 

3.2 安装Docker并配置核心参数

bash 复制代码
# 1. 安装Docker(默认安装最新稳定版,如需指定版本可加版本号,如docker-ce-20.10.18)
yum install -y docker-ce-20.10.18 docker-ce-cli-20.10.18 containerd.io

# 2. 创建Docker配置目录
mkdir /etc/docker

# 3. 配置Docker daemon(关键参数说明如下)
cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://0a40cefd360026b40f39c00627fa6f20.mirror.swr.myhuaweicloud.com"],  # 华为云镜像加速(国内拉取镜像更快)
  "exec-opts": ["native.cgroupdriver=systemd"],  # Cgroup驱动为systemd(与K8S的kubelet匹配)
  "log-driver": "json-file",  # 日志存储格式(方便ELK收集)
  "log-opts": {
    "max-size": "100m"  # 单日志文件最大100M(避免日志占满磁盘)
  },
  "insecure-registries": ["https://hub.simon.com"]  # 信任Harbor私有仓库(后续Harbor部署需用到)
}
EOF
# 使用Systemd管理的Cgroup来进行资源控制与管理,因为相对Cgroupfs而言,Systemd限制CPU、内存等资源更加简单和成熟稳定。
# 日志使用json-file格式类型存储,大小为100M,保存在/var/log/containers目录下,方便ELK等日志系统收集和管理日志。
================================================================
mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://0a40cefd360026b40f39c00627fa6f20.mirror.swr.myhuaweicloud.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "insecure-registries": ["https://hub.simon.com"]
}
EOF
================================================================

# 4. 重启Docker并设置开机自启
systemctl daemon-reload
systemctl restart docker.service
systemctl enable docker.service

# 5. 验证Docker配置(确保Cgroup Driver为systemd)
docker info | grep "Cgroup Driver"
# 预期输出:Cgroup Driver: systemd

四、K8S集群节点安装kubeadm、kubelet、kubectl

kubeadm是K8S集群部署工具,kubelet是节点上的核心组件(管理Pod生命周期),kubectl是K8S命令行工具,需在所有节点安装指定版本(1.20.11)。

4.1 添加Kubernetes YUM源

使用阿里云K8S源(国内源避免拉取失败):

bash 复制代码
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

4.2 安装并配置kubelet

bash 复制代码
# 1. 安装指定版本(1.20.11)的kubeadm、kubelet、kubectl
yum install -y kubelet-1.20.11 kubeadm-1.20.11 kubectl-1.20.11

# 2. 设置kubelet开机自启(K8S组件以Pod运行,依赖kubelet启动)
systemctl enable kubelet.service

# 3. 验证版本(确保三者版本一致)
kubeadm version && kubelet --version && kubectl version --client

五、部署Kubernetes集群

集群部署的核心是初始化Master节点,再将Node节点加入集群,最后部署网络插件(flannel)确保Pod间通信。

5.1 初始化Master节点(仅在master01执行)

kubeadm初始化支持配置文件命令行参数两种方式,本文推荐配置文件方式(更灵活,便于后续修改)。

5.1.1 加载K8S镜像(离线/在线两种方式)

K8S初始化需拉取多个核心镜像(如etcd、api-server),国内网络可能拉取失败,推荐两种方式:

  • 方式1:离线加载(推荐,速度快)

    1. 查看初始化需要的镜像

      bash 复制代码
      kubeadm config images list
    2. v1.20.11.zip压缩包(包含所有K8S核心镜像)上传至master01的/opt目录;

    3. 解压并加载镜像:

      bash 复制代码
      unzip v1.20.11.zip -d /opt/k8s
      cd /opt/k8s/v1.20.11
      # 批量加载镜像
      for i in $(ls *.tar); do docker load -i $i; done
    4. 将镜像目录复制到node01、node02节点并加载:

      bash 复制代码
      scp -r /opt/k8s root@node01:/opt
      scp -r /opt/k8s root@node02:/opt
      # 在node01、node02节点执行加载命令(同master步骤2)
      cd /opt/k8s/v1.20.11
      # 批量加载镜像
      for i in $(ls *.tar); do docker load -i $i; done
  • 方式2:在线拉取(依赖网络)

    若网络允许,可通过初始化命令自动拉取(配置文件中已指定阿里云镜像源),无需手动加载。

5.1.2 方法一:配置文件方式

5.1.2.1 准备初始化配置文件
bash 复制代码
# 1. 生成默认初始化配置文件
kubeadm config print init-defaults > /opt/kubeadm-config.yaml

# 2. 编辑配置文件(关键参数修改如下)
vim /opt/kubeadm-config.yaml

需修改的核心参数(按行号或关键字查找):

yaml 复制代码
# 1. 指定Master节点IP(192.168.10.14)
localAPIEndpoint:
  advertiseAddress: 192.168.10.14  # 修改为master01的IP
  bindPort: 6443  # API Server默认端口

# 2. 指定K8S版本(与安装的kubeadm版本一致)
kubernetesVersion: v1.20.11

# 3. 指定网络网段(需与flannel插件匹配)
networking:
  dnsDomain: cluster.local  # 默认DNS域名
  podSubnet: "10.244.0.0/16"  # flannel默认Pod网段,不可修改
  serviceSubnet: 10.96.0.0/16  # Service网段(默认即可)

# 4. 在文件末尾添加kube-proxy配置(启用IPVS模式)
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs  # 替换默认的iptables模式为IPVS
5.1.2.2 执行Master初始化
bash 复制代码
# 执行初始化并记录日志(日志用于后续排查问题)
kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log

# --experimental-upload-certs 参数可以在后续执行加入节点时自动分发证书文件,K8S V1.16版本开始替换为 --upload-certs
# tee kubeadm-init.log 用以输出日志

# 查看初始化日志(可选,确认是否有报错)
less kubeadm-init.log

# kubernetes配置文件目录
ls /etc/kubernetes/

# 存放ca等证书和密码的目录
ls /etc/kubernetes/pki	

初始化成功后,会输出Node节点加入集群的命令(需复制保存,后续使用),类似如下:

bash 复制代码
kubeadm join 192.168.10.14:6443 --token xxxxx.xxxxxxxxxx \
    --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


5.1.3 方法二:命令行参数方式

bash 复制代码
kubeadm init \
--apiserver-advertise-address=192.168.10.14 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.20.11 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--token-ttl=0

--------------------------------------------------------------------------------------------
初始化集群需使用kubeadm init命令,可以指定具体参数初始化,也可以指定配置文件初始化。
可选参数:
--apiserver-advertise-address:apiserver通告给其他组件的IP地址,一般应该为Master节点的用于集群内部通信的IP地址,0.0.0.0表示节点上所有可用地址
--apiserver-bind-port:apiserver的监听端口,默认是6443
--cert-dir:通讯的ssl证书文件,默认/etc/kubernetes/pki
--control-plane-endpoint:控制台平面的共享终端,可以是负载均衡的ip地址或者dns域名,高可用集群时需要添加
--image-repository:拉取镜像的镜像仓库,默认是k8s.gcr.io
--kubernetes-version:指定kubernetes版本
--pod-network-cidr:pod资源的网段,需与pod网络插件的值设置一致。Flannel网络插件的默认为10.244.0.0/16,Calico插件的默认值为192.168.0.0/16;
--service-cidr:service资源的网段
--service-dns-domain:service全域名的后缀,默认是cluster.local
--token-ttl:默认token的有效期为24小时,如果不想过期,可以加上 --token-ttl=0 这个参数
---------------------------------------------------------------------------------------------

# 方法二初始化后需要修改 kube-proxy 的 configmap,开启 ipvs

kubectl edit cm kube-proxy -n=kube-system
修改mode: ipvs

5.2 配置kubectl命令行工具(仅在master01执行)

kubectl需通过API Server认证才能管理集群,需加载管理员配置文件:

bash 复制代码
# 1. 创建kubectl配置目录
mkdir -p $HOME/.kube

# 2. 复制管理员配置文件(kubeadm初始化时自动生成)
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

# 3. 设置权限(确保当前用户可访问)
chown $(id -u):$(id -g) $HOME/.kube/config

# 4. 验证kubectl(查看集群组件状态)
kubectl get cs
# 预期输出:controller-manager、scheduler、etcd均为Healthy

kubectl get cs显示组件不健康(如Unhealthy),需修改schedulercontroller-manager的配置文件,将--bind-address=127.0.0.1改为192.168.10.14,并注释--port=0,然后重启kubelet:

bash 复制代码
vim /etc/kubernetes/manifests/kube-scheduler.yaml
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
# 修改如下内容
把--bind-address=127.0.0.1变成--bind-address=192.168.10.14		#修改成k8s的控制节点master01的ip
把httpGet:字段下的hosts由127.0.0.1变成192.168.10.14(有两处)
#- --port=0					# 搜索port=0,把这一行注释掉
systemctl restart kubelet

5.3 部署flannel网络插件(master节点执行)

flannel是K8S常用的网络插件,负责Pod间的跨节点通信,需在所有节点加载flannel镜像,并在master节点创建资源。

5.3.1 方法一:加载flannel镜像(离线方式)

所有节点上传flannel镜像 flannel.tar/opt 目录,master节点上传 kube-flannel.yml 文件

bash 复制代码
# 所有节点执行
cd /opt
docker load < flannel-v0.22.2.tar
docker load < flannel-cni-v1.2.0.tar

# 在 master 节点创建 flannel 资源
kubectl apply -f kube-flannel.yml 

5.3.2 方法二:在线拉取yaml(依赖网络)

bash 复制代码
# 方式2:在线拉取yaml(依赖网络)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
或者
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

5.3.3 验证flannel状态

bash 复制代码
# 验证flannel状态(确保节点的flannel Pod为Running)
kubectl get pods -A
# 验证节点状态为Ready
kubectl get node


5.4 Node节点加入集群(仅在node01、node02执行)

在node01、node02节点执行Master初始化时输出的kubeadm join命令(若忘记命令,可在master节点执行tail kubeadm-init.log查看):

bash 复制代码
# 替换为实际的join命令(token和hash需与master输出一致)
kubeadm join 192.168.10.14:6443 --token xxxxx.xxxxxxxxxx \
    --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

5.5 验证集群状态(仅在master01执行)

bash 复制代码
# 1. 查看节点状态(所有节点应为Ready)
kubectl get nodes
# 预期输出:master01、node01、node02均为Ready

# 2. 查看所有系统组件Pod(均为Running)
kubectl get pods -n kube-system


六、集群功能验证(部署Nginx示例)(Master节点执行)

为确保集群正常工作,部署Nginx应用并暴露服务,验证Pod创建、服务访问、副本扩展功能。

6.1 创建Nginx Deployment

bash 复制代码
# 创建Nginx部署(--image指定镜像,默认拉取Docker Hub的nginx:latest)
kubectl create deployment nginx --image=nginx

# 查看Pod状态(确保为Running)
kubectl get pods -o wide

6.2 暴露Nginx服务(NodePort类型)

NodePort类型可通过节点IP+端口访问服务:

bash 复制代码
# 暴露80端口,类型为NodePort
kubectl expose deployment nginx --port=80 --type=NodePort

# 查看服务状态(获取NodePort端口,如30456)
kubectl get svc
# 预期输出:nginx服务的PORT(S)为80:30456/TCP(30456为随机端口)

6.3 测试服务访问

通过任意节点的IP+NodePort访问Nginx:

bash 复制代码
# 示例:访问node01的32404端口
curl http://192.168.10.15:30456
# 预期输出:Nginx默认首页HTML内容

6.4 扩展Nginx副本(验证调度功能)

bash 复制代码
# 扩展副本数为3(Pod会分布在不同Node节点)
kubectl scale deployment nginx --replicas=3

# 查看副本状态(3个Pod均为Running,分布在node01、node02)
kubectl get pods -o wide

七、部署Kubernetes Dashboard(可视化管理)

Dashboard是K8S官方的Web可视化工具,可方便查看集群资源、部署应用,需在master节点部署并配置访问权限。

7.1 准备Dashboard配置文件

  1. recommended.yaml上传至master01的/opt/k8s目录;

  2. 编辑文件,将Service改为NodePort类型(默认仅集群内部可访问):

    bash 复制代码
    vim /opt/k8s/recommended.yaml

修改Service部分(搜索kind: Servicename: kubernetes-dashboard):

yaml 复制代码
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30000  # 添加NodePort端口(30000-32767之间)
  type: NodePort  # 添加类型为NodePort
  selector:
    k8s-app: kubernetes-dashboard

7.2 部署Dashboard(仅在master01执行)

bash 复制代码
kubectl apply -f /opt/k8s/recommended.yaml

# 验证Dashboard Pod状态(确保为Running)
kubectl get pods -n kubernetes-dashboard

# 查看 Service(确认 NodePort 已生效)
kubectl get svc -n kubernetes-dashboard


7.3 创建管理员账号并获取Token

Dashboard默认无访问权限,需创建ServiceAccount并绑定cluster-admin角色:

bash 复制代码
# 1. 创建ServiceAccount(dashboard-admin)
kubectl create serviceaccount dashboard-admin -n kube-system

# 2. 绑定cluster-admin角色(授予管理员权限)
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin

# 3. 获取Token(用于登录Dashboard)
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

复制输出中的token字段值(长字符串),用于后续登录。

7.4 访问Dashboard

  1. 打开浏览器,访问https://<任意节点IP>:30000(如https://192.168.10.14:30000);
  2. 选择"Token"登录,粘贴步骤7.3获取的Token,点击"登录";
  3. 登录后可查看集群节点、Pod、Service等资源,实现可视化管理。


八、部署Harbor私有仓库(hub.simon.com

Harbor是企业级Docker私有仓库,用于存储K8S集群所需的镜像(避免依赖外部仓库),需在Harbor节点(192.168.10.17)部署。

8.1 环境准备(仅在Harbor节点执行)

Harbor依赖Docker和docker-compose,已在步骤二、三完成Docker安装,需额外安装docker-compose。

8.1.1 安装docker-compose

1、将docker-compose二进制文件上传至Harbor节点的/opt目录;

2、移动到/usr/local/bin并赋予执行权限:

bash 复制代码
cp /opt/docker-compose /usr/local/bin/
chmod +x /usr/local/bin/docker-compose

# 验证版本
docker-compose --version

8.2 配置Harbor证书(仅在Harbor节点执行)

Harbor需HTTPS访问,需生成自签名证书(生产环境建议使用CA签发证书)。

8.2.1 创建证书目录并生成证书

bash 复制代码
# 1. 创建证书目录
mkdir -p /data/cert && cd /data/cert

# 2. 生成私钥(输入密码,如123456)
openssl genrsa -des3 -out server.key 2048

# 3. 生成证书签名请求(CSR)
openssl req -new -key server.key -out server.csr
# 按提示输入信息(关键:Common Name需为Harbor域名hub.simon.com):
# Country Name: CN
# State or Province Name: BJ
# Locality Name: BJ
# Organization Name: simon
# Organizational Unit Name: simon
# Common Name: hub.simon.com(必须与Harbor域名一致)
# Email Address: admin@simon.com
# 其他直接回车

# 4. 备份私钥并清除密码(Harbor不支持带密码的私钥)
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key  # 输入之前设置的密码123456

# 5. 生成自签名证书(有效期1000天)
openssl x509 -req -days 1000 -in server.csr -signkey server.key -out server.crt

# 6. 赋予证书权限
chmod +x /data/cert/*

8.3 配置并安装Harbor(仅在Harbor节点执行)

1、将harbor-offline-installer-v1.9.2.tgz上传至Harbor节点的/opt目录;

2、解压并编辑配置文件:

bash 复制代码
# 1. 解压安装包
tar zxvf /opt/harbor-offline-installer-v1.9.2.tgz -C /opt/
cd /opt/harbor/

# 2. 编辑Harbor配置文件
vim harbor.yml

修改核心配置(按行号查找):

ini 复制代码
# 第5行:修改主机名
hostname: hub.benet.com  # 原配置:reg.mydomain.com

# 第8-10行:http配置保持默认
http:
  # port for http, default is 80. If https enabled, this port will redirect to https port
  port: 80

# 第13-17行:启用并配置HTTPS(取消注释并修改)
https:  # 原配置:被注释状态
  # https port for harbor, default is 443
  port: 443  # 原配置:被注释状态
  # The path of cert and key files for nginx
  certificate: /data/cert/server.crt  # 原配置:/your/certificate/path
  private_key: /data/cert/server.key  # 原配置:/your/private/key/path

# 第26行:管理员密码配置(保持或修改)
harbor_admin_password: Harbor12345  # 可根据需要修改密码

3、执行安装:

bash 复制代码
./prepare
./install.sh

8.4 访问Harbor并上传镜像

8.4.1 浏览器访问Harbor

  1. 打开浏览器,访问https://hub.simon.com
  2. 点击"高级"→"添加例外"(自签名证书需信任);
  3. 登录:用户名admin,密码Harbor12345
  4. 登录后创建library项目(默认已存在,用于存储公共镜像)。

8.4.2 节点登录Harbor并上传镜像

在任意Node节点(如node01)登录Harbor,并上传Nginx镜像:

bash 复制代码
# 1. 登录Harbor(输入用户名admin,密码Harbor12345)
docker login -u admin -p Harbor12345 https://hub.simon.com

# 2. 给本地Nginx镜像打标签(格式:Harbor域名/项目名/镜像名:版本)
docker tag nginx:latest hub.simon.com/library/nginx:v1

# 3. 上传镜像到Harbor
docker push hub.simon.com/library/nginx:v1


8.4.3 K8S使用Harbor镜像部署应用

在master节点删除之前的Nginx部署,使用Harbor镜像重新部署:

bash 复制代码
# 1. 删除旧部署
kubectl delete deployment nginx

# 2. 使用Harbor镜像创建部署(3个副本,暴露80端口)
kubectl create deployment nginx-harbor --image=hub.simon.com/library/nginx:v1 --port=80 --replicas=3

# 3. 暴露服务(NodePort类型)
kubectl expose deployment nginx-harbor --port=80 --type=NodePort

# 4. 验证部署(Pod正常运行,服务可访问)
kubectl get pods -o wide
kubectl get svc nginx-harbor
# 浏览器访问:http://<节点IP>:<NodePort>(如http://192.168.10.15:30199)


总结

本文详细讲解了基于kubeadm 1.20.11版本部署K8S集群的完整流程,从环境准备、组件安装到集群部署、功能验证,再到Dashboard可视化和Harbor私有仓库搭建,覆盖了企业级K8S集群的核心需求。

关键注意事项

  1. 环境一致性:所有节点的系统配置(防火墙、SELinux、Swap、内核参数)必须统一,避免集群通信或组件启动失败;
  2. 版本匹配:kubeadm、kubelet、kubectl版本需一致,且与K8S集群版本匹配(本文为1.20.11);
  3. 网络插件:flannel的Pod网段(10.244.0.0/16)需与kubeadm初始化配置一致,否则Pod无法跨节点通信;
  4. Harbor配置 :所有节点需在Docker daemon中添加Harbor为信任仓库(insecure-registries),否则无法拉取镜像。

后续扩展方向

  • 集群高可用:添加多个Master节点,配合负载均衡器(如HAProxy)实现API Server高可用;
  • 存储配置:集成PersistentVolume(PV)、PersistentVolumeClaim(PVC),实现Pod数据持久化;
  • 监控告警:部署Prometheus+Grafana监控集群资源,配置AlertManager实现告警;
  • 日志收集:部署ELK(Elasticsearch+Logstash+Kibana)收集Pod日志,便于问题排查。

希望本文能帮助读者快速掌握K8S集群部署技能,如有问题可在评论区留言交流!

相关推荐
IvanCodes3 小时前
七、Docker核心技术:深入理解网络模式 (Bridge, Host, None, Container)
网络·docker·容器
荣光波比4 小时前
K8S(二)—— K8S 1.28 集群部署指南(kubeadm 方式)
云原生·容器·kubernetes
问道飞鱼5 小时前
【Kubernets进阶】Kubernetes VPA (Vertical Pod Autoscaler) 详解与配置指南
云原生·容器·kubernetes·vpa
Light606 小时前
领码方案|微服务与SOA的世纪对话(7):运营降本增效——智能架构时代的成本与服务管理
微服务·云原生·ai ops·成本边界·slo/sli·容量预测·成本治理
Vio7256 小时前
微服务基础:远程调用的基本使用详解
微服务·云原生·架构
Roam-G7 小时前
在 Mac 上使用 Docker 安装 Milvus 2.6.2
docker·容器·milvus
敲上瘾8 小时前
Docker镜像构建指南:Dockerfile语法与docker build命令全解析
linux·服务器·docker·微服务·容器
YC运维12 小时前
Dockerfile实战案例详解
运维·docker·容器
分布式存储与RustFS13 小时前
告别手动配置:用 Terraform 定义你的 RustFS 存储帝国
云原生·wpf·文件系统·terraform·对象存储·minio·rustfs