一、kubernetes 概述
1、kubernetes 基本介绍
kubernetes,简称 K8s,是用 8 代替 8 个字符“ubernete”而成的缩写。是一个开源 的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的 应用简单并且高效(powerful),Kubernetes 提供了应用部署,规划,更新,维护的一种 机制。
传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配 置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等 操作,当然也可以通过创建虚拟机的方式来实现某些功能,但是虚拟机非常重,并不利于 可移植性。
新的方式是通过部署容器方式实现,每个容器之间互相隔离,每个容器有自己的文件 系统 ,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能快速部署, 由于容器与底层设施、机器文件系统解耦的,所以它能在不同云、不同版本操作系统间进 行迁移。
容器占用资源少、部署快,每个应用可以被打包成一个容器镜像,每个应用与容器间 成一对一关系也使容器有更大优势,使用容器可以在 build 或 release 的阶段,为应用创 建容器镜像,因为每个应用不需要与其余的应用堆栈组合,也不依赖于生产环境基础结构, 这使得从研发到测试、生产能提供一致环境。类似地,容器比虚拟机轻量、更“透明”, 这更便于监控和管理。
Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、 应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便 对应用请求进行负载均衡。
在 Kubernetes 中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通 过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需 要运维人员去进行复杂的手工配置和处理。
2、kubernetes 功能和架构
2.1、概述
Kubernetes 是一个轻便的和可扩展的开源平台,用于管理容器化应用和服务。通过 Kubernetes 能够进行应用的自动化部署和扩缩容。在 Kubernetes 中,会将组成应用的容 器组合成一个逻辑单元以更易管理和发现。Kubernetes 积累了作为 Google 生产环境运行 工作负载 15 年的经验,并吸收了来自于社区的最佳想法和实践。
2.2 、K8s 功能
(1)自动装箱
基于容器对应用运行环境的资源配置要求自动部署应用容器
(2)自我修复(自愈能力)
当容器失败时,会对容器进行重启
当所部署的 Node 节点有问题时,会对容器进行重新部署和重新调度
当容器未通过监控检查时,会关闭此容器直到容器正常运行时,才会对外提供服务
(3)水平扩展
通过简单的命令、用户 UI 界面或基于 CPU 等资源使用情况,对应用容器进行规模扩大 或规模剪裁
(4)服务发现
用户不需使用额外的服务发现机制,就能够基于 Kubernetes 自身能力实现服务发现和 负载均衡
(5) 滚动更新
可以根据应用的变化,对应用容器运行的应用,进行一次性或批量式更新
(6) 版本回退
可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退
(7)密钥和配置管理 在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署。
(8)存储编排 自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要 存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph 等)、公共云存储服务
(9)批处理 提供一次性任务,定时任务;满足批量数据处理和分析的场景
2.3 、k8s 集群架构
2.4 、k8s 集群架构节点角色功能
Master Node
k8s 集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求;
Master Node 由 API Server、Scheduler、ClusterState Store(ETCD 数据库)和 Controller MangerServer 所组成。
Worker Node
集群工作节点,运行用户业务应用容器;
Worker Node 包含 kubelet、kube proxy 和 ContainerRuntime;
二、kubernetes 集群搭建(kubeadm方式)
2.1 、kubeadm 部署方式介绍
kubeadm 是官方社区推出的一个用于快速部署kubernetes 集群的工具,这个工具能通过两条指令完成一个kubernetes 集群的部署:
- 创建一个Master 节点kubeadm init
- 将Node 节点加入到当前集群中$ kubeadm join <Master 节点的IP 和端口>
2.2、安装要求
在开始之前,部署Kubernetes 集群机器需要满足以下几个条件:
- 1台以上机器,操作系统 CentOS7.x-64位系统
- 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
- 集群中所有机器之间网络互通
- 可以访问外网,需要拉取镜像 禁止swap分区
2.3、最终目标
- 在所有节点上安装Docker 和kubeadm
- 部署Kubernetes Master
- 所有节点上安装Docker和kubeadm,kubelet
- 部署 Kubernetes Node,将节点加入 Kubernetes 集群中
- 部署 Dashboard Web 页面,可视化查看 Kubernetes资源
2.4、准备环境
角色 IP地址 组件
master01 192.30.93.1 docker,kubectl,kubeadm,kubelet
node01 192.30.93.2 docker,kubectl,kubeadm,kubelet
2.5、环境部署
2.6.1 检查操作系统的版本
此方式下安装kubernetes集群要求Centos版本要在7.5或之上
cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
2.6.2 关闭防火墙
kubernetes和docker 在运行的中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则
(1)关闭firewalld服务
systemctl stop firewalld
systemctl disable firewalld
(2)关闭iptables服务
systemctl stop iptables
systemctl disable iptables
2.6.3 关闭 selinux
selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题。
setenforce 0 #临时
sed -i 's/enforcing/disabled/' /etc/selinux/config #永久
2.6.4 关闭 swap
swap分区指的是虚拟内存分区,它的作用是物理内存使用完,之后将磁盘空间虚拟成内存来使用,启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备,但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明。
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
2.6.5 将桥接的 IPv4 流量传递到 iptables 的链
cat >> /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
## 重新加载配置,生效
sysctl --system
2.6.6 时间同步
kubernetes要求集群中的节点时间必须精确一直,这里使用chronyd服务从网络同步时间
企业中建议配置内部的会见同步服务器
systemctl start chronyd
systemctl enable chronyd
date
2.6.7安装docker
Kubernetes 默认 CRI(容器运行时)为 Docker,因此先安装 Docker。
安装 Docker,系统已安装docker查看版本
2.6.8 安装Kubernetes组件
1、由于kubernetes的镜像在国外,速度比较慢,这里切换成国内的镜像源
2、编辑/etc/yum.repos.d/kubernetes.repo,添加下面的配置
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgchech=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
3、安装kubeadm、kubelet和kubectl
yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y --nogpgcheck
4、设置kubelet开机自启
[root@master ~]# systemctl enable kubelet
2.6.9 集群初始化
下面的操作只需要在master节点上执行即可
1、在 172.30.93.225(Master)执行
kubeadm init \
--apiserver-advertise-address=192.30.93.1 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.17.4 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
由于默认拉取镜像地址 k8s.gcr.io 国内无法访问,这里指定阿里云镜像仓库地址。
执行完按照要求执行以下步骤
2、创建必要文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
下面的操作只需要在node节点上执行即可
kubeadm join 192.30.93.1:6443 --token lcpklc.qstkss5lqi1ybell \
--discovery-token-ca-cert-hash sha256:82d9bff70d810f82f192683b7feba12660c1a30e5b919f1cf07a86fe3ccca25f
在master上查看节点信息
kubectl get node
2.6.10 安装 Pod 网络插件(CNI)
只在master节点操作即可
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
确保能够访问到 quay.io 这个 registery。如果 Pod 镜像下载失败,可以改这个镜像地址
2.6、集群测试
2.6.1 创建一个nginx服务
kubectl create deployment nginx --image=nginx:1.14-alpine
2.6.2 暴露端口
kubectl expose deploy nginx --port=80 --target-port=80 --type=NodePort
2.6.3查看服务
kubectl get pod,svc
访问地址:http://NodeIP:Port
注意:如果只有一台机器 需要去除master上的污点,k8s默认master不工作。
允许master节点部署pod
kubectl taint nodes --all node-role.kubernetes.io/master-
污点可选参数
NoSchedule: 一定不能被调度
PreferNoSchedule: 尽量不要调度
NoExecute: 不仅不会调度, 还会驱逐Node上已有的Pod
kubectl taint nodes master1 node-role.kubernetes.io/master=:PreferNoSchedule