Kubernetes 使用 helm 部署 harbor
一、环境说明
本教程建立在已有的k8s集群以及安装了helm的前提下,如未搭建k8s集群,请先参考其他相关部署教程。
环境现状:
- k8s版本为 v1.14.0,部署了helm,版本为v2.13.1;
- k8s1和k8s2为两个高可用的master节点,同时也是node节点;
- k8s3为单纯的node节点;
- mars仅作为docker client使用,所以使用了一台很久以前的虚拟机,docker client 版本比较低,能用就行;
- 所有机器的操作系统均为CentOS7.2。
- harbor版本号为 v1.9.0
角色 | IP | 主机名 | 程序版本 |
k8s-master/k8s-node |
10.2.1.86 vip: 10.2.1.254 |
k8s1 | k8s v1.14.0 helm Client&Server v2.13.1 |
k8s-master/k8s-node |
10.2.1.72 vip: 10.2.1.254 |
k8s2 | k8s v1.14.0 |
k8s-node | 10.2.1.20 | k8s3 | k8s v1.14.0 |
Docker client | 10.2.1.67 | mars | docker client 1.10.3 |
二、部署harbor
1、从github拉取harbor-helm
git clone https://github.com/goharbor/harbor-helm cd harbor-helm
2、修改相关配置
在harbor-helm文件夹里面,可以看到Chart.yml 及 values.yaml 等helm 部署相关的文件,vim 编辑一下value.yaml,根据实际情况修改配置
ingress: hosts: core: harbor.mars.com #修改ingress里面的域名 notary: notary.mars.com …… externalURL: https://harbor.mars.com #修改访问的URL …… #这部分可以看到,这里需要5个pvc,也就是说需要手动创建5个pv,官方默认为两个5G,3个1G,可根据需要修改size,这里由于是实验环境,所以不作改动 persistentVolumeClaim: registry: existingClaim: "" storageClass: "" subPath: "" accessMode: ReadWriteOnce size: 5Gi chartmuseum: existingClaim: "" storageClass: "" subPath: "" accessMode: ReadWriteOnce size: 5Gi jobservice: existingClaim: "" storageClass: "" subPath: "" accessMode: ReadWriteOnce size: 1Gi database: existingClaim: "" storageClass: "" subPath: "" accessMode: ReadWriteOnce size: 1Gi redis: existingClaim: "" storageClass: "" subPath: "" accessMode: ReadWriteOnce size: 1Gi …… harborAdminPassword: "Harbor12345" #默认管理员密码为Harbor12345,可在这里进行修改
3、创建需要的5个pv
为简化实验,本实验环境使用local-storage作为持久化存储,使用k8s3机器的 /data/disks 目录作为本地持久化存储。
- 在k8s3上面创建五个文件夹
mkdir /data/disks/{disk1-5G,disk2-5G,disk3-1G,disk4-1G,disk5-1G}
- 在master上面编写5个pv的yaml文件,并创建pv
mkdir pv cd pv
cat <<EOF > disk1-5G.yml apiVersion: v1 kind: PersistentVolume metadata: name: disk1 spec: capacity: storage: 5Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle local: path: "/data/disks/disk1-5G" nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - k8s3 EOF cat <<EOF > disk2-5G.yml apiVersion: v1 kind: PersistentVolume metadata: name: disk2.yml spec: capacity: storage: 5Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle local: path: "/data/disks/disk2-5G" nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - k8s3 EOF cat <<EOF > disk3-1G.yml apiVersion: v1 kind: PersistentVolume metadata: name: disk3.yml spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle local: path: "/data/disks/disk3-1G" nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - k8s3 EOF cat <<EOF > disk4-1G.yml apiVersion: v1 kind: PersistentVolume metadata: name: disk4.yml spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle local: path: "/data/disks/disk4-1G" nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - k8s3 EOF cat <<EOF > disk5-1G.yml apiVersion: v1 kind: PersistentVolume metadata: name: disk5.yml spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle local: path: "/data/disks/disk5-1G" nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - k8s3 EOF
kubectl apply -f .
kubectl get pv
可以看到5个pv已经准备就绪
4、使用helm部署harbor
cd /data/harbor-helm
helm dependency update
helm install . --debug -n harbor --namespace mars
参数说明:
- --debug 部署过程中开启debug模式
- -n 定义helm release的名字
- --namespace 指定使用哪个namespace部署
部署完成后,可以通过相关命令查看部署情况
分别查看helm、pvc、deployment、pod、service、ingress 等是否正常(其中部分pod有可能会失败,但会自动重建,直到最后全部pod都会处理Running状态,个人猜测原因是启动这些deployment需要有一定的顺序,某些deployment需要在其他deployment启动的前提下才能正常启动)
5、使用浏览器测试
在 Docker Client 的 /etc/hosts 文件里面把 10.2.1.254 指定到域名 harbor.mars.com 的解释上,然后使用浏览器访问 https://harbor.mars.com,由于是实验环境,没有ssl配置证书,直接信任即可。注:此步骤需要使用图形界面,如果Docker Client 没有安装图形界面,请自行安装,或者用其他方法(如ssh隧道)
echo '10.2.1.254 harbor.mars.com' >> /etc/hosts
使用 admin用户登录(默认密码在之前的value.yaml文件中定义),并创建一个项目mars。
三、使用harbor
1、登录harbor
harbor部署完毕了,项目也创建好了,现在尝试一下用命令行登录一下。
发现报错了,看提示,是缺少了CA证书,解决方法有两个:
(1)在Docker Client 的启动文件里面加入 --insecure-registry 参数,强制信任这个镜像仓库(生产环境不推荐,不安全)
(2)在Docker Client 添加harbor的CA证书(推荐)
下面分别说明一下两种方法。
方法一:Docker client 启动文件加入--insecure-registry 参数(生产环境不推荐,不安全)
这个版本的Docker的启动文件为 /usr/lib/systemd/system/docker.service ,其他版本可能不一样
在ExecStart 加入 --insecure-registry "harbor.mars.com" ,意思为允许不安全地使用 harbor.mars.com 这个镜像仓库
重启 docker 及 daemon
systemctl restart docker
systemctl daemon-reload
再次尝试 login,登录成功
方法二:在Docker Client 添加harbor的CA证书(推荐)
在k8s的master上面通过以下命令获取CA证书
kubectl -n mars get secrets/harbor-harbor-ingress -o jsonpath="{.data.ca\.crt}" | base64 --decode
在Docker Client 上添加证书(不需要重启docker)
mkdir /etc/docker/certs.d/harbor.mars.com cat <<EOF > /etc/docker/certs.d/harbor.mars.com/ca.crt -----BEGIN CERTIFICATE----- MIIC9DCCAdygAwIBAgIQdq5L+F3WlnD1oRv7Ai1o1zANBgkqhkiG9w0BAQsFADAU MRIwEAYDVQQDEwloYXJib3ItY2EwHhcNMTkwNzE4MDQxNzMwWhcNMjAwNzE3MDQx NzMwWjAUMRIwEAYDVQQDEwloYXJib3ItY2EwggEiMA0GCSqGSIb3DQEBAQUAA4IB DwAwggEKAoIBAQDVr8SzNtog69u+3kLa8xZYEpgKktV6w7A6d43XSnQOhF2PynT3 AnQ3Ah3NBcjGoYEp7k/JNoNHyvPMMMxqOs8bj/QNTIASN7XuqLZegJCF5E15dttR ey1bZsINDX4eoa5WN/nYOGRnP6rNF8ijDPwFm/I0bT+V9xTiJgaEScPSmN9YRwkQ Gm1279W5eXXaHXUeArAdsydC1+hRA0Xxz9mZWA9CGNJwJ3w+Zmvg82CxCcWmm4yf feiex5N/8u63PynuVV3ZNoWTyDRZ6o7ljXat0MX0fBjmkC6UQbo6IuILSHZR5oPj mtSMgfqMzT9o175Ew3DtC6KB39cs6op0IXdrAgMBAAGjQjBAMA4GA1UdDwEB/wQE AwICpDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDwYDVR0TAQH/BAUw AwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAZPG5cYVFI8nYNQfZJ8yzkWD0jJMHlZ77 D65gUHnZSsJKQd+yXA674LHfNXCkPDexYZvMZtYjSg/wTwI0xVeW+K3zdfK9MBxM PCpEJLtrTKj2ZYXKXqG9db7iybKbIgW+6eGELBn7asM7ka0jNWsYVOkKirVtfPzZ sKUm9ujNfs5W1XeJL/8af/HDX7sYJoNRgDRzYRzmFScV5cq7KD1Vvn7+QjcDdHpJ QNmJ9QC53LW34NJ+mfQFMXs84LNZ4M08V+Wpyd0p6c8RYRYS8QVxuXbShn3ltP40 Xu2/CRYCzvpOj3vQSn78bqDoXfX/8AX1eKr7iMAPNyrDrYVQU39QpQ== -----END CERTIFICATE----- EOF
再次尝试 login,登录成功
2、上传本地镜像
把本地的一个镜像 docker.io/redis:latest 上传到harbor,先给镜像打一个tag
docker tag docker.io/redis harbor.mars.com/mars/redis:v1
上传镜像
docker push harbor.mars.com/mars/redis:v1
上传成功
在harbor页面上对应的项目里面,可以查看到相关的镜像
3、下载harbor镜像
先删除本地镜像(其实只是去掉一个tag)
docker rmi harbor.mars.com/mars/redis:v1
下载harbor上面的镜像
docker pull harbor.mars.com/mars/redis:v1
下载成功