Kubernetes的安装方式非常灵活,用户可以通过软件包管理工具进行安装,也可以通过kubeadmin管理工具进行安装,或者二进制文件进行安装,甚至可以下载源代码、自己编译而后再安装部署。

Kubernetes设计架构

Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etc),一切都基于分布式的存储系统。下面这张图是Kubernetes的架构图。
K8S架构图

Kubernetes节点

在上面的系统架构图中,可以把服务分为运行在工作节点上的服务组成集群级别控制板的服务。Kubernetes节点有运行应用容器必备的服务,而这些都是受Master的控制。当然,每个节点上都要运行Docker。Docker来负责所有具体的映像下载和容器运行。

Kubernetes主要由以下几个核心组件组成:

  • etcd: 分布式键值存储系统,用于保存整个集群的状态数据,比如Pod、Service等对象信息;
  • kube-apiserver:提供了资源操作的唯一入口,各组件协调者,以RESTful API接口提供认证、授权、访问控制、API注册和发现等服务。
  • kube-controller-manager:负责维护集群的状态,处理集群中常规后台任务,比如故障检测、自动扩展、滚动更新等。一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的
  • kube-scheduler:负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上。
  • kubelet:Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret,获取容器和节点状态等工作,同时也负责Volume(CVI)和网络(CNI)的管理。kubelet将每个Pod转换成一组容器。
  • Container runtime负责镜像管理以及Pod和容器的真正运行(CRI);
  • kube-proxy:在Node节点上实现Pod网络代理,负责为Service提供cluster内部的服务发现和负载均衡;
  • docker或rocket:容器引擎、运行容器
  • Pod网络:Pod要能够互相间通信,K8S集群必须部署Pod网络,flannel是其中一种的可选方案。

除了核心组件,还有一些推荐的Add-ons:

  • kube-dns负责为整个集群提供DNS服务
  • Ingress Controller为服务提供外网入口
  • Heapster提供资源监控
  • Dashboard提供GUI
  • Federation提供跨可用区的集群
  • Fluentd-elasticsearch提供集群日志采集、存储与查询

Kubernetes Master节点

Kubernetes Master

Kubernetes Node节点

Kubernetes Node

分层架构

Kubernetes设计理念和功能其实就是一个类似Linux的分层架构,如下图所示
Kubernetes分层架构

  • 核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境
  • 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)
  • 管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
  • 接口层:kubectl命令行工具、客户端SDK以及集群联邦
  • 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴
    • Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等
    • Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等

相关组件描述

  • kubelet:kubelet负责管理pods和它们上面的容器,images镜像、volumes、etc
  • kube-proxy:每一个节点也运行一个简单的网络代理和负载均衡。 正如Kubernetes API里面定义的,这些服务也可以在各种终端中以轮询的方式做一些简单的TCP和UDP传输。服务端点目前是通过DNS或者环境变量( Docker-links-compatible 和 Kubernetes{FOO}_SERVICE_HOST 及 {FOO}_SERVICE_PORT 变量都支持)。这些变量由服务代理所管理的端口来解析。
  • Kubernetes控制面板:Kubernetes控制面板可以分为多个部分。目前它们都运行在一个master 节点,然而为了达到高可用性,这需要改变。不同部分一起协作提供一个统一的关于集群的视图。
  • etcd:所有master的持续状态都存在etcd的一个实例中。这可以很好地存储配置数据。因为有watch(观察者)的支持,各部件协调中的改变可以很快被察觉。
  • Kubernetes API Server:API服务提供Kubernetes API 的服务。这个服务试图通过把所有或者大部分的业务逻辑放到不同的部件中从而使其具有CRUD特性。它主要处理REST操作,在etcd中验证更新这些对象(并最终存储)。
  • Scheduler:调度器把未调度的pod通过binding api绑定到节点上。调度器是可插拔的,并且我们期待支持多集群的调度,未来甚至希望可以支持用户自定义的调度器。
  • Kubernetes控制管理服务器:所有其它的集群级别的功能目前都是由控制管理器所负责。例如,端点对象是被端点控制器来创建和更新。这些最终可以被分隔成不同的部件来让它们独自的可插拔。

节点规划

以CentOS 8操作系统为基础,通过使用kubeadm安装Kubernetes,kubeadm是K8S官方推荐的一个集群部署工具。这里,我们部署了3台CentOS 8虚拟机,其中1台作为Master节点,另外2台作为Node节点。IP地址规划如下:

Master:192.168.23.120
Node1:192.168.23.121
Node2:192.168.23.122

其中,Master节点上安装kubernetes-master和etcd软件包,Node节点上安装kubernetes-node、etcd、flannel以及docker等软件包。kubernetes-master软件包包括了kube-apiserver、kube-controller-manager和kube-scheduler等组件及其管理工具。kubernetes-node包括kubelet及其管理工具。2个Node节点上都安装etcd软件包。这样3个节点组成一个etcd集群。flannel为网络组件,docker为运行容器。

安装前准备

在安装软件之前,首先对所有节点的软件环境进行相应的配置和更新。

1. 禁用SELINUX

SELinux是2.6版本的Linux内核中提供的强制访问控制系统,在这种访问控制体系的限制下,进程只能访问某些指定的文件。但是它会影响K8S某些组件的功能。因此需要将其禁用。

# 临时关闭
[root@k8smaster opt]# setenforce 0
# 永久关闭
$ vim /etc/selinux/config 
SELINUX=disabled

2. 禁用firewall

firewall是CentOS7开始采用的防火墙系统,代替之前的iptables。用户可以通过firewall来加强系统的安全,关闭或者开放某些端口。firewall会影响Docker的网络功能,所以在安装之前将其禁用。

$ systemctl stop firewalld 
$ systemctl disable firewalld

3. 添加阿里源

[root@k8smaster ~]# rm -rfv /etc/yum.repos.d/*
[root@k8smaster ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo

4. 配置主机名

[root@k8smaster ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1   k8smaster

192.168.23.120 k8smaster
192.168.23.121 k8snode1
192.168.23.122 k8snode2

5. 关闭swap,注释swap分区

临时关闭:

[root@k8smaster ~]# swapoff -a && sysctl -w vm.swappiness=0
[root@k8smaster ~]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Thu Aug 20 09:54:50 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/cl-root     /                       xfs     defaults        0 0
UUID=2092be64-67ac-4a81-9dd9-4d09067648cf /boot                   ext4    defaults        1 2
/dev/mapper/cl-swap     swap                    swap    defaults        0 0

永久关闭:
把/etc/fstab中的swap注释掉

sudo sed -i 's/.*swap.*/#&/' /etc/fstab

6. 配置内核参数,将桥接的IPv4流量传递到iptables的链

[root@k8smaster ~]# cat > /etc/sysctl.d/k8s.conf <<EOF
> net.bridge.bridge-nf-call-ip6tables = 1
> net.bridge.bridge-nf-call-iptables = 1
> EOF
[root@k8smaster ~]# sysctl --system
* Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ...
kernel.yama.ptrace_scope = 0
* Applying /usr/lib/sysctl.d/50-coredump.conf ...
kernel.core_pattern = |/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h %e
* Applying /usr/lib/sysctl.d/50-default.conf ...
kernel.sysrq = 16
kernel.core_uses_pid = 1
kernel.kptr_restrict = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.promote_secondaries = 1
net.core.default_qdisc = fq_codel
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
* Applying /usr/lib/sysctl.d/50-libkcapi-optmem_max.conf ...
net.core.optmem_max = 81920
* Applying /usr/lib/sysctl.d/50-pid-max.conf ...
kernel.pid_max = 4194304
* Applying /etc/sysctl.d/99-sysctl.conf ...
* Applying /etc/sysctl.d/k8s.conf ...
* Applying /etc/sysctl.conf ...
[root@k8smaster ~]#

7.安装常用软件包

$ yum install vim bash-completion net-tools gcc -y
$ yum install tc -y

8. 配置ssh免密登陆

在所有节点上执行如下命令

[root@k8smaster ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Y4NC3oK42HGiIh3uyrL6mzn67cqKTdBEemxtrZkNKX8 root@k8smaster
The key's randomart image is:
+---[RSA 3072]----+
|  .              |
| + . o           |
|. * * .          |
| * B B .         |
|o * X E S        |
|.B = + . o       |
|* =              |
|*=.+             |
|XO@=o            |
+----[SHA256]-----+

然后使用ssh-copy-id命令将公钥拷贝到master节点上:

[root@k8smaster ~]# ssh-copy-id 192.168.23.120
[root@k8snode1 ~]# ssh-copy-id 192.168.23.120
[root@k8snode2 ~]# ssh-copy-id 192.168.23.120

然后将authorized_keys文件拷贝到node1和node2上:

[root@k8smaster ~]# scp /root/.ssh/authorized_keys root@192.168.23.121:~/.ssh/authorized_keys
[root@k8smaster ~]# scp /root/.ssh/authorized_keys root@192.168.23.122:~/.ssh/authorized_keys

9. 更新软件包

更新当前系统的软件包,保持所有的软件包都是最新版本

$ yum update -y

10. 同步系统时间

用户需要先将其中一台服务器设置为NTP服务器,另外两台的时间通过chrony进行同步:

  1. NTP时间服务器配置
$ sudo systemctl status chronyd.service
$ sudo vim /etc/chrony.conf
# 注释pool 2.centos.pool.ntp.org iburst,增加:
server 210.72.145.44 iburst #国家授时中心
server ntp.aliyun.com iburst #阿里云时间服务器
allow 192.168.23.0/24	#去掉注释,允许192.168.23.0/24网段的节点访问
local stratum 10		#去掉注释,开启同步层
$ sudo systemctl restart chronyd.service
$ sudo systemctl enable chronyd.service
$ sudo chronyc sourcestats -v
210 Number of sources = 2
                             .- Number of sample points in measurement set.
                            /    .- Number of residual runs with same sign.
                           |    /    .- Length of measurement set (time).
                           |   |    /      .- Est. clock freq error (ppm).
                           |   |   |      /           .- Est. error in freq.
                           |   |   |     |           /         .- Est. offset.
                           |   |   |     |          |          |   On the -.
                           |   |   |     |          |          |   samples. \
                           |   |   |     |          |          |             |
Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev
==============================================================================
210.72.145.44               0   0     0     +0.000   2000.000     +0ns  4000ms
203.107.6.88                4   3     6   +121.697   7779.832   +101us  1043us
$ timedatectl
               Local time: Mon 2021-01-25 22:29:42 CST
           Universal time: Mon 2021-01-25 14:29:42 UTC
                 RTC time: Mon 2021-01-25 22:29:41
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes # yes表明时间同步正常
              NTP service: active
          RTC in local TZ: no
$ date
Mon Jan 25 22:32:49 CST 2021
  1. 客户端配置:
sudo vim /etc/chrony.conf
server 192.168.23.120 iburst
$ sudo systemctl restart chronyd.service
$ sudo systemctl enable chronyd.service
$ sudo chronyc sourcestats -v
  1. 检查时间同步情况:
    其中的System clock synchronized: yes表示时间同步正常
[root@k8snode1 ~]# timedatectl
               Local time: Tue 2021-01-26 12:30:02 UTC
           Universal time: Tue 2021-01-26 12:30:02 UTC
                 RTC time: Tue 2021-01-26 12:28:01
                Time zone: UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

11. 添加K8S安装源

将如下内容保存到:/etc/yum.repos.d/kubernetes.repo

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

由于目前阿里镜像中还没有CentOS8的kubernetes,但是可以使用CentOS7的安装包,所以上面是使用的kubernetes-el7-x86_64,如果有CentOS8的,则为kubernetes-el8-x86_64。

12. 安装docker

卸载podman,CentOS8默认安装了podman容器,它和docker可能有冲突,需要将其卸载掉:

[root@k8smaster opt]# sudo yum remove podman

卸载旧的docker:

[root@k8smaster opt]# sudo yum remove docker docker-common docker-selinux docker-engine

安装docker,建议不安装最新版:

sudo yum install -y yum-utils device-mapper-persistent-data lvm2 net-tools
wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
# 把软件仓库地址替换为 TUNA
sudo sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
sudo yum makecache fast
sudo yum install docker-ce docker-ce-cli containerd.io

查看docker版本:

[root@k8snode1 yum.repos.d]# docker --version
Docker version 20.10.3, build 48d30b5

修改Cgroupfs 为 Systemd(docker文件驱动默认由cgroupfs 改成 systemd,与k8s保持一致避免conflict)

sudo mkdir -p /etc/docker
sudo vim /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}

设置开启启动:

sudo systemctl enable docker
sudo systemctl start docker

查看文件驱动:

[root@k8smaster ~]# sudo docker info | grep Driver
 Storage Driver: overlay2
 Logging Driver: json-file
 Cgroup Driver: systemd

至此,我们安装K8S的基础环境已经准备就绪,接下来,我们可以安装Kubernetes了。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐