构建Nginx镜像和k8s组件功能介绍

一、基于Dockerfile构建nginx镜像

1.1 准备Dockerfile用到的文件

  • 修改镜像源为清华大学镜像源,创建sources.list文件
    网址:https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/
  • 下载nginx安装包
    网址:https://nginx.org/en/download.html
  • 启动nginx容器,从容器中拷贝nginx.conf文件到宿主机
  • 编写docker-entrypoint.sh脚本,并添加可执行权限

1.2 编写Dockerfile文件

cat >> Dockerfile <

1.3 构建镜像

docker build -t 192.168.204.200/n60/nginx:v1.20.2 .

1.4 运行容器

docker run -itd -p80:80 192.168.204.200/n60/nginx:v1.20.2

1.5 访问容器

nginx.jpg

二、Docker的cpu和内存的资源限制

2.1 下载压测镜像

  • 下载地址和使用说明:https://hub.docker.com/r/lorel/docker-stress-ng
docker pull lorel/docker-stress-ng:latest

2.2 压测cpu

  • 容器需要使用cpu个数为2
docker run -it --rm lorel/docker-stress-ng --cpu 2

top 按1查看

  • two cpus.jpg

    docker stats查看

  • two cpus docker stats.jpg
  • 限制容器使用cpu个数为1,容器需要使用的cpu个数为2

docker run -it --cpus 1 --rm lorel/docker-stress-ng --cpu 2

top 按1查看

  • limit 1 top.jpg

    docker stats
  • limit 1 stats.jpg
  • 在宿主机上查看分配给容器的cpu
cat /sys/fs/cgroup/cpu,cpuacct/docker/fd984ff398613870ba22adb329415fd4ea214d97e1f24d52b2cf6862085e16b2/cpu.cfs_quota_us

文件中的单位是毫核,除以1000是百分比的形式,再除以100是cpu个数

  • check cpu.jpg

2.3 压测内存

  • 默认两个vm,占用两个cpu,使用命令限制容器使用一个cpu
docker run -it --cpus 1 --rm lorel/docker-stress-ng --vm 2
  • 容器需要使用两个vm,一个vm使用256M
    docker stats
  • two vm mem stats.jpg
  • 限制容器使用内存200M
docker run -it --cpus 1 -m 200m --rm lorel/docker-stress-ng --vm 2

docker stats

  • limit 200 mem.jpg
  • 在宿主机上查看分配给容器的mem
cat /sys/fs/cgroup/memory/docker/e2dd9d29676f664507e233366b6de911f50bacd626033bf362543a57c6cd866c/memory.limit_in_bytes

文件中单位是字节,除以1024是K,再除以1024是M

  • check mem.jpg

三、Docker存储卷和网络

3.1 查看容器详细信息

docker inspect 容器id
  • Lower Dir:image镜像层(镜像本身,只读)
  • Upper Dir:容器的上层(读写)
  • Merged Dir:容器的文件系统,使用Union FS(联合文件系统)将lower dir和upper dir合并给容器使用
  • Work Dir:容器在宿主机的工作目录

3.2 容器在宿主机的目录

  • docker数据默认在宿主机/var/lib/docker目录下,在容器中写入的文件,一旦容器被删除,目录丢失

3.3 容器挂载目录

  • 创建目录
mkdir -p /data/testapp
echo "testapp page" > /data/testapp/index.html
  • 启动两个tomcat容器
docker run -tid --name web1 -v /data/testapp:/usr/local/tomcat/webapps/testapp -p 8080:8080 tomcat:8.5.73
docker run -tid --name web2 -v /data/testapp:/usr/local/tomcat/webapps/testapp -p 8081:8080 tomcat:8.5.73
  • 两个容器访问的数据目录一样
    web1
    web1.jpg

    web2
    web2.jpg
  • 挂载只读目录
docker run -itd --name web3 -v /data/tomcat/conf/server.xml:/usr/local/tomcat/conf/server.xml:ro -v /data/testapp:/usr/local/tomcat/webapps/testapp -p 8083:8080 tomcat:8.5.73

server.xml只读

ro.jpg

  • 创建docker volume
docker volume create n60

创建卷n60

volume n60.jpg

  • 挂载docker volume
docker run -it -p 3306:3306 -v n60:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6.38
  • volume n60 mysqldata.jpg

3.4 Docker网络介绍

  • 查看docker网络
docker network ls
docker network ls.jpg

四、k8s各组件的功能介绍

4.1 kube-apiserver

  • 运行在master节点上
  • Kubernetes API server提供k8s各类资源对象的增删改查及watch等HTTP Rest接口,这些对象包括pods、services、replicationcontrollers等,API Server为REST等操作提供服务,并为集群的共享状态提供前端,所有其他组件都通过改前端进行交互。
  • 端口默认值为6443,可通过启动参数"--secure-port"的值来修改默认值。
  • 默认IP地址为非本地(Non-Localhost)网络端口,通过启动参数"--bind-address"设置改值。
  • 端口用于接收客户端、dashboard等外部HTTPS请求。
  • 用于基于Tocken文件或客户端证书以及HTTP Base的请求。
  • 用于基于策略的授权。

4.2 kube-scheduler

  • 运行在master节点上
  • Kubernetes调度器是一个控制面进程,负责Pods指派到节点上。
  • 通过调度算法为待调度Pod列表的每个Pod从可用Node列表中选择一个最合适的Node,并将信息写入etcd中。
  • node节点上的kubelet通过API Server监听到kubernetes scheduler产生的Pod绑定信息,然后获取对应的Pod清单,下载Image,并启动容器。
  • 策略:
        LeastRequestedPriority:优先从备选节点列表中选择资源消耗最小的节点(CPU+内存)。
        CalculateNodeLabelPriority:优先选择含有指定Label的节点。
        BalancedResourceAllocation:优先从备选节点列表中选择各项资源使用率最均衡的节点。

4.3 kube-controller-manager

  • 运行在master节点上
  • Controller Manager还包括一些子控制器(副本控制器、节点控制器、命名空间控制器和服务账号控制器等),控制器作为集群内部的管理控制中心,负责集群内的Node、Pod副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(ServiceAccount)、资源定额(ResourceQuota)的管理,当某个Node意外宕机时,Controller Manager会及时发现并执行自动化修复流程,确保集群中的pod副本始终处于预期的工作状态。
  • 每间隔5秒检查一次节点的状态。
  • 如果没有收到节点的心跳,则将该node节点标记为不可达。
  • 在标记为无法访问之前等待40秒。
  • 如果该node节点被标记为无法访问后5分钟还没有恢复,Controller manager会删除当前node节点的所有pod并在其它可用节点重建这些pod。
  • pod高可用机制:
        node monitor period:节点监视周期,5s
        node monitor grace period:节点监视器宽限期,40s
        pod eviction timeout:pod驱逐超时时间,5m

4.4 kube-proxy

  • 运行在node节点上
  • 反映了node上Kubernetes API中定义的服务,并可以通过一组后端进行简单的TCP、UDP和SCTP流转发或者在一组后端进行循环TCP、UDP和SCTP转发,用户必须使用apiserver API创建一个服务来配置代理,其实就是kube-proxy通过在主机上维护网络规则并执行连接转发来实现Kubernetes服务访问。
  • 监听API Server中服务对象的变化,再通过管理IPtables或者IPVS规则,实现网络的转发。
  • 不同版本可支持三种工作模式:
        UserSpace:k8s v1.1之前使用,k8s 1.2及以后就已经淘汰。
        IPtables:k8s 1.1版本开始支持,1.2开始为默认模式
        IPVS:k8s 1.9引入到1.11为正式版本,需要安装ipvsadm、ipset工具包和加载ip_vs内核模块
  • 当kube-proxy以IPVS代理模式启动时,kube-proxy将验证节点上是否安装了IPVS模块,如果未安装,则kube-proxy将回退到IPtables代理模式。
  • 使用IPVS模式,kube-proxy会监视Kubernetes Service对象和Endpoints,调用宿主机内核Netlink接口以相应的创建IPVS规则并定期与Kubernetes Service对象Endpoints对象同步IPVS规则,以确保IPVS状态与期望一直,访问服务时,流量将被重定向到其中一个后端Pod,IPVS使用哈希表作为底层数据结构并在内核空间中工作,这意味着IPVS可以更快地重定向流量,并且在同步代理规则时具有更好的性能。

4.5 kubelet

  • 运行在node节点上
  • worker节点的代理组件,监视分配给节点的pod
  • 向master汇报node节点的状态信息
  • 接收指令并在Pod中创建docker容器
  • 准备Pod所需的数据卷
  • 返回Pod的运行状态
  • 在node节点执行容器健康检查

4.6 kubectl

  • 是一个通过命令对kubernetes集群进行管理的客户端工具。

4.7 etcd

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

4.8 dns

  • DNS负责为整个集群提供DNS服务,从而实现服务之间的访问。

4.9 Dashboard

  • Dashboard是基于网页的kubernetes用户界面,可以使用Dashboard获取运行在集群中的应用的概览信息,也可以创建或者修改kubernetes资源(如Deployment、Job、DaemonSet等),也可以对Deployment实现弹性伸缩、发起滚动升级、重启Pod或者使用向导创建新的应用。

五、部署高可用k8s集群

主机环境准备

IP 角色 系统 内存 CPU
192.168.96.11 k8s-master1 ubutu 20.04.3 2G 2C
192.168.96.12 k8s-master2 ubutu 20.04.3 2G 2C
192.168.96.13 k8s-node1 ubutu 20.04.3 2G 2C
192.168.96.14 k8s-node2 ubutu 20.04.3 2G 2C
192.168.96.12 k8s-etcd1 ubutu 20.04.3 2G 2C
192.168.96.13 k8s-etcd2 ubutu 20.04.3 2G 2C
192.168.96.14 k8s-etcd3 ubutu 20.04.3 2G 2C
192.168.96.12 k8s-harbor1 ubutu 20.04.3 2G 2C
192.168.96.13 k8s-harbor2 ubutu 20.04.3 2G 2C
192.168.96.12 k8s-keepalived1 ubutu 20.04.3 2G 2C
192.168.96.13 k8s-keepalived2 ubutu 20.04.3 2G 2C
192.168.96.12 k8s-haproxy1 ubutu 20.04.3 2G 2C
192.168.96.13 k8s-haproxy2 ubutu 20.04.3 2G 2C

5.1 部署keepalived和haproxy

  • 192.168.96.12主机配置keepalived
apt install -y keepalived haproxy
cat > /etc/keepalived/keepalive.conf <
  • 192.168.96.13主机配置keepalived
apt install -y keepalived haproxy
cat > /etc/keepalived/keepalive.conf <
  • 192.168.96.12主机,验证vip切换,停止keepalived,再启动
ifconfig | grep 192.168.    # 查看vip
systemctl stop keepalived.service    # 停止keepalived
ifconfig | grep 192.168.    # vip飘到备机
systemctl start keepalived.service    # 再启动keepalived
ifconfig | grep 192.168.    # vip回到主机
  • 192.168.96.12主机配置haproxy
cat > /etc/haproxy/haproxy.cfg <
  • 192.168.96.13主机配置haproxy
cat > /etc/haproxy/haproxy.cfg <> /etc/sysctl.conf    # 修改内核参数,允许服务监听在本机没有的地址上
sysctl -p    # 使参数生效
systemctl restart haproxy
 ss -ntl    # 查看vip端口是否监听

5.2 部署harbor

  • 192.168.96.12安装harbor
cp harbor.yml.tmpl harbor.yml    # 赋值harbor配置文件,然后修改hostname为harbor域名
mkdir certs    # 创建目录,用作存放证书
openssl genrsa -out ./harbor-ca.key    # 生成私有key
openssl  req -x509 -new -nodes -key ./harbor-ca.key -subj "/CN=HARBOR_DOMAIN" -days 3650 -out ./harbor-ca.crt    # 给harbor的域名签发十年有效期的证书,然后修改harbor中证书和私钥路径
./install.sh --with-trivy --with-chartmuseum    # 安装harbor

然后修改电脑hosts文件,用harbor域名从浏览器中访问,新建项目测试

5.3 安装k8s集群

参考Github开源项目

你可能感兴趣的:(构建Nginx镜像和k8s组件功能介绍)