内网环境离线部署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