使用 ansible 和 vagrant 快速搭建k8s集群
2021-01-07 tech kubernetes ansible vagrant 12 mins 5 图 4415 字
作为kubernetes相关的开发人员,以前我都是用 kind 拉起集群,再进行相关开发的。但kind 毕竟只是一个模拟工具,没法满足我们对 kubernetes 更底层的开发。我使用了 ansible 和 vagrant 进行模拟部署,这篇文章进行一个简要记录。
一、使用 vagrant 拉起虚机
vagrant 相关的操作可以参考我先前的文章——《vagrant 快速上手(基于Debian9)》
以下是我的 Vagrantfile,我将其置于 /etc/vagrant
设置了3个虚机n1 n2 n3,内存cpu可以随意配置,推荐最小1c1g。
运行:
vagrant up
ssh的相关配置如下:
记住上边的信息,在ansible的配置里,需要使用它们来与虚机通信。
虚机运行情况如下:
二、安装 ansible
参考我先前的文章——《ansible 快速上手(Debian 9)》
三、kubeasz
kubeaze 是个 基于 ansible 快速搭建 kubernetes 的项目。可以免翻墙安装,省去了国内开发者很多麻烦, GitHub 上截至2021.01是 6.5k 个赞,是个非常受欢迎的项目了。
我用它来进行kubernetes的安装。基于最简单的架构,我配置了2个master,1个node。
-
下载easzup
chmod +x ./easzup # 下载kubernetes 镜像 ./easzup -D
运行后,
/etc/ansible
目录下就下载好了所有相关的文件了。如果还没有安装 ansible,按照 boot.sh 的命令安装。
-
配置虚机信息
cp example/hosts.multi-node hosts
hosts 文件 用来描述 虚机和kubernetes的相关信息,可以根据 vagrant 相关的配置和个人需要修改 hosts 文件。
我的 hosts 文件如下:
10.184.0.131 ansible_ssh_host=127.0.0.1 ansible_ssh_port=2200 ansible_ssh_private_key_file=/etc/vagrant/.vagrant/machines/n1/virtualbox/private_key 10.184.0.132 ansible_ssh_host=127.0.0.1 ansible_ssh_port=2201 ansible_ssh_private_key_file=/etc/vagrant/.vagrant/machines/n2/virtualbox/private_key 10.184.0.133 ansible_ssh_host=127.0.0.1 ansible_ssh_port=2202 ansible_ssh_private_key_file=/etc/vagrant/.vagrant/machines/n3/virtualbox/private_key [local] test # 'etcd' cluster should have odd member(s) (1,3,5,...) # variable 'NODE_NAME' is the distinct name of a member in 'etcd' cluster [etcd] 10.184.0.131 NODE_NAME=etcd1 10.184.0.132 NODE_NAME=etcd2 10.184.0.133 NODE_NAME=etcd3 # master node(s) [kube-master] 10.184.0.131 10.184.0.132 # work node(s) [kube-node] 10.184.0.133 # [optional] harbor server, a private docker registry # 'NEW_INSTALL': 'yes' to install a harbor server; 'no' to integrate with existed one # 'SELF_SIGNED_CERT': 'no' you need put files of certificates named harbor.pem and harbor-key.pem in directory 'down' [harbor] #192.168.1.8 HARBOR_DOMAIN="harbor.yourdomain.com" NEW_INSTALL=no SELF_SIGNED_CERT=yes # [optional] loadbalance for accessing k8s from outside [ex-lb] #192.168.1.6 LB_ROLE=backup EX_APISERVER_VIP=10.184.0.13250 EX_APISERVER_PORT=8443 #192.168.1.7 LB_ROLE=master EX_APISERVER_VIP=10.184.0.13250 EX_APISERVER_PORT=8443 # [optional] ntp server for the cluster [chrony] #10.184.0.131 [all:vars] # --------- Main Variables --------------- # Cluster container-runtime supported: docker, containerd CONTAINER_RUNTIME="docker" # Network plugins supported: calico, flannel, kube-router, cilium, kube-ovn CLUSTER_NETWORK="calico" # Service proxy mode of kube-proxy: 'iptables' or 'ipvs' PROXY_MODE="iptables" # K8S Service CIDR, not overlap with node(host) networking SERVICE_CIDR="10.68.0.0/16" # Cluster CIDR (Pod CIDR), not overlap with node(host) networking CLUSTER_CIDR="172.20.0.0/16" # NodePort Range NODE_PORT_RANGE="20000-40000" # Cluster DNS Domain CLUSTER_DNS_DOMAIN="cluster.local." # -------- Additional Variables (don't change the default value right now) --- # Binaries Directory bin_dir="/opt/kube/bin" # CA and other components cert/key Directory ca_dir="/etc/kubernetes/ssl" # Deploy Directory (kubeasz workspace) base_dir="/etc/ansible" # Calico # IP_AUTODETECTION_METHOD: "interface=enp0s8"
ssh的配置信息,在 vagrant 目录下 运行命令
vagrant ssh-config
可以获得。 -
修改网络插件相关配置。
由于我是用的是 calico,在 hosts 文件中修改了下面几个配置:
- CLUSTER_NETWORK=”calico”
- IP_AUTODETECTION_METHOD: “interface=enp0s8”
如果不配置 IP_AUTODETECTION_METHOD,默认是
can-reach xxx
,很有可能导致集群无法互联。 vagrant 内网卡名为enp0s8
. -
修改 ansible.cfg 配置文件
增加下面的配置,使用 vagrant 用户。
remote_user = vagrant
-
修改以下ansible的yaml文件,增加
become: true
配置- 01.prepare.yml
- 02.etcd.yml
- 03.docker.yml
- 04.kube-master.yml
- 05.kube-node.yml
- 06.network.yml
- 07.cluster-addon.yml
这么修改的原因是,如果不使用
become: true
,apt 更新等很多需要root权限的操作将报错,使得流程不能继续下去。修改大致如下。
-
运行。
cd /etc/vagrant ansible-playbook 01.prepare.yml ansible-playbook 02.etcd.yml ansible-playbook 03.docker.yml ansible-playbook 04.kube-master.yml ansible-playbook 05.kube-node.yml ansible-playbook 06.network.yml ansible-playbook 07.cluster-addon.yml
-
测试
kubectl get nodes wget cdn.kelu.org/blog/2021/01/demo.yaml kubectl apply -f demo.yaml
查看本机上能否访问以下地址:
- 10.184.0.131:32003
- 10.184.0.132:32003
- 10.184.0.133:32003
只要能访问就说明网络是ok的。