私有镜像仓库部署
私有化平台上传部署包
1.联系技术支持获取探针部署包tingyun-kubeimage-X.X.X.X.zip。其中X.X.X.X为探针的版本号。
2.通过admin账号上传该部署包,然后在下载中心页面看到Kubernetes UniAgent有更新即可。
说明:SaaS平台不需要上述操作。
私有镜像库上传
联系技术支持获取镜像包tingyun-k8s-images-X.X.X.X.tar.gz。其中X.X.X.X为探针的版本号。
解压缩。
tar xvf tingyun-k8s-images-X.X.X.X.tar.gz
推送镜像到私有仓库。
如需指定镜像架构为AMD64(仅适用于集群内所有Node的CPU均为AMD64的场景),请执行
IMAGE_PLATFORM=amd64 sh ./pushImages.sh
如需指定镜像架构为ARM64(仅适用于集群内所有Node的CPU均为ARM64的场景),请执行
IMAGE_PLATFORM=arm64 sh ./pushImages.sh
如果集群内既存在AMD64的Node节点,又存在ARM64的Node节点,(也适用于集群内所有Node均为同一CPU架构的场景),请执行
sh ./pushImages.sh
输入待上传的私有仓库镜像地址和项目名称,如registry.tingyun.com/tingyun。
输入私有仓库的用户名和密码进行登录。
脚本会自动检测当前环境上是否安装了 docker、podman、nerdctl、ctr 等推送工具, 并自动选择一种推送工具。
如果当前用户使用的推送工具支持Manifest功能,则推送脚本会自动上传AMD64和ARM64两种镜像,每个Node拉取镜像时,会尝试自动拉取和Node CPU架构一致的镜像。
如果当前用户使用的推送工具不支持Manifest功能,则脚本会提示选择上传的镜像类型,AMD64或ARM64,只能选择一种镜像进行推送。
说明:
- 如果不开启Manifest,AMD64和ARM64两种类型的镜像不会共存,如果推送多次,后上传的镜像会覆盖前面上传的镜像。
- 不开启Manifest进行推送仅适用于所有Node的CPU架构均一致的情况,如果Node CPU既有AMD64又有ARM64,请开启Manifest功能。Manifest的开启方式见下方的FAQ小节。
私有镜像选择
上传完毕后,在部署Kubernetes UniAgent时选择私有仓库,并输入私有仓库地址。
如果拉取镜像需要权限验证,设置镜像拉取密钥 (仅2.5.3.0及以上版本探针支持)
在私有仓库内创建长期有效的账号
⚠️ 创建账号时,一定要创建长期有效的账号,如果仅是临时账号,当账号过期后,会导致镜像拉取失败。
以Harbor平台为例,项目选择听云镜像所在的项目名称
Project -> Robot Accounts
, 创建Robot机器人只读账号,过期时间选择永不过期,权限选择查询和拉取镜像,生成账号和令牌:
以阿里云平台为例,选择
容器镜像服务 -> 仓库管理 -> 访问凭证
,生成固定密码访问凭证:以华为云平台为例,选择
容器镜像服务 -> 我的镜像 -> 客户端上传 -> 生成登录指令 -> 长期有效登录指令 -> 生成指令
,平台生成登录命令中包含了账号密码和地址信息:docker login -u 镜像账号 -p 密码 私有库服务器域名
添加听云探针所在命名空间的镜像拉取密钥
在听云探针命名空间例如tingyun中创建名称为tingyun-image-secret
的秘钥
确认录入正确的秘钥类型、私有库服务器地址、账号和密码或令牌,注意如果账号名或密码令牌包含$+等特殊字符,执行命令时需要转义
kubectl -n tingyun create secret docker-registry tingyun-image-secret \
--docker-server=私有库服务器域名 --docker-username=镜像账号 --docker-password=密码或令牌
例如其中用户名为robot$test+app-readonly
, 则转义为
kubectl -n tingyun create secret docker-registry tingyun-image-secret \
--docker-server=test.huaweicloud.com --docker-username=robot\$test\+app-readonly --docker-password=******
放开从听云平台下载的yaml脚本中kind: ServiceAccount
下面2行代码注释
apiVersion: v1
kind: ServiceAccount
metadata:
name: tingyun-k8s-monitor
namespace: tingyun
#imagePullSecrets:
# - name: tingyun-image-secret
修改后的yaml, 注意格式及对齐, imagePullSecrets
和 metadata
对齐, -
空2格:
apiVersion: v1
kind: ServiceAccount
metadata:
name: tingyun-k8s-monitor
namespace: tingyun
imagePullSecrets:
- name: tingyun-image-secret
添加业务Pod所在命名空间的镜像拉取密钥 (此步骤根据现场情况可选)
如果需要嵌入探针的Pod中现有密钥策略已经包含了听云镜像所在项目的权限,则可以跳过此步
在需要嵌入探针的Pod所在的业务命名空间中创建名称为tingyun-image-secret
的秘钥
如果有多个命名空间需要嵌入探针,那么必须针对每个命名空间单独创建tingyun-image-secret
kubectl -n 业务命名空间 create secret docker-registry tingyun-image-secret \
--docker-server=私有库服务器域名 --docker-username=账号 --docker-password=密码或令牌
放开从听云平台下载的yaml脚本中mutate.yaml
下面2行代码注释
mutate.yaml: |
#imagePullSecrets:
#- name: tingyun-image-secret
initContainers:
修改后的yaml, 注意格式及对齐, imagePullSecrets
和 initContainers
对齐, -
和 imagePullSecrets
对齐:
mutate.yaml: |
imagePullSecrets:
- name: tingyun-image-secret
initContainers:
重新apply yaml脚本, 并删除Pod tingyun-agent-xxx ,Pod重建后配置才能生效。
kubectl apply -f tingyunagent.yaml
kubectl -n tingyun delete pod tingyun-agent-xxx
常见问题
Q: 如何开启Manifest?
A:Docker 20 以上已经默认开启了Manifest功能,Docker 20以下版本执行以下命令:
执行
vim /root/.docker/config.json
命令,并修改experimental为enabled:{ "auth": {}, "experimental": "enabled" }
重新加载Docker。
systemctl daemon-reload systemctl restart docker
验证是否开启。
Q: ARM64和AMD64的镜像先后上传到同一个私有库,安装后探针启动不了或者应用的Pod启动不了?
A:每个Node拉取镜像时,会尝试自动拉取和当前Node CPU架构一致的镜像,
如果Node CPU既有AMD64又有ARM64,进行镜像推送时请开启Manifest功能。否则可能造成Node拉取了错误的CPU架构的镜像导致无法启动。
如果应用Pod启动失败,并且InitContainer报错 exec /bin/sh exec format error
,说明镜像和当前Node CPU架构不一致。
Q: 部署时,拉取镜像报错 ImagePullBackOff
报ImagePullBackOff的原因有很多,包括:镜像未上传、连接镜像库失败、没有拉取权限、拉取超时等
连接镜像库失败:describe pod中出现
connected fail
等字样,请联系镜像库管理人员确认。没有拉取权限:describe pod中出现
denied
、You may not login
、authorization failed
、401 Unauthorized
等字样,解决方案请参考本文档设置镜像拉取密钥
镜像未上传:describe pod中出现
404
Not Found
等字样,请联系镜像库管理人员确认镜像名、镜像Tag等是否正确。拉取超时:describe pod中出现
timedtout
等字样, 请联系运维确认。