简介:
kubernetes,是一个全新的基于容器技术的分布式架构领先方案,是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本,于2014年9月发布第一个版本,2015年7月发布第一个正式版本。
kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:
- 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
- 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
- 服务发现:服务可以通过自动发现的形式找到它所依赖的服务
- 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
- 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
- 存储编排:可以根据容器自身的需求自动创建存储卷
kubernetes的组件
一个kubernetes集群主要时有控制节点(master)、工作节点(node)构成,每一个节点都会安装不同的组件。
master:集群的控制平面,负责集群的决策(管理)
ApiServer:资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现
等机制。
Scheduler:负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上
ControllerManager:负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等。
Etcd:负责存储集群中各种资源对象的信息
node:集群的数据平面,负责为容器提供运行环境(干活)
Kubelet:负责维护容器的生命周期,监听节点上pod的状态,负责与master节点通信,并管
理节点上的pod
Kubeproxy:负责提供集群内部的服务发现和负载均衡
Docker:负责节点上容器的各种操作
演示
下面部署一个nginx服务来说明kubernetes系统各个组件调用关系:
- 一旦kubernetes环境启动之后,master和node都会将自身信息存储到etcd数据库中
- 一个nginx服务的安装请求会首先被发送到master节点的apiServer组件上
- apiServer组件会调用scheduler组件来决定到底应该把这个服务安装到哪个node节点上,在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知apiServer
- apiServer调用controller-manager去调度node节点安装nginx服务
- kubelet接收到指令后,会通知docker,然后有docker来启动一个nginx的pod。pod时kubernetes的最小操作单元,容器必须跑在pod中。
- 至此一个nginx服务就运行了,如果需要访问nginx,就需要通过kube-proxy来对pod产出访问的代理,这样外界用户就可以访问集群中的nginx服务了。
kubernetes概念
Master:集群控制节点,每一个集群需要至少一个master节点负责集群的管控
Node:工作负载节点,有master分配容器到这些node节点上,然后node节点上的docker负
责容器运行。
Pod:kubernetes的最小控制单元,容器都是运行在Pod中的,一行Pod可以有1个或者多个
容器
Controller:控制器,通过它来实现对pod的管理,比如启动pod,停止pod,伸缩pod的数量
等等
Service:pod对外服务的唯一入口,下面可以维护者同一类的多个pod
Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签
nameSpace:命名空间,用来隔离pod的运行环境
对于相同标签的pod,在运行的时候可以进行负载均衡。
安装
操作环境:CPU(2G) 内存(4G) 硬盘(50G)
环境初始化:
检查操作系统的版本
# 要求centos版本要在7.9
cat /etc/redhat-release
时间同步
# 安装chrony
$ yum install chrony -y
# 修改配置文件
$ vim /etc/chrony.conf
server ntp1.aliyun.com iburst
# 启动chrony服务器
$ systemctl start chronyd
# 设置chronyd服务开机自启
$ systemctl enable chronyd
# 查看是否同步
$ chronyc source
禁用iptables和firewalld服务
# 关闭firewalld服务,并关闭开启自启
$ systemctl disable firewalld --now
# 查看状态
$ firewall-cmd state
# 关闭iptables服务
$ systemctl disable iptables --now
# 禁用selinux
# 编辑 /etc/selinux/config 文件,修改SELINUX的值为disabled
SELINUX=disabled
# 或者
$ sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config
# 注意上面是修改配置文件,只有重启linux服务才可以生效,要是不想重启设置setenfoce
$ setenfoce 0
禁用swap分区
# 编辑分区配置文件/etc/fstab,注释掉swap分区一行
# 注意修改完毕之后需要重启linux服务
UUID=455cc753-7a60-4c17-a424-7741728c44a1 /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
# /dev/mapper/centos-swap swap swap defaults 0 0
升级操作系统内核
# 先导入新内核软件包的签名公钥,验证其有效性
$ rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# 安装elrepo YUM源仓库
$ yum -y install https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
# 安装kernel-ml版本,ml为长期稳定版本,lt为长期维护版本
$ yum --enablerepo="elrepo-kernel" -y install kernel-ml.x86_64
# 修改默认内核启动项
$ grub2-set-default 0
# 重新生成grub2引导文件
$ grub2-mkconfig -o /boot/grub2/grub.cfg
# 更新后,需要重启,使用升级的内核生效
$ reboot
修改linux内核参数
# 修改linux的内核参数,添加网桥过滤和地址转发功能
# 编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness=0
# 重新加载配置
[root@master ~]# sysctl -p /etc/sysctl.d/kubernetes.conf
# 加载网桥过滤模块
[root@master ~]# modprobe br_netfilter
# 查看网桥过滤模块是否加载成功
[root@master ~]# lsmod | grep br_netfilter
配置ipvs功能
在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的
两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块
# 1 安装ipset和ipvsadm
[root@master ~]# yum install ipset ipvsadm -y
# 2 添加需要加载的模块写入脚本文件
[root@master ~]# cat <<EOF > /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
# 3 为脚本文件添加执行权限
[root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
# 4 执行脚本文件
[root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules
# 5 查看对应的模块是否加载成功
[root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
基础环境
k8s环境准备
由于kubernetes的镜像源在国外,速度比较慢,这里切换成国内的镜像源,本文使用阿里云YUM源。
$ cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
$ yum clean all && yum makecache
# 集群软件安装
安装kubeadm、kubelet和kubectl
# yum install kubeadm kubelet kubectl -y
# 查看所有的可用版本
$ yum list kubeadm kubelet kubectl --showduplicates | sort -r
# 默认安装的版本就是最新版1.24.X,当然也可以指定版本安装 ,如 yum install kubelet-1.16.2
kubeadm-1.16.2 kubectl-1.16.2
$ yum install kubeadm-1.25.4 kubelet-1.25.4 kubectl-1.25.4
#安装后查看版本
$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.2",
GitCommit:"f66044f4361b9f1f96f0053dd46cb7dce5e990a8", GitTreeState:"clean",
BuildDate:"2022-06-15T14:20:54Z", GoVersion:"go1.18.3", Compiler:"gc",
Platform:"linux/amd64"}
# 配置kubelet的cgroup
# 为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,建议修改如下文件内容。
$ cat <<EOF > /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd" # 如果不是docker安装,不需要添加
KUBE_PROXY_MODE="ipvs"
EOF
# 设置kubelet开机自启
# systemctl enable kubelet
kubeadm
:用来初始化集群的指令。
kubelet
:在集群中的每个节点上用来启动 Pod 和容器等。
kubectl
:用来与集群通信的命令行工具。