服务器版本 | docker软件版本 | CPU架构 |
---|---|---|
CentOS Linux release 7.4.1708 (Core) | Docker version 20.10.12 | x86_64 |
下图描述了软件部署方式的变迁:传统部署时代,虚拟化部署时代,容器部署时代。
传统部署时代:
早期,各个组织是在物理服务器上运行应用程序。 由于无法限制在物理服务器中运行的应用程序资源使用,因此会导致资源分配问题。 例如,如果在同一台物理服务器上运行多个应用程序, 则可能会出现一个应用程序占用大部分资源的情况,而导致其他应用程序的性能下降。 一种解决方案是将每个应用程序都运行在不同的物理服务器上, 但是当某个应用程式资源利用率不高时,剩余资源无法被分配给其他应用程式, 而且维护许多物理服务器的成本很高。
虚拟化部署时代:
因此,虚拟化技术被引入了。虚拟化技术允许你在单个物理服务器的 CPU 上运行多台虚拟机(VM)。 虚拟化能使应用程序在不同 VM 之间被彼此隔离,且能提供一定程度的安全性, 因为一个应用程序的信息不能被另一应用程序随意访问。
虚拟化技术能够更好地利用物理服务器的资源,并且因为可轻松地添加或更新应用程序, 而因此可以具有更高的可扩缩性,以及降低硬件成本等等的好处。 通过虚拟化,你可以将一组物理资源呈现为可丢弃的虚拟机集群。
每个 VM 是一台 完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。
容器部署时代:
容器类似于 VM,但是更宽松的隔离特性,使容器之间可以共享操作系统(OS)。 因此,容器比起 VM 被认为是更轻量级的。且与 VM 类似,每个容器都具有自己的文件系统、CPU、内存、进程空间等。 由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。
容器因具有许多优势而变得流行起来,例如:
Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态,其服务、支持和工具的使用范围相当广泛。
Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项目。 Kubernetes 建立在 Google 大规模运行生产工作负载十几年经验的基础上, 结合了社区中最优秀的想法和实践。
Kubernetes 为你提供的功能如下:
Kubernetes 集群架构如下:
Kubernetes 集群组件如下:
Kubernetes有两种节点类型:master节点,worker节点。master节点又称为控制平面(Control Plane)。控制平面有很多组件,控制平面组件会为集群做出全局决策,比如资源的调度。 以及检测和响应集群事件,例如当不满足部署的 replicas 字段时, 要启动新的 pod)。
控制平面组件可以在集群中的任何节点上运行。 然而,为了简单起见,设置脚本通常会在同一个计算机上启动所有控制平面组件, 并且不会在此计算机上运行用户容器。
3.2.1 控制平面组件
控制平面组件如下:
3.2.2 Node组件
节点组件会在每个节点上运行,负责维护运行的 Pod 并提供 Kubernetes 运行环境。
node组件如下:
Kubernetes集群架构:k8scloude1作为master节点,k8scloude2,k8scloude3作为worker节点
服务器 | 操作系统版本 | CPU架构 | 进程 | 功能描述 |
---|---|---|---|---|
k8scloude1/192.168.110.130 | CentOS Linux release 7.4.1708 (Core) | x86_64 | docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calico | k8s master节点 |
k8scloude2/192.168.110.129 | CentOS Linux release 7.4.1708 (Core) | x86_64 | docker,kubelet,kube-proxy,calico | k8s worker节点 |
k8scloude3/192.168.110.128 | CentOS Linux release 7.4.1708 (Core) | x86_64 | docker,kubelet,kube-proxy,calico | k8s worker节点 |
先配置节点的基本环境,3个节点都要同时设置,在此以k8scloude1作为示例
首先设置主机名
1 2 3 |
|
配置节点IP地址(可选)
1 2 3 4 5 6 7 8 9 10 11 12 |
|
重启网络
1 2 3 |
|
重启机器之后,主机名变为k8scloude1,测试机器是否可以访问网络
1 2 3 4 5 6 7 8 9 |
|
配置IP和主机名映射
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
|
关闭屏保(可选)
1 |
|
下载新的yum源
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
关闭selinux,设置SELINUX=disabled
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
配置防火墙允许所有数据包通过
1 2 3 4 5 |
|
Linux swapoff命令用于关闭系统交换分区(swap area)。
注意:如果不关闭swap,就会在kubeadm初始化Kubernetes的时候报错:“[ERROR Swap]: running with swap on is not supported. Please disable swap”
1 2 3 4 5 6 7 8 9 |
|
k8s是容器编排工具,需要容器管理工具,所以三个节点同时安装docker,还是以k8scloude1为例。
安装docker
1 2 3 4 5 6 7 8 |
|
设置docker开机自启动并现在启动docker
1 2 3 4 5 6 7 8 9 10 11 |
|
查看docker版本
1 2 |
|
配置docker镜像加速器
1 2 3 4 5 6 7 8 9 |
|
重启docker
1 2 3 4 5 6 7 8 9 10 |
|
设置iptables不对bridge的数据进行处理,启用IP路由转发功能
1 2 3 4 5 6 7 8 9 10 |
|
三个节点都安装kubelet,kubeadm,kubectl:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
设置kubelet开机自启动并现在启动kubelet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
查看kubeadm哪些版本是可用的
1 2 3 4 5 6 7 8 9 10 11 12 |
|
kubeadm init:在主节点k8scloude1上初始化 Kubernetes 控制平面节点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
手动下载coredns镜像
1 2 3 4 5 6 7 |
|
需要重命名coredns镜像,不然识别不了
1 2 3 |
|
此时可以发现现在k8scloude1上有7个镜像,缺一个镜像,kubeadm初始化都不能成功
1 2 3 4 5 6 7 8 9 |
|
重新进行kubeadm初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
|
根据提示创建目录和配置文件
1 2 3 |
|
现在已经可以看到master节点了
1 2 3 |
|
接下来把另外的两个worker节点也加入到k8s集群。
kubeadm init的时候输出了如下这句:
kubeadm join 192.168.110.130:6443 --token nta3x4.3e54l2dqtmj9tlry --discovery-token-ca-cert-hash sha256:9add1314177ac5660d9674dab8c13aa996520028514246c4cd103cf08a211cc8
在另外两个worker节点执行这一命令就可以把节点加入到k8s集群里。
如果加入集群的token忘了,可以使用如下的命令获取最新的加入命令token
1 2 |
|
在另外两个节点执行加入集群的token命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
在k8scloude1查看节点状态,可以看到两个worker节点都加入到了k8s集群
1 2 3 4 5 |
|
可以发现worker节点加入到k8s集群后多了两个镜像
1 2 3 4 5 6 7 8 |
|
虽然现在k8s集群已经有1个master节点,2个worker节点,但是此时三个节点的状态都是NotReady的,原因是没有CNI网络插件,为了节点间的通信,需要安装cni网络插件,常用的cni网络插件有calico和flannel,两者区别为:flannel不支持复杂的网络策略,calico支持网络策略,因为今后还要配置k8s网络策略networkpolicy,所以本文选用的cni网络插件为calico!
现在去官网下载calico.yaml文件:
官网:About Calico
搜索框里直接搜索calico.yaml
找到下载calico.yaml的命令
下载calico.yaml文件
1 2 3 4 5 6 |
|
查看需要下载的calico镜像,这四个镜像需要在所有节点都下载,以k8scloude1为例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
|
修改calico.yaml 文件,CALICO_IPV4POOL_CIDR的IP段要和kubeadm初始化时候的pod网段一致,注意格式要对齐,不然会报错
1 2 3 4 |
|
不直观的话看图片:修改calico.yaml 文件
应用calico.yaml文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
此时发现三个节点都是Ready状态了
1 2 3 4 5 |
|
查看kubectl自动补全命令
1 2 |
|
添加source <(kubectl completion bash)到/etc/profile,并使配置生效
1 2 3 4 |
|
此时即可kubectl命令tab键自动补全
1 2 3 4 5 6 7 8 9 10 |
|
自此,Kubernetes(k8s)集群部署完毕!