概述
需要批量的修改多个集群,多台节点的镜像域名,也就是执行一次类似 docker tag
这样的操作,如果公司内没有那种运维平台,不管是通过 server 还是 agent 的方式来统一操作节点的话,那可以考虑一下通过 Kubernetes 的 DaemonSet 来做,下面的操作的参考例子。
前提条件
- 执行机有多个集群的kubeconfig文件
- 执行机安装了kubectx
- 配置
alias k=kubectl
简化命令
操作
实际的操作就是做 for loop 循环,脚本的操作最好用少量的镜像,或者测试清楚后才真正去做 docker tag
,保留好日志的输出,遇到问题再 case by case 处理。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
for cluster in `kc` ; do
echo $cluster
kc $cluster
k create ns test
# y.yaml的内容在下面
k -n test apply -f y.yaml
sleep 5s
pods=("${(@f)$(k -n test get pod -l app=create-secrets | grep -v AGE | awk '{print $1}')}")
touch /root/$cluster.log
for pod in $pods ; do
echo "checking logs of pod: $pod"
k -n test logs $pod -c create-secrets > /root/$cluster.log
done
k -n test delete ds create-secrets
echo "======================"
done
|
下面是 y.yaml 的内容的参考,只要的逻辑就是选择需要修改域名的镜像,然后执行 docker tag
换成需要的域名,这里的 yaml 文件的写法是比较特殊的,应用了 yaml 的规则,通过定义 &cmd
这个很长的变量,然后在命令处使用 *cmd
来引用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: retag-image
annotations:
command: &cmd |
#!/usr/bin/env sh
set -x
docker images | while read -r line; do
infoArray=(${line// / })
imageFullName=${infoArray[0]}
imageUrl=$(echo "${imageFullName}" | awk -F '/' '{print $1}')
urlLength=$(echo "${imageUrl}" | awk -F '' '{print NF}')
imageName=${imageFullName:urlLength}
imageRepository=$(echo "${imageName}" | cut -f2 -d '/')
stableUrl="harbor.dev-prev.com"
stablePrivateUrl="harbor.dev-prev.com"
onlineUrl="harbor.fql.com"
onlinePrivateUrl="harbor.fql.com"
case $imageUrl in
# stable
10.9.28.38) docker tag "${imageFullName}:${infoArray[1]}" "${stableUrl}${imageName}:${infoArray[1]}" ;;
# stable private
10.9.20.11) docker tag "${imageFullName}:${infoArray[1]}" "${stablePrivateUrl}${imageName}:${infoArray[1]}" ;;
# online
10.11.36.133) docker tag "${imageFullName}:${infoArray[1]}" "${onlineUrl}${imageName}:${infoArray[1]}" ;;
# online private
10.11.145.14)
if [ "${imageRepository}" == "rancher" ]; then
docker tag "${imageFullName}:${infoArray[1]}" "${onlineUrl}${imageName}:${infoArray[1]}"
fi
;;
*) ;;
esac
done
docker images
labels:
app: retag-image
spec:
selector:
matchLabels:
app: retag-image
template:
metadata:
labels:
app: retag-image
spec:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
hostNetwork: true
hostPID: true
initContainers:
- name: retag-image
command:
- nsenter
- --mount=/proc/1/ns/mnt
- --
- bash
- -c
- *cmd
image: harbor.fql.com/middleware/alpine:3.12
securityContext:
privileged: true
containers:
- name: sleep
image: harbor.fql.com/middleware/alpine:3.12
imagePullPolicy: Always
command:
- sleep
- infinity
|
警告
本文最后更新于 2017年2月1日,文中内容可能已过时,请谨慎参考。