harbor在k8s上的部署

一、环境准备

1.1 确认集群状态

  • Kubernetes 集群已部署(如 kube-apiserverkube-controller-managerkube-schedulerkubelet 等组件正常运行)。

  • 所有节点(包括 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.1148.8.8.8sed -i 's/UPSTREAMNAMESERVER/114.114.114.114/g' coredns.yaml

# 将 Service 的 clusterIP 从 CLUSTER_DNS_IP 改为具体 IP(例如 10.96.0.10sed -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

 

 
posted @ 2026-03-08 22:00  teiperfly  阅读(6)  评论(0)    收藏  举报