8、Harbor - 企业级 Docker 私有仓库
一、安装底层需求
- Python应该是应该是2.7或更高版本或更高版本
- Docker引擎应为引擎应为1.10或更高版本或更高版本
- Docker Compose需要为需要为1.6.0或更高版本或更高版本
- docker-compose:
curl -L https://github.com/docker/compose/releases/download/1.9.0/docker-compose-`uname -s`-`uname -m`> /usr/local/bin/docker-compose
二、Harbor 安装:
Harbor 官方地址
1、解压软件包:
解压软件包:tar xvf harbor-offline-installer-<version>.tgz
2、配置、配置harbor.cfg
a、必选参数
- hostname:目标的主机名或者完全限定域名:目标的主机名或者完全限定域名
- ui_url_protocol::http或或https。默认为http
- db_password:用于db_auth的的MySQL数据库的根密码。更改此密码进行任何生产用途
- max_job_workers:(默认值为:3)作业服务中的复制工作人员的最大数量。对于每个映像复制作业,工作人员将存储库的所有标签同步到远程目标。增加此数字允许系统中更多的并发复制作业。但是,由于每个工作人员将存储库的所有标签同步到远程目标。增加此数字允许系统中更多的并发复制作业。但是,由于每个工作人员都会消耗一定数量的网络/ CPU / IO资源,请根据主机的硬件资源,仔细选择该属性的值
- customize_crt:(on或或off。默认为on)当此属性打开时,prepare脚本将为注册表的令牌的生成/验证创验证创建私钥和根证书
- ssl_cert:SSL证书的路径,仅当协议设置为https时才应用时才应用
- ssl_cert_key:SSL密钥的路径,仅当协议设置为https时才应用时才应用
- secretkey_path:用于在复制策略中加密或解密远程注册表的密码的密钥路径
3、创建、创建 https 证书以及配置相关目录权限
openssl genrsa -des3 -out server.key 2048 openssl req -new -key server.key -out server.csr cp server.key server.key.org openssl rsa -in server.key.org -out server.key openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt mkdir /data/cert chmod -R 777 /data/cert
4、运行脚本进行安装
./install.sh
5、访问测试
https://reg.yourdomain.com 的管理员门户(将reg.yourdomain.com更改为您的主机名更改为您的主机名harbor.cfg)。
请注意,默认管理员用户名/密码为密码为admin / Harbor12345
6、上传镜像进行上传测试
a、指定镜像仓库地址、指定镜像仓库地址
vim /etc/docker/daemon.json
{
"insecure-registries": ["serverip"]
}
b、下载测试镜像
docker pull hello-world
c、给镜像重新打标签
docker tag hello-world serverip/hello-world:latest
d、登录进行上传
docker login serverip
7、其它 Docker 客户端下载测试
a、指定镜像仓库地址
vim /etc/docker/daemon.json
{
"insecure-registries": ["serverip"]
}
b、下载测试镜像
docker pull serverip/hello-world:latest
三、Harbor 原理说明原理说明
1、软件资源介绍
Harbor是是VMware公司开源的企业级公司开源的企业级DockerRegistry项目,项目地址为项目,项目地址为https://github.com/vmware/harbor。其目是帮助用户迅速搭建一个企业级的标是帮助用户迅速搭建一个企业级的Dockerregistry服务。它以Docker公司开源的公司开源的registry为基础,提供了管理为基础,提供了管理UI,,基于角色的访问控制(Role Based Access Control),AD/LDAP集成、以及审计日志(Auditlogging) 等企业用户需求的功能,同时还原生支持中文。Harbor的每个组件都是以Docker容器的形式构建的,使用容器的形式构建的,使用Docker Compose来对它进行部署。用于部署Harbor的的Docker Compose模板位于 /Deployer/docker-compose.yml,由5个容器组成,这几个容器通过Docker link的形式连接在一起,在容器之间通过容器名字互相访问。对终端用户而言,只需要暴露 proxy (即即Nginx)的服务端口
- Proxy:由Nginx 服务器构成的反向代理。
- Registry:由Docker官方的开源官方的开源 registry 镜像构成的容器实例。
- UI:即架构中的 core services,,构成此容器的代码是构成此容器的代码是 Harbor 项目的主体。
- MySQL:由官方 MySQL 镜像构成的数据库容器。
- Log:运行着 rsyslogd 的容器,通过 log-driver 的形式收集其他容器的日志
2、Harbor 特性特性
a、基于角色控制:用户和仓库都是基于项目进行组织的,、而用户基于项目可以拥有不同的权限
b、基于镜像的复制策略:镜像可以在多个Harbor实例之间进行复制实例
c、支持LDAP:Harbor的用户授权可以使用已经存在的LDAP用户用户
d、镜像删除 & 垃圾回收:Image可以被删除并且回收Image占用的空间,绝大部分的用户操作API,方便用户对系统进行扩展
e、用户UI:用户可以轻松的浏览、搜索镜像仓库以及对项目进行管理
f、轻松的部署功能:Harbor提供了提供了online、、offline安装,除此之外还提供了virtualappliance安装安装
g、Harbor 和 docker registry 关系:Harbor实质上是对 docker registry 做了封装,扩展了自己的业务模块做了封装,扩展了自己的业务模块
3、Harbor 认证过程认证过程
a、dockerdaemon从docker registry拉取镜像。
b、如果dockerregistry需要进行授权时,registry将会返回401 Unauthorized响应,同时在响应中包含了dockerclient如何进行认证的信息。
c、dockerclient根据registry返回的信息,向auth server发送请求获取认证token。
d、auth server则根据自己的业务实现去验证提交的用户信息是否存符合业务要求。
e、用户数据仓库返回用户的相关信息。
f、auth server将会根据查询的用户信息,生成token令牌,以及当前用户所具有的相关权限信息.上述就是完整的授权过程.当用户完成上述过程以后便可以执行相关的pull/push操作。认证信息会每次都带在请求头中操作。
Harbor整体架构整体架构
4、Harbor 认证流程认证流程
a、请求被代理容器监听拦截,并跳转到指定的认证服务器。
b、如果认证服务器配置了权限认证,则会返回401。通知dockerclient在特定的请求中需要带上一个合法的token。而认证的逻辑地址则指向架构图中的core services。。
c、当docker client接受到错误code。client就会发送认证请求(带有用户名和密码)到到coreservices进行进行basicauth认证。
d、当C的请求发送给ngnix以后,ngnix会根据配置的认证地址将带有用户名和密码的请求发送到coreserivces。
e、 coreservices获取用户名和密码以后对用户信息进行认证(自己的数据库或者介入LDAP都可以)。成功以后,返回认证成功的信息
Harbor认证流程认证流程
---------------------------
设置主机名
hostnamectl set-hostname k8s-harbor # 将 k8s-master01 替换为当前主机名
如果 DNS 不支持主机名称解析,还需要在每台机器的 /etc/hosts 文件中添加主机名和 IP 的对应关系:
cat >> /etc/hosts <<EOF 1.1.1.14 k8s-master01 1.1.1.15 k8s-node01 1.1.1.16 k8s-node02 1.1.1.17 hub.hlc.com EOF
添加节点信任关系
本操作只需要在 k8s-01 节点上进行,设置 root 账户可以无密码登录所有节点:
ssh-keygen -t rsa ssh-copy-id root@k8s-master01 ssh-copy-id root@k8s-node01 ssh-copy-id root@k8s-node02
关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
关闭 swap 分区
关闭 swap 分区,否则kubelet 会启动失败(可以设置 kubelet 启动参数 --fail-swap-on 为 false 关闭 swap 检查):
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
关闭 SELinux
关闭 SELinux,否则 kubelet 挂载目录时可能报错 Permission denied:
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
设置系统时区
timedatectl set-timezone Asia/Shanghai
设置系统时钟同步
systemctl enable chronyd
systemctl start chronyd
查看同步状态:
timedatectl status
输出:
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
- System clock synchronized: yes,表示时钟已同步;
- NTP service: active,表示开启了时钟同步服务;
# 将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0
# 重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond
关闭无关的服务
systemctl stop postfix && systemctl disable postfix
安装docker
安装依赖配置阿里云Docker Yum源 yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 查看docker可安装的版本 yum list docker-ce --showduplicates | sort -r yum -y install docker-ce-18.09.6 systemctl start docker.service systemctl enable docker.service ## 创建 /etc/docker 目录 mkdir /etc/docker # 配置 daemon. cat > /etc/docker/daemon.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "insecure-registries": ["https://hub.hlc.com"] } EOF k8s集群中也需要添加“ "insecure-registries": ["https://hub.hlc.com"]”,并重启docker # 重启docker服务 systemctl daemon-reload && systemctl restart docker
上传相关安装包及配置harbor
docker-compose harbor-offline-installer-v1.2.0.tgz mv docker-compose /usr/local/bin/ chmod a+x /usr/local/bin/docker-compose tar -zxvf harbor-offline-installer-v1.2.0.tgz mv harbor /usr/local/ cd /usr/local/harbor/ vim harbor.cfg hostname = hub.xxx.com ui_url_protocol = https mkdir -p /data/cert/ cd /data/cert/ openssl genrsa -des3 -out server.key 2048
# openssl req -new -key server.key -out server.csr Enter pass phrase for server.key: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:BJ Locality Name (eg, city) [Default City]:BJ Organization Name (eg, company) [Default Company Ltd]:hlc Organizational Unit Name (eg, section) []:hlc Common Name (eg, your name or your server's hostname) []:hub.hlc.com Email Address []:hlc@163.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: [root@harbor cert]# [root@harbor cert]# ls server.csr server.key
# openssl x509 -req -days 36500 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=/C=CN/ST=BJ/L=BJ/O=hlc/OU=hlc/CN=hub.hlc.com/emailAddress=hlc@163.com
Getting Private key
# chmod a+x *
# cd /usr/local/harbor/ && ./install.sh
在电脑本地配置上地址解析,可以通过浏览器进行访问hub,账户名和密码:admin / Harbor12345
测试:
将镜像上传到仓库
docker login https://hub.hlc.com docker pull nginx docker tag nginx:latest hub.hlc.com/library/myapp:v1 docker push hub.hlc.com/library/myapp:v1
docker rmi -f nginx:latest
docker rmi -f hub.hlc.com/library/myapp:v1
在k8s所有节点配置主机名解析及“/etc/docker/daemon.json”中配置“insecure-registries”,并重启docker 运行一个Pod: kubectl run nginx-deployment --image=hub.hlc.com/library/myapp:v1 --port=80 查看所有的Pod运行情况: kubectl get pod -A -o wide 访问pod,10.244.1.3为Pod的私有ip curl 10.244.1.3
为nginx创建访问服务: kubectl expose pod nginx-deployment --port=30000 --target-port=80 nginx-deployment ClusterIP 10.97.80.179 <none> 30000/TCP 2m3s 使用curl进行测试 curl 10.97.80.179:30000 查看负载均衡的转发策略 ipvsadm -Ln 修改port的类型 kubectl edit svc nginx-deployment type: NodePort 查看svc kubectl get svc -o wide nginx-deployment NodePort 10.97.80.179 <none> 30000:32518/TCP 20m run=nginx-deployment 修改之后每个节点上面都会监听32518端口,使用主机ip和端口号可以实现外部访问
http://172.16.68.11:32518/

浙公网安备 33010602011771号