容器编排与Kubernates
1 基本概念
1.1 K8S优势
容器调度、容器管理、容器编排、容器集群管理工具。Google开源,自动化部署。支持弹性收缩、负载均衡。
1.2 K8S在Devops中的角色
2 容器编排
2.1 Docker Compose
Docker Compose适用于单机容器编排。
2.1.1 docker compose 安装
# 第一步:下载(国外网站需要FQ)
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 如不能下载可使用其他源下载
sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 第二步:授权
sudo chmod +x /usr/local/bin/docker-compose
# 第三步:验证
docker-compose --version
2.1.2 案例一:使用docker compose 安装WordPress
参考官方文档
# 创建yml配置文件
mkdir wordpress
cd wordpress/
vi docker-compose.yml
复制以下内容到docker-compose.yml
version: "3.9"
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- wordpress_data:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
wordpress_data: {}
执行docker-compose配置文件中内容
docker-compose up -d
访问:ip:8000
2.1.3 使用docker-compose部署Java项目
- 部署后台应用
1)项目文件
2)编写dockerfile
vi DockerFile
########DockerFile Start#####
# 基于基础镜像构建容器
FROM openjdk:8u222-jre
# 创建目录并切换
WORKDIR /usr/local/bshdj
# 复制项目文件
ADD bsbdj.jar .
ADD application.yml .
ADD application-dev.yml .
# 指定容器监听端口80
EXPOSE 80
# 容器中执行指令
CMD ["java","-jar","bsbdj.jar"]
#########Dockerfile End###########
3)构建镜像
# 构建容器
docker build -t qinjuncai/bsbjd-app .
# 查看镜像
docker images
4) 启动容器
# 此时会报错,数据库容器未启动
docker run qinjuncai/bsbjd-app
- 构建数据库容器
1)项目文件
2)编写Dockerfile
# 基于MySQL基础镜像构建
FROM mysql:5.7
# 切换MySQL5.7 初始化工作目录(官方定义执行目录)
WORKDIR /docker-entrypoint-initdb.d
# 复制文件
ADD init-db.sql .
3)构建数据库镜像
docker build -t qinjuncai/bsbdj-db .
4)启动容器
# -e 指定环境变量 详见dockerhub MySQL
docker run -d -e MYSQL_ROOT_PASSWORD=root qinjuncai/bsbdj-db
5)验证
docker exec -it 11a6d2726e7d /bin/bash
mysql -uroot -proot
show databases;
use bsbdj;
show tables;
- 使用docker-compose 构建容器
1) 编写docker-compose.yml
# docke-compose解析版本
version: '3.3'
# 描述信息
services:
# 服务名,多个容器之间需要实现网络互通 可用db名
db:
build: ./bsbdj-db/
restart: always
# 环境
environment:
MYSQL_ROOT_PASSWORD: root
app:
build: ./bsbdj-app/
# 依赖 依赖后服务之前可相互访问
depends_on:
- db
ports:
- "80:80"
restart: always
2)启动
# 后台启动
docker-compose up -d
# 查看日志
docker-compose logs
# 停止并移除
docker-conpose down
3)验证
2.2 Kubernates容器编排
2.2.1 基本概念
Kubernates Master节点:
主节点,也叫管理节点,Master主节点就是集群里的大脑,它主要职责就是起到调度的作用(决定应用放在哪里运行)。Master运行的Linux系统上,可以是物理服务器或虚拟机或云服务。如果我们想实现高可用,还可以设置多个主节点。
Kubernates Node节点:
职责就是负责运行容器的应用。node节点由Master节点管理,Node负责监控并汇报容器的状态。根据Master的要求管理容器的生命周期(创建、开始、运行、停止、销毁)。可以跑在Linux系统centos7或Ubuntu server16。
Pod 工作单元:
Pod是K8S中最小的工作单元。每个Pod包含一个或多个容器,Pod中的容器会被视为一个整体,被Master调度到一个node上运行。
控制器Controller:
K8S通常不会自己直接创建Pod,而是通过Controller控制器来管理Pod。Controller中定义Pod的部署特性,内部端口 外部端口,不如有几个剧本 在什么样的node上运行等。为了满足不同工作场景,K8S提供了多种Controller
控制器Deployment:
最常见的一种Controller。它可以管理pod的多个副本,并确保Pod按照期望的状态去运行。
任务Job:
用于运行结束就删除的应用,而其他的Controller中的pod通常是可以长期持续运行的。
服务service:
deployment可以部署多个副本,每个pod都有自己的IP,虚拟的网桥。
2.2.2 环境准备
Centos7 Master * 1
- Master:192.168.88.102
Centos7 Node * 2
- Node1:192.168.88.103
- Node1:192.168.88.104
- 环境准备
#1. 设置主机名与时区
timedatectl set-timezone Asia/Shanghai #都要执行
hostnamectl set-hostname master #102执行
hostnamectl set-hostname node1 #103执行
hostnamectl set-hostname node2 #104执行
#2. 添加hosts网络主机配置,三台虚拟机都要设置
vi /etc/hosts
192.168.88.102 master
192.168.88.103 node1
192.168.88.104 node2
#3. 关闭防火墙,三台虚拟机都要设置,生产环境跳过这一步
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
systemctl disable firewalld
systemctl stop firewalld
- 安装Kubeadmin加载K8S镜像
每个服务器都需要执行一遍
#1. 将镜像包上传至服务器每个节点
mkdir /usr/local/k8s-install
cd /usr/local/k8s-install
#XFTP上传安装文件
#2. 按每个Centos上安装Docker
tar -zxvf docker-ce-18.09.tar.gz
cd docker
yum localinstall -y *.rpm
systemctl start 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
tar -zxvf kube114-rpm.tar.gz
cd kube114-rpm
yum localinstall -y *.rpm
#5. 关闭交换区
swapoff -a
vi /etc/fstab
#swap一行注释
#6. 配置网桥
cat <<EOF > /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
docker load -i k8s-114-images.tar.gz
docker load -i flannel-dashboard.tar.gz
问题处理:
1)本地文件版本与系统存在版本冲突
解决:删除本地文件
rm -rf audit*
rm -rf policycoreutils*
重新执行
yum localinstall -y *.rpm
- 使用Kubeadm部署K8S集群
1) Master服务器配置:
#1. master主服务器配置
kubeadm init --kubernetes-version=v1.14.1 --pod-network-cidr=10.244.0.0/16
报错
处理:虚拟机关机后增加CPU,至少2颗CPU
注意执行成功返回的数据
# 按提示执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes
#查看存在问题的pod 发现coredns-fb8b8dccf-xxx 2个组件pending状态,原因是缺少flannel网络组件
kubectl get pod --all-namespaces
#设置全局变量
#安装flannel网络组件,用于在多个pod之间通信
cd /usr/local/k8s-install/
kubectl create -f kube-flannel.yml
#再次查看。全部running状态
kubectl get pod --all-namespaces
2) Node服务器配置:
#2. 加入NODE节点
kubeadm join 192.168.88.102:6443 --token cvlg4q.1acza8qa2gwr5iar \
--discovery-token-ca-cert-hash sha256:3a1275d3737101d19b9a9cde6dc46dedea066daf30caeebfb193b766a73c92a7
#如果忘记
#在master 上执行kubeadm token list 查看 ,在node上运行
kubeadm join 192.168.88.102:6443 --token cvlg4q.1acza8qa2gwr5iar --discovery-token-unsafe-skip-ca-verification
#Master服务器上查看节点信息
kubectl get nodes
3)安装Dashboard仪表盘监控
# Master服务器开启仪表盘
cd /usr/local/k8s-install
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.88.102:32000 访问
验证
2.2.3 Dashboard部署Tomcat集群
- 确保所有节点都配置了阿里云镜像加速
# node1 和 node2上执行
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://k0dd2jve.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
- 使用Dashboard控制台创建Tomcat集群
验证
等待一段时间后,刷新页面查看
在node1和node2上查看容器已运行
2.2.4 Deployment脚本部署Tomcat集群
- 常用命令
# 创建部署
kubectl create 部署yml文件
# 更新部署配置,没有创建则默认创建
kubectl apply -f 部署yml文件
# 查看已部署的pod
kubectl get pod [-o wide]
# 查看pod详细信息
kubectl describe pod pod名称
# 查看pod输出日志
kubectl logs [-f] pod名称
- 编写yml文件
# 解析用的API版本,extensions/v1beta1固定
apiVersion: extensions/v1beta1
kind: Deployment
# 元数据,当前部署文件名称
metadata:
name: tomcat-deploy
# 设置详细内容
spec:
# 部署2个Tomcat pod
replicas: 2
template:
metadata:
# pod名称
labels:
app: tomcat-cluster
spec:
# 容器设置
containers:
# 容器名字,通常与app保持一致
- name: tomcat-cluster
# 镜像及版本
image: tomcat:latest
ports:
- containerPort: 8080
- 创建pod
kubectl create -f ./tomcat-deploy.yml
# 查看创建状态
kubectl create -f ./tomcat-deploy.yml
# 查看详细信息
kubectl get pod -o wide
# 更详细信息查看
kubectl describe pod tomcat-deploy-5fd4fc7ddb-bktpn
# 查看日志
kubectl logs tomcat-deploy-5fd4fc7ddb-bktpn