目录

多集群修改本地镜像名

概述

需要批量的修改多个集群,多台节点的镜像域名,也就是执行一次类似 docker tag 这样的操作,如果公司内没有那种运维平台,不管是通过 server 还是 agent 的方式来统一操作节点的话,那可以考虑一下通过 Kubernetes 的 DaemonSet 来做,下面的操作的参考例子。

前提条件

  1. 执行机有多个集群的kubeconfig文件
  2. 执行机安装了kubectx
  3. 配置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日,文中内容可能已过时,请谨慎参考。