文章目录
容器编排
集群环境容器部署的困境
动态调整集群的部署
容器编排:哪些宿主机上安装什么容器,以及这些容器以什么样的方式通信和被管理
单机容器编排工具:docker compose
集群容器编排工具:docker swarm、kubernetes
Kubernetes基本概念
Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
- 自动化容器的部署和复制
- 随时扩展或收缩容器规模
- 容器分组Group,并且提供容器间的负载均衡
- 实时监控,,即时故障发现,,自动替换
Kubernetes Master
整个集群的管理者,对整个集群的节点进行管理,向具体的节点发送创建容器、自动部署、自动发布等职能。所有来自外侧的数据包都会由master来接收,然后在进行分配。通常Master节点是个独立的物理机。
Node
Kubernetes中的工作节点,可以是VM或物理机。每个Node具有运行Pod的一些必要服务,并由Master组件进行管理,Node节点上的服务包括Docker、kubelet和kube-proxy。
docker:Kubernetes使用的容器技术来创建容器
kubelet:执行Kubernetes相关的命令
kube-proxy:Service使用其将链接路由到Pod,多主机间Pod通信的代理人
Pod
- POD是Kubernetes创建或部署的最小/最简单的基本单位,一个Pod代表集群上正在运行的一个进程。
- POD封装一个应用容器(也可以有多个容器),存储资源、一个独立的网络IP以及管理控制容器运行方式的策略选项。
- POD代表部署的一个单位,是Kubernetes中单个应用的实例,它可能由单个容器或多个容器共享组成的资源,它可以是代表完整的应用(集群),也可以代表某个模块(微服务)。
- POD提供两种共享资源:网络和存储,网络的共享是通过pause容器实现的,数据的共享是通过volume实现的。
网络:每个Pod被分配一个独立的IP地址,Pod中的每个容器共享网络命名空间,包括IP地址和网络端口。Pod内的容器可以使用localhost相互通信。当Pod中的容器与Pod 外部通信时,他们必须协调如何使用共享网络资源(如端口)。
存储:Pod可以指定一组共享存储volumes。Pod中的所有容器都可以访问共享volumes,允许这些容器共享数据。volumes 还用于Pod中的数据持久化,以防其中一个容器需要重新启动而丢失数据。
POD之间是无法直接进行交流的,需要通过Service进行通信。
Replication Controller
ReplicationController(简称RC),对Pod进行监控,确保用户定义的Pod副本数保持不变。
Service
主要作用就是将多个不同主机上的Pod进行连通,从逻辑上对Pod分组。
Label
标签,用Label来区分Pod,Pod的别名。
Kubernetes搭建
Kubernetes安装-准备集群
Kubernetes使用方式:1.使用kubeadmin通过离线镜像安装、2.使用阿里公有云平台k8s、3.通过yum官方仓库安装、4.二进制包的形式进行安装,kubeasz (github)。
环境准备:
Centos 7 Master >> Master: 192.168.163.132
Centos 7 Node >> Node1: 192.168.163.133 ; Node2:192.168.163.137
- 设置主机名与时区
timedatectl set-timezone Asia/Shanghai #设置时区,都要执行
hostnamectl set-hostname master #设置主机名,132执行
hostnamectl set-hostname node1 #设置主机名,133执行
hostnamectl set-hostname node2 #设置主机名,137执行 - 添加hosts网络主机配置,三台虚拟机都要设置
vim /etc/hosts
192.168.163.132 master
192.168.163.133 node1
192.168.163.137 node2 - 关闭防火墙,三台虚拟机都要设置,生产环境跳过这一步
sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config
setenforce 0
systemctl disable firewalld
systemctl stop firewalld
安装Kubeadm快速部署工具
- 将镜像包上传至服务器每个节点
mkdir /usr/local/k8s-install
cd /usr/local/k8s-install
XFTP上传安装文件
kube114-rpm.tar.gz 集群管理工具安装压缩包
docker-ce-18.09.tar.gz docker安装压缩包
k8s-114-images.tar.gz k8s镜像
flannel-dashboard.tar.gz 监控集群状态的仪表盘 - 按每个Centos上安装Docker
tar -zxvf docker-ce-18.09.tar.gz
cd docker
yum localinstall -y *.rpm
systemctl start docker
systemctl enable docker - 确保从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
- 安装kubeadm
kubeadm是集群部署工具
cd /usr/local/k8s-install/kubernetes-1.14
tar -zxvf kube114-rpm.tar.gz
cd kube114-rpm
yum localinstall -y *.rpm - 关闭交换区
swapoff -a
vi /etc/fstab
#swap一行注释 - 配置网桥
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system - 通过镜像安装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创建集群
- master主服务器配置
kubeadm init --kubernetes-version=v1.14.1 --pod-network-cidr=10.244.0.0/16
–kubernetes-version=v1.14.1 #安装k8s的具体版本
–pod-network-cidr=10.244.0.0/16 #新创建POD所拥有IP的范围
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown
(id -g) $HOME/.kube/config
admin.conf 有关当前集群的核心配置文件,里面包含了kubeadm的集群信息。
kubectl get nodes #查看所有节点
kubectl get pod --all-namespaces #查看所有的Pod
STATUS:CrashLoopBackOff 创建失败并重试 Pending 等待
kubectl create -f kube-flannel.yml #安装flannel网络组件
2. 加入NODE节点
kubeadm join 192.168.4.130:6443 --token 911xit.xkp2gfxbvf5wuqz7
–discovery-token-ca-cert-hash sha256:23db3094dc9ae1335b25692717c40e24b1041975f6a43da9f43568f8d0dbac72
如果忘记,则在master 上执行kubeadm token list 查看 ,在node上运行
kubeadm join 192.168.163.132:6443 --token aoeout.9k0ybvrfy09q1jf6 --discovery-token-unsafe-skip-ca-verification
kubectl get nodes
重新启动服务
kubeadm/kubelet/kubectl区别
kubeadm是kubernetes集群快速构建工具
kubelet运行在所有节点上,负责启动POD和容器,以系统服务形式出现
kubectl是kubenetes命令行工具,提供指令
启动节点命令
启动节点的K8S服务
systemctl start kubelet
设置开机启动
systemctl enable kubelet
启用Web UI Dashboard
Master开启仪表盘
kubectl apply -f kubernetes-dashboard.yaml
kubectl apply -f admin-role.yaml
kubectl apply -f kubernetes-dashboard-admin.rbac.yaml
kubectl -n kube-system get svc #获取系统命名空间下的服务
http://192.168.163.132:32000 访问
脚本部署Tomcat集群
先配置镜像加速器
Deployment(部署):是指Kubernetes向Node节点发送指令,创建容器的过程。
创建Deployment
kubectl create -f 部署yml文件 #创建Deployment
apiVersion: extensions/v1beta1 #版本号,必填
kind: Deployment #类型,必填
metadata:
name: tomcat-deploy #部署文件名,必填
spec: #详细内容
replicas: 2 #Pod数量
template:
metadata: #模板的元素据
labels:
app: tomcat-cluster #Pod名称
spec:
containers: #容器信息
- name: tomcat-cluster #容器名字
image: tomcat:latest #镜像来源
ports:
- containerPort: 8080 #容器内对外暴露的端口
kubectl create -f 部署yml文件 #创建部署
kubectl apply -f 部署yml文件 #更新部署配置
kubectl get deployment #查看当前的deployment
kubectl get pod [-o wide] #查看已部署pod[详细]
kubectl describe pod pod名称 #查看Pod详细信息
kubectl logs [-f] pod名称 #查看pod输出日志[实时更新]
kubectl delete deployment deployment名 #删除deployment
外部访问Tomcat集群
Service服务用于对外暴露应用,是访问内部数据的统一入口,起到负载均衡的作用。
kubectl create -f 部署yml文件 #创建Service
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
labels:
app: tomcat-service
spec:
# type: NodePort #开辟节点端口,与内部tomcat映射
selector: #选择器
app: tomcat-cluster #指向部署完的label
ports:
- port: 8000 #Service服务端口
targetPort: 8080 #容器内部暴露的端口
# nodePort: 32500 #节点暴露的端口与容器端口映射
kubectl get service #获取所有的服务列表
kubectl describe service service名 #查看service详细信息
kubectl delete service service名 #删除service
基于NFS文件集群共享
Network File System - NFS
NFS,是由SUN公司研制的文件传输协议
NFS主要是采用远程过程调用RPC机制实现文件传输
yum install -y nfs-utils rpcbind nfs工具集 rpc底层支持
设置共享文件夹
vim /etc/exports 设置对外暴露的文件夹
/usr/local/data/www-data 192.168.163.132/24(rw,sync) #rw可读可写,sync同步变化
systemctl start nfs.service
systemctl enable nfs.service
systemctl start rpcbind.service
systemctl enable rpcbind.service
exportfs 查看文件共享列表
showmount -e 192.168.163.132 #查看对外共享的文件夹
mount 192.168.163.132:/usr/local/data/www-data /mnt #挂载到本机mnt目录
部署配置挂载点
apiVersion: extensions/v1beta1 #版本号
kind: Deployment #类型
metadata:
name: tomcat-deploy #部署文件名
spec: #详细内容
replicas: 2 #Pod数量
template:
metadata: #模板的元素据
labels:
app: tomcat-cluster #Pod名称
spec:
volumes: #将宿主机某个文件夹向容器内挂载
- name: web-app #挂载数据卷的别名
hostPath:
path: /mnt #宿主机目录
containers: #容器信息
- name: tomcat-cluster #容器名字
image: tomcat:latest #镜像来源
ports:
- containerPort: 8080 #容器内对外暴露的端口
volumeMounts: #挂载点
- name: web-app
mountPath: /usr/local/tomcat/webapps #挂载地址
端口转发工具-Rinetd
Rinetd是Linux操作系统中为重定向传输控制协议工具,可将源IP端口数据转发至目标IP端口,在Kubernetes中用于将service服务对外暴露。
安装Rinetd
cd /usr/local
wget http://www.boutell.com/rinetd/http/rinetd.tar.gz
tar -zxvf rinetd.tar.gz
cd rinetd
sed -i ‘s/65536/65535/g’ rinetd.c 调整可映射端口范围
mkdir -p /usr/man/
yum install -y gcc
make && make install
vim /etc/rinetd.conf
0.0.0.0 8000 10.100.22.231 8000
rinetd -c /etc/rinetd.conf
netstat -tulpn
集群配置调整与资源限定
apiVersion: extensions/v1beta1 #版本号
kind: Deployment #类型
metadata:
name: tomcat-deploy #部署文件名
spec: #详细内容
replicas: 2 #Pod数量
template:
metadata: #模板的元素据
labels:
app: tomcat-cluster #Pod名称
spec:
volumes: #将宿主机某个文件夹向容器内挂载
- name: web-app #挂载数据卷的别名
hostPath:
path: /mnt #宿主机目录
containers: #容器信息
- name: tomcat-cluster #容器名字
image: tomcat:latest #镜像来源
resources:
requests: #需要资源,最低要求
cpu: 0.5
memory: 200Mi
limits: #资源限定,最多使用
cpu: 1
memory: 512Mi
ports:
- containerPort: 8080 #容器内对外暴露的端口
volumeMounts: #挂载点
- name: web-app
mountPath: /usr/local/tomcat/webapps #挂载地址