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

  下载成功

 

 

 

 

 

posted @ 2019-07-18 15:33  面壁者的逻辑  阅读(4479)  评论(0编辑  收藏  举报