- Notifications
You must be signed in to change notification settings - Fork33
zze326/ansible-deploy-kubernetes
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
此项目为个人初学 Kubernetes 时所建(那时木有什么给力的一键部署工具),因工作原因木有跟进后续 Kubernetes 的更新,所以不建议大家使用啦~
近几年出现了很多好用的一键部署项目,比如kubeasz、kubespray,二进制部署 Kubernetes 我推荐使用这俩。
此仓库已停更,就当做我 ansible 的练手笔记啦~
- CNI 插件自动部署;
- Dashboard UI 自动部署;
- Metrics Server 自动部署;
- core DNS 自动部署;
- 一键加入新的 Node;
- Ingress-Controller 自动部署;
- 多 Master 高可用(Keepalived + Nginx)一键部署;
- 透明支持 CentOS 7 和 Ubuntu 16/18;
- 多版本兼容(已通过测试的版本有:
v1.17.x、v1.18.x、v1.19.x、v1.20.x); - 支持自定义 Service 和 Pod 网段;
- 支持 HAProxy Ingress Controller 和 Nginx Ingress Controller 可选部署;
- 支持 CNI 网络插件可选部署(Flannel Or Calico);
- 支持容器运行时可选部署(Containerd Or Docker);
- 支持最新 Kubernetes 1.20.x 版本的一键部署;
如有疑惑或建议可提 ISSUE 或在此链接 下留言。
这里我在 CentOS 7.8、Ubuntu 16.04 和 Ubuntu 18.04 上进行了测试,完全能够一键跑完。
用的顺手可以点一下右上角 Star 哦~~
要注意的是,如果你使用的是 Ubuntu,那么需要先在所有节点上装上 python 环境,因为 Ansible 依赖被控端的 python,而 Ubuntu 默认是没有的(CentOS 默认有),执行
sudo apt install python-minimal安装即可。
链接:https://pan.baidu.com/s/1uJwhrINaO-SlTYSjeVOktw 提取码:q3n1。
该链接提供的下载目录结构如下:
├── kubernetes-server-linux-amd64-v1.17.13.tar.gz├── kubernetes-server-linux-amd64-v1.18.10.tar.gz├── kubernetes-server-linux-amd64-v1.19.3.tar.gz├── kubernetes-server-linux-amd64-v1.20.5.tar.gz└── packages ├── cfssl │ ├── cfssl-certinfo_linux-amd64 │ ├── cfssljson_linux-amd64 │ └── cfssl_linux-amd64 ├── cni-plugins-linux-amd64-v0.8.7.tgz ├── docker-19.03.9.tgz └── etcd-v3.4.13-linux-amd64.tar.gz
要下载的文件:
packages目录下都是构建 Kubernetes 集群必需的组件和工具,直接下载该目录;kubernetes-server-linux-amd64-v*.tar.gz为对应版本的 Kubernetes 二进制包,选择一个你需要的版本即可,来源于官网未作任何修改,更多版本可点击此链接自行选择合适的版本;
下载好后它们上传到服务器,并将 Kubernetes 二进制包移动到packages 目录下,我这里选择的是v1.19.3 版本的二进制包,所以最终packages 的目录结构如下:
$ tree packages/packages/├── cfssl│ ├── cfssl-certinfo_linux-amd64│ ├── cfssljson_linux-amd64│ └── cfssl_linux-amd64├── cni-plugins-linux-amd64-v0.8.7.tgz├── containerd-1.4.4-linux-amd64.tar.gz├── crictl-v1.20.0-linux-amd64.tar.gz├── docker-19.03.9.tgz├── etcd-v3.4.13-linux-amd64.tar.gz└── kubernetes-server-linux-amd64-v1.20.5.tar.gz1 directory, 9 files
我这里将packages 目录放到服务器的/opt 目录下,所以最终packages 目录的绝对路径为/opt/packages ,这个路径要和后面hosts.yml 中的package_dir 变量值设置的路径对应。
安装 Ansible 和 Git,我这里使用的是 CentOS 7.8 做演示,直接使用 YUM 安装即可:
$ yum install ansible git -y
如果使用的是 Ubuntu,那么此时不能直接使用apt 来安装 Ansible,因为默认的版本太低了,需要执行下面的操作添加源来安装新版本的 Ansible:
$ sudo apt update$ sudo apt-get install software-properties-common$ sudo apt-add-repository --yes ppa:ansible/ansible:2.7.6$ sudo apt update$ sudo apt-get install ansible取消 Ansible 检查 Key(此步骤如果有疑问可百度或 Google):
$ vim /etc/ansible/ansible.cfg# 取消此行注释host_key_checking = False安装完成后 clone 当前 Project:
# 如果网络不好可以下载 release 版本更快$ git clone https://github.com/zze326/kubernetes-deploy-ansible.git克隆完成后目录结构如下:
$ ls kubernetes-deploy-ansible/hosts.yml manifests README.md roles run.yml
下面对上述几个文件做一下说明:
hosts.yml:主机清单以及配置;manifests:存放 Kubernetes 使用的 manifests,如 CoreDNS、Flannel、Dashboard 等,后续所有使用到的 manifests 都将放在这里方便配置改动;roles:标准的 Ansible 角色目录;run.yml:此 Ansible 的入口 Playbook;
为让部署操作简单易懂,我将所有可能修改的配置都放到了hosts.yml 文件中,下面对hosts.yml 配置进行说明:
all:vars:# SSH 用户名ansible_user:root# SSH 密码ansible_ssh_pass:root1234# 用户的 sudo 提权密码ansible_sudo_pass:root1234# 标识是否是多 Master 架构is_mutil_master:yes# 多 Master 架构时会使用 Nginx 来四层代理多个 Master 中的 APIServer,Nginx 四层代理可能有多个,这多个代理之间使用 Keepalived 提供 VIP 进行高可用,该字段就是用来设置该 VIPvirtual_ip:10.0.1.200# Keepalived VIP 绑定的网卡,如果多个主机网卡名不同,则可定义在对应的主机变量下virtual_ip_device:eth0# Service 网络网段,默认为 10.0.0.0/24service_net:10.0.0.0/24# Pod 网络网段,默认为 10.244.0.0/16pod_net:10.244.0.0/16# 多主架构时 Nginx 代理 APIServer 使用的端口,如果代理和 APIServer 在同一台主机,则不可为 6443,因为 APIServer 的默认端口为 6443proxy_master_port:7443# 应用的安装目录,kube-apiserver、kube-controller-manager、kube-scheduler、kubelet、kube-proxy、nginx、cni、docker、keepalived 等这些应用程序的安装目录install_dir:/opt/apps/# 二进制包的存放目录,就是上面的压缩包 kubernetes-1.19.0-zze-ansible.bin.tar.gz 解压到的目录package_dir:/opt/packages/# 证书存放目录,kubernetes 和 ETCD 的运行需要一些证书,这里先生成所有证书保存到这个目录,然后从这里分发到各个需要对应证书的节点,要求当前运行 Ansible 的用户拥有该目录的写权限,否则证书无法生成(或者使用 sudo 执行 ansible-playbook)tls_dir:/opt/k8s_tls# 提供 NTP 时间同步服务的主机,将会添加到定时任务,因为考虑到可能会使用内建的时间服务器,所以把这个地址提取了出来ntp_host:ntp1.aliyun.com# 是否可以连接到 internet,如果可以,则会自动装 ntpdate 等工具,该字段暂时只有控制联网安装一些软件的功能,主要预留为后续离线部署开关have_network:yes# 是否修改 yum 源或 apt 源为阿里云,支持 CentOS 7、Ubuntu 16、Ubuntu 18,注意,会清空原有的源配置replace_repo:yes# API Server 证书预留 IP 列表,默认情况下:# - 单 master 只会添加 master 节点 IP 到证书;# - 多 master 会添加 master 节点 IP 和 ha_proxy 节点 IP 到证书# 所以这里可以放一些将来打算扩展作为 Master 的主机的 IPapi_server_ext_ip_list: -10.0.1.210 -10.0.1.211 -10.0.1.212# 可信任的 Docker 镜像仓库地址,默认仅允许 HTTPS 仓库,添加后可支持 HTTP,用于渲染 /opt/apps/docker/conf/daemon.jsondocker_insecure_registries: -10.0.1.122 -10.0.1.123# Docker 镜像仓库加速地址,可选,注释后默认为我的阿里云镜像加速地址docker_registry_mirrors:https://7hsct51i.mirror.aliyuncs.com# kubelet 用来发送签发证书请求用的 Token,可通过 head -c 16 /dev/urandom | od -An -t x | tr -d ' ' 生成kubelet_bootstrap_token:8fba966b6e3b5d182960a30f6cb94428# Kubernetes 使用的 pause 镜像,无需解释pause_image:registry.cn-shenzhen.aliyuncs.com/zze/pause:3.2# Dashboard Web UI 使用的端口 30000-32767 之间dashboard_port:30001# 保存 Dashboard 访问 Token 的文件名,在当前 hosts.yml 同级目录下dashboard_token_file:dashboard_token.txt# 选择 Ingress Controller 的类型,目前可选 nginx 和 haproxy,可使用在 hosts 节对应主机下添加 ingress: yes 标识仅在该主机上部署 Ingress-Controller,如果没有标识则默认在所有 Node 上部署,注释此变量则不会部署 Ingress Controlleringress_controller_type:nginx# 选择 CNI 网络插件的类型,目前可选 flannel 和 calico,calico 默认使用 BGP 模式,注释此变量则不会部署 CNI 网络插件cni_type:flannel# 选择 kubelet 使用的容器运行时,先支持 docker 和 containerd,kubernetes 1.20+ 后推荐使用 containerd,即便设置 containerd 为容器运行时,为方便使用依旧会在所有 node 上部署 dockercontainer_runtime:containerd# 下面为主机清单配置,只不过是 YAML 格式,每一个 IP 代表一个主机,其下级字段为对应的主机变量,即如下配置有三个主机hosts:10.0.1.201:# 主机名,会自动设置对应节点的主机名为该属性值,并且 Kubernetes 的节点名称也会使用它hostname:k8s-master1# 标识当前节点是否是 Master 节点master:yes# 标识当前节点时 Node 节点node:yes# 标识当前节点是否是 ETCD 节点etcd:yes# 标识当前节点是否用作 API Server 的代理节点,如果启用,将会在该节点上运行 Nginx 和 Keepalived(仅在多 Master 时生效)proxy_master:yes# 当前节点用作代理节点时会启动一个 Keepalived,该字段用来指定 Keepalived 配置中的优先级,优先级越高,VIP 则越优先绑定到该节点proxy_priority:11010.0.1.202:hostname:k8s-master2node:yesmaster:yesetcd:yesproxy_master:yesproxy_priority:10010.0.1.203:hostname:k8s-node1etcd:yesnode:yesingress:yes
从上述配置可以看出:
- 上述配置最终会创建一个三节点的双 Master 三 Node 的 Kubernete 集群,并且每个节点也是 ETCD 集群中的一个成员;
10.0.1.201和10.0.1.202作为 Master 的同时也会作为 API Server 的代理节点;10.0.1.201的优先级(proxy_priority)比10.0.1.202高,所以最终 Keepalived 管理的 VIP 会优先绑定到10.0.1.201上;
按需修改hosts.yml,大部分配置保持默认即可,几乎仅需要修改节点 IP 和密码,我这里修改完配置之后hosts.yml 内容如下:
all:vars:ansible_user:rootansible_ssh_pass:root1234ansible_sudo_pass:root1234is_mutil_master:yesvirtual_ip:10.0.1.200virtual_ip_device:eth0proxy_master_port:7443install_dir:/opt/apps/package_dir:/opt/packages/tls_dir:/opt/k8s_tlsntp_host:ntp1.aliyun.comhave_network:yesreplace_repo:yesdocker_registry_mirrors:https://7hsct51i.mirror.aliyuncs.comkubelet_bootstrap_token:8fba966b6e3b5d182960a30f6cb94428pause_image:registry.cn-shenzhen.aliyuncs.com/zze/pause:3.2dashboard_port:30001dashboard_token_file:dashboard_token.txtingress_controller_type:haproxycni_type:flannelhosts:10.0.1.201:hostname:k8s-master1master:yesnode:yesetcd:yesproxy_master:yesproxy_priority:11010.0.1.202:hostname:k8s-master2master:yesnode:yesetcd:yesproxy_master:yesproxy_priority:10010.0.1.203:hostname:k8s-node1etcd:yesnode:yesingress:yes
修改完成后执行下面命令开始部署操作:
$ sudo ansible-playbook -i hosts.yml run.yml...TASK [deploy_manifests: 打印 token 信息]***************************************************************************************************************************************************************ok: [10.0.1.201] => {"msg":"token: eyJhbGciOiJSUzI1NiIsImtpZCI6IlVnU2Z6aTM1a0I1S3J5T04yVmMwQTNoWC0xZnF2RThybXBzQU9pcWhUYnMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tamdzZHQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMWI3YzcxMWYtMGQwYi00MTJjLTkwMGEtMzY5ZmVmZGZiMzZjIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.oxjPtZhyOylFO8mvWBJ6E8UD42161-jxLMXYeJuQSPKs_wioUqR2Fkx3p7DeYb3b0A4_I4cT0APC1nM1tQnuah9UH9wb6hryzdoiH8WVfNZjjGJcPCC59hMOLFfBswQOo5f9zIbZnMdDjo9NXo96RQrxlu_JxQM_l3UYpr2Gn5CRwZrMVQBRQ5mhDd2yTK-wF-I0rcwoIDAUGt-ajFRZ7J9V4AHxXjHDfA0XqVCay25ZKiJ50UkkGV0PCwU7VwZzdNqF-nOxRkhDnX7w13LVxlwaWvpBMcHimX2HU0P6orufslKlVrQAdj3nenZ4dKPW0Ss1ndK0nRUpOuOgd4hi7g"}skipping: [10.0.1.202]skipping: [10.0.1.203]TASK [deploy_manifests: 保存 token 到当前 ansible 目录]***************************************************************************************************************************************************skipping: [10.0.1.202]skipping: [10.0.1.203]changed: [10.0.1.201]PLAY RECAP******************************************************************************************************************************************************************************************10.0.1.201: ok=117 changed=82 unreachable=0 failed=0 skipped=19 rescued=0 ignored=0 10.0.1.202: ok=69 changed=53 unreachable=0 failed=0 skipped=33 rescued=0 ignored=0 10.0.1.203: ok=49 changed=39 unreachable=0 failed=0 skipped=53 rescued=0 ignored=0
要添加 Node 节点也很简单,仅需在hosts.yml 下新添加一个节点,并添加一个主机变量node: yes 标识它为 Node 节点,我这里要添加一个10.0.1.204 的主机为新 Node,所以在hosts.yml 中添加配置如下:
all:vars:ansible_user:rootansible_ssh_pass:root1234ansible_sudo_pass:root1234...hosts:...10.0.1.203:hostname:k8s-node1etcd:yesnode:yes10.0.1.204:hostname:k8s-node2node:yes
然后执行 Playbook 时限定仅执行新 Node 节点相关的 Task,如下:
$ sudo ansible-playbook -i hosts.yml run.yml --limit 10.0.1.204
如果需要同时添加多个 Node 节点,有如下两种方法:
- 使用
--limit时后面指定多个 Node IP,以逗号,分隔;- 可以将多个 Node 节点的 IP 保存到一个文本文件,每行一个 IP,然后执行
ansible-playbook时使用--limit @<文件名>即可;
执行完成后在 Master 节点可以接收到新 Node 中的 Kubulet 发出的证书申请:
$ kubectl get csr| grep Pendingnode-csr-jHEi1_yP3TNX80M8_4KPRxIziC7E-bkf07rJpa_l4Vw 2m16s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending直接在 Master 节点执行下面命令允许签发证书即可:
$ kubectl get csr| awk'$NF=="Pending"{print $1}'| xargs -i kubectl certificate approve {}certificatesigningrequest.certificates.k8s.io/node-csr-jHEi1_yP3TNX80M8_4KPRxIziC7E-bkf07rJpa_l4Vw approved
然后就可以查看到新加入的节点了:
$ kubectl get nodeNAME STATUS ROLES AGE VERSIONk8s-master1 Ready<none> 26m v1.20.5k8s-master2 Ready<none> 21m v1.20.5k8s-node1 Ready<none> 26m v1.20.5k8s-node2 NotReady<none> 22s v1.20.5
在 Master 节点(10.0.1.201 或10.0.1.202)上检查 Node 是否正常:
$ kubectl get nodeNAME STATUS ROLES AGE VERSIONk8s-master1 Ready<none> 113s v1.20.5k8s-master2 Ready<none> 113s v1.20.5k8s-node1 Ready<none> 113s v1.20.5
检查网络插件是否正常,即检查Pod 能否跨主机通信,创建如下Deployment 资源:
$ cat test_deploy.yml apiVersion: apps/v1kind: Deploymentmetadata: labels: app:test name:testspec: replicas: 3 selector: matchLabels: app:test template: metadata: labels: app:test spec: containers: - image: busybox:1.28.4 name: busybox command: ["sleep","3600"]$ kubectl apply -f test_deploy.ymldeployment.apps/test created
随便进入一个Pod 中的容器,ping 另外两个主机上的Pod:
$ kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATEStest-54fdd84b68-j9zwq 1/1 Running 0 77s 10.244.0.2 k8s-node1<none><none>test-54fdd84b68-w64jv 1/1 Running 0 77s 10.244.2.4 k8s-master1<none><none>test-54fdd84b68-zptw8 1/1 Running 0 77s 10.244.1.3 k8s-master2<none><none>$ kubectlexec -it test-54fdd84b68-j9zwq -- sh/# ping 10.244.2.4PING 10.244.2.4 (10.244.2.4): 56 data bytes64 bytes from 10.244.2.4: seq=0 ttl=62 time=1.334 ms^C--- 10.244.2.4 ping statistics ---1 packets transmitted, 1 packets received, 0% packet lossround-trip min/avg/max = 1.334/1.334/1.334 ms/#/# ping 10.244.1.3PING 10.244.1.3 (10.244.1.3): 56 data bytes64 bytes from 10.244.1.3: seq=0 ttl=62 time=0.761 ms
About
Ansible 一键部署二进制版高可用 Kubernetes 集群(CentOS 7 和 Ubuntu 16/18 已经过测试)。
Topics
Resources
Uh oh!
There was an error while loading.Please reload this page.