K8S(三)—— 基于kubeadm 1.20版本部署Kubernetes集群与Harbor私有仓库实战
文章目录
- 前言
- 一、集群节点规划
- 1.1 安装步骤
- 二、所有节点环境准备
- 2.1 关闭系统安全机制
- 2.2 加载IPVS模块
- 2.3 配置主机名与Hosts映射
- 2.3.1 分别设置节点主机名
- 2.3.2 所有节点配置Hosts映射
- 2.4 调整内核参数
- 三、所有节点安装Docker
- 3.1 安装Docker依赖与YUM源
- 3.2 安装Docker并配置核心参数
- 四、K8S集群节点安装kubeadm、kubelet、kubectl
- 4.1 添加Kubernetes YUM源
- 4.2 安装并配置kubelet
- 五、部署Kubernetes集群
- 5.1 初始化Master节点(仅在master01执行)
- 5.1.1 加载K8S镜像(离线/在线两种方式)
- 5.1.2 方法一:配置文件方式
- 5.1.2.1 准备初始化配置文件
- 5.1.2.2 执行Master初始化
- 5.1.3 方法二:命令行参数方式
- 5.2 配置kubectl命令行工具(仅在master01执行)
- 5.3 部署flannel网络插件(master节点执行)
- 5.3.1 方法一:加载flannel镜像(离线方式)
- 5.3.2 方法二:在线拉取yaml(依赖网络)
- 5.3.3 验证flannel状态
- 5.4 Node节点加入集群(仅在node01、node02执行)
- 5.5 验证集群状态(仅在master01执行)
- 六、集群功能验证(部署Nginx示例)(Master节点执行)
- 6.1 创建Nginx Deployment
- 6.2 暴露Nginx服务(NodePort类型)
- 6.3 测试服务访问
- 6.4 扩展Nginx副本(验证调度功能)
- 七、部署Kubernetes Dashboard(可视化管理)
- 7.1 准备Dashboard配置文件
- 7.2 部署Dashboard(仅在master01执行)
- 7.3 创建管理员账号并获取Token
- 7.4 访问Dashboard
- 八、部署Harbor私有仓库(hub.simon.com)
- 8.1 环境准备(仅在Harbor节点执行)
- 8.1.1 安装docker-compose
- 8.2 配置Harbor证书(仅在Harbor节点执行)
- 8.2.1 创建证书目录并生成证书
- 8.3 配置并安装Harbor(仅在Harbor节点执行)
- 8.4 访问Harbor并上传镜像
- 8.4.1 浏览器访问Harbor
- 8.4.2 节点登录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 安装步骤
- 在所有节点上安装Docker和kubeadm
- 部署Kubernetes Master
- 部署容器网络插件
- 部署Kubernetes Node,将节点加入Kubernetes集群中
- 部署 Dashboard Web页面,可视化查看Kubernetes资源
- 部署 Harbor 私有仓库,存放镜像资源
二、所有节点环境准备
环境准备是K8S集群部署的基础,需在master01、node01、node02、Harbor节点上统一执行以下操作,避免因系统配置差异导致部署失败。
2.1 关闭系统安全机制
K8S集群中,防火墙、SELinux会干扰组件间的网络通信,Swap分区会影响K8S对内存的管理,需全部关闭并设置永久生效。
# 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相关内核模块。
# 遍历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):
hostnamectl set-hostname master01
- Node01节点(192.168.10.15):
hostnamectl set-hostname node01
- Node02节点(192.168.10.16):
hostnamectl set-hostname node02
- Harbor节点(192.168.10.17):
hostnamectl set-hostname hub.simon.com
2.3.2 所有节点配置Hosts映射
编辑/etc/hosts
文件,添加以下内容(确保所有节点的Hosts一致):
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等),需通过配置文件设置内核参数并生效。
# 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源
# 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并配置核心参数
# 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源(国内源避免拉取失败):
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
# 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:离线加载(推荐,速度快)
-
查看初始化需要的镜像
kubeadm config images list
-
将
v1.20.11.zip
压缩包(包含所有K8S核心镜像)上传至master01的/opt
目录; -
解压并加载镜像:
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
-
将镜像目录复制到node01、node02节点并加载:
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 准备初始化配置文件
# 1. 生成默认初始化配置文件
kubeadm config print init-defaults > /opt/kubeadm-config.yaml# 2. 编辑配置文件(关键参数修改如下)
vim /opt/kubeadm-config.yaml
需修改的核心参数(按行号或关键字查找):
# 1. 指定Master节点IP(192.168.10.14)
localAPIEndpoint:advertiseAddress: 192.168.10.14 # 修改为master01的IPbindPort: 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初始化
# 执行初始化并记录日志(日志用于后续排查问题)
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节点加入集群的命令(需复制保存,后续使用),类似如下:
kubeadm join 192.168.10.14:6443 --token xxxxx.xxxxxxxxxx \--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
5.1.3 方法二:命令行参数方式
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,开启 ipvskubectl edit cm kube-proxy -n=kube-system
修改mode: ipvs
5.2 配置kubectl命令行工具(仅在master01执行)
kubectl需通过API Server认证才能管理集群,需加载管理员配置文件:
# 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),需修改scheduler
和controller-manager
的配置文件,将--bind-address=127.0.0.1
改为192.168.10.14
,并注释--port=0
,然后重启kubelet: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
文件
# 所有节点执行
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(依赖网络)
# 方式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状态
# 验证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
查看):
# 替换为实际的join命令(token和hash需与master输出一致)
kubeadm join 192.168.10.14:6443 --token xxxxx.xxxxxxxxxx \--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
5.5 验证集群状态(仅在master01执行)
# 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
# 创建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+端口访问服务:
# 暴露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:
# 示例:访问node01的32404端口
curl http://192.168.10.15:30456
# 预期输出:Nginx默认首页HTML内容
6.4 扩展Nginx副本(验证调度功能)
# 扩展副本数为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配置文件
- 将
recommended.yaml
上传至master01的/opt/k8s
目录; - 编辑文件,将Service改为NodePort类型(默认仅集群内部可访问):
vim /opt/k8s/recommended.yaml
修改Service部分(搜索kind: Service
和name: kubernetes-dashboard
):
kind: Service
apiVersion: v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard
spec:ports:- port: 443targetPort: 8443nodePort: 30000 # 添加NodePort端口(30000-32767之间)type: NodePort # 添加类型为NodePortselector:k8s-app: kubernetes-dashboard
7.2 部署Dashboard(仅在master01执行)
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
角色:
# 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
- 打开浏览器,访问
https://<任意节点IP>:30000
(如https://192.168.10.14:30000
); - 选择“Token”登录,粘贴步骤7.3获取的Token,点击“登录”;
- 登录后可查看集群节点、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
并赋予执行权限:
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 创建证书目录并生成证书
# 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、解压并编辑配置文件:
# 1. 解压安装包
tar zxvf /opt/harbor-offline-installer-v1.9.2.tgz -C /opt/
cd /opt/harbor/# 2. 编辑Harbor配置文件
vim harbor.yml
修改核心配置(按行号查找):
# 第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 portport: 80# 第13-17行:启用并配置HTTPS(取消注释并修改)
https: # 原配置:被注释状态# https port for harbor, default is 443port: 443 # 原配置:被注释状态# The path of cert and key files for nginxcertificate: /data/cert/server.crt # 原配置:/your/certificate/pathprivate_key: /data/cert/server.key # 原配置:/your/private/key/path# 第26行:管理员密码配置(保持或修改)
harbor_admin_password: Harbor12345 # 可根据需要修改密码
3、执行安装:
./prepare
./install.sh
8.4 访问Harbor并上传镜像
8.4.1 浏览器访问Harbor
- 打开浏览器,访问
https://hub.simon.com
; - 点击“高级”→“添加例外”(自签名证书需信任);
- 登录:用户名
admin
,密码Harbor12345
; - 登录后创建
library
项目(默认已存在,用于存储公共镜像)。
8.4.2 节点登录Harbor并上传镜像
在任意Node节点(如node01)登录Harbor,并上传Nginx镜像:
# 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镜像重新部署:
# 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集群的核心需求。
关键注意事项
- 环境一致性:所有节点的系统配置(防火墙、SELinux、Swap、内核参数)必须统一,避免集群通信或组件启动失败;
- 版本匹配:kubeadm、kubelet、kubectl版本需一致,且与K8S集群版本匹配(本文为1.20.11);
- 网络插件:flannel的Pod网段(10.244.0.0/16)需与kubeadm初始化配置一致,否则Pod无法跨节点通信;
- Harbor配置:所有节点需在Docker daemon中添加Harbor为信任仓库(
insecure-registries
),否则无法拉取镜像。
后续扩展方向
- 集群高可用:添加多个Master节点,配合负载均衡器(如HAProxy)实现API Server高可用;
- 存储配置:集成PersistentVolume(PV)、PersistentVolumeClaim(PVC),实现Pod数据持久化;
- 监控告警:部署Prometheus+Grafana监控集群资源,配置AlertManager实现告警;
- 日志收集:部署ELK(Elasticsearch+Logstash+Kibana)收集Pod日志,便于问题排查。
希望本文能帮助读者快速掌握K8S集群部署技能,如有问题可在评论区留言交流!