基于dockerfile构建nginx镜像与k8s各组件功能说明

本文目录:

1.基于dockerfile构建nginx镜像
2.掌握容器的cpu和内存的资源限制
3.整理k8s master和node节点各组件的功能
kube-apiserver
kube-controller-manager
kube-scheduler
kubelet
kube-proxy
etcd
网络组件

-------------------------------------------------------------------------------------------------------

一、基于dockerfile构建nginx镜像

1、Dockerfile指令

 

2、基于dpckerfile编写nginx镜像
#nginx image

#父镜像

 FROM ubuntu:20.04



#容器说明,管理者信息 #maintainer dengrh
"847308@qq.com" LABEL "maintainer"="dengrh 847308@qq.com" LABEL "name" = "dengrh"
#将本地文件替换到容器里,aliyun源替换到容器 COPY aliyun.repo
/etc/yum.repos.d/aliyun.repo
#给容器安装基本编译环境
RUN apt update && apt  install -y iproute2  ntpdate  tcpdump telnet traceroute nfs-kernel-server nfs-common  lrzsz tree  openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute  gcc openssh-server iotop unzip zip make vim && mkdir /data/nginx -p
#添加并解压nginx到容器
ADD nginx-1.18.0.tar.gz  /usr/local/src


#编译安装nginx, 将nginx安装目录制作软连接到 /usr/bin 并删除源码安装包,减小容器体积

  RUN cd /usr/local/src/nginx-1.20.2 && ./configure --prefix=/apps/nginx && make && make install && ln -sv /apps/nginx/sbin/nginx /usr/bin && rm -rf /usr/local/src/nginx-1.20.2

 
ADD nginx.conf /apps/nginx/conf/nginx.conf

#公司代码保存目录
#ADD
static.tar.gz /data/nginx/html
#将nginx容器的正确和错误日志打到容器的标准输出上,便可通过 docker logs 容器ID 查看nginx日志 RUN ln
-sv /dev/stdout /apps/nginx/logs/access.log RUN ln -sv /dev/stderr /apps/nginx/logs/error.log
#统一权限,uid,路径,组和用户 RUN groupadd
-g 2022 nginx && useradd -g nginx -s /usr/sbin/nologin -u 2022 nginx && chown -R nginx.nginx /apps/nginx /data/nginx
#声明服务的端口 EXPOSE
80 443
#推荐可执行程序的方式 CMD [
"/apps/nginx/sbin/nginx","-g","daemon off;"]
3、启动nginx容器 

docker run -it -p 81:80 --rm 7a78e9f30e91 bash

4、访问nginx页面

 

二、掌握容器的cpu和内存的资源限制

Cgroup及资源限制

 

容器如果不加资源限制,容器就可以使用宿主机所有资源, 如果一个容器或几个容器占用内存资源过多,导致宿主机没有内存资源分配。

导致其他容器在申请资源的时候,没有可用资源,OM会把资源占用过多的进程强制  kill  掉。

 

K8s资源限制

 

 在k8s中,容器 需要一个最小的可用资源,如100m CPU,256M内存。在k8s中会将容器调度到宿主机可用资源符合容器调度条件的的宿主机上。

容器运行起来后可设置一个容器运行资源上限。如500m CPU,1024m内存。该容器最多只能使用这么多资源。

 
k8s资源池

 

used:可用资源

requests:申请的资源

limits:最大资源

total capacity:剩余资源

参数:

--cpus:限制容器使用的最大cpu核心

-m:限制容器使用的最大物理内存

命令:
限制容器最多使用256兆内存
#docker run -it --rm -m 256m --name docker1 容器ID --vm 2-bytes 256M

CPU限制4
#docker run -it --rm --name docker1 容器ID --cpu 4 --vm 4
加大CPU到1.5核心

后跟宿主机cgroup对需要改的容器的CPU资源限制文件路径

 

 docker stats查看 ( CPU%在 150% 左右浮动)
 减小CPU到1核心

 

 docker stats查看( CPU% 在 100% 左右浮动)

 

 物理内存资源限制存放路径 memory.limit_in_bytes

 

 调大物理内存资源限制(只能调高)

 

 docker stats查看

 

 


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

kub -api server:

     Kubernetes API server 验证并配置API对象的数据,这些对象包括pods、services、replicationcontrollers等、以 REST API 服务形式提供接口,作为增个系统的控制入口。

简介:     

    1. api-server默认端口  6443 可通过启动参数  “--secure-port”的值来修改默认值

    2. 默认IP地址为非本地网络端口,通过启动参数“--bind-address” 设置该值

    3. 该端口用于接收客户端,dashboard等外部 https 请求

    4.用于基于Tocken文件客户端证书及 HTTP Base 的认证

    5.用于基于策略的授权

官方:https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-apiserver/

如图:

       用户向api server发起创建容器的请求,由 api server 检查权限是否符合并将该事件发给 etcd。

       api server 通过 api server 的地址与 api server 保持监听,查询是否存在事件,若存在,kube-scheduler 会通过 api server 从 etcd 获取事件,并检查宿主机资源是否符合要求,若符合则进行调度,将调度结果返回给api-server,再写到etcd,最后 node 节点就可以通过api server拿到该事件。

 

kube-controller-manager:

                执行整个系统的后台任务,包括节点状态状况、Pod个数、Pods和Service的关联等。

         kube-Controller-Manager还包括了一些子控制器(副本控制器,系统控制器、命名空间控制器和服务账号控制器等),控制器作为集群内部的管理控制中心、负责集群内的Node、Pod副本、服务端点(Endopint)、命名空间(Namespace)、服务账号(ServiceAccount)、资源定额(ResoourceQuota)的管理,当某个Node意外宕机时,Controller Manager会及时发现并执行自动化修复流程,确保集群中的pod副本始终处于理想工作状态。

 官方:https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-controller-manager/

 

◽ controller-manager控制器每间隔5秒检查一次节点的状态

◽ 如果controller-manager控制器没有收到自节点的心跳,则将该node节点被标记为不可达

◽ controller-manager将标记为无法放置之前等待40秒

如果该node节点被标记为无法访问后5分钟还没恢复,controller-manager会删除当前node节点的所有pod并在其他可用节点重建这些pod

 

     如图:

               kube-controller-manager也是通过api server从etcd 中读取etcd中的数据,得知有哪些节点挂了。

而kubelet是一个客户端,主要是维护当前主机的pod状态,汇报状态,汇报信息。若当前主机的pod节点挂了,kubelet会将该信息通过api server 写到 etcd,然后 kube-scheduler 或 kube-controller-manager 就可以通过 api server 获取 etcd 中该事件的信息,并由 kube-scheduler 进行容器重建。

kube-scheduler:

负责节点资源管理,接收来自kube-apiserver创建Pods任务,并分配到某个节点


kube-proxy:

       kubernetes网络代理运行在node上,他反映了node上Kubernetes API中定义的服务,并可以通过一组后端进行简单的TCP、UDP和SCTP转发,用户必须使用api server创建一个服务来配置代理,其实就是kube-pory通过主机上维护网络规则并执行连接转发来实现Kubernetes服务访问。

官方:https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-proxy/

◽ Kube-proxy运行在每个节点上,监听API Server中服务对象的变化,再通过管理 IP tables 或者 IPVS 规则来实现网络的转发。

◽Kube-proxy不同的版本支持三种工作模式

      User Space:k8s v1.1 之前使用,k8s 1.2及以后淘汰

      IP tables:k8s 1.1版本开始支持,1.2开始为默认

      IPVS:k8s 1.9 引入到1.11版本为正式版本,五幺安装ipvsadm,ipset工具包和加载  ip_vs  内核模块

 

 

以上是K8s集群图:

       kube-proxy  运行在每个计算机节点上,负责pod网络代理,定时从etcd获取service信息做相应策略。

       用户如果要创建一个容器,想要暴漏某些端口的时候,就需要 kube-proxy 与 api server 进行交互。 该请求会由 api server 将该事件写到 etcd,通过 kube-scheduler 进行调度将容器分配给 node1 ,node1 上的 kube-proxy 就发现本机有一事件需要创建该容器的端口映射,然后接收 etcd 的请求,然后调用内核更新本机的一些网络规则(ip tables或ipvs)。当pod请求写到 ectd 后, kubelect也会拿到该事件,需要在本主机上创建一个容器,会调用docker拉取镜像并创建容器(docker调用containerd创建容器)。 

etcd:

      由CoreOS公司开发,目前是kubernetes默认使用的key-value数据存储系统,用于保存kubernetes的所有集群数据。etcd支持分布式集群功能,生成环境使用时需要为etcd数据提供备份机制

         官方:  https://kubernetes.io/zh/docs/tasks/administer-cluster/configure-upgrade-etcd/

                     https://etcd.io/                                         官网

                     https://github.com/etcd-io/etcd                 github

kubelet:

        官网:https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kubelet/

                   https://kubernetes.io/zh/docs/reference/kubectl/kubectl/

 kubelet是运行在每个worker节点的代理组件,作为agent,接收分配该节点的Pods任务及管理容器,周期性获取容器状态,反馈给kube-apiserver。,具体功能如下

◽ 向master汇报node节点的状态信息

◽ 接收指令并在pod中创建docker容器

◽ 准备pod所需要的数据卷

◽ 返回pod的运行状态

◽ 在node节点执行容器监控检查

 DNS:

DNS负责为整个集群提供DNS服务,从而实现服务直接的访问

 

posted @ 2022-01-11 11:05  小小一兆  阅读(399)  评论(0编辑  收藏  举报