內網環境離線部署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 爲如下可用國內鏡像。
配置使用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
在內網其他主機可以用dockers驗證是否可以下載這些鏡像:
docker pull k8s.gcr.io/kube-proxy:v1.15.3
通過上面的設置可以在內網環境完成kubeadm、docker和k8s.gcr.io相關鏡像的全內網方式訪問。
三、使用kubeadm創建集羣
通過kubeadm創建管理k8s集羣的方式,k8s各服務均以static pod的方式運行,由kubelet進行自動管理。 本文檔採用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