容器编排与Kubernates

1 基本概念

1.1 K8S优势

容器调度、容器管理、容器编排、容器集群管理工具。Google开源,自动化部署。支持弹性收缩、负载均衡。

1.2 K8S在Devops中的角色

image-20220207214502010

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

image-20220207154813542

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

image-20220207155446706
访问:ip:8000
image-20220207155534956

2.1.3 使用docker-compose部署Java项目

  1. 部署后台应用
    1)项目文件
    image-20220207161332335
    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

image-20220207162552619
4) 启动容器

# 此时会报错,数据库容器未启动
docker run qinjuncai/bsbjd-app
  1. 构建数据库容器
    1)项目文件
    image-20220207172512287
    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 .

image-20220207172933717
4)启动容器

# -e 指定环境变量 详见dockerhub MySQL
docker run -d -e MYSQL_ROOT_PASSWORD=root  qinjuncai/bsbdj-db

image-20220207173225196
5)验证

docker exec -it 11a6d2726e7d /bin/bash
mysql -uroot -proot
show databases;
use bsbdj;
show tables;

image-20220207173755980

  1. 使用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)验证
image-20220207185530320

image-20220207185742620

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,虚拟的网桥。
image-20220207190621076

image-20220207231716266

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. 环境准备
#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
  1. 安装Kubeadmin加载K8S镜像
    每个服务器都需要执行一遍

image-20220207192906117

#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)本地文件版本与系统存在版本冲突
image-20220207194552297

解决:删除本地文件

rm -rf audit*
rm -rf policycoreutils*
重新执行
yum localinstall -y *.rpm
  1. 使用Kubeadm部署K8S集群
    1) Master服务器配置
#1. master主服务器配置
kubeadm init --kubernetes-version=v1.14.1 --pod-network-cidr=10.244.0.0/16

报错
image-20220207200825629
处理:虚拟机关机后增加CPU,至少2颗CPU
注意执行成功返回的数据
image-20220207201459552

# 按提示执行
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

image-20220207202628936
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 访问

验证
image-20220207203151008

2.2.3 Dashboard部署Tomcat集群

  1. 确保所有节点都配置了阿里云镜像加速
# 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
  1. 使用Dashboard控制台创建Tomcat集群

image-20220207204134443

验证
等待一段时间后,刷新页面查看
image-20220207204912924

在node1和node2上查看容器已运行
image-20220207205008908

2.2.4 Deployment脚本部署Tomcat集群

  1. 常用命令
# 创建部署
kubectl create 部署yml文件 
# 更新部署配置,没有创建则默认创建
kubectl apply -f 部署yml文件
# 查看已部署的pod
kubectl get pod [-o wide]
# 查看pod详细信息
kubectl describe pod pod名称
# 查看pod输出日志
kubectl logs [-f] pod名称
  1. 编写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
  1. 创建pod
kubectl create -f ./tomcat-deploy.yml
# 查看创建状态
kubectl create -f ./tomcat-deploy.yml

image-20220207212254069

# 查看详细信息
kubectl get pod -o wide

image-20220207212446230

# 更详细信息查看
kubectl describe pod tomcat-deploy-5fd4fc7ddb-bktpn

# 查看日志
kubectl logs tomcat-deploy-5fd4fc7ddb-bktpn
posted @ 2022-02-26 15:54  Dvomu  阅读(124)  评论(0编辑  收藏  举报