3 min read

如何解决在初始化kubernetes集群时无法访问gcr.io?

如何解决在初始化kubernetes集群时无法访问gcr.io?

  国内网络比较特殊化,无法直接访问gcr.io,这导致了我们在正常初始化kubernetes集群时会失败--kubernetes在使用kubeadm工具时会自动拉取gcr.io上面的docker镜像。这时我们需要通过一些特殊的手段来解决该问题。

方法一、镜像替换法

顾名思义,就是从别的地方下载集群所需要的docker镜像,然后将这些镜像tag标记成gcr.io镜像,这样在集群初始化时的镜像依赖就可以得到解决。

查看集群环境需要镜像列表

$ sudo kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.13.3
k8s.gcr.io/kube-controller-manager:v1.13.3
k8s.gcr.io/kube-scheduler:v1.13.3
k8s.gcr.io/kube-proxy:v1.13.3
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.2.24
k8s.gcr.io/coredns:1.2.6

docker.io中下载这些镜像

$ docker pull mirrorgooglecontainers/kube-apiserver:v1.13.3
$ docker pull mirrorgooglecontainers/kube-controller-manager:v1.13.3
$ docker pull mirrorgooglecontainers/kube-scheduler:v1.13.3
$ docker pull mirrorgooglecontainers/kube-proxy:v1.13.3
$ docker pull mirrorgooglecontainers/pause:3.1
$ docker pull mirrorgooglecontainers/etcd:3.2.24
$ docker pull coredns/coredns:1.2.6

使用tag命令将这里镜像前缀改回 gcr.io

$ docker tag mirrorgooglecontainers/kube-apiserver:v1.13.3 k8s.gcr.io/kube-apiserver:v1.13.3
$ docker tag mirrorgooglecontainers/kube-controller-manager:v1.13.3 k8s.gcr.io/kube-controller-manager:v1.13.3
$ docker tag mirrorgooglecontainers/kube-scheduler:v1.13.3 k8s.gcr.io/kube-scheduler:v1.13.3
$ docker tag mirrorgooglecontainers/kube-proxy:v1.13.3 k8s.gcr.io/kube-proxy:v1.13.3
$ docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
$ docker tag mirrorgooglecontainers/etcd:3.2.24 k8s.gcr.io/etcd:3.2.24
$ docker tag coredns/coredns:1.2.6 k8s.gcr.io/coredns:1.2.6
  • 取消从镜像仓库下载的tag
$ docker rmi mirrorgooglecontainers/kube-apiserver:v1.13.3
$ docker rmi mirrorgooglecontainers/kube-controller-manager:v1.13.3
$ docker rmi mirrorgooglecontainers/kube-scheduler:v1.13.3
$ docker rmi mirrorgooglecontainers/kube-proxy:v1.13.3
$ docker rmi mirrorgooglecontainers/pause:3.1
$ docker rmi coredns/coredns:1.2.6

方法二、使用第三方镜像

  在使用kubeadm工具初始化集群时,可以使用使用--image-repository参数接上第三方镜像地址,比如阿里云镜像是registry.cn-hangzhou.aliyuncs.com/google_containers/
,微软云镜像为gcr.azk8s.cn/google_containers/

$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16 \
                    --service-cidr=10.192.0.0/16 \
                    --apiserver-advertise-address=$(hostname -i) \
                    --node-name=$(hostname -i) \
                    --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers/

参数

  • --service-dns-domain k8s.local \
  • --apiserver-advertise-address $(hostname -i) \ # API监听的地址,缺省 0.0.0.0
  • --image-repository
  • --pod-network-cidr string
  • --service-cidr 10.64.0.0/16 # 缺省 10.96.0.0/12
  • --node-name 本节点的名称(DNS需要正常能解析,可以使用当前IP)

推荐使用第二种方法,该方法更为简单高效。

参考引用