2022
我们一起努力

从零开始搭建Kubernetes学习环境(上),云主机怎么搭建

一、Kubernetes基本知识

1. 引言

kubernetes当前已经成为云原生部署使用最广泛的工具平台了,学习K8s平台还是有较高的门槛,需要有3台主机才能搭建最基础的学习与研究平台,以往学习材料大多介绍都是租用3台云主机来搭建K8s学习,学习门槛还是有点高,使用云主机需要还是有一定门槛和费用。另外K8s系统还是非常复杂,必须有很多技术基础,小白要想学习入门难度还是非常大,本教材尽量细化,从零开始介绍K8s学习平台搭建。

现在笔记本普遍都有16G内存,可以安装3~4台虚拟机,基本可以安装起一套K8s学习研究平台,可以方便随时对K8s进行学习与研究。

当前网上很多Kubernetes安装的文章还是写得比较简单,考虑到在笔记本上用虚拟机安装K8s都是初学者,本文章用最详尽的方案从零开始介绍K8s的安装,当然学习都必须有Linux操作系统和Docker的基本技能,否则还是无法学习的。

2. Kubernetes的概念

Kubernetes(k8s)是一个基于容器技术的的分布式架构解决方案,是Google开源的容器集群管理系统,Google内部称为Borg,主要用于自动部署、扩展和管理容器化的应用程序,是以Docer为基础的分布式系统架构。 Kubernetes可以对分布式系统进行完美的支撑,它具备完善的集群控制能力,内建有智能的负载均衡器,拥有强大的故障发现和自我修复能力。同时还针对开发、部署测试、运维监控等提供了完善的管理工具。

Kubernetes的核心思想是:一切以服务为中心,根据这一核心思想,Kubernetes可以让在其上构建的系统独立运行在物理机、虚拟机群或者云上,所以,Service(服务)是Kubernetes进行分布式集群构建的核心,必须拥有如下关键特征:

  • 拥有一个唯一指定的名称。
  • 拥有一个虚拟IP和端口。
  • 能够提供某种远程服务能力。
  • 可以被映射到提供这种远程服务能力的一组容器应用上。

3. Kubernetes的术语

3.1 Master

Kubernetes的集群控制节点,负责整个集群的管理和控制,拥有一个etcd服务,用来保存所有资源对象的数据,我们执行的所有控制命令会发给他,他负责具体的执行过程,Master节点通常会独占一个服务器,在其上会运行以上一组关键的进程:

  • Kubernetes API Server:提供Http Rest接口的关键服务进程,是Kubernetes中增、删、改、查等操作的唯一入口,是集群控制的入口进程。
  • Kubernetes Controller Manager:Kubernetes中所有资源对象的自动化控制中心。
  • Kubernetes Scheduler:负责资源调度的进程。

3.2 Node

Kubernetes集群中的其他机器被称为Node节点,Node节点可以是一台物理主机,也可以是一台虚拟机,每个Node节点会被Master节点分配一些负载,所以Node节点是Kubernetes集群中工作负载节点,当某个Node节点宕机时,工作负载会被Master自动转移到其他节点。Node节点之上会运行一组关键进程:

  • kubelet:负责Pod对应容器的创建,启动、停止等任务。
  • kube-proxy:实现Kubernetes Service通讯与负载均衡机制的重要组件。
  • Docker Engine:Docker引擎,负责容器的创建和管理

3.3 Pod

Pod是Kurbernetes进行创建、调度和管理的最小单位,Pod运行在Node节点之上,其中包含多个业务容器,这些业务容器之间共享网络命名空间、Ip地址、端口,可以通过localhost进行通讯。Pod有两种类型:普通Pod和静态Pod。

3.4 Replication Controller

Kurbernetes用来管理和保证集群中拥有的Pod。

4. Kubernetes的架构

Kubernetes的一切都是基于分布式的,下面这张图就是Kubernetes的架构图

4.1、控制平面组件介绍(Control Plane Components)

控制平面的组件对集群做出全局决策(比如调度),以及检测和响应集群事件(例如,当不满足部署的 replicas 字段时间,启动新的 pod)。

控制平面组件可以在集群中的任何节点上运行。 然而,为了简单起见,设置脚本通常会在同一个计算机上启动所有控制平面组件, 并且不会在计算机上运行用户容器。 请参阅使用 kubeadm 构建高可用性集群 中关于多 VM 控制平面设置的示例。

kube-apiserver

API 服务器是 Kubernetes 控制面的组件, 该组件公开了 Kubernetes API。 API 服务器是 Kubernetes 控制面的前端。

Kubernetes API 服务器的主要实现是 kube-apiserver。 kube-apiserver 设计上考虑了水平伸缩,也就是说,它可通过部署多个实例进行伸缩。 你可以运行 kube-apiserver 的多个实例,并在这些实例之间平衡流量。

etcd

etcd 兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。

您的 Kubernetes 集群的 etcd 数据库通常需要有个备份计划。

要了解 etcd 更深层次的信息,请参考 etcd 文档。

kube-scheduler

控制平面组件,负责监视新创建的、未指定运行节点(node)的 Pods,选择节点让 Pod 在上面运行。

调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限。

kube-controller-manager

在主节点上运行 控制器 的组件。

从逻辑上讲,每个控制器都是一个单独的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行。

这些控制器包括:

– ● 节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应

– ● 任务控制器(Job controller): 监测代表一次性任务的 Job 对象,然后创建 Pods 来运行这些任务直至完成

– ● 端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod)

– ● 服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认账户和 API 访问令牌

cloud-controller-manager

空间控制器管理器是指嵌入特定云的控制逻辑的 控制平面组件。 云控制器管理器允许您连接集群到云提供商的应用编程接口中, 并把和该云平台交互的组件与只和您的集群交互的组件分离开。

cloud-controller-manager 仅运行特定于云平台的控制回路。 如果你在自己的环境中运行 Kubernetes,或者在本地计算机中运行学习环境, 所部署的环境中不需要云控制器管理器。

与 kube-controller-manager 类似,cloud-controller-manager 将若干逻辑上独立的 控制回路组合到同一个可执行文件中,供你以同一进程的方式运行。 你可以对其执行水平扩容(运行不止一个副本)以提升性能或者增强容错能力。

下面的控制器都包含对云平台驱动的依赖:

– ● 节点控制器(Node Controller): 用于在节点终止响应后检查云提供商以确定节点是否已被删除

– ● 路由控制器(Route Controller): 用于在底层云基础架构中设置路由

– ● 服务控制器(Service Controller): 用于创建、更新和删除云提供商负载均衡器

4.2、Node 组件

节点组件在每个节点上运行,维护运行的 Pod 并提供 Kubernetes 运行环境。

kubelet

一个在集群中每个节点(node)上运行的代理。 它保证容器(containers)都 运行在 Pod 中。

kubelet 接收一组通过各类机制提供给它的 PodSpecs,确保这些 PodSpecs 中描述的容器处于运行状态且健康。 kubelet 不会管理不是由 Kubernetes 创建的容器。

kube-proxy

kube-proxy 是集群中每个节点上运行的网络代理, 实现 Kubernetes 服务(Service) 概念的一部分。

kube-proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。

如果操作系统提供了数据包过滤层并可用的话,kube-proxy 会通过它来实现网络规则。否则, kube-proxy 仅转发流量本身。

5、K8s学习环境安装架构

k8s-node1 192.168.6.101 # 作为master节点

k8s-node2 192.168.6.102 # 第1个运算节点

k8s-node3 192.168.6.103 # 第2个运算节点

安装上述3台主机,每台主机分配2CPU、2G内存、30G磁盘。

二、在Vmware上安装Centos虚机

1、安装Vmware,下载Centos镜像

因为Kubernetes的一切都是基于分布式的,那么,要想搭建Kubernetes就需要准备多台服务器主机,因为条件有限,这里我采用搭建多台虚拟机系统的方式进行,所以需要将虚拟机和镜像系统准备好。

  • 虚拟机:这里的虚拟机采用的是VMware,也可以采用VirtualBox,推荐使用VMware稳定性好一些,VMware下载地址如下:
    • https://www.vmware.com/cn.html
  • Centos镜像系统:使用阿里云镜像库下载,采用Centos 7最高版本,Centos 8文件太大学习环境占用空间大,还是用7吧。
    • https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso

2、修改虚拟机系统网络设置

虚拟机缺省是使用DHCP分配客户机IP地址,客户机重启会后会发生IP地址漂移,不便于利用固定主机进址安装K8s的组件,因此需要将虚拟机系统地址改为固定地址。

从VMware Workstation的编辑菜单,虚拟网络编辑器进入。

选择更改设置:

设置VMnet8地址网段

VMnet8网段地址要注意记住,后面主机地址设置要与之匹配。

3、创建第一台虚拟主机

注意选择下载的centos镜像。

选择与镜像匹配的操作系统。

主机名不要用下画线,k8s使用时会不兼容,当前命名直接使用规范命名。虚拟机文件存储定义好目录,3个虚拟机要分别建立目录,另注意硬盘要有足够空间,3个虚拟机最多可能会用到100G的空间。

考虑到后面学习要安装应用,分配30G空间,只练习安装20G空间也行。

选择自定义硬件

配置完成后,选择开启虚拟机,安装虚拟机中的操作系统。

此处务必注意几个选项,都要选择相应配置,软件选择:选“开发及生成工作站”,以便安装必要的管理组件。安装位置选择自动分区即可,注意禁用kdump,减少空间占用。

VMware网络与主要名选择比较复杂,对于WMware虚拟机与 宿主机的网络节构如下图所示,主要同VMnet8网卡的网关机IP地址注意不要使用与网卡IP地址一个地址。

网上与主机名设置内容较多,注意如下图所示。

设置主机地址,网关地址,DNS服务器选择国内通用的114.114.114.114

VMnet8是NAT方式的虚拟网卡,IP 地址为192.168.6.1,网关地址填同网端另一个192.168.6.2.

设备好root的密码,然后开始安装。

在新打开的页面中设置Root密码,进行安装CentOS 7系统

安装完成后重启虚拟机。

重启后,选择同意许可协议。

选择语言。

在客户机上首次进入时,需要设置一个新的用户,不能用root。

进入虚拟机终端力界面,查询网络是否启动,在前面网络设置界面很可能没有选择启动网络,vi”指令打开“/etc/sysconfig/network-scripts/ifcfg-ens33”文件,将其中的“ONBOOT=no”改为“ONBOOT=yes”,使用“wq”指令保存文件.

ping下外网网站地址,如果解析正确,网络连接正确,说明网络主机已经安装成功。

4、远程操作操作系统

因为在操作系统的终端中直接操作指令不太方便,比较好的方法是使用第三方的终端模拟软件,比如Xshell、SecureCRT登录,这里使用的是SecureCRT进行操作。打开SecureCRT软件,配置一个连接,连接CentOS 7操作系统,如下图所示:

从零开始搭建Kubernetes学习环境(上),云主机怎么搭建

二、升级Centos内核,更新系统

1、升级内核

查看内核版本,uname -a, 为了减少问题尽可能把内核升级到高版本。

[root@k8s-node1 ~]# uname -a

Linux k8s-node1 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

升级内容一般不会出错,按以下指令逐条执行,就可以将内核 升级到5.4.xxx的最新版

安装epel源

rpm –import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

yum install -y https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm

查看内核版本并安装最新版本

yum –disablerepo="*" –enablerepo="elrepo-kernel" list available

安装最新lt内核版本

yum –disablerepo='*' –enablerepo=elrepo-kernel install kernel-lt -y

查看系统grub内核的启动列表,这里编号0的5.4.201的lt版本是我们新安装的

awk -F' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg

指定以新安装的编号0的内核版本为默认启动内核

grub2-set-default 0

重启机器,以新内核版本加载启动 reboot 重启后,再用

uname -a

会显示系统当前内核信息

Linux k8s-node1 5.4.201-1.el7.elrepo.x86_64 #1 SMP Fri Jun 24 08:59:49 EDT 2022 x86_64 x86_64 x86_64 GNU/Linux

卸载旧内核版本(重启后才能执行,重启前旧内核还在执行,不能删除,重启后执行下面操作可以删除旧的内核)

yum remove kernel -y

2、将yum更新到最新

yum update

更新后,重新启动一下。

三、系统设置调整

为安装k8s,需要对系统的参数进行一些调整,以适配k8s的安装。

1、关闭selinux

setenforce 0

sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

2、关闭Swap

“vi”指令打开“/etc/fstab”文件,将其中的swap配置注释掉

#/dev/mapper/centos-swap swap swap defaults 0 0

3、关闭防火墙

systemctl stop firewalld & systemctl disable firewalld

4、将主机改为静态地址,避免重启后IP地址变换,

前面介绍已是采用了静态地址,如前面是 DHCP动态地址安装的网络,则需要按以下方法将IP地址调整为静态地址,以避免IP地址漂移。

ens33是机器网卡名,不同类型的机器此名称不同。

cd /etc/sysconfig/network-scripts

vi ifcfg-ens33,注意文件中不要有多余的空格,也注意字符规范

BOOTPROTO="static" 

DNS1="114.114.114.114" 
IPADDR="192.168.6.101" 
NETMASK="255.255.255.0" 
GATEWAY="192.168.6.2"

网关地址注意:vmnet8的地址是192.168.6.1, 虚机网关要用另一个地址,如用192.168.6.2, 不是vmnet8的ip4地址。

在主机网络上能ping通192.168.6.1,但ping不通192.168.6.2

在虚机网络能ping通192.168.6.2,但ping不通192.168.6.1

5、修改hosts

在主机用vi /etc/hosts,增加主机记录

192.168.6.101 k8s-node1 
192.168.6.102 k8s-node2 
192.168.6.103 k8s-node3 
192.168.6.101 quay.io k8s.gcr.io gcr.io

6、配置iptables

配置各节点系统内核参数使流过网桥的流量也进入iptables/netfilter框架中

cat > /etc/sysctl.d/k8s.conf <<EOF 
net.bridge.bridge-nf-call-iptables = 1 
net.bridge.bridge-nf-call-ip6tables = 1 
net.ipv4.ip_forward = 1 
vm.swappiness = 0 
EOF

执行命令使配置生效

sysctl -p /etc/sysctl.d/k8s.conf

7、 确认iptables的FORWARD规则

Docker有时候会将iptables filter链的FORWARD规则默认设置为DROP,按下面要求修改

[root@CentOS-7-2 ~]# iptables -vnL | grep FORWARD 
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) 
[root@CentOS-7-2 ~]# systemctl start docker 
[root@CentOS-7-2 ~]# iptables -vnL | grep FORWARD 
Chain FORWARD (policy DROP 0 packets, 0 bytes)
# 设置FORWARD规则为ACCEPT
iptables -P FORWARD ACCEPT

8、 安装ntp服务并启动

保证集群间的时间一致,否则会有各种未知问题。

yum install -y ntp systemctl start ntpd;systemctl enable ntpd

(未完,待续。。。)

本文在学习形成过程中,参考了大量其他人员的方法以,在此表示感谢。

赞(0)
文章名称:《从零开始搭建Kubernetes学习环境(上),云主机怎么搭建》
文章链接:https://www.fzvps.com/52993.html
本站文章来源于互联网,如有侵权,请联系管理删除,本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
图片版权归属各自创作者所有,图片水印出于防止被无耻之徒盗取劳动成果的目的。

评论 抢沙发

评论前必须登录!