由于头条篇幅有限,分上下两部分呈现给大家,大家关注头号可以在查到完整的技术文档哈。
技能目标:
· 了解k8s api基本对象
· 掌握k8s组件工作原理
· 学会部署k8s集群
7.1 案例分析
7.1.1 案例概述
随着Docker技术的发展和广泛流行,云原生应用和容器调度管理系统也成为IT领域大热的词汇。事实上,在Docker技术火爆之前,云原生应用的思想已经由云计算技术的领导者和分布式系统架构的推广者广泛传播。例如早在2011年Heroku的工程师提出了云原生应用的12要素,只不过以虚拟机技术作为云原生应用的基础实施。由于虚拟机镜像大、镜像标准不统一以及打包流程和工具不统一,导致了业界无法广泛接受的云原生应用标准,限制了云原生应用的流行。而Docker的出现正好解决了这些限制云原生应用构建、交付和运行的瓶颈,使得构建云原生应用成为了使用Docker的开发者自然而然的选择。
Kubernetes是为生产环境而设计的容器调度管理系统,对于负载均衡、服务发现、高可用、滚动升级、自动伸缩等容器云平台的功能要求有原生支持。由于Kubernetes在K和s间有8个字母,因此常简称k8s。事实上,随着对k8s系统架构与设计理念的了解深入,会发现K8s系统正是处处为运行云原生应用而设计考虑;同时,随着对k8s系统使用的加深和推广,也会有越来越多有关云原生应用的设计模式产生出来,使得基于k8s系统设计和开发生产级的复杂云原生应用变得像启动一个单机版容器服务那样简单易用。
7.1.2 案例前置知识点
1. k8s是什么
Kubernetes是一个开源的Docker容器编排系统,它可以调度计算集群的节点,动态管理上面的作业,保证它们按用户期望的状态运行。通过使用「labels」和「pods」的概念,Kubernetes将应用按逻辑单元进行分组,方便管理和服务发现。
k8s主要用于自动化部署、扩展和管理容器应用,提供了资源调度、部署管理、服务发现、扩容缩容、监控等一整套功能。2015年7月,Kubernetes v1.0正式发布,截止到目前最新稳定版本是v1.9。
2. 为什么要用Kubernetes
使用Kubernetes的理由有很多,最基本的一个理由就是:IT是新技术驱动行业。
Docker这个新兴的容器化技术当前已经被很多公司所采用,其从单机走向集群已成必然,而云计算的蓬勃发展正在加速这一进程。Kubernetes作为当前唯一被业界广泛认可和看好的Docker分布式系统解决方案。可以预见,在未来几年内,会有大量的新系统选择它,不管是运行在企业本地服务器上还是被托管到公有云上。
使用Kubernetes又会收获哪些好处呢?
首先,使用Kubernetes就是在全面拥抱微服务架构。微服务架构的核心就是将一个巨大的单体应用分解为很多小的互相连接的微服务,一个微服务背后可能有多个实例副本在支撑,副本的数量可能会随着系统的负荷变化而进行调整,内嵌的负载均衡器在k8s平台中有多个实例副本在支撑,副本的数量可能会随着系统的负荷变化而进行调整,内嵌的负载均衡器k8s平台中发挥了重要的作用。微服务架构使得每个服务都可以由专门的开发团队来开发,开发者可以自由选择开发技术,这对于大规模团队来说很有价值。另外,每个微服务独立开发、升级、扩展,使得系统具备很高的稳定性和快速迭代进化能力。
其次,Kubernetes系统架构具备了超强的横向扩容能力。对于互联网公司来说,用户规模就等价于资产,谁拥有更多的用户,谁就能在竞争中胜出,因此超强的横向扩容能力是互联网业务系统的关键指标之一。不用修改代码,一个Kubernetes集群即可从只包含几个Node的小集群平滑扩展到拥有成百上千Noder大规模集群,利用Kubernetes提供的工具,甚至可以在线完成集群的扩容。只要微服务设计的得好,结合硬件或者公有云资源的线性增加,系统就能够承受大量用户并发访问所带来的压力。
3. Kubernetes基本概念和术语
Kubernetes中的大部分概念如Node、Pod、Replication Controller、Server、Deploymeng、Job、DaemonSet等都可以看作一种资源对象,几乎所有的资源对象都可以通过Kubernetes提供的kubectl工具执行增、删、改、查等操作,并将其保存在etcd中持久化存储。从这个角度来看,Kubernets其实是一个高度自动化的资源控制系统,它通过跟踪对比etcd存储里保存的资源期望状态与当前环境中的实际资源状态的差异来实现自动控制和自动纠错的高级功能。
1) Master
Kubernetes里的Master指的是集群控制节点,每个Kubernetes集群里需要有一个Master节点来负责整个集群的管理的控制,基本上Kubernetes所有的控制命令进是发给Master,Master负责具体的执行过程,后面所有执行的命令基本都是在Master节点上运行的。Master节点通常会占据一个独立的X86服务器,一个主要的原因是它太重要了,它是整个集群的大脑,如果它宕机或者不可用,那么所有的控制命令都将失效。
Master节点上运行着以下一组关键进程:
· Kube-apiserver:提供了HTTP Rest接口的关键服务进程,是Kubernetes里所有资源的增、删、改、查等操作的唯一入口,也是集群控制入口进程。
· Kube-controller-manager:是Kubernetes里所有资源对象的自动化控制中心,可以理解为资源对象的管家。
· Kube-scheduler:负责资源调度的进程,相当于公交公司的调度室。
其实Master节点上往往还启动了一个etcd server进程,因为Kubernetes里的所有资源对象的数据全部是保存在etcd中的。
2) Node
除了Master、Kubernetes集群中的其他机器被称为Node节点,在较早的版本中也被称为Minion。与Master一样,Node节点可以是一台物理主机,也可以是一台虚拟机。Node节点才是Kubernetes集群中的工作负载节点,每个Node都会被Master分配一些负载。当某个Node宕机时,其上的工作负载会被Master自动转移到其他节点上去。
每个Node节点都运行着以下一组关键进程:
· Kubelet:负责Pod对应的容器的创建、启停等任务,同时与Master节点密切协作,实现集群管理的基本功能。
· Kube-proxy:实现Kubernetes Service的通信与负载均衡机制的重要组件。
图7.1是k8s组件逻辑图。
图7.1 k8s组件逻辑图
· Docker Engine:Docker引擎,负责本机的容器创建和管理工作。
Node节点可以在运行期间动态增加到Kubernetes集群中,前提是这个节点上已经正确安装、配置和启动了上述关键进程。在默认情况下,kubelet会向Master注册自己,这也是Kubernetes推荐的Node管理方式。一旦Node被纳入集群管理范围,kubelet进程就会定向Master节点汇报自身的情况,例如操作系统、Docker版本、机器的CPU和内存情况,以及之前有哪些Pod在运行等,这样Master可以获知每个Node的资源使用情况,并实现高效负载均衡资源调度策略。而某一个Node超过指定时间不上报信息时,会被Master判定为失聪的状态,被标记为不可用,随后Master会触发节点转移进程。
3) Pod
Pod是最小部署单元,一个Pod有一个或多个容器组成,Pod中容器共享存储和网络,在同一台Docker主机上运行。每个Pod都有一个特殊的被称为"根容器"的Pause容器。Pause容器对应的镜像属于Kubernetes平台的一部分,除了Pause容器,每个Pod还包含一个或多个紧密相关的用户业务容器。
4) Lable
Lable是Kubernetes系统中另外一个核心概念。一个Label是一个key-value的键值对,其中key与value由用户自己指定。Label可以附加到各种资源对象上,例如Node、Pode、Service、RC等。一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象中,也可以在对象创建后动态添加或者删除。
另外可以通过给指定的资源对象捆绑一个或多个不同的Label来实现多纬度的资源分组管理功能,以便于灵活、方便地进行资源分配、调度、配置、部署等管理工作。Label标签,给某个资源对象定义一个Label,就相当于给它打了一个标签,随后可以通过Label selector 标签选择器查询和筛选拥有某些Label的资源对象,Kubernetes通过这种方式实现了类似SQL的简单又通用的对象查询机制。
5) 复制控制器(Replication Controller ,RC)
RC是Kubernetes集群中最早的保证Pod高可用的API对象。通过监控运行中的Pod来保证集群中运行指定数目的Pod副本。指定的数目可以是多个也可以是1个;如果少于指定数目,RC就会启动运行新的Pod副本。如果多于指定数目,RC就会杀死多余的Pod副本。即使在指定数目为1的情况下,通过RC运行Pod也比直接运行Pod更明智,因为RC也可以发挥它高可用的能力,保证永远有1个Pod在运行。RC是K8s较早期的技术概念,只适用于长期伺服型的业务类型,比如控制小机器人提供高可用的Web服务。
6) Deployment控制器
部署表示用户对K8s集群的一次更新操作。部署是一个比RS应用模式更广的API对象,可以是创建一个新的服务,更新一个新的服务,也可以是滚动升级一个服务。滚动升级一个服务,实际是创建一个新的RS,然后逐渐将新RS中副本数增加到理想状态,将旧RS中的副本数减小到0的复合操作;这样一个复合操作用一个RS是不太好描述的,需要用一个更通用的Deployment来描述。以k8s的发展方向,未来对所有长期服务型的的业务的管理,都会通过Deployment来管理。
7) 服务 Service
RC和Deployment只是保证了支撑服务的微服务Pod的数量,但是没有解决如何访问这些服务的问题。一个Pod只是一个运行服务的实例,随时可能在一个节点上停止,在另一个节点以一个新的IP地址启动一个新的Pod,因此不能以确定的IP地址和端口号提供服务。要稳定地提供服务,需要服务发现和负载均衡能力。服务发现完成的工作,是针对客户端访问的服务,找到对应的的后端服务实例。
在K8s集群中,客户端需要访问的服务就是Service对象。每个Service会对应一个集群内部有效的虚拟IP,集群内部通过虚拟IP访问一个服务。在K8s集群中微服务的负载均衡是由Kube-proxy实现的。Kube-proxy是K8s集群内部的负载均衡器。它是一个分布式代理服务器,在K8s的每个节点上都会运行一个Kube-proxy组件;这一设计体现了它的伸缩性优势,需要访问服务的节点越多,提供负载均衡能力的Kube-proxy就越多,高可用节点也随之增多。与之相比,平时在服务器端做个反向代理做负载均衡,还要进一步解决反向代理的负载均衡和高可用问题。
8) Job计划任务
Job是Kubernetes用来控制批处理型任务的API对象。批处理业务与长期服务业务的主要区别是批处理业务的运行有头有尾,而长期伺服业务在用户不停止的情况下永远运行。根据用户的设置,Job管理的Pod把任务成功完成就自动退出了。成功完成的标志根据不同的spec.completions策略而不同:单Pod型任务有一个Pod成功就标志完成;定数成功型任务保证有N个任务全部成功;工作队列型任务根据应用确认的全局成功而标志成功。
9) DaemonSet
后台支撑型服务的核心关注点在Kubernetes集群中的节点(物理机或虚拟机),DaemonSet确保所有或某些节点运行同一个Pod,要保证每个节点上都有一个此类Pod运行。节点可能是所有集群节点也可能是通过nodeSelector选定的一些特定节点。典型的后台支撑型服务包括,存储,日志和监控等在每个节点上支持K8s集群运行的服务。
4. 小结
上述这些组件是Kubernetes系统的核心组件,共同构成了Kubernetes系统的框架和计算模型。通过对它们进行灵活配置用户就可以快速、方便地对容器集群进行配置和管理。除了本章所介绍的核心组件外,在Kubernetes系统中还有很多辅助的资源对象,例如LimitRange、ResouceQuota。另外,一些系统内部使用的对象等具体可以参考Kubernetes的Api文档。
7.1.3 案例环境
1. 本案例实验环境
本案例环境如表7-1所示。
表7-1 k8s系统环境
2. 主机角色分配
本案例环境角色分配如表7-2所示。
表7-2 Docker角色分配
3. 案例拓扑
Kubernetes集群是由分布式存储(etcd)、服务节点(Node)和控制节点(Master)构成的。所有的集群状态都保存在etcd中,Master节点上则运行集群的管理控制模块。Node节点是真正运行应用容器的主机节点,在每个Node节点上都会运行一个Kubelet代理,控制该节点上的容器、镜像和存储卷等。具体架构图如7.2所示:
图7.2 Kubernetes拓扑图
4. 案例需求
1)部署etcd服务集群
2)部署flannel网络跨主机通信网络
3)部署k8s集群
5.案例实现思路
1)准备k8s系统环境
2)创建自签的TLS通信加密证书
3)部署etcd集群
4)部署flannel网络
5)部署k8s master组件
6)部署k8s node 组件
7)查看自动签发证书,验证k8s集群部署成功
7.1.4 问题分析
绝大部分使用k8s的人都会使用kubedns做服务发现和service domain的解析。kubedns会建立长连接即时检查service的变化,一旦发现有service被创建,会根据service的类型,在数据库中构建service domain 到指定的CNAME或IP(cluster-IP)的映射,作为对该service domain 的dns解析结果。
7.2 案例实施
7.2.1 k8s系统环境准备
1. 修改主机名
[root@localhost ~]# hostnamectl set-hostname k8s-master //192.168.168.91
[root@localhost ~]# hostnamectl set-hostname k8s-node1 //192.168.168.92
[root@localhost ~]# hostnamectl set-hostname k8s-node2 //192.168.168.93
2. 修改hosts对应主机名
[root@k8s-master ~]# vi /etc/hosts //每台机器都需要执行
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.168.91 k8s-master
192.168.168.92 k8s-node1
192.168.168.93 k8s-node2
3. 添加外网dns解析地址
注意:要根据自己的网络环境选择合适的dns。
[root@k8s-master ~]# vi /etc/resolv.conf //每台机器都需要执行
nameserver 202.106.0.20
4. 安装必要的依赖软件(k8s创建容器的时候需要生成iptables规则)
//每台机器都需要执行,master可以不安装docker
[root@k8s-master ~]# yum -y install iptable* wget telnet lsof vim
[root@k8s-master ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@k8s-master ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@k8s-master ~]# yum -y install docker-ce
[root@k8s-master ~]# systemctl restart docker
[root@k8s-master ~]# cat << EOF > /etc/docker/daemon.json
{
"registry-mirrors":["https://registry.docker-cn.com"]
}
EOF
5. 把默认的firewalld防火墙换成iptables
[root@k8s-master ~]# systemctl stop firewalld //每台机器都需要执行
[root@k8s-master ~]# systemctl start iptables
[root@k8s-master ~]# iptables -F
[root@k8s-master ~]# iptables -I INPUT -s 192.168.168.0/24 -j ACCEPT
6. 检查确认这三台机器时间是否同步
7.2.2 k8s集群部署-自签TLS通信加密证书
Kubernetes系统的各组件需要使用TLS证书对通信进行加密,本案例使用CloudFlare的PKI工具集cfssl来生成Certificate Authority和其他证书。
1.创建证书存放位置并安装证书生成工具
[root@k8s-master ~]# mkdir –p /root/software/ssl
[root@k8s-master ~]# cd /root/software/ssl/
[root@k8s-master ssl]# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
[root@k8s-master ssl]# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
[root@k8s-master ssl]# wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
[root@k8s-master ssl]# chmod +x * //下载完后,加上执行权限
[root@k8s-master ssl]# mv cfssl_linux-amd64 /usr/local/bin/cfssl
[root@k8s-master ssl]# mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
[root@k8s-master ssl]# mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
[root@k8s-master ssl]# cfssl --help
Usage:
Available commands:
bundle
ocsprefresh
print-defaults
version
genkey
gencert
ocspsign
serve
gencrl
selfsign
scan
info
revoke
certinfo
sign
ocspdump
ocspserve
Top-level flags:
-allow_verification_with_non_compliant_keys
Allow a SignatureVerifier to use keys which are technically non-compliant with RFC6962.
-loglevel int
Log level (0 = DEBUG, 5 = FATAL) (default 1)
2. 拷贝证书生成脚本
[root@k8s-master ssl]# cat > ca-config.json < { "signing": { "default": { "expiry": "87600h" }, "profiles": { "kubernetes": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } } EOF [root@k8s-master ssl]# cat > ca-csr.json < { "CN": "kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Beijing", "ST": "Beijing", "O": "k8s", "OU": "System" } ] } EOF //引入刚才创建的证书签名文件导入到json中,生成ca证书 [root@k8s-master ssl]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca - 2018/05/17 09:42:36 [INFO] generating a new CA key and certificate from CSR 2018/05/17 09:42:36 [INFO] generate received request 2018/05/17 09:42:36 [INFO] received CSR 2018/05/17 09:42:36 [INFO] generating key: rsa-2048 2018/05/17 09:42:37 [INFO] encoded CSR 2018/05/17 09:42:37 [INFO] signed certificate with serial number 5977604747865604906008868091874540878101817576 [root@k8s-master ssl]# cat > server-csr.json < { "CN": "kubernetes", "hosts": [ "127.0.0.1", "192.168.168.91", "192.168.168.92", "192.168.168.93", "10.10.10.1", "kubernetes", "kubernetes.default", "kubernetes.default.svc", "kubernetes.default.svc.cluster", "kubernetes.default.svc.cluster.local" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing", "O": "k8s", "OU": "System" } ] } EOF //引用刚才配置文件,生成server证书 [root@k8s-master ssl]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server 2018/05/17 09:48:38 [INFO] generate received request 2018/05/17 09:48:38 [INFO] received CSR 2018/05/17 09:48:38 [INFO] generating key: rsa-2048 2018/05/17 09:48:38 [INFO] encoded CSR 2018/05/17 09:48:38 [INFO] signed certificate with serial number 524139292034260252183231282762952629821338832583 2018/05/17 09:48:38 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for websites. For more information see the Baseline Requirements for the Issuance and Management of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org); specifically, section 10.2.3 ("Information Requirements"). [root@k8s-master ssl]# cat > admin-csr.json < { "CN": "admin", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing", "O": "system:masters", "OU": "System" } ] } EOF //计算节点访问控制节点api通信所以使用的证书,通过携带证书访问集群 [root@k8s-master ssl]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin 2018/05/17 09:50:23 [INFO] generate received request 2018/05/17 09:50:23 [INFO] received CSR 2018/05/17 09:50:23 [INFO] generating key: rsa-2048 2018/05/17 09:50:23 [INFO] encoded CSR 2018/05/17 09:50:23 [INFO] signed certificate with serial number 174743345194288503588728187075883698358392239997 2018/05/17 09:50:23 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for websites. For more information see the Baseline Requirements for the Issuance and Management of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org); specifically, section 10.2.3 ("Information Requirements"). //admin 证书是用于管理员访问集群的证书 [root@k8s-master ssl]# cat > kube-proxy-csr.json < { "CN": "system:kube-proxy", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing", "O": "k8s", "OU": "System" } ] } EOF [root@k8s-master ssl]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy 2018/07/20 10:16:05 [INFO] generate received request 2018/07/20 10:16:05 [INFO] received CSR 2018/07/20 10:16:05 [INFO] generating key: rsa-2048 2018/07/20 10:16:05 [INFO] encoded CSR 2018/07/20 10:16:05 [INFO] signed certificate with serial number 461289686710155214110401691358255422210193728113 2018/07/20 10:16:05 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for websites. For more information see the Baseline Requirements for the Issuance and Management of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org); specifically, section 10.2.3 ("Information Requirements"). [root@k8s-master ssl]# ls | grep -v pem | xargs -i rm {} //删除证书以外的json文件,只保留pem证书 7.2.3 k8s集群部署-Etcd集群 1.创建etcd配置文件目录 [root@k8s-master ssl]# mkdir /opt/kubernetes [root@k8s-master ssl]# mkdir /opt/kubernetes/{bin,cfg,ssl} 2.解压etcd软件包并拷贝二进制bin文件 [root@k8s-master ~]# tar zxf etcd-v3.2.12-linux-amd64.tar.gz [root@k8s-master ~]# cd etcd-v3.2.12-linux-amd64/ [root@k8s-master etcd-v3.2.12-linux-amd64]# mv etcd /opt/kubernetes/bin/ [root@k8s-master etcd-v3.2.12-linux-amd64]# mv etcdctl /opt/kubernetes/bin/ 3.配置etcd集群 1)部署k8s-master主etcd节点 //创建etcd配置文件 [root@k8s-master etcd-v3.2.12-linux-amd64]# vim /opt/kubernetes/cfg/etcd #[Member] ETCD_NAME="etcd01" ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_PEER_URLS="https://192.168.168.91:2380" ETCD_LISTEN_CLIENT_URLS="https://192.168.168.91:2379" #[Clustering] ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.168.91:2380" ETCD_ADVERTISE_CLIENT_URLS="https://192.168.168.91:2379" ETCD_INITIAL_CLUSTER="etcd01=https://192.168.168.91:2380,etcd02=https://192.168.168.92:2380,etcd03=https://192.168.168.93:2380" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_INITIAL_CLUSTER_STATE="new" //创建脚本配置文件 [root@k8s-master etcd-v3.2.12-linux-amd64]# vim /usr/lib/systemd/system/etcd.service [Unit] Description=Etcd Server After=network.target After=network-online.target Wants=network-online.target [Service] Type=notify EnvironmentFile=-/opt/kubernetes/cfg/etcd ExecStart=/opt/kubernetes/bin/etcd \\ --name=${ETCD_NAME} \\ --data-dir=${ETCD_DATA_DIR} \\ --listen-peer-urls=${ETCD_LISTEN_PEER_URLS} \\ --listen-client-urls=${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 \\ --advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS} \\ --initial-advertise-peer-urls=${ETCD_INITIAL_ADVERTISE_PEER_URLS} \\ --initial-cluster=${ETCD_INITIAL_CLUSTER} \\ --initial-cluster-token=${ETCD_INITIAL_CLUSTER} \\ --initial-cluster-state=new \\ --cert-file=/opt/kubernetes/ssl/server.pem \\ --key-file=/opt/kubernetes/ssl/server-key.pem \\ --peer-cert-file=/opt/kubernetes/ssl/server.pem \\ --peer-key-file=/opt/kubernetes/ssl/server-key.pem \\ --trusted-ca-file=/opt/kubernetes/ssl/ca.pem \\ --peer-trusted-ca-file=/opt/kubernetes/ssl/ca.pem Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target //拷贝etcd启动所依赖的证书 [root@k8s-master etcd-v3.2.12-linux-amd64]# cd /root/software [root@k8s-master software]# cp ssl/server*pem ssl/ca*.pem /opt/kubernetes/ssl/ //启动etcd主节点,主节点启动会卡顿,直接ctrl +c 终止即可 [root@k8s-master software]# systemctl start etcd [root@k8s-master software]# systemctl enable etcd Created symlink from /etc/systemd/system/multi-user.target.wants/etcd.service to /usr/lib/systemd/system/etcd.service. //查看etcd启动结果 [root@k8s-master software]# ps -ef | grep etcd root 30447 1 1 10:18 ? 00:00:00 /opt/kubernetes/bin/etcd --name=etcd01 --data-dir=/var/lib/etcd/default.etcd --listen-peer-urls=https://192.168.168.91:2380 --listen-client-urls=https://192.168.168.91:2379,http://127.0.0.1:2379 --advertise-client-urls=https://192.168.168.91:2379 --initial-advertise-peer-urls=https://192.168.168.91:2380 --initial-cluster=etcd01=https://192.168.168.91:2380etcd02=https://192.168.168.92:2380,etcd03=https://192.168.168.93:2380 --initial-cluster-token=etcd01=https://192.168.168.91:2380,etcd02=https://192.168.168.92:2380,etcd03=https://192.168.168.93:2380 --initial-cluster-state=new --cert-file=/opt/kubernetes/ssl/server.pem --key-file=/opt/kubernetes/ssl/server-key.pem --peer-cert-file=/opt/kubernetes/ssl/server.pem --peer-key-file=/opt/kubernetes/ssl/server-key.pem --trusted-ca-file=/opt/kubernetes/ssl/ca.pem --peer-trusted-ca-file=/opt/kubernetes/ssl/ca.pem root 30471 29612 0 10:18 pts/4 00:00:00 grep --color=auto etcd 2)部署k8s-node1、k8s-node2 etcd从节点 //拷贝etcd配置文件到计算节点主机,然后修改对应的主机ip [root@k8s-master ~]# rsync -avcz /opt/kubernetes/* 192.168.168.92:/opt/kubernetes/ [root@k8s-node1 ~]# vim /opt/kubernetes/cfg/etcd #[Member] ETCD_NAME="etcd02" ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_PEER_URLS="https://192.168.168.92:2380" ETCD_LISTEN_CLIENT_URLS="https://192.168.168.92:2379" #[Clustering] ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.168.92:2380" ETCD_ADVERTISE_CLIENT_URLS="https://192.168.168.92:2379" ETCD_INITIAL_CLUSTER="etcd01=https://192.168.168.91:2380,etcd02=https://192.168.168.92:2380,etcd03=https://192.168.168.93:2380" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_INITIAL_CLUSTER_STATE="new" [root@k8s-master ~]# rsync -avcz /opt/kubernetes/* 192.168.168.93:/opt/kubernetes/ [root@k8s-node2 ~]# vim /opt/kubernetes/cfg/etcd
#[Member]
ETCD_NAME="etcd03"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.168.93:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.168.93:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.168.93:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.168.93:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.168.91:2380,etcd02=https://192.168.168.92:2380,etcd03=https://192.168.168.93:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
//拷贝启动脚本文件
[root@k8s-master ~]# scp /usr/lib/systemd/system/etcd.service 192.168.168.92:/usr/lib/systemd/system/
[root@k8s-master ~]# scp /usr/lib/systemd/system/etcd.service 192.168.168.93:/usr/lib/systemd/system/
//启动node节点etcd
[root@k8s-node1 ~]# systemctl start etcd
[root@k8s-node2 ~]# systemctl start etcd
//添加etcd命令全局环境变量
[root@k8s-master ~]# vim /etc/profile
PATH=$PATH:/opt/kubernetes/bin
[root@k8s-master ~]# source /etc/profile
//查看etcd集群部署状况
[root@k8s-master ssl]# cd /root/software/ssl/
[root@k8s-master ssl]# etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://192.168.168.91:2379,https://192.168.168.92:2379,https://192.168.168.93:2379" cluster-health
member d98aeda9406262e is healthy: got healthy result from https://192.168.168.93:2379
member 4fd8139c55484b86 is healthy: got healthy result from https://192.168.168.91:2379
member 846eaeba5ec817ba is healthy: got healthy result from https://192.168.168.92:2379
cluster is healthy
至此完成k8s-etcd集群部署。
閱讀更多 運維小周的vlog 的文章