文章目录
1、环境准备
1.1、k8s环境安装
服务器角色 | 地址 |
---|---|
master | 192.168.31.11 |
node | 192.168.31.21 |
node | 192.168.31.22 |
node | 192.168.31.23 |
暂时还没写,后面补充
1.2、nfs服务安装
搭建一个测试使用的nfs-server,实际生产环境使用现有的即可,这里只是演示使用
git文档:https://github.com/kubernetes-csi/csi-driver-nfs/blob/master/deploy/example/nfs-provisioner/README.md
kubectl create namespace nfs
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/deploy/example/nfs-provisioner/nfs-server.yaml --namespace nfs
# 查看容器是否运行
kubectl get pod -nfs
apiVersion: v1
metadata:
name: nfs-server
labels:
app: nfs-server # 定义服务的标签为 app: nfs-server
spec:
type: ClusterIP # 使用 "LoadBalancer" 类型可获取公共 IP 地址
selector:
app: nfs-server # 选择与服务关联的 Pod 的标签为 app: nfs-server
ports:
- name: tcp-2049
port: 2049
protocol: TCP
- name: udp-111
port: 111
protocol: UDP
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: nfs-server
spec:
replicas: 1 # 指定副本数量为 1
selector:
matchLabels:
app: nfs-server # 选择要管理的 Pod 的标签为 app: nfs-server
template:
metadata:
name: nfs-server
labels:
app: nfs-server # 定义 Pod 的标签为 app: nfs-server
spec:
nodeSelector:
"kubernetes.io/os": linux # 指定 Pod 只能在具有特定标签的节点上运行
containers:
- name: nfs-server
image: itsthenetwork/nfs-server-alpine:latest # 使用 NFS 服务器的镜像
env:
- name: SHARED_DIRECTORY
value: "/exports" # 指定共享目录为 /exports
volumeMounts:
- mountPath: /exports
name: nfs-vol # 挂载到容器中的卷的名称为 nfs-vol
securityContext:
privileged: true # 将容器设置为特权模式
ports:
- name: tcp-2049
containerPort: 2049
protocol: TCP
- name: udp-111
containerPort: 111
protocol: UDP
volumes:
- name: nfs-vol
hostPath:
path: /nfs-vol # 修改此处以指定存储 NFS 共享数据的路径
type: DirectoryOrCreate # 如果路径不存在,则创建它
1.3、nfs-csi安装
部分镜像无法下载,可以使用神奇的魔法下载,或者使用阿里云新建香港服务器下载镜像后,统一上传到阿里云的私有仓库,这里使用私有仓库方式下载
见链接:
git文档:https://github.com/kubernetes-csi/csi-driver-nfs/blob/master/docs/install-csi-driver-v4.5.0.md
# 使用代理下载
git clone https://mirror.ghproxy.com/https://github.com/kubernetes-csi/csi-driver-nfs.git
#这里修改v4.5.0的版本
cd csi-driver-nfs/
# 修改默认镜像仓库到自己的私有仓库(需要提前上传好对应的镜像xxxx为仓库名称)
# grep registry.k8s.io deploy/v4.5.0/* -rn
sed -i 's|registry.k8s.io/sig-storage|registry.cn-hongkong.aliyuncs.com/xxxxx|g' deploy/v4.5.0/*
# 安装4.5.0版本
./deploy/install-driver.sh v4.5.0 local
# 查看容器是否启动
kubectl -n kube-system get pod -o wide -l app=csi-nfs-controller
kubectl -n kube-system get pod -o wide -l app=csi-nfs-node
2、使用helm安装harbor
依赖环境
组件 | 版本 |
---|---|
Kubernetes cluster | 1.20+ |
Helm | v3.2.0+ |
2.1、 安装helm
官方文档:https://helm.sh/zh/docs/
htlm chart仓库:https://artifacthub.io/packages/search?kind=0
helm版本与k8s对应关系:https://helm.sh/zh/docs/topics/version_skew/
# 下载不下来可以放到浏览器下载或者使用迅雷下载
wget https://get.helm.sh/helm-v3.14.2-linux-amd64.tar.gz
tar zxf helm-v3.14.2-linux-amd64.tar.gz
cp linux-amd64/helm /usr/local/bin
# 如果更换过版本,执行source命令
source ~/.bashrc
# 查看版本是否正确
helm version --client
version.BuildInfo{Version:"v3.14.2", GitCommit:"c309b6f0ff63856811846ce18f3bdc93d2b4d54b", GitTreeState:"clean", GoVersion:"go1.21.7"}
2.2、 配置harbor存储项
这里使用storageclass动态生成pv与pvc绑定
kubectl apply -f nfs-csi-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-csi # 存储类的名称
annotations:
storageclass.kubernetes.io/is-default-class: "true" # 将此存储类设置为默认存储类
provisioner: nfs.csi.k8s.io # 使用的 CSI 驱动程序
parameters:
server: nfs-server.nfs.svc.cluster.local # NFS 服务器的地址 服务名.命名空间.服务对象.默认域名后缀
share: / # NFS 服务器上共享的路径
reclaimPolicy: Retain # 当 PVC 被删除时对应的 PV 应该如何处理,当 PVC 被删除时,对应的 PV 不会被自动删除
volumeBindingMode: Immediate # PV 和 PVC 的绑定模式,快速绑定
mountOptions:
- hard # NFS 挂载选项之一,表示在遇到问题时会持续尝试
- nfsvers=4.1 # 指定使用的 NFS 版本
2.3、 配置harbor自定义环境变量
harbor chat仓库地址:https://artifacthub.io/packages/helm/harbor/harbor
vim harbor-values.yaml
expose:
#type: ingress
type: nodePort
tls:
enabled: false
# certSource: auto
nodePort:
# The name of NodePort service
name: harbor
ports:
http:
# The service port Harbor listens on when serving HTTP
port: 80
# The node port Harbor listens on when serving HTTP
nodePort: 30002
https:
# The service port Harbor listens on when serving HTTPS
port: 443
# The node port Harbor listens on when serving HTTPS
nodePort: 30003
# externalURL: http://registry.harbor.com
externalURL: http://core.harborconnor.com
# 持久化存储配置部分
persistence:
enabled: true
resourcePolicy: "keep" # 在删除资源(例如 Pod)时保留相关的持久卷资源,而不会将其删除。
persistentVolumeClaim: # 定义Harbor各个组件的PVC持久卷
registry: # registry组件(持久卷)
storageClass: "nfs-csi" # 前面创建的StorageClass,其它组件同样配置
accessMode: ReadWriteMany # 卷的访问模式,需要修改为ReadWriteMany
size: 5Gi
chartmuseum: # chartmuseum组件(持久卷)
storageClass: "nfs-csi"
accessMode: ReadWriteMany
size: 5Gi
jobservice:
jobLog:
storageClass: "nfs-csi"
accessMode: ReadWriteOnce
size: 1Gi
database: # PostgreSQl数据库组件
storageClass: "nfs-csi"
accessMode: ReadWriteMany
size: 2Gi
redis: # Redis缓存组件
storageClass: "nfs-csi"
accessMode: ReadWriteMany
size: 2Gi
trivy: # Trity漏洞扫描
storageClass: "nfs-csi"
accessMode: ReadWriteMany
size: 5Gi
harborAdminPassword: "1q2w3e4r5t"
2.5、 部署harbor
# 创建命名空间
kubectl create ns harbor
# 添加源
helm repo add harbor https://helm.goharbor.io
#指定配置文件和命名空间创建
helm install harbor -f harbor-values.yaml harbor/harbor -n harbor
# 如果后续修改配置文件,修改后执行下面命令
# helm upgrade harbor -f harbor-values.yaml harbor/harbor -n harbor
检查pvc是否自动绑定pv
kubectl get pvc -n harbor
检查容器是否启动
# 需要拉取镜像,启动较慢
kubectl get pod -n harbor -w
3、harbor使用说明
浏览器登录任意node节点的30002端口,输入账号密码admin/1q2w3e4r5t,这里密码在配置文件中定义,如果未定义默认密码为Harbor12345,或者使用下面命令查看默认密码
kubectl exec -it -n harbor `kubectl get pod -n harbor |grep core |awk '{print $1}'` bash
printenv |grep HARBOR_ADMIN_PASSWORD
3.1 新建镜像代理
镜像代理作用:公共镜像可以选择此链接下载,当本地项目中没有对应镜像时,会通过代理下载镜像,并缓存到仓库中,但此镜像无法通过push推送镜像
新建镜像仓库,【系统管理】【仓库管理】【新建目标】
目标URL:https://1fc43mcq.mirror.aliyuncs.com,这个是我自己的阿里云加速地址,可以选择自己的填上
新建镜像代理项目,【项目】【新建项目】开启镜像代理,选择上一步创建的仓库
3.2 测试镜像的下载和上传
3.2.1 配置基础环境
vim /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://1fc43mcq.mirror.aliyuncs.com"],
"insecure-registries": ["core.harborconnor.com"] # 配置 Docker 允许不安全的镜像仓库地址列表,即使该地址没有使用安全的 HTTPS 连接
}
因为这里使用了externalURL: http://core.harborconnor.com,所以需要搭建一个nginx将此域名的请求,转发到nodeport上,本地需要配置host
echo "192.168.31.11 core.harborconnor.com" >> /etc/hosts
# 定义 upstream 块,指定后端服务器的地址和端口
upstream backend_servers {
server 192.168.31.21:30002;
server 192.168.31.22:30002;
server 192.168.31.23:30002;
}
# 配置 server 块,监听80端口,处理 core.harbor.com 的请求
server {
listen 80;
server_name core.harborconnor.com;
location / {
proxy_pass http://backend_servers; # 将请求转发到后端服务器
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
登录仓库
docker login core.harborconnor.com
3.2.2 使用代理仓库下载公共镜像
# Docker 中,library 是一个特殊的命名空间,用于存储官方的镜像库
# image 为代理仓库名称
docker pull core.harborconnor.com/image/library/tomcat:9.0.52
已经缓存到了本地harbor仓库
3.3.3 上传镜像到项目仓库
# 查看本地镜像列表
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
core.harborconnor.com/image/library/nginx latest 605c77e624dd 2 years ago 141MB
core.harborconnor.com/image/library/redis latest 7614ae9453d1 2 years ago 113MB
core.harborconnor.com/image/library/tomcat 9.0.52 9427bc9144fa 2 years ago 680MB
# 修改tag,test_666项目需要提前创建,或者使用默认的library项目
docker tag core.harborconnor.com/image/library/tomcat:9.0.52 core.harborconnor.com/test_666/tomcat:v1
# 上传镜像tomcat:v1到test_666项目
docker push core.harborconnor.com/test_666/tomcat:v1