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集群部署技能,如有问题可在评论区留言交流!

相关推荐
阿里云云原生18 小时前
不改代码也能监控 AI Agent?揭秘 OBI 如何在内核层精准解析 GenAI 语义流量
云原生·agent
众人皆醒我独醉18 小时前
Pod 一直 Terminating,死活删不掉?三个凶手,每一个你都意想不到
面试·kubernetes
飞翔沫沫情20 小时前
K8s Alloy 采集 Pod 控制台日志
云原生·容器·kubernetes
潮起鲸落入海1 天前
Kubernetes Metric Server, Quota and Limits
容器·kubernetes
梦想的颜色1 天前
Docker 容器化本地部署 Claude Code 完整硬核教程|隔离沙盒 + 国产模型直连 + 持久化 Skill
运维·容器·ai 工程化·沙盒隔离·docker 本地部署·claude code硬核实战·国内国产模型接入
摇滚侠1 天前
云原生 Java 架构师的第一课 K8s+Docker+KubeSphere+DevOps 19-25
java·云原生·kubernetes
渣渣盟1 天前
Docker 运维常用命令手册(含扩容与实战)
运维·docker·容器
我叫张小白。1 天前
一个微服务电商+社区项目(瓷韵app)的技术深度复盘
docker·微服务·云原生·架构
咕噜咕噜的猪大侠1 天前
《K8s 核心知识梳理:Deployment 滚动更新、JobCronJob、DaemonSet 和 Service》
云原生·容器·kubernetes
虚心的百褶裙1 天前
远程调用服务架构设计及zookeeper技术详解(下篇)
分布式·zookeeper·云原生