本文介绍了如何通过Kubespray来进行部署高可用k8s集群,k8s版本为1.12.5。
代码仓库:https://github.com/kubernetes-sigs/kubespray
参考文档:https://kubespray.io/#/
由于kubespray是依赖于ansible,ansible通过ssh协议进行主机之间的访问,所以部署之前需要设置主机之间免密登录,步骤如下:
ssh-keygen -t rsa scp ~/.ssh/id_rsa.pub root@IP:/root/.ssh ssh root@IP cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys注意:不要通过使用github仓库master分支的代码,我这里使用的是tag v2.8.3进行部署
wget https://github.com/kubernetes-sigs/kubespray/archive/v2.8.3.tar.gz tar -xvf v2.8.3cd kubespray-v2.8.3Kubernetes安装大部分都是使用的国外的镜像,由于防火墙原因没有办法获取到这些镜像,所以需要自己创建镜像仓库并将这些镜像获取到上传到镜像仓库中。
镜像仓库我们选用的组件是Harbor,安装步骤参考:
https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md
在文件roles/download/defaults/main.yml文件中,可以看到使用的全量镜像列表,注意某些镜像由于功能未使用的原因所以暂时没有用到,我们主要用到有如下镜像:
使用的镜像列表如下,在这里我申请了一台国外的阿里云主机,在该台主机下载所需镜像然后上传至私有镜像仓库
例如操作某个镜像时,需要执行如下命令:
docker pull gcr.io/google_containers/kubernetes-dashboard-amd64:v1.10.0 docker tag gcr.io/google_containers/kubernetes-dashboard-amd64:v1.10.0 106.14.219.69:5000/google_containers/kubernetes-dashboard-amd64:v1.10.0 docker push 106.14.219.69:5000/google_containers/kubernetes-dashboard-amd64:v1.10.0在inventory/testcluster/group_vars/k8s-cluster/k8s-cluster.yml文件中添加如下配置:
# kubernetes image repo define kube_image_repo: "10.0.0.183:5000/google_containers" ## modified by: robbin # comment: 将使⽤的组件的镜像仓库修改为私有镜像仓库地址 etcd_image_repo: "10.0.0.183:5000/coreos/etcd" coredns_image_repo: "10.0.0.183:5000/coredns" calicoctl_image_repo: "10.0.0.183:5000/calico/ctl" calico_node_image_repo: "10.0.0.183:5000/calico/node" calico_cni_image_repo: "10.0.0.183:5000/calico/cni" calico_policy_image_repo: "10.0.0.183:5000/calico/kube-controllers" hyperkube_image_repo: "{{ kube_image_repo }}/hyperkube-{{ image_arch }}" pod_infra_image_repo: "{{ kube_image_repo }}/pause-{{ image_arch }}" dnsautoscaler_image_repo: "{{ kube_image_repo }}/cluster-proportional-autoscaler-{{ image_arch }}" dashboard_image_repo: "{{ kube_image_repo }}/kubernetes-dashboard-{{ image_arch }}"由于我们的私有镜像仓库未配置https证书,需要在 inventory/testcluster/group_vars/all/docker.yml文件中添加如下配置:
docker_insecure_registries: - 10.0.0.183:5000由于默认从Docker官方源安装docker,速度非常慢,这里我们更换为国内阿里源,在inventory/testcluster/group_vars/k8s-cluster/k8s-cluster.yml文件中添加如下配置:
# CentOS/RedHat docker-ce repo docker_rh_repo_base_url:' docker_rh_repo_gpgkey: ' dockerproject_rh_repo_base_url:' dockerproject_rh_repo_gpgkey: 'https://mirrors.aliyun.com/docker-engine/yum/gpg'3.2.2 可执行文件预处理
另外由于需要从google以及github下载一些可执行文件,由于防火墙原因无法直接在服务器上下载,我们可以预先将这些执行文件下载好,然后上传到指定的服务器路径中
可执行文件下载地址可以在roles/download/defaults/main.yml文件中查找到,下载路径如下:
kubeadm_download_url: "https://storage.googleapis.com/kubernetes-release/release/v1.12.5/bin/linux/amd64/kubeadm" hyperkube_download_url: "https://storage.googleapis.com/kubernetes-release/release/v1.12.5/bin/linux/amd64/hyperkube" cni_download_url: "https://github.com/containernetworking/plugins/releases/download/v0.6.0/cni-plugins-amd64-v0.6.0.tgz"接下来修改文件权限,并上传到每台服务器的/tmp/releases目录下
chmod 755 cni-plugins-amd64-v0.6.0.tgz hyperkube kubeadm scp cni-plugins-amd64-v0.6.0.tgz hyperkube kubeadm root@node1:/tmp/releases3.3 组件列表
k8s所需要的组件
可选插件列表
k8s的服务发现依赖于DNS,涉及到两种类型的网络:主机网络和容器网络,所以Kubespray提供了两种配置来进行管理
dns_mode 主要用于集群内的域名解析,有如下几种类型,我们的技术选型是coredns,注意:选择某种dns_mode,可能需要下载安装多个容器镜像,其镜像版本也可能不同
resolvconf_mode主要用来解决当容器部署为host网络模式的时候,如何使用k8s的dns,这里我们使用的是docker_dns
resolvconf_mode: docker_dnskube-proxy可以选择ipvs或者iptables,在这里我们选择的是ipvs模式,关于这两者的区别可以参考 华为云在 K8S 大规模场景下的 Service 性能优化实践(https://zhuanlan.zhihu.com/p/37230013)
网络插件列表如下,我们的技术选型是calico,注意:选择某种网络插件,可能需要一个或多个容器镜像,其镜像版本也可能不同。
部署完成,可以登录到k8s-master所在的主机,执行如下命令,可以看到各个组件正常
kubectl cluster-info kubectl get node kubectl get pods --all-namespaces参考文档:
https://github.com/kubernetes-sigs/kubespray/blob/master/docs/getting-started.md
https://xdatk.github.io/2018/04/16/kubespray2/
https://jicki.me/kubernetes/docker/2018/12/21/k8s-1.13.1-kubespray/
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。