kubernetes - 简单了解

容器编排

集群环境容器部署的困境
动态调整集群的部署
容器编排:哪些宿主机上安装什么容器,以及这些容器以什么样的方式通信和被管理
单机容器编排工具:docker compose
集群容器编排工具:docker swarm、kubernetes

Kubernetes基本概念

Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。

  • 自动化容器的部署和复制
  • 随时扩展或收缩容器规模
  • 容器分组Group,并且提供容器间的负载均衡
  • 实时监控,,即时故障发现,,自动替换
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eC5EFXYB-1580965420666)(C:\Users\ZhaoTaoSheng\AppData\Roaming\Typora\typora-user-images\1580894800767.png)]

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

  1. 设置主机名与时区
    timedatectl set-timezone Asia/Shanghai #设置时区,都要执行
    hostnamectl set-hostname master #设置主机名,132执行
    hostnamectl set-hostname node1 #设置主机名,133执行
    hostnamectl set-hostname node2 #设置主机名,137执行
  2. 添加hosts网络主机配置,三台虚拟机都要设置
    vim /etc/hosts
    192.168.163.132 master
    192.168.163.133 node1
    192.168.163.137 node2
  3. 关闭防火墙,三台虚拟机都要设置,生产环境跳过这一步
    sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config
    setenforce 0
    systemctl disable firewalld
    systemctl stop firewalld

安装Kubeadm快速部署工具

  1. 将镜像包上传至服务器每个节点
    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 监控集群状态的仪表盘
  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
  1. 安装kubeadm
    kubeadm是集群部署工具
    cd /usr/local/k8s-install/kubernetes-1.14
    tar -zxvf kube114-rpm.tar.gz
    cd kube114-rpm
    yum localinstall -y *.rpm
  2. 关闭交换区
    swapoff -a
    vi /etc/fstab
    #swap一行注释
  3. 配置网桥
    cat <<EOF > /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    sysctl --system
  4. 通过镜像安装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创建集群

  1. 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 ( i d u ) : (id -u): (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    #挂载地址
发布了15 篇原创文章 · 获赞 0 · 访问量 372

猜你喜欢

转载自blog.csdn.net/weixin_44601009/article/details/104195267