导图社区 Docker和kubernetes
Docker和Kubernetes是现代云计算和容器化技术中两个非常重要的工具,它们在应用程序的部署、管理和扩展方面发挥着不同的作用。以下是对Docker和Kubernetes的详细概述,从入门到实际应用,有K8S架构描述。
编辑于2024-07-31 15:18:55Docker&kubernetes
Docker基础培训
01 容器技术概述
容器技术发展
Docker介绍
容器是一个轻量级、独立运行的环境,包含了所以应用程序和其所有依赖。
Docker基础操作
安装
安装(参考阿里云文档:https://developer.aliyun.com/mirror/?spm=a2c6h.12873639.J_eBhO-wcawiLJRkGqHmozR.74.21d9772exf1VLK)
镜像源(https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors)
生命周期管理
docker run -d -p 8080:80 httpd(镜像默认是最新的,从docker hub下载)
registry.opsxlab.cn/kubesphereio/ks-apiserver:v2.0
docker stop $(容器ID,或者容器名字)
docker start $(容器ID,或者容器名字)
docker restart $(容器ID,或者容器名字)
docker rm $(容器ID,或者容器名字)
进入容器
docker attach 25d24c712857 进入主进程,不能修改操作,只能查看
docker exec -it 25d24c712857 /bin/bash 分配一个终端,类似linux ssh
容器镜像
容器镜像结构
分层,除了当前层,下面的层只读。
如果要增、删、改、都是当前层操作
如果要查找,逐层往下查,保证数据是最新的
docker image inspect ubuntu:latest 查看镜像的详细信息
构建容器镜像
通过容器来构建
1、修改容器的内容,或者安装程序
2、在容器停止状态,保存为新镜像:docker commit <container_id> myapp:latest
通过Dockerfile文件来构建(生产推荐)
1、创建一个文件,里面包含对应的程序文件和Dockerfile定义文件,基于一个空镜像
2、在Dockerfile当前目录执行docker build -t myapp2:latest .
搭建私有镜像仓库
公有仓库库
Docker hub
Docker公司所有,大量的官方镜像和社区镜像,种类非常丰富
Quay.io
种类上不及Docker hub,但是镜像安全上优于Docker hub,基本是没有漏洞,适合企业生产环境。
私有仓库
Docker Registry简单,易于使用
docker run -d -p 5000:5000 -v /root/myregistry:/var/lib/registry(-v 指的是把本地路径挂载到容器) registry
harbor(可以漏洞扫描,搭建双活,适合企业)
通过kubekey kubesphere部署
镜像管理
docker pull xxx 默认从Docker hub下载
用本地仓库
1、配置本地仓库地址,然后重启Docker echo '{ "insecure-registries": ["192.168.3.211:5000"] }' > /etc/docker/daemon.json
标注
2、docker tag httpd:latest 192.168.3.211:5000/test/httpd:v2.0
3、docker push 192.168.3.211:5000/test/httpd:v2.0
4、Docker rmi 镜像id
5、docker run -d -p 8080:80 192.168.3.211:5000/test/httpd:v2.0(后面镜像使用具体的标签和版本)
容器网络
bridge
在linux 出现一个Docker0网桥,有自己的子网,Docker会被分配一个独立的IP地址
类似于一个虚拟机交换机,创建容器默认网络
创建bridge网络
docker network create --driver bridge net1 走默认网关
docker network create --driver bridge --opt com.docker.network.host_binding_ipv4=192.168.3.211(宿主机的IP地址) net2
docker network create --driver bridge --subnet 192.168.30.0/24 --gateway 192.168.30.1 net3 (指定Docker网络的子网和掩码)
通过端口转发,把宿主机的端口转发给容器,不同的容器端口一样。每个容器网络空间独立的,端口不会冲突。
none
不会分配IP地址,容器被完全隔离,适合容器测试的时候使用
host
容器和宿主机共用所有网络,IP地址相同
容器之间以及宿主机,通过端口区分业务,容器之间端口会冲突,每个容器需要一个独立的端口,不能和其他容器共用。
容器存储
容器存储机制
tmpfs
临时性
数据在内存中,读写速度非常快,但是需要对大小进行严格限制
适合缓存中间件
docker run -itd --tmpfs /test:rw,size=1g centos
volume
持久性
自动创建路径/var/lib/docker/volumes/...
宿主机更新文件,容器里面同步更新
docker run -itd -p 8080:80 -v /usr/local/apache2/htdocs httpd
bind mount
和volume 类似,也具有持久性,实际生产常用
-v 宿主机路径:容器内路径
宿主机更新文件,容器里面同步更新
docker run -itd -p 8082:80 -v /local/bind_mount/:/usr/local/apache2/htdocs --name c1 httpd
容器间数据共享
第一种:通过volume或者bind mount重复挂载给其他容器
通过--volumes-from
docker run -itd --name c3 -p 8083:80 --volumes-from c1 httpd
区别:如果有5个目录同时要挂给2个容器,第一种方式,2个容器分别挂载5个目录。 第二种方式,只需要--volumes-from 指定volume来的第一个容器即可,更方便。
kubernetes基础培训
PAAS概述
什么是PASS
PASS与编排工具
K8S
社区支持好,流行度高,行业标准
Swarm
简单易于使用
Mesos
适合管理大规模的集群
架构复杂,使用门框比较高,社区支持没有K8S好
kubernetes架构介绍
容器编排工具
kubernetes架构
节点
节点可以是虚拟机也可以是物理机
master(老板,或者公司管理层)
node(一个具体工作组)
工作平面
控制平面(master)
Kube-apiserver 整个集群的核心,所有通讯的总联络员
Etcd 键值对的数据库,负责记录整个集群的状态
Kube-controller-manager:管理控制器, 确保集群的期望状态和实际状态保持一致
deployment(无状态)
ReplicaSet 确保副本数,不单独使用
DaemonSet 类似于守护进程,每个节点都会有
StatefulSet (有状态)
pv和pvc 负责存储
......
scheduler 制定调度策略
工作平面(node)
kubelet
是 Kubernetes 的代理
每个节点都会有,类似于(工作小组的组长)
kube-proxy
网络代理,网络负载均衡(service > pod)
容器引擎
负责启动和管理容器
namespace
可以理解为虚拟化集群
隔离资源,区分不同的环境(测试、生产....)、RBAC(类似于用户)
pod管理和应用
pod基本概念
pod是K8S里面最小的管理单元
也是业务运行基础
常规情况一个pod一个容器,在容器需要紧密结合的时候才会出现一个pod多个容器
一个pod一个IP,里面里面所有容器共用这个IP,容器之间通过lo(127.0.0.1) 接口通信
使用pod
kubectl apply -f simple-pod.yaml(yaml文件写法可以参考https://kubernetes.io)
进入pod
kubectl exec -it nginx -- /bin/sh 不指定容器,直接进入主容器
kubectl exec -it nginx --container nginx -- /bin/sh 进入指定的容器
kubectl get pod -A 获取所有的容器名字
kubectl get pod -n kubesphere-controls-system 查看指定namespace的pod
kubectl describe pod kubectl-admin-7447f6f456-8wkjs -n kubesphere-controls-system 查看pod的详细,包括包括启动时候的故障原因,常用故障分析。
kubectl logs nginx-deployment-86dcfdf4c6-2dwlq 查看容器里面应用日志
deployment管理和使用
kubernetes管理对象
创建deployment
kubectl create deployment mydep --image=nginx
kubectl apply -f xxx.yaml 推荐方式
管理方式和pod一样, kubectl get、create、describe语法一样
deployment升级和弹性伸缩
kubectl scale deployment nginx-deployment —replicas=3
kubectl apply -f xxx.yaml 推荐方式,可以是原文件,只需要修改replicas: 3
deployment滚动升级
升级方式kubectl apply -f xxx.yaml 执行原yaml,只需要修改镜像版本
对业务无感知
先让新版本的pod就绪,然后再删除旧版本的pod,轮询操作直到全部替换。
deployment回滚
方式一:也可以执行旧版本yaml文件来回滚,不足地方就是看不版本更新的记录
方式二:k apply -f nginx-deployment-v1.yaml --record
k rollout history deployment nginx-deployment
k rollout history deployment nginx-deployment --revision=3
k rollout undo deployment nginx-deployment --to-revision=3
标签和标签选择器
标签
标签就是一个键值对,给对象打上标识,用于管理
可以在第一次创建对象的时候打上标识,也可以后面运行过程增加。
k label pod nginx-label time=2024 增加
k label pod nginx-label time- 移除标识
k label pod nginx-label --overwrite time=2023 覆盖标识
标签选择器
基于等值的
基于集合的(实际生产当中用途更广泛)
service服务发现
service基本概念
定义了一种抽象,它包括一组逻辑上的Pod以及一种可以访问这些Pod的策略
服务的三种类型
clusterIP 内部网络访问
nodeport 外部网络通过节点端口访问
LoadBalancer:通过外部的负载均衡器来访问
集中的DNS
一个轻量级 DNS 服务器
提供Service 域名,提供稳定连接
Headless Service
和有状态statefulset结合使用
daemonset与job
daemonset
类似于守护进程,保证每个节点上都有对应的pod
常用监控代理,日志收集,网络插件等
job
一次性的任务
cronjob
周期性的任务
pod健康检查
pod探针基本概念
使用存活探针
exec
http
tcp
类似于虚拟机有没有启动,不管里面服务状态,只管pod是否正常启动成本
使用就绪探针
exec
http
tcp
类似于虚拟机里面的应用或者服务启动完毕,出现对应进程,可以访问。
k8s网络
kubernetes网络模型
pod 与 pod通信
同一个pod内部容器通信
Pod到Service的通信
集群外部与 Service 之间的通信
cni插件及常见的实现
Flannel 优点:设置和管理简单,缺点:缺乏高级网络策略支持,处理高性能需求时表现不佳, 因为有封包解包的过程。
calico 优点:支持高级网络策略,高性能。 缺点:设置较为复杂,不支持原生多播
canal 优点:提供了比较平衡的网络策略,结合flannel和calico优点, 缺点:集成可能不如单独calico流程,还是涉及flannel的封装开销。
k8s存储
emptydir
是一种临时存储卷,当Pod被调度到一个节点上时,系统会自动在该节点上创建一个
hostpath
允许我们将宿主机(即运行Pod的节点)上的特定文件或目录挂载到Pod内
pv和pvc
独立于pod生命周期
Retain(保留)
Recycle(回收)
Delete(删除)
statefulset管理与使用
和deployment的区别是有稳定的标识符
扩容和缩容都是有序的
helm包管理工具
helm简介
使用helm
chart简介
chart模版的使用
kubernetes日志管理方案
k8s日志管理
efk日志管理
kubernetes 监控方案
k8s常用监控方案
Prometheus概述
K8S如何监控故障,以及如何使用K8S实际部署应用?