harbor在k8s上的部署
一、环境准备
1.1 确认集群状态
-
Kubernetes 集群已部署(如
kube-apiserver、kube-controller-manager、kube-scheduler、kubelet等组件正常运行)。 -
所有节点(包括 master 和 worker)可以互通,且已安装
nfs-common(用于挂载 NFS)。 -
已安装
helm命令行工具(建议 3.8+)# 在所有节点安装 nfs-common sudo apt update && sudo apt install -y nfs-common
1.2 准备 NFS 服务器
-
在 NFS 服务器上安装并配置:假设 NFS 服务器 IP 为
192.168.0.60,共享目录/srv/nfs/k8s。# 服务端 sudo apt install -y nfs-kernel-server sudo mkdir -p /srv/nfs/k8s sudo chown nobody:nogroup /srv/nfs/k8s sudo chmod 777 /srv/nfs/k8s # 生产环境请按需收紧权限 echo "/srv/nfs/k8s 192.168.0.0/24(rw,sync,no_subtree_check,no_root_squash)" | sudo tee -a /etc/exports sudo exportfs -ra
二、部署 NFS 动态存储供给器(nfs-subdir-external-provisioner)
2.1 使用 Helm 安装
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/ helm repo update helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \ --namespace nfs-provisioner --create-namespace \ --set nfs.server=192.168.0.60 \ --set nfs.path=/srv/nfs/k8s \ --set storageClass.name=nfs-sc \ --set storageClass.defaultClass=true \ --set image.repository=registry.cn-beijing.aliyuncs.com/xngczl/nfs-subdir-external-provisioner \ --set image.tag=v4.0.2
#(若网络可达 k8s.gcr.io,可省略--set image.xxx)
2.2 验证动态存储
kubectl get sc # 应看到 nfs-sc 且标记为 (default) kubectl get pod -n nfs-provisioner # 应处于 Running
三、部署 CoreDNS(二进制集群默认无 DNS)
3.1 下载并修改 CoreDNS 部署文件
wget https://raw.githubusercontent.com/coredns/deployment/master/kubernetes/coredns.yaml.sed -O coredns.yaml
3.2 替换占位符
# 集群域(与 apiserver 参数 --service-cluster-ip-range 对应,默认 cluster.local) sed -i 's/CLUSTER_DOMAIN/cluster.local/g' coredns.yaml # 上游 DNS(根据实际网络环境选择,如 114.114.114.114 或 8.8.8.8) sed -i 's/UPSTREAMNAMESERVER/114.114.114.114/g' coredns.yaml # 将 Service 的 clusterIP 从 CLUSTER_DNS_IP 改为具体 IP(例如 10.96.0.10) sed -i 's/CLUSTER_DNS_IP/10.96.0.10/g' coredns.yaml
3.3 应用 CoreDNS
kubectl apply -f coredns.yaml
3.4 验证 DNS
kubectl get pod -n kube-system -l k8s-app=kube-dns
kubectl get svc -n kube-system kube-dns
3.5 在所有节点配置 kubelet 使用 DNS
#编辑每个节点的 kubelet 启动参数(如 /etc/systemd/system/kubelet.service 或 /etc/default/kubelet),添加: --cluster-dns=10.96.0.10 --cluster-domain=cluster.local
#然后重启
sudo systemctl daemon-reload
sudo systemctl restart kubelet
四、使用 Helm 部署 Harbor(HTTP + NodePort 模式)
4.1 添加 Harbor 仓库并更新
helm repo add harbor https://helm.goharbor.io helm repo update
4.2 创建命名空间并安装 Harbor
# 选择一个节点 IP 作为 externalURL(例如 192.168.0.61) export NODE_IP=192.168.0.61 helm install harbor harbor/harbor \ --namespace harbor --create-namespace \ --set expose.type=nodePort \ --set expose.tls.enabled=false \ --set externalURL=http://$NODE_IP:30002 \ --set persistence.enabled=true \ --set persistence.storageClass=nfs-sc
-
expose.type=nodePort:使用节点端口暴露服务,无需 Ingress。 -
expose.tls.enabled=false:禁用 HTTPS(因无域名和证书)。 -
persistence.storageClass=nfs-sc:使用之前创建的 NFS 动态存储。
4.3 等待部署完成
kubectl get pods -n harbor -w
4.4 配置所有节点支持 HTTP 仓库
由于 Harbor 使用 HTTP,每个节点上的容器运行时需要将其标记为 insecure。
对于 containerd(K8s 节点):
编辑 /etc/containerd/config.toml,在 [plugins."io.containerd.grpc.v1.cri".registry] 部分添加:
[plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."192.168.0.61:30002"] endpoint = ["http://192.168.0.61:30002"] [plugins."io.containerd.grpc.v1.cri".registry.configs] [plugins."io.containerd.grpc.v1.cri".registry.configs."192.168.0.61:30002".tls] insecure_skip_verify = true
重启 containerd:
sudo systemctl restart containerd
对于 Docker(若在节点上使用 docker 命令):
编辑 /etc/docker/daemon.json,添加:
{ "insecure-registries": ["192.168.0.61:30002"] }
重启 Docker:
sudo systemctl restart docker
五、验证 Harbor
5.1 获取访问端口
kubectl get svc -n harbor harbor-portal
5.2 浏览器访问
打开 http://<任一节点IP>:30002,使用默认账号 admin / Harbor12345 登录。
5.3 测试推送镜像
docker login http://192.168.0.61:30002 -u admin -p Harbor12345 docker pull hello-world docker tag hello-world 192.168.0.61:30002/library/hello-world docker push 192.168.0.61:30002/library/hello-world

浙公网安备 33010602011771号