容器技术分享

一、开篇词

容器技术由来已久,却直到几十年后因dotCloud公司(后更名为Docker)于Docker项目中发明的“容器镜像”技术创造性的解决了应用打包的难题才焕发出新的生命力并以“应用容器”的面目风靡与世,也催生出或改变了一大批诸如容器编排、服务网络和云原生等技术,深刻的影响了云计算领域的技术方向。

二、容器

容器(container):实际上是一种沙盒技术,能够像一个集装箱一样,把你的应用“装”起来的技术。这样,应用与应用之间,就因为有了边界而不至于相互干扰;而被装进集装箱的应用,也可以被方便地搬来搬去(做到了一次打包,就可以到处使用)。

隔离与限制:容器之所以能做到相互隔离且互不干扰主要原因归咎于两大技术:Cgroup+Namespaces
Cgroups 技术是用来制造约束的主要手段,而 Namespace 技术则是用来修改进程视图的主要方法。

更多详细内容参考:https://zhuanlan.zhihu.com/p/433327341

三、容器技术——Docker

1、初识docker

(1)基于Linux 内核的Cgroup,Namespace,以及Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术,由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
(2)Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护,使得Docker 技术比虚拟机技术更为轻便、快捷。

2、核心概念

容器:轻量级的沙箱,Docker利用容器来运行和隔离应用(Cgroup+Namespaces)。
镜像:静态的只读文件,类似于虚拟机镜像,它提供了容器中程序执行需要的所有文件。
仓库:存储镜像的仓库,docker仓库可以分为公有仓库(public)和私有仓库(Private)两种形式。

3、安装

参考教程
(1)菜鸟教程:https://www.runoob.com/docker/centos-docker-install.html
(2)docker官网:https://docs.docker.com/engine/install/

4、容器操作

(1)运行容器:docker run
● -it 交互
● -d 后台运行
● -p 端口映射
● -v 磁盘挂载
(2)启动已停止容器:docker start
(3)停止容器:docker stop
(4)查看容器进程:docker ps
(5)进入容器:docker exec
(6)拷贝文件至容器:docker cp file1 :/file-to-path

5、启动一个容器

(1)启动容器:
#docker run -d centos/httpd:latest
● run 的意思就是要启动一个容器;
● -d 参数里 d 是 Daemon 的首字母,也就是让容器在后台运行;
● centos/httpd:latest 指定了具体要启动哪一个镜像,这里咱们启动的是 centos/httpd 这个镜像的 latest 版本;

(2)查看启动的容器:
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c5a9ff78d9c1 registry/httpd:v1 “/sbin/httpd -D FORE…” 2 seconds ago Up 2 seconds loving_jackson

(3)确定httpd服务进程是否正常,进入容器运行空间查看进程;
docker exec c5a9ff78d9c1 ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 01:59 ? 00:00:00 /sbin/httpd -D FOREGROUND apache 6 1 0 01:59 ? 00:00:00 /sbin/httpd -D FOREGROUND apache 7 1 0 01:59 ? 00:00:00 /sbin/httpd -D FOREGROUND apache 8 1 0 01:59 ? 00:00:00 /sbin/httpd -D FOREGROUND apache 9 1 0 01:59 ? 00:00:00 /sbin/httpd -D FOREGROUND

(4)查看容器内网络信息;
docker exec c5a9ff78d9c1 ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 168: eth0@if169: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever
(5)通过容器搭建的httpd服务下载文件;
curl -L -O http://172.17.0.2/file2 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 6 100 6 0 0 1500 0 --:–:-- --:–:-- --:–:-- 1500 # ls file2

6、制作容器镜像

制作容器镜像主要分为三个步骤:
● 定义Dockerfile文件# cat Dockerfile FROM centos:8.1.1911 #基础镜像,必须要有 RUN yum install -y httpd #执行命令 COPY file1 /var/www/html/ #拷贝文件,但不解压文件 ADD file2.tar.gz /var/www/html/ #拷贝文件且解压 CMD [“/sbin/httpd”, “-D”, “FOREGROUND”] #容器镜像中包含应用的运行命令,需要带参数
● docker build(构建镜像)
$ docker build -t registry/httpd:v1 .
-t :的作用是给这个镜像加一个 Tag,即:起一个好听的名字。
docker build :会自动加载当前目录下的 Dockerfile 文件,然后按照顺序,执行文件中的指令。
docker images:镜像构建好后,可以在本地查看镜像。
● docker run(运行镜像)
docker run -d centos/httpd:latest

更多Dockerfile指令参考:https://www.runoob.com/docker/docker-dockerfile.html

四、容器编排系统——kubernetes

容器编排 是指自动化容器应用的部署、管理、扩展和联网的一系列管控操作,能够控制和自动化许多任务,包括调度和部署容器、在容器之间分配资源、扩缩容器应用规模、在主机不可以或者资源不足时将容器从一台主机迁移到其他主机、负载均衡以及监视容器和主机的运行状况等。

1、组件介绍

● Master组件
Apiserver:集群网关,负责接收、校验并响应所有请求; Etcd:集群状态存储; Controller Manager:控制器管理器,负责生命周期功能、扩缩容; Scheduler:调度器,资源调度;
● Worker组件
Kubelet:工作在集群节点之上的代理组件,通过它使用命令可以跟API Server进行交互; Docker:容器运行时环境 Kube-proxy:按需为service对象生成iptables或ipvs规则,从而将流量转发至正确的pod对象

2、安装

● Kind
特点:简单、容易部署,不适用生产环境
参考安装教程:https://kind.sigs.k8s.io/docs/user/quick-start

● Minikube
特点:相比Kind更加强大,支持虚拟化的能力,使用简单、容易部署,不适用生产环境
参考安装教程:https://kaiwu.lagou.com/course/courseInfo.htm?courseId=447#/detail/pc?id=4520

● kubeadmin(v1.13版本之后可用于生产环境)
搭建生产环境参考文档:https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/high-availability/

3、kubectl命令

(1)常用命令:kubectl get pod
● kubectl:可查看对象。
● -o yaml:输出详细信息为yaml格式。
● -o wide:以详细列表的格式查看对象。
(2)展示资源的详细信息和相关Event:kubectl describe
(3)进入容器:kubectl exec
(4)查看日志:kubectl logs

4、第一个容器化应用

Kubernetes 跟 Docker 等很多项目最大的不同,就在于它不推荐使用命令行的方式直接运行容器(虽然 Kubernetes 项目也支持这种方式,比如:kubectl run),而是希望用 YAML 文件的方式,即:把容器的定义、参数、配置,统统记录在一个 YAML 文件中,然后用这样一句指令把它运行起来:
kubectl create -f 配置文件
配置文件如下:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: #标签选择器 matchLabels: app: nginx replicas: 2 #副本数 template: #pod相关信息 metadata: labels: app: nginx spec: containers: - name: nginx #名称 image: nginx:1.7.9 #容器镜像 ports: - containerPort: 80 #端口
这样做的好处是能够知道我们容器运行的相关信息,配置好相关字段提交到kubernetes后,kubernetes会创建出这些对象所定义的容器或者其他类型的 API 资源。

5、控制器模型

● ReplicaSet控制器
能够保证⼀定数量的pod正常运⾏,它会持续监听这些Pod的运⾏状态,⼀旦Pod发⽣故障,就会重启或重建。同时它还⽀持对pod数量的扩缩容和镜像版本的升降级。

● Deployment控制器
控制器并不直接管理pod,⽽是通过管理ReplicaSet来间接管理Pod,支持RS的基础上还 ⽀持滚动升级和回滚版本。

● StatefulSet控制器
StatefulSet 是为了解决有状态服务的问题而设计的资源控制器,可以通过某种方式记录这些状态,然后在 Pod 被重新创建时,能够为新 Pod 恢复这些状态。
适用场景:
○ 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于 PVC 来实现。
○ 稳定的网络标识符,即 Pod 重新调度后其 PodName 和 HostName 不变。
○ 有序部署,有序扩展,基于 init containers 来实现。
○ 有序收缩。

● DaemonSet控制器
可以保证在集群中的每⼀台(或指定)节点上都运⾏⼀个副本。⼀般适⽤于⽇志收集、 节点监控等场景。
● Job控制器
主要⽤于负责批量处理(⼀次要处理指定数量任务)短暂的⼀次性(每个任务仅运⾏⼀次就结束)任务。
● CronJob控制器
与Job控制器不同的是,CronJob可以在特定的时间点(反复的)去运⾏job任务。

6、存储卷与数据持久化

● emptyDir
生命周期与所属pod对象相同,适用于临时存储、数据缓存系统中;
● gitRepo
能通过挂载目录访问指定代码仓库中的数据,即pod资源创建时,首先创建一个空目录clone指定git仓库的数据到该目录,再创建容器挂载该存储卷;
● hostPath
本地存储卷,其生命周期具体所在工作节点一样的持久性;
● 网络文件系统
支持NFS、CephFS等存储;
● Secret
敏感的配置信息,密钥、证书等;
● ConfigMap
为容器中应用提供配置数据以定制程序的行为,做到应用与配置文件的解耦。

hostPaths存储卷挂载方式如下所示:
存储卷挂载由两部分组成,一是容器内的volumeMounts(表示容器内挂载的目录);二是spec.volunes (表示本机上的文件系统)。

7、Service

Service简介:
在kubernetes中,pod是应⽤程序的载体,我们可以通过pod的ip来访问应⽤程序,但是pod的ip地址不是固定的,这也就意味着不⽅便直接采⽤pod的ip对服务进⾏访问。
为了解决这个问题,kubernetes提供了Service资源,Service会对提供同⼀个服务的多个pod进⾏聚合,并且提供 ⼀个统⼀的⼊⼝地址。通过访问Service的⼊⼝地址就能访问到后⾯的pod服务。

Service类型:
● ClusterIP:默认值,它是Kubernetes系统⾃动分配的虚拟IP,只能在集群内部访问。
● Nodeport: 建立在ClusterIP基础上,在集群每个节点的某静态端口暴露服务(30000-32767),集群外可通过nodeip:nodeport访问。
● LoadBalancer:建立在Nodeport基础上,直接调度云厂商的负载均衡将服务暴露到集群外。
● ExternalName:将service映射至由ExternalName字段的内容指定的主机名来暴露服务,通过 externalName 属性指定外部⼀个服务的地址,然后在集群内部访问此service就可以访问到外部的服务了。

Service资源访问清单:
apiVersion: v1
metadata:
name: service
namespace: dev #命名空间
spec:
selector: #标签选择器,⽤于确定当前service代理哪些pod
app: nginx
type: #Service类型,指定service的访问⽅式
clusterIP: #虚拟服务的ip地址
sessionAffinity: #session亲和性,⽀持ClientIP、None两个选项
ports: #端⼝信息 - protocol: TCP
port: 3017 #service端⼝
targetPort: 5003 #pod端⼝
nodePort: 31122 #主机端⼝

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值