第一节
内容编排与Kubernetes
为什么要用k8s
集群环境容器部署的困境,假设我们有数十台服务器。分别部署Nginx,redis,mysql,业务服务。如何合理的分配这些资源。这里就需要用到容器编排
容器编排
在实际集群环境下,需要自动完成容器的构建和部署,在宿主机上安装什么容器,如何管理,完成这些工作的工具就是容器编排工具。
常见的容器编排工具
Docker compose :单机多容器
Docker swarm: 官方跨主机的容器编排工具
kubernetes(k8s) :Google提供的容器编排工具,和docker swarm是竞争对手关系,功能上相差不多。
k8s优势
Google提供,因为google体量大,k8s的实际编排经验上更多,市场占有率更高
K8s的职责
自动化容器的部署和复制
随时扩展与收缩容器规模
容器分组Group,并且提供容器间的负载均衡
实时监控,实时的故障发现,自动替换
k8s基本概念
Pod:
- Pod是“容器”的容器,可以包含多个“Container”
- Pod是k8s最小可部署单元,一个Pod就是一个进程
- Pod内容容器网络互通,每个Pod都由自己虚拟IP
- Pod都是部署完整的应用或模块
Pause(容器):提供了网络底层功能,简单理解Pod内容器间的请求变成localhost,IPC(NetWork(PID(HostName pause …)))
Container(容器)
Label(标签)
说明标签,相当于每一个Pod的别名,方便k8s主节点Master找到对应的Pod进行操作
Replication Controller(复制控制器)
存在于主节点Master上,它的职责是对Pod的数量进行实时监控,剔除失去响应的Pod ,改变参数控制Pod副本的数量
Service(服务)
跨主机、跨容器间的网络通信,进行逻辑分组
Node(节点)
Kubernetes Master(k8s主节点)
具体使用到的技术
每个节点都应该安装三个应用程序,docker,kubelet,kube-proxy
kubelet:用于执行相应的k8s命令,横向对比docker相当于docker命令。kubelet是k8s的核心命令。
kube-proxy:代理,Service能做到跨主机、跨容器间的网络通信,依赖的就是kube-proxy
第二节
安装K8S的四种方式
- 使用kubeadmin通过离线镜像安装(推荐)
- 使用阿里云共有云平台平台k8s(花钱)
- 通过yum官方仓库安装(上古版本)
- 二进制包的形式进行安装,kubeasz(github)
设计初安装并不复杂,一切的安装包都是google远程下载安装,因为墙的原因,只能使用上面四种,推荐使用第一种,选择业界稳定版本
环境准备
虚拟机
Centos7 Master *1, Master:192.168.163.132
Centos7 Node *2 ,Node1:192.168.163.133, Node2:192.168.163.137
设置主机名与时区、添加hosts网络主机配置,三台虚拟机都要设置
1.设置时区、主机名
timedatectl set-timezone Asia/Shanghai # 都要执行
hostnamectl set-hostname master #132执行
hostnamectl set-hostname node1 #133执行
hostnamectl set-hostname node2 #137执行
2.网络配置
#设置好以后可以通过主机名来和其他主机进行网络数据传输,比如在master主机中ping node1,ping node1,网络是通的
vim /etc/hosts
# 黏贴下面内容
192.168.163.132 master
192.168.163.133 node1
192.168.163.137 node2
3.关闭防火墙,三台虚拟主机都要设置。生产环境跳过
#学习过程中linux安全增强模块关闭
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
#设置临时生效
setenforce 0
#禁用防火墙,防止端口被屏蔽
systemctl disable firewalld
#停止防火墙
systemctl stop firewalld
安装Kubeadm快速部署工具
步骤
不只是Master节点,所有节点都需要严格按照下面步骤运行。
1.将镜像包上传至服务器每个节点
mkdir /usr/local/k8s-install
cd /usr/local/k8s-install
XFTP 上传安装文件kubernetes-1.14
[^安装镜像kubernetes-1.14文件夹下面的kuber114-rpm.tar.gz是我们的kubeAdm集群管理工具的压缩包; docker-ce-18.09.tar.gz是docker的压缩包;k8s-114-images.tar.gz是k8s镜像本身;flannel-dashboard.tar.gz是仪表盘,用来监控集群状态的;]:
2.每个Centos上安装Docker
tar -zxvf docker-ce-18.09.tar.gz
cd docker
# 加载当前目录下所有rpm文件,自动完成安装
yum localinstall -y *.rpm
# 启动docker
systemctl start docker
# 设置docker为自启动
systemctl enable docker
3.确保从cgroups均在同一个从groupfs
#cgroups是control groups的简称,它为Linux内核提供了一种任务聚集和划分的机制,通过一组参数集合将一些任务组织成一个或多个子系统。
#cgroups是实现IaaS虚拟化(kvm、lxc等),PaaS容器沙箱(Docker等)的资源管理控制部分的底层基础。
#子系统是根据cgroup对任务的划分功能将任务按照一种指定的属性划分成的一个组,主要用来实现资源的控制。
#在cgroup中,划分成的任务组以层次结构的形式组织,多个子系统形成一个数据结构中类似多根树的结构。cgroup包含了多个孤立的子系统,每一个子系统代表单一的资源
docker info | grep cgroup
如果不是groupfs,执行下列语句
cat << EOF > /etc/docker/daemon.json
{
“exec-opts”: [“native.cgroupdriver=cgroupfs”]
}
EOF
systemctl daemon-reload && systemctl restart docker
4.安装kubeadm
kubeadm是集群部署工具
cd /usr/local/k8s-install/kubernetes-1.14
tar -zxvf kube114-rpm.tar.gz
cd kube114-rpm
yum localinstall -y *.rpm
5.关闭交换区
swapoff -a
vi /etc/fstab
#swap一行注释
6.配置网桥
cat < /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
7.通过镜像安装k8s
cd /usr/local/k8s-install/kubernetes-1.14
#加载本地镜像
docker load -i k8s-114-images.tar.gz
#加载仪表盘镜像
docker load -i flannel-dashboard.tar.gz
第三节
利用kubeadm创建集群
集群设备
Centos7 Master *1, Master:192.168.163.132
Centos7 Node *2 ,Node1:192.168.163.133, Node2:192.168.163.137
初始化一主两从集群设备
1.master主服务器配置
#指定k8s版本,pod的虚拟ip范围
kubeadm init --kubernetes-version=v1.14.1 --pod-network-cidr=10.244.0.0/16
#控制台提示需要运行以下命令
mkdir -p $HOME/ .kube
#/etc/kubernetes/admin.conf 是kubeadm有关于集群的核心配置文件, $HOME/.kube/config是k8s默认去读取的文件夹
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/congfig
#不需要在master运行,后面会在node1和node2运行,node1、node2和master构建成集群
kubeadm join 192.168.163.132:6443 --token aoeout.xxx \ --discover-token-ca-cert-hash sha256:xxx -discovery-token-unsafe-skip-ca-verfication
# 如果忘记上面的命令,在master上运行,拿到令牌aoeout.xxx
kubectl token list
2.检查下master状态
kubectl get nodes
#查看存在问题的pod,所有组件都是running状态,k8s的master设置完成
kubectl get pod --all-namespaces
#设置全局变量
#加载和创建flannel网络组件(组件状态是pending的话,尝试使用下面命令,跨pod通信最底层的网络协议)
kubectl create -f kube-flannel.yaml
3.从节点Node1和node2设置
#node1和node2设置
kubeadm join 192.168.163.132:6443 --token aoeout.xxx \ --discover-token-ca-cert-hash sha256:xxx
#检查集群状态
kubectl get nodes
第四节
重新启动服务
用于服务器重启了,恢复k8s。
- 启动节点的k8s服务,systemctl start kubelet
- 设置开机启动 systemctl enable kubelet,即便服务器重启了,kubelet也会随之重启
kubeadm/kubelet/kubectl区别
1.kubeadm是kubernetes集群快速构建工具,快速构建主节点,让从属的node节点快速加入当中 ,大幅度简化集群构建工作
2.kubelet运行在所有节点上,负责启动POD和容器的程序,以系统服务形式在后台运行,保证POD和容器的可用性
3.kubectl是kubernetes命令行工具,提供指令,对集群发送各种命令
启动Web UI Dashboard
在k8s 中默认提供了一个可视化界面,对集群进行监控和管理,学习下如何开启Web UI和基本的操作
先找到kubernetes-1.14文件夹,找到文件夹下面的kubernetes-dashboard.ymal仪表盘的核心配置文;admin-role.yaml配置文件说明管理员角色有哪些职能;kubernetes-dashboard-admin.rbac.yaml是基于RBAC基于角色的访问控制权限
# 简单配置
# kubectl apply读取配置文件,并使用配置文件进行配置
kubectl apply -f kubernetes-dashboard.yaml
kubectl apply -f admin-role.yaml
kubectl apply -f kubernetes-dashboard-admin.rbac.yaml
# 获取系统命名空间kube-system下的服务有哪些,通过宿主机ip+端口访问控制台
kubectl -n kube-system get svc
第五节
Dashboard部署Tomcat集群
1.配置阿里云镜像加速器
确保每一个集群节点都配置,否则创建容器会遇到无法下载问题
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://b66nkcgc.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2.浏览器回到 dashboard地址 192.168.163.132.32000
左侧菜单中找到工作负载->创建->创建应用->(输入应用名称mytomcat;镜像名称:tomcat:latest;容器组个数:2个副本;服务:外部,其它电脑才可以访问容器;端口:8000是pod端口,目标端口:8080,在容器启动后容器8080端口映射到pod虚拟ip的8000端口)->部署
3.检查概况汇总的部署状况,容器组的状态,点击日志查看日志输出
4.如何访问tomcat,概况->副本集->名称,服务中的 内部端点的端口32421,这个内部端点端口就是外部访问的端口,浏览器中输入node1ip+32421,node2ip+32421,32421可以在服务暴露中修改
5.测试。docker -ps,找到名为tomcat的容器id, 使用命令docker rm- f id,强制删除,来模拟tomcat容器挂掉的场景;k8s会检测到这一情况,并尝试恢复tomcat容器
Deployment脚本部署Tomcat集群
2个副本;服务:外部,其它电脑才可以访问容器;端口:8000是pod端口,目标端口:8080,在容器启动后容器8080端口映射到pod虚拟ip的8000端口)->部署
3.检查概况汇总的部署状况,容器组的状态,点击日志查看日志输出
4.如何访问tomcat,概况->副本集->名称,服务中的 内部端点的端口32421,这个内部端点端口就是外部访问的端口,浏览器中输入node1ip+32421,node2ip+32421,32421可以在服务暴露中修改
5.测试。docker -ps,找到名为tomcat的容器id, 使用命令docker rm- f id,强制删除,来模拟tomcat容器挂掉的场景;k8s会检测到这一情况,并尝试恢复tomcat容器