如何解决在初始化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)
推荐使用第二种方法,该方法更为简单高效。