前言:
kubernetes的集群部署方式之一是使用kubeadm,该方式部署的集群性质比较接近shell里的一键安装部署脚本,各个组件耦合度非常高,比如etcd组件,kube-apiserver组件并不能高可用,因此,在2018年之前,kubernetes官方并不建议也不能将kubeadm用于生产环境,只是一个快速搭建测试集群的工具。
在2018年之后,通过官方以及社区的不断改进,kubeadm能够实现组件的解耦进而实现了kubernetes集群关键组件的可高用,因此,kubeadm和二进制集群部署方式成为了两大主流方式。
从现如今的角度来看,二进制部署集群仍然是一个首选方案,因为kubeadm部署方式里的关于kube-controller-manage和kube-scheduler 这两个次级关键组件仍不能实现高可用,但不得不说中小规模的kubernetes集群kubeadm这个部署工具仍然是适用的。
我们在使用kubeadm部署集群的时候,如果不做特别的指定,那么,这个集群将会使用其内部的静态pod来创建etcd,因此,此etcd将会是一个单实例模式,而这样的集群显然是不适合在实际的生产活动中使用的,因此,本文将分享如何解耦kubeadm里的etcd,直接使用外部的etcd集群来部署一个高可用的kubernetes集群。
注1:kubernetes集群的组件大体有kube-controller-manage ,kube-apiserver ,kube-scheduler,etcd,kube-proxy这么几个核心的关键组件,其中,为了保证生产环境的稳定可靠,也是为了应对集群的大流量冲击,etcd和kube-apiserver应该是高可用集群模式也必须是高可用集群模式。
注2:静态pod,特指集群内部的运行关键组件的专有pod,此pod一般不需要人为干预,只是作为集群的一个组件形式存在,是在集群初始化的时候生成的pod,例如下面这些pod,统一称为静态pod
[root@master bin]# kubectl get po -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-7f6cbbb7b8-4vrj7 1/1 Running 0 42m kube-system coredns-7f6cbbb7b8-9x2kg 1/1 Running 0 42m kube-system kube-apiserver-master 1/1 Running 0 43m kube-system kube-controller-manager-master 1/1 Running 0 43m kube-system kube-proxy-kvq2z 1/1 Running 0 41m kube-system kube-proxy-rwtbz 1/1 Running 0 42m kube-system kube-proxy-wp2ft 1/1 Running 0 42m kube-system kube-scheduler-master 1/1 Running 0 43m
OK,下面就开始讲述如何在kubeadm中使用外部etcd集群。
一,环境介绍
主机名的定义:
[root@master ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.217.19 master k8s-master 192.168.217.20 node1 k8s-node1 192.168.217.21 node2 k8s-node2
集群基础环境的安装见我的博客:
云原生|kubernetes|kubeadm五分钟内部署完成集群(完全离线部署---适用于centos7全系列)_晚风_END的博客-CSDN博客
二,etcd集群二进制部署
centos7操作系统 ---ansible剧本离线快速部署etcd集群_晚风_END的博客-CSDN博客_etcd离线安装
这里在强调一下,ansible_offlie.tar.gz 进入解压目录后 rpm -ivh * 即可,剩下的按照上面我写的博客操作即可。
ansible-deployment-etcd-3.3.tar对应etcd-v3.3.13-linux-amd64.tar
ansible-deployment-etcd-3.4.tar对应etcd-v3.4.9-linux-amd64.tar ,etcd安装包如果不想麻烦就放到root根目录下即可。
etcd集群部署完成后的最终测试:
[root@node2 ~]# ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints=https://192.168.217.19:2379,https://192.168.217.20:2379,https://192.168.217.21:2379 --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem member list -w table +------------------+---------+--------+-----------------------------+-----------------------------+------------+ | ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER | +------------------+---------+--------+-----------------------------+-----------------------------+------------+ | 97c1c1003e0d4bf | started | etcd-1 | https://192.168.217.19:2380 | https://192.168.217.19:2379 | false | | ef2fee107aafca91 | started | etcd-2 | https://192.168.217.20:2380 | https://192.168.217.20:2379 | false | | f5b8cb45a0dcf520 | started | etcd-3 | https://192.168.217.21:2380 | https://192.168.217.21:2379 | false | +------------------+---------+--------+-----------------------------+-----------------------------+------------+
[root@node2 ~]# etcd_search member list -w table +------------------+---------+--------+-----------------------------+-----------------------------+------------+ | ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER | +------------------+---------+--------+-----------------------------+-----------------------------+------------+ | 97c1c1003e0d4bf | started | etcd-1 | https://192.168.217.19:2380 | https://192.168.217.19:2379 | false | | ef2fee107aafca91 | started | etcd-2 | https://192.168.217.20:2380 | https://192.168.217.20:2379 | false | | f5b8cb45a0dcf520 | started | etcd-3 | https://192.168.217.21:2380 | https://192.168.217.21:2379 | false | +------------------+---------+--------+-----------------------------+-----------------------------+------------+
三,kubernetes集群正式部署:
config配置文件形式初始化集群(在19服务器上执行):
需要更改的地方:
advertiseAddress: 192.168.217.19 修改成你自己的要作为master节点的IP地址
name:master 修改成你自己要作为master节点的主机名
hostnameOverride: "k8s-master" 修改成你自己要作为master节点的hosts文件内定义的主机名
dns: {} 这里表示使用默认也就是coredns,如果想显式定义可修改为:
1. dns: 2. type:coreDNS
有多少etcd节点就写多少个,一样的格式,etcd的证书路径后面处理:
- https://192.168.217.19:2379 - https://192.168.217.20:2379 - https://192.168.217.21:2379 caFile: /etc/kubernetes/pki/etcd/ca.pem certFile: /etc/kubernetes/pki/etcd/apiserver-etcd-client.pem keyFile: /etc/kubernetes/pki/etcd/apiserver-etcd-client-key.pem
[root@master ~]# ls -al /opt/etcd/ssl/ total 16 drwxr-xr-x 2 root root 78 Oct 21 15:21 . drwxr-xr-x 5 root root 39 Oct 21 15:21 .. -rw-r--r-- 1 root root 1675 Oct 21 15:21 ca-key.pem -rw-r--r-- 1 root root 1265 Oct 21 15:21 ca.pem -rw-r--r-- 1 root root 1679 Oct 21 15:21 server-key.pem -rw-r--r-- 1 root root 1338 Oct 21 15:21 server.pem