生产环境迁移——harbor篇
这些年环境迁移干了很多,但是没有总结,想想还是记录一下,以前是下属做,自己统筹就行,现在就剩下孤家寡人了,只好都自己做。还是完整记录下来,供有缘人参考。其实我也是搭了个草台班子。
1 安装docker
很多人都是简单直接安装docker,其实是不对的,因为首先知道那个目录的磁盘空间较大,否则磁盘满了,还得费二遍事。下面是我的磁盘情况,各位可能是不同,需要注意这一点。
命令如下
yum -y install yum-utils device-mapper-persistent-data lvm2
# 这个是我的磁盘目录,不要照抄
mkdir -p /home/docker
#
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache
yum install docker-ce docker-ce-cli containerd.io -y# 更改配置
vi /lib/systemd/system/docker.service
在下图位置添加--data-root /home/docker,再次强调这里你们自己的目录,这个是docker文件目录。
启动docker
systemctl daemon-reload
# 启动命令
systemctl start docker
# 开机启动
systemctl enable docker
由于docker19.03.8已经下载不了了,
# 源服务器是centos,使用yumdownloader将docker的rpm包下载下来。
yum install -y yum-utils
sudo yumdownloader docker-ce-19.03.8-3.el7 docker-ce-cli-19.03.8-3.el7 containerd.io
2 rsync文件同步
在源和目标的服务器都需要安装上rsync
yum install rsync -y
exsi主机比较容易,之前在线迁移就行,但是物理机就不行。先查看源服务器上内容,
执行同步命令,这种复制文件方式都需要思考,源服务器有啥就复制啥。
# 同步docker-compose文件
rsync -avz docker-compose root@10.101.10.2:/home/harbor
# 同步harbor安装相关文件
rsync -avz harbor root@10.101.10.2:/home/harbor
下面是harbor目录的内容
直接同步harbor的数据文件,这个时候就需要思考harbor数据文件是在哪里指定的,很显然就是harbor.yml中。
3 安装docker-compose
chmod +x docker-compose
cp -a docker-compose /usr/bin
docker-compose -v
4 harbor恢复
上面是直接使用rsync做的文件级别同步,如何将harbor恢复呢?
更改hostname和http端口,因为之前使用exsi做的虚拟机,80和443端口可以随便,但是现在是物理机,就不能这么干了。注意下面hostname配置的是es2,那么其他节点就都需要在/etc/hosts中配置es2对应的ip
更改数据目录
新增daemon.json配置,下面的配置现在可能docker有什么限制下载不下来,可以参考Error response from daemon: Get “https://registry-1.docker.io/v2/“: net/http: request cancele 报错
cat > /etc/docker/daemon.json <<EOF
{"registry-mirrors": ["https://2b5ean3t.mirror.aliyuncs.com"],"insecure-registries": ["10.101.12.2", "10.101.12.200"],"max-concurrent-downloads": 10,"max-concurrent-uploads": 10,"log-driver": "json-file","log-level": "info","log-opts": {"max-size": "100m","max-file": "3"},"storage-driver": "overlay2"
}
EOFsystemctl daemon-reload
systemctl restart docker
有些情况下修改了daemon配置可以启动不了,一个可能是文件拼写错误,一个是docker版本不同参数页不同,这个是否执行journalctl -u docker.service --no-pager,查看详细的错误日
harbor的开启关闭如下:
# 启动
cd /home/harbor/harbor
# 首次需要执行./prepare,后面就不需要了
./prepare
# 启动
docker-compose up -d
# 关闭
docker-compose down
安装过程如下
启动之后就可以看到端口变为了8081
登录到界面,可以看到镜像已经还原了。
5 Jenkins关联更改
5.1 harbor镜像的全局路径配置
在configure system中自定义全局变量docker_repository
这个跟自己发布程序有关,可以看到py脚本如下,下面的代码在拼接。
5.2 jenkins访问harbor权限
打包发现访问异常。
需要在jenkins中需要daemon.json中文件中添加需要连接harbor的ip:port,因为我已经把端口改成8081,不再是80,所以需要显式写明。
另外需要在此台机器上做一下登录docker login 10.101.12.2:8081,再次编译harbor上传成功。
5.3 生产的jenkins
为了避免打包直接发布生产环境,造成不可估量的后果,于是就有了另外一个jenkins,这个jenkins从测试harbor中拉取镜像,然后再推到生产的harbor中,最后再进行部署。
迁移总是不是很顺利,因为有的环境我并不熟悉,也没有人问了,于是只好自己摸索着来。部署的时候可以看到下面的错误,为什么呢?可以看到下面的2:8081,写成了2.8081,改成过啦即可
6 k8s关联更改
虽然镜像已经推送到harbor中,但因为自动化部署脚本是通过k8s提供的api,故而k8s的环境也需要更改。从下图可以看到harbor镜像pull失败。
6.1 kuboard连接docker仓库配置
这个是原来的配置
,将这个删掉重新创建
再k8s集群节点执行下面的提示
[root@master1 ~]# docker login 10.101.12.2:8081
Username: admin
Password:
Error response from daemon: Get http://10.101.12.2:8081/v2/: Get http://es2:8081/service/token?account=admin&client_id=docker&offline_token=true&service=harbor-registry: dial tcp: lookup es2 on 223.5.5.5:53: no such host
于是再/etc/hosts将对应的的地址添加进去即可。
k8s可以通过imagePullSecrets获取harbor私库的凭证认证。下面的脚本需要在k8s的主节点执行
# 这个跟上面的jenkins一样,把harbor的ip:port写入到insecure-registries,这样内部访问就不需要SSL了
vi /etc/docker/daemon.json
systemctl daemon-reload
systemctl restart docker
查看secret,之前已经有harbor-cert,可以先删掉旧的,然后再kuboard中添加新的
[root@master1 ~]# kubectl get secrets -n test
NAME TYPE DATA AGE
default-token-bjbzb kubernetes.io/service-account-token 3 153d
harbor-cert kubernetes.io/dockerconfigjson 1 147d# 执行下面的命令可以看到harbor-cert的详细信息
kubectl get secret harbor-cert -n test -o jsonpath="{.data.\.dockerconfigjson}" | base64 --decode# 删除旧的harbor-cert
kubectl delete secret harbor-cert -n test
6.2 worker节点配置更改
更改了harbor-cert,发现还是无法pull镜像
于是做相同的操作,在/etc/hosts中添加es2对应的ip,因为上面harbor.yml配置的是es2,另外在/ect/docker/daemon.json中更改insecure-registries,把ip:8081添加进去。
至此问题解决。