一、K8S和Docker的比较
Docker 是一个开源的、轻量级的容器引擎,和 VMware 虚拟机相比,Docker 使用容器承载应用程序,而不使用操作系统,所以它的开销很少,性能很高。但是,Docker 对应用程序的隔离不如虚拟机彻底,所以它并不能完全取代 VMware。
在传统的开发过程中(我之前的开发过程),以Java为例,一般都是本地(开发机)开发运行然后打成jar、war包放到服务器上,然后在服务器上部署相关环境(JDK、Redis、Mysql、Nginx等),非常麻烦。一款产品开发–上线是两套不同的环境,应用环境,应用配置都是不同的,很容易导致的问题是:为什么在本地可以运行,部署后出现问题,版本更新后为什么导致服务不可用,对于运维来说考验十分大。
环境配置是十分的麻烦(对Linux不熟悉的同学经常会出现各种各样奇葩的问题,甚至把环境搞脏),对于集群每一个都要部署环境(集群Redis、ES、Hadoop…) 费事费力。发布一个项目( jar + (Redis MySQL JDK ES) ),项目能不能带上环境安装打包。
基于以上问题,Dokcer提出了解决方案。
相信很多人都用过虚拟机,虚拟机,就是在你的操作系统里面,装一个软件,然后通过这个软件,再模拟一台甚至多台“子电脑”出来。 在“子电脑”里,你可以和正常电脑一样运行程序,例如开QQ。如果你愿意,你可以变出好几个“子电脑”,里面都开上QQ。“子电脑”和“子电脑”之间,是相互隔离的,互不影响。虚拟机属于虚拟化技术。而Docker这样的容器技术,也是虚拟化技术,属于轻量级的虚拟化。
虚拟机虽然可以隔离出很多“子电脑”,但占用空间更大,启动更慢,虚拟机软件可能还要花钱(例如VMWare)。而容器技术恰好没有这些缺点。它不需要虚拟出整个操作系统,只需要虚拟一个小规模的环境(类似“沙箱”)。
比较Docker和虚拟机技术的不同:
传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件。
Docker:容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响
但需要注意的是: Docker本身并不是容器,它是创建容器的工具,是应用容器引擎。
Docker技术的三大核心概念,分别是:
镜像(Image)
容器(Container)
仓库(Repository)
对于Docker来说,其作用可概况为:搭建,发送,运行。即将相关内容包括环境等等打包成一个镜像,然后放到仓库里,需要时进行下载运行即可。复杂繁琐。
单看图示上部分,发生的变化仅仅是HOST换成了Pod,底层网络由真实网络换成了覆盖网络,即虚拟网络。对于APP应用开发者而言,即使你完全不懂容器技术也没关系,Kubernetes提供的抽象层对于APP应用开发者而言是完全透明的。应用在POD中和在HOST主机上并没有本质区别。 k8s是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
也就是说k8s跟Docker的粒度是不同的,K8S用于对Docker及容器进行更高级更灵活的管理 ,K8S管理更加容易简单。
二、K8S 架构
一个K8S系统,通常称为一个K8S集群(Cluster)。
这个集群主要包括两个部分:
一个Master节点(主节点)
一群Node节点(计算节点)
Master节点:
API Server、Scheduler、Controller-manager、etcd。
- API Server是整个系统的对外接口,供客户端和其它组件调用,相当于“营业厅”
- Scheduler负责对集群内部的资源进行调度,相当于“调度室”,定义Pod的访问规则
- Controller manager负责管理控制器,相当于“大总管”,确保预期的Pod数量,无状态应用部署和有状态应用部署,确保所有node应用同一Pod,一次性任务和定时任务等
- etcd存储系统,保存存储相关数据
Node节点:
Docker、kubelet、kube-proxy、Fluentd、kube-dns(可选),还有就是Pod
- Docker 进行容器化操作的工具
- kubelet 是master 派到node节点的代表,管理本机容器
- kube-proxy提供网络代理,负载均衡等操作
- Pod是Kubernetes最基本的操作单元。一个Pod代表着集群中运行的一个进程,它内部封装了一个或多个紧密相关的容器,一个Pod中的容器是共享网络的,生命周期是短暂的
三、K8S集群搭建
3.1、kubernetes 官方提供的三种部署方式
minikube:
Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,仅用于尝试Kubernetes或日常开发的用户使用。部署地址:https://kubernetes.io/docs/setup/minikube/
kubeadm:
Kubeadm也是一个工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。部署地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
二进制包:
推荐,从官方下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。下载地址:https://github.com/kubernetes/kubernetes/releases
3.2 、安装kubeadm环境准备
以下操作,在三台节点都执行
环境需求:centos 7.4 +
硬件需求:CPU>=2c ,内存>=2G
环境角色
IP | 角色 | 安装软件 |
---|---|---|
192.168.73.138 | k8s-Master | kube-apiserver |
kube-schduler | ||
docker | ||
flannel | ||
kubelet | ||
192.168.73.139 | k8s-node01 | kubelet |
kube-proxy | ||
docker | ||
flannel | ||
192.168.73.140 | k8s-node02 | kubelet |
kube-proxy | ||
docker | ||
flannel |
3.3 、环境初始化
以下所有操作,在三台节点全部执行
1、关闭防火墙及selinux
关防火墙
$ systemctl stop firewalld # 临时
$ systemctl disable firewalld # 永久
关闭selinux
$ sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config # 永久
$ setenforce 0 # 临时
2、关闭 swap 分区
$ swapoff -a # 临时
$ sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab #永久
3、分别在192.168.73.138、192.168.73.139、192.168.73.140上设置主机名及配置hosts
$ hostnamectl set-hostname k8s-master
#(192.168.73.138主机打命令)
$ hostnamectl set-hostname k8s-node01(192.168.73.139
主机打命令
$ hostnamectl set-hostname k8s-node02 (192.168.73.140
主机打命令
4、在所有主机上上添加如下命令
$ cat >> /etc/hosts << EOF 192.168.73.138 k8s-master 192.168.73.139 k8s-node01 192.168.73.140 k8s-node02 EOF
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
6、设置系统时区并同步时间服务器
# yum install -y ntpdate