Dockerfile 及 docker 资源限制

基于dockerfile构建nginx镜像

# 下载nginx源码包到本地 http://nginx.org/download/nginx-1.21.5.tar.gz
~/nginx$ ll
总用量 1052
-rw-rw-r-- 1 yxy yxy     372 1月   7 16:59 Dockerfile
-rw-rw-r-- 1 yxy yxy 1072633 12月 28 23:35 nginx-1.21.5.tar.gz

# 编写 Dockerfile
~/nginx$ cat Dockerfile 
FROM centos:7 as build

RUN yum install gcc make automake pcre-devel openssl-devel zlib-devel systemd -y && yum clean all
ADD nginx-1.21.5.tar.gz /usr/local/src/
WORKDIR /usr/local/src/nginx-1.21.5
RUN mkdir /opt/nginx && ./configure --prefix=/opt/nginx --with-stream && make && make install

FROM centos:7 
COPY --from=build /opt/nginx /opt/nginx
WORKDIR /opt/nginx

# 基于 Dockerfile 构建镜像
~/nginx$ sudo docker build -t nginx:1.21.5 .
Sending build context to Docker daemon  1.075MB
Step 1/8 : FROM centos:7 as build
 ---> eeb6ee3f44bd
Step 2/8 : RUN yum install gcc make automake pcre-devel openssl-devel zlib-devel systemd -y && yum clean all
 ---> Using cache
 ---> 7da5dc86a302
Step 3/8 : ADD nginx-1.21.5.tar.gz /usr/local/src/
 ---> Using cache
 ---> 29a7617fc3fb
Step 4/8 : WORKDIR /usr/local/src/nginx-1.21.5
 ---> Using cache
 ---> 770c987e83b3
Step 5/8 : RUN mkdir /opt/nginx && ./configure --prefix=/opt/nginx --with-stream && make && make install
 ---> Using cache
 ---> df57203705c9
Step 6/8 : FROM centos:7
 ---> eeb6ee3f44bd
Step 7/8 : COPY --from=build /opt/nginx /opt/nginx
 ---> Using cache
 ---> a12811c4d5b6
Step 8/8 : WORKDIR /opt/nginx
 ---> Running in fc54357a93f9
Removing intermediate container fc54357a93f9
 ---> 085b95eeb479
Successfully built 085b95eeb479
Successfully tagged nginx:1.21.5

# 测试镜像
~/nginx$ sudo docker run -it --rm nginx:1.21.5 /opt/nginx/sbin/nginx -v
nginx version: nginx/1.21.5

容器的cpu和内存的资源限制

# 限制容器使用 1核心CPU
~$ docker run --rm -it --cpus  1 lorel/docker-stress-ng --cpu 3
stress-ng: info: [1] defaulting to a 86400 second run per stressor
stress-ng: info: [1] dispatching hogs: 3 cpu
stress-ng: info: [1] successful run completed in 26.34s

# 限制容器使用 280MB内存
~$ docker run --rm -it -m 280m lorel/docker-stress-ng  --vm 2
WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap.
stress-ng: info: [1] defaulting to a 86400 second run per stressor
stress-ng: info: [1] dispatching hogs: 2 vm
stress-ng: info: [1] successful run completed in 68.97s

k8s master和node节点各组件的功能

Master 节点

  • etcd

    Kubernetes集群的所有状态信息都需要持久存储于存储系统etcd中。etcd是由CoreOS基于Raft协议开发的分布式键值存储,可用于服务发现、共享配置以及一致性保障(如数据库主节点选择、分布式锁等)。显然,在生产环境中应该以etcd集群的方式运行以确保其服务可用性,并需要制定周密的备份策略以确保数据安全可靠。
    etcd还为其存储的数据提供了监听(watch)机制,用于监视和推送变更。API Server是Kubernetes集群中唯一能够与etcd通信的组件,它封装了这种监听机制,并借此同其他各组件高效协同。

  • kube-apiserver

    API Server是Kubernetes控制平面的前端,支持不同类型应用的生命周期编排,包括部署、缩放和滚动更新等。它还是整个集群的网关接口,由kube-apiserver守护程序运行为服务,通过HTTP/HTTPS协议将RESTful API公开给用户,是发往集群的所有REST操作命令的接入点,用于接收、校验以及响应所有的REST请求,并将结果状态持久存储于集群状态存储系统(etcd)中。

  • kube-controller-manager
    控制器负责实现用户通过API Server提交的终态声明,它通过一系列操作步骤驱动API对象的当前状态逼近或等同于期望状态。Kubernetes提供了驱动Node、Pod、Service、Endpoint、ServiceAccount和Token等数十种类型API对象的控制器。从逻辑上讲,每个控制器都是一个单独的进程,但是为了降低复杂性,它们被统一编译进单个二进制程序文件kube-controller-manager(即控制器管理器),并以单个进程运行。

  • kube-scheduler

    Kubernetes系统上的调度是指为API Server接收到的每一个Pod创建请求,并在集群中为其匹配出一个最佳工作节点。kube-scheduler是默认调度器程序,它在匹配工作节点时的考量因素包括硬件、软件与策略约束,亲和力与反亲和力规范以及数据的局部性等特征。

Node 节点

  • kubelet

    kubelet是Kubernetes中最重要的组件之一,是运行于每个Node之上的“节点代理”服务,负责接收并执行Master发来的指令,以及管理当前Node上Pod对象的容器等任务。它支持从API Server以配置清单形式接收Pod资源定义,或者从指定的本地目录中加载静态Pod配置清单,并通过容器运行时创建、启动和监视容器。
    kubelet会持续监视当前节点上各Pod的健康状态,包括基于用户自定义的探针进行存活状态探测,并在任何Pod出现问题时将其重建为新实例。它还内置了一个HTTP服务器,监听TCP协议的10248和10250端口:10248端口通过/healthz响应对kubelet程序自身的健康状态进行检测;10250端口用于暴露kubelet API,以验证、接收并响应API Server的通信请求。

  • kube-proxy

    kube-proxy也是需要运行于集群中每个节点之上的服务进程,它把API Server上的Service资源对象转换为当前节点上的iptables或(与)ipvs规则,这些规则能够将那些发往该Service对象ClusterIP的流量分发至它后端的Pod端点之上。kube-proxy是Kubernetes的核心网络组件,它本质上更像是Pod的代理及负载均衡器,负责确保集群中Node、Service和Pod对象之间的有效通信。

  • 容器运行时环境

    Pod是一组容器组成的集合并包含这些容器的管理机制,它并未额外定义进程的边界或其他更多抽象,因此真正负责运行容器的依然是底层的容器运行时。kubelet通过CRI(容器运行时接口)可支持多种类型的OCI容器运行时,例如docker、containerd、CRI-O、runC、fraki和Kata Containers等。

k8s集群高可用部署

参考 https://github.com/easzlab/kubeasz

你可能感兴趣的:(Dockerfile 及 docker 资源限制)