docker和k8s的学习介绍

docker: 出现是因为相比于虚拟机,资源复用更加灵活,虚拟机是一个完整的操作系统,占用空间大,启动慢;docker容器技术可以根据也无需求,配置不同的环境,不会互相影响。镜像操作方便迁移,实现build once run everywhere

docker主要就是隔离和标准化。核心技术是namespace技术和cgroup技术。
namespace是让不同容器看起来没有关联,防止不同空间命名冲突,比如pid,用户Id,ip地址等。
每一个容器有自己的ns, 就和多进程一样,一个进程的1234地址和另一个进程的1234地址不是一个物理地址(虚拟地址)。不同ns中相同的命名也不是真正相同的资源。
可以通过proc/pid/ns文件夹查看进程所属的ns,然后想要修改的话可以用nsenter进入指定的别的ns空间。

cgroup是用起来隔离的技术。树状结构组织,若干个进程组成cgroup,若干个cgroup树状排列,同时有很多树,代表不同的系统资源,CPU,内存,网络,设备等
可以进行一些资源的监控限制等操作,比如限制mysql一组进程核绑定,占用多大CPU时间,内存和带宽,可以访问哪些设备等等。

常用操作,
先拉取镜像 docker pull ubuntu
然后启动一个容器 docker run -i -t -name 名字 cmd
如果是交互式的话就是/bin/bash

docker image查看镜像
docker ps 查看容器 docker inspect c_id查看具体容器信息
docker top 容器id 查看其中的进程

编译dockfile还可以post发布镜像到docker_hub库里面,没试过。

我用它主要在两个方面,一个是计算机系统实验中,每次实验要装不同的环境,而且是不兼容的,所以为了方便,就用了docker加载镜像。不然的话就要卸载。

还有一个就是在docker部署网站。(静态)
步骤是,1.端口映射一下,docker run -p 80指定80端口。
2、下载nginx和vim. 写一个简单的html文件,修改nginx配置为那个文件,启动nginx。然后ctrl+Q退出,保证容器还是在运行的。然后docker port web查看一下映射情况,通过宿主机地址127.0.0.1加映射端口访问

k8s
要知道k8s出现的原因,其实就是数据中心的操作系统,为了管理很多机器的软硬件资源的。
主要组成和操作系统类似。
调度器controller 进程线程进程组(docker pod service) 网络(每个pod有ip地址)存储(文件存储,对象存储,块存储,有自己的接口管理)和包管理工具helm
关注一下Kubernetes 会将 Service DNS的名字作为域名解析成为一个虚拟的 Cluster IP,然后通过负载均衡,转发到后端的 Pod。虽然 Pod 可能漂移,IP 会变,但是 Service 会一直不变。(Service就相当于一组pod,也就是实现某种功能的一个进程集合,比如mysql的一组进程,也就是说,在进行service作为虚拟ip的时候,真正到的pod会变飘逸的,但是service不会变的,有点类似于NAT,可以实现负载均衡了。)

k8s解决的核心问题是?

服务发现和负载均衡
也就是说给你一个程序,你需要决定在哪个机器的pod上运行。k8s的容器本身就可以指定资源大小CPU,内存等。它有自己的DNS和ip地址公开开容器,流量大的时候还可以负载均衡。

还有存储编排(可选择对象,文件,块存储)

自我修复,高可用。

架构:传统的客户端服务端架构
服务端由一组master节点(存储状态,调度分配资源)和一系列worker节点组成。

主节点结构:
它主要负责接收客户端的请求,安排容器的执行并且运行控制循环,将集群的状态向目标状态进行迁移。(主要有API和客户端交互接口,etcd键值数据库存储状态,调度器主要负责的是让pod在特定空闲节点运行,调度的策略包括资源的需求,亲和性(一组进程最好在一台主机进行,通信方便)还有一个controler控制器,负责故障的通知转移,以及副本,令牌控制等)

其他的 Worker 节点实现就相对比较简单了,它主要由 kubelet 和 kube-proxy 两部分以及运行时(docker)组成。
kubelet: 是工作节点执行操作的 agent,负责具体的容器生命周期管理,根据从数据库中获取的信息来管理容器,并上报 pod 运行状态等。
kube-proxy: 是一个简单的网络访问代理,同时也是一个 Load Balancer。它负责将访问到某个服务的请求具体分配给工作节点上同一类标签的 Pod。
kube-proxy 实质就是通过操作防火墙规则(iptables,service ip到pod ip的映射)来实现 Pod 的映射。(客户端通过services的cluster ip来访问,这个代理会根据iptable规则重定向到其中的pod,流量大的时候还可以负载均衡)service就是一组pod,保证健壮性。

Pod、Service、Volume 和 Namespace 是 Kubernetes 集群中四大基本对象,它们能够表示系统中部署的应用、工作负载、网络和磁盘资源,共同定义了集群的状态。Kubernetes 中很多其他的资源其实只对这些基本的对象进行了组合。

配置文件用yaml写,kubectl 是 Kubernetes 自带的客户端,可以用它来直接操作 Kubernetes 集群。

你可能感兴趣的:(docker,kubernetes,学习)