内网环境离线部署k8s,docker

要全内网环境安装docker、k8s和相关依赖,需要在内部提供k8s、docker和linux更新yum源和内部镜像仓库提供kubeadm需要的各镜像。

一,内部yum源建立和内网docker、k8s安装

创建内部docker介质yum源

因为docker版本对linux相关包的依赖包括了对extra下的container-selinux版本要求,因此需要通过国内外网环境的linux base和extra源来建立本地docker源。

1,添加linux介质源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
2, 添加docker介质源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --enable docker-ce-edge
3, 通过如下命令download远程yum源文件,建立本地docker repo库
yumdownloader --resolve docker-ce  --destdir /root/docker-ce 
##或者yum install --downloadonly --downloaddir=/mnt/docker-ce docker-ce
createrepo -d /mnt/docker-ce

注:如果yumdownloader,createrepo工具不存在,可以通过linux base repo进行安装。

创建内部k8s介质yum源

通过国内外网可用kubernetes源建立本地源,比如可以通过aliyun来建立本地yum源。

1,添加aliyun提供的k8s下载镜像
cat <<EOF > /etc/yum.repos.d/kubernetes.repo

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
2, 执行如下命令download远程yum源文件,建立本地repo库
yumdownloader --resolve kubeadm --destdir /mnt/k8s
createrepo -d /mnt/k8s

如上操作将在本地/mnt/docker-ce建立docker可安装yum源、在/mnt/k8s下建立kubernetes可安装yum源,通过http服务提供其他主机安装,比如,通过如下配置nginx服务对外提供下载。nginx.conf关键配置如下:

server {
    listen          80;
    server_name     yum.serve;
    server_name     public.serve;
    server_name     package.wcj.me;
    access_log      /usr/local/nginx/logs/share.access.log ;
    error_log       /usr/local/nginx/logs/share.error.log;

    location / {
            root                    /mnt;
                autoindex               on;
                autoindex_exact_size    on;
                autoindex_localtime     on;
        }
}

内网其他机器可以配置/etc/yum.conf或添加这些yum repo。

[os-repo]
name=os repo
baseurl=http://192.168.100.70:9080/nfs
enabled=1
gpgcheck=0
skip_if_unavailable=1

[k8s-repo]
name=k8s repo
baseurl=http://192.168.100.70:9080/k8s
enabled=1
gpgcheck=0
skip_if_unavailable=1

[docker-repo]
name=docker repo
baseurl=http://192.168.100.70:9080/docker-ce
enabled=1
gpgcheck=0
skip_if_unavailable=1

这样配置后,内网其他主机均可通过该机器方便地安装docker,kubeadm等。

yum clean all
yum install -y docker-ce
yum install -y kubeadm

二、kubeadm依赖镜像库建立

kubeadm在进行集群建立和管理时,只能读取默认k8s.gcr.io仓库下的镜像。

kubeadm config images list
……falling back to the local client version: v1.15.3
k8s.gcr.io/kube-apiserver:v1.15.3
k8s.gcr.io/kube-controller-manager:v1.15.3
k8s.gcr.io/kube-scheduler:v1.15.3
k8s.gcr.io/kube-proxy:v1.15.3
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1

因此,要建立本地镜像仓库,并使用其为kubeadm提供镜像服务。可以在各主机/etc/hosts文件设置k8s.gcr.io指向本地registry库所在主机,并将本地registry服务启动到80端口。

1, 通过国内外网可用google镜像源下载k8s各镜像

kubeadm config print init-defaults > kubeadm.yml

修改替换kubeadm.yml中imageRepository: k8s.gcr.io 为如下可用国内镜像。

  • gcr.azk8s.cn/google-containers
  • quay.azk8s.cn/coreos
  • dockerhub.azk8s.cn/library/centos
  • mirrorgooglecontainers/google-containers
  • registry.cn-hangzhou.aliyuncs.com/google_containers
  • 配置使用daoCloud国内镜像加速

    curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
    
    # cat /etc/docker/daemon.json
    {"registry-mirrors": ["http://f1361db2.m.daocloud.io"],
    
      "insecure-registries": [ "k8s.gcr.io" ]
    }
    
    

    比如如下修改kubeadm.yml

    cat kubeadm.yml 
    imageRepository: gcr.azk8s.cn/google-containers
    kind: ClusterConfiguration
    kubernetesVersion: v1.15.3
    

    通过如下命令下载镜像。

    kubeadm config images pull --config kubeadm.yml
    

    通过命令将下载的镜像tag修改为k8s.gcr.io。

    for r in $(kubeadm config images list --config kubeadm.yml);do rsv=($(docker image ls $r|tail -n 1));image=$(echo ${rsv[0]}|awk -F / '{print $NF}');tag=${rsv[1]}; docker tag $r k8s.gcr.io/$image:$tag;docker rmi -f $r; done
    
    

    ARM64平台下拉取kubeadm以来k8s镜像示例脚本:

    #!/bin/bash
    
    
    repos=$(kubeadm config images list 2>/dev/null | grep "k8s.gcr.io" )
    
    mirror=mirrorgcrio
    
    for repo in ${repos};
    do
    
    iv=$(echo $repo|awk -F / '{print $NF}')
    
    #docker rmi -f $repo
    
    image=$(echo $iv|cut -d ':' -f 1)
    version=$(echo $iv|cut -d ':' -f 2)
    
    if [[ $image == "coredns" ]];then
    mrepo="coredns/"$image:$version
    else
    mrepo=$mirror/$image-arm64:$version
    fi
    
    exts=$(docker image ls $mrepo|grep $image|wc -l)
    
    if [[ $exts -lt 1 ]];then
    docker pull $mrepo
    fi
    
    docker tag $mrepo $repo
    ######a local host named k8s.gcr.io registry started by   docker run -d --rm -v $(pwd)/vg:/var/lib/registry -p 80:5000 --name registry registry
    
    docker push $repo
    
    done
    
    

    2, 建立本地registry库,并上传镜像

    修改内部各主机/etc/hosts和docker配置指向内部主机k8s.gcr.io。比如:

    [root@zhannk1 ~]# cat /etc/hosts
    ……
    192.168.100.70  zhannk k8s.gcr.io
    ……
    
    [root@zhannk1 ~]# cat /etc/docker/daemon.json
    {
    
      "insecure-registries": [ "k8s.gcr.io" ]
    }
    

    在80端口启动registry,这个可以方便其他主机通过内部k8s.gcr.io下载镜像。

    docker run -d  -v /root/vg:/var/lib/registry -p 80:5000 --name registry registry
    

    将镜像上传到registry。

    IFS=$'\n';for line in $(docker images |grep k8s.gcr.io);do unset IFS; ia=($line);  docker push ${ia[0]}:${ia[1]}; done
    

    通过curl可以查看Registry中镜像信息:

    curl -L http://localhost/v2/_catalog
    curl -L http://localhost/v2/pause/tags/list
    

    在内网其他主机可以用dockers验证是否可以下载这些镜像:

    docker pull k8s.gcr.io/kube-proxy:v1.15.3 
    

    通过上面的设置可以在内网环境完成kubeadm、docker和k8s.gcr.io相关镜像的全内网方式访问。

    三、使用kubeadm创建集群

    通过kubeadm创建管理k8s集群的方式,k8s各服务均以static pod的方式运行,由kubelet进行自动管理(https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ )。 本文档采用kube-router作为k8s网络方案创建k8s集群(The combination of BGP for inter-node Pod networking and IPVS for load balanced proxy Services is a perfect recipe for high-performance cluster networking at scale.v)。

    –to be continued

Logo

开源、云原生的融合云平台

更多推荐