K8S+Docker+rancher+Nginx

 

一、Docker介绍

1.1 什么是Docker

Docker 是一个开源的应用容器引擎,基于Go实现,遵从Apache2.0协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,这里所说的容器和上面我提到的容器是一个容器,容器是完全使用沙箱机制,可以这么理解就是,一台Linux部署了5个Docker容器,那么这一台电脑可以相当于6台电脑去使用,容器可以比作是Linux中的Linux,这个我也是在学习过程中才理解的.

不幸的是Docker开始收费了,但是幸运的是Docker提供社区版本来供我们学习.

1.2 Docker 有什么优点

现在,各个大厂都在使用Docker和K8S来进行上云,既然这么多大公司都在用,那么就说明,Docker肯定是有其非常亮眼的优势的,现在我们就来分析一下。

Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助Docker可以以管理应用程序的方式来管理基础架构。通过利用Docker的方法来快速交付、测试、部署代码。

1.3 Docker 整体将架构

Docker 是基于C/S 模式的架构的,其通过 DocekrClient 和 与 Docker Daemon 建立通信,使用远程API来管理和创建Docker容器. 其可以通过HTTP API 形式通信也可以通过Socket方式进行通信。

 

Docker Client 通过发送请求到 Docker Server中,Docker Server 根据路由以及请求来调用Engine中的各个不同的Job来完成本次请求操作,而之后各个Job完成自己的任务向Engine返回即可.
————————————————
原文链接:https://blog.csdn.net/DaXingGggg/article/details/119064132

 

1.4 Docker和虚拟机的区别

Docker和K8s实战_第1张图片

1.5 docker概述

docker的出现,是为了解决容器的编排问题(容器本身没有价值,容器编排解决了开发生产环境不一致的问题,同时解决了大规模部署问题,也大大方便了我们开发,运维成本)。

具体用途:

(1)标准化打包。

(2)隔离。

(3)标准化部署。

1.6 容器与虚拟机

虚拟机和容器的区别:

 (1)共享宿主机资源还是模拟:

      虚拟机采用模拟的方式,通过Hypervisor的软件即硬件虚拟化功能,模拟操作系统运行的必备硬件,比如CPU、内存、I/O设备等。

容器其实就是宿主机上的一个进程,所以本质上还是用的宿主机的硬件。

(2)隔离性

虚拟机是Hypervisor来实现强隔离机制。容器是软隔离,消耗资源也比较少。容器只能看到Namespace所限定的资源,网络,文件,状态,设备或者配置等。而完全看不到宿主机及其它不相关程序。

(3)启动数量

容器启动数量要远远多于虚拟机的启动数量。容器依赖的资源更少。

1.7 容器核心技术

容器通过CGroups,Networking,Namespaces,Storage来实现隔离与限制。CGroups限制CPU,内存,设备的使用。Networking实现docker网络与容器,容器与容器之间的互联互通。Namespaces限定进程视线,只能看到指定的内容。

容器通过分层的组织方式。类似洋葱结构,若两个容器底层镜像相同,他们可以共用镜像层。

容器的四大组成部分。镜像 ( Image )、容器 ( Container )、网络 ( Network )、数据卷 ( Volume )。

(1)镜像: 虚拟环境运行最原始文件系统的内容。Docker 的镜像实质上是无法被修改的,因为所有对镜像的修改只会产生新的镜像,而不是更新原有的镜像。

(2)容器:隔离虚拟环境的基础设施,镜像跑起来就是容器,一个镜像可以跑多个容器。

(3)网络:docker容器内部网络可以进行配置,还可以在容器之间建立虚拟网络,甚至可以跨节点构建虚拟网络实现多台物理机上容器的互通互联。

(4)数据卷:为了保证数据的安全性以及独立性,将容器中的关键数据挂载到宿主机的文件系统。

1.8 docker Engine:实现容器化的工具

docker engine最核心的组件就是 docker daemon 和 docker CLI 。Docker 所能提供的容器管理、应用编排、镜像分发等功能都集中在了daemon中。同时其向外暴露了restful api,通过docker cli与docker daemon进行交互。

1.9 docker容器运行示例图

(1)构建镜像发布到docker hub上。docker build。

(2)从镜像仓库拉去镜像。docker pull。当然若本地已经有了,之间用本地的。

(3)运行镜像。docker run。

Dockerfile制作说明:

https://docs.docker.com/engine/reference/builder/

二、Docker安装

2.1 标准化机器准备

不论是master还是node节点,都要先做一些同样的设置,本章会将这些步骤列出,请参照本章对每一台机器做同样的设置。

2.1.1 版本信息本次涉及到的重要软件的版本信息如下:

操作系统:CentOS Linux 7.9 
Docker:20.10.17
Kubernetes:1.4

2.1.2 机器信息

整个环境由三台CentOS7的机器组成,如下:

系统 k8s版本 docker ip 主机名 配置
centos 7.9 1.24 20.10.17 11.112.20.94  k8s-master 2核4G 
centos 7.9 1.24 20.10.17 11.112.20.95 k8s-node01 2核4G
centos 7.9 20.10.17 11.112.20.96 rancher-master 2核4G

 接下来的操作是通用的,在master和node1两台机器上都要一模一样的做一遍;

建议以root身份来执行以下操作,或者通过sudo su -命令获取root权限;

2.1.3 检查hostname

检查文件/etc/hostname,确保master和node1的不一样,我这边master的hostname就叫master,node的hostname叫node1;

修改后需要重启机器;
检查hosts
检查文件/etc/hosts,确保有hostname和本机IP的配置:

对于master应该有这么一行:11.112.20.94 master
对于node1应该有这么一样:11.112.20.95 node1

2.1.4 IP和DNS

IP地址不能冲突;
能正常解析域名,执行curl www.baidu.com,可以返回网站的html内容;

2.1.5 防火墙

如果是测试环境就关闭防火墙,如果是生产环境需要做详细的设置,关闭防火墙的方法如下:

查看当前防火墙状态:systemctl status firewalld.service
禁止开机启动:systemctl disable firewalld.service
关闭防火墙:systemctl stop firewalld.service

2.1.6 关闭selinux

打开文件/etc/selinux/config,找到SELINUX=xxxxx这行,改为SELINUX=disabled;
修改后需要重启机器;
开启IPV4转发
打开文件/etc/sysctl.conf,检查是否有net.ipv4.ip_forward = x这样的配置;
如果有就保证x等于1,如果没有就加一行:net.ipv4.ip_forward = 1
修改并保存后,执行命令sysctl -p使配置生效;

执行命令:
sysctl -a|grep “ip_forward”
查看最新的配置,应该有如下内容: net.ipv4.ip_forward = 1 net.ipv4.ip_forward_use_pmtu = 0

重启
做完上述步骤后,如果有改动,最好重启机器,以免有设置未能生效;

2.1.7 关闭Swap交换分区

执行命令swapoff -a关闭Swap交换分区;

2.2 安装Docker

什么版本的Docker才能适配Rancher和Kubernetes?rancher的官网给出了一份列表,

请参考:http://rancher.com/docs/rancher/v1.6/zh/hosts/#docker

两种安装方法:

2.2.1 在线安装

2.2.1.1 使用官方安装脚本自动安装 (仅适用于公网环境)

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

2.2.1.2 这里采用yum源命令安装前期准备的依赖包

包括yum-utils、device-mapper-persistent-data、lvm2

step 1: 安装必要的一些系统工具

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

Step 2: 添加软件源信息

因为官方镜像仓库网速较慢,在此设置阿里云镜像代理,以便快速下载、上传镜像。

sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

接下来安装Docker-CE 社区版,通过以下命令查看docker社区版安装包列表。如下图所示各docker版本信息。

yum list docker-ce --showduplicates | sort -r
或:
yum list docker-ce.x86_64 --showduplicates | sort -r

Step 3: 更新并安装 Docker-CE

选择对应版本安装docker

sudo yum makecache fast
sudo yum -y install docker-ce

Step4 : 安装指定版本的Docker-CE: (VERSION 例如:17.03.0.ce.1-1.el7.centos)

# sudo yum -y install docker-ce-[VERSION]
# 注意:在某些版本之后,docker-ce安装出现了其他依赖包,如果安装失败的话请关注错误信息。例如 docker-ce 17.03 之后,需要先安装 docker-ce-selinux。 # yum list docker-ce-selinux- --showduplicates | sort -r # sudo yum -y install docker-ce-selinux-[VERSION]

eg:
sudo yum -y install docker-ce-20.10.9-3.el7

启动

启动
systemctl start docker
设置开机启动:
systemctl enable docker
验证:
查看版本信息命令,出现下图时表明安装成功。
docker version

看到如下信息:

设置Docker镜像加速

详情看2.3

2.2.2 离线安装

提供以下三种方式下载docker离线安装包

Docker官方地址:docker down

1.百度云下载地址:  

2.有网服务器执行命令下载:wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.17.tgz

wget -P /home/test (指定目录下载)

3.官方参考文档:https://docs.docker.com/install/linux/docker-ce/binaries/#install-static-binaries

将已下载好的docker离线包拷贝到服务器,解压压缩包

tar -xvf docker-20.10.17.tgz

将解压出来的docker文件内容移动到 /usr/bin/ 目录下

cp docker/* /usr/bin/

注册编辑docker服务

vim /usr/lib/systemd/system/docker.service

写入以下内容后保存

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
  
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
  
[Install]
WantedBy=multi-user.target

添加权限后启动

chmod +x /etc/systemd/system/docker.service

重新加载配置文件

systemctl daemon-reload

启动Docker

systemctl start docker

设置开机自启

systemctl enable docker.service

验证是否安装成功

systemctl status docker

docker -v
**

备注:

常用命令(搜索、下载本地未有镜像需要联网)

搜索镜像

#docker search 镜像名称

docker search java

下载镜像

#docker pull 镜像名称

docker pull java

查看已下载的镜像

docker images

删除镜像

删除单个镜像:docker rmi 镜像名称

删除所有镜像:docker rmi -f $(docker images)

操作容器

使用docker run命令可新建并启动一个容器,例如使用java镜像启动:docker run java /bin/echo 'Hello World'

其它启动可选附带参数:

-d 选项:表示后台运行

-P 选项:随机端口映射

-p 选项: 指定端口映射,有以下四种模式:

① ip:hostPort:containerPort

② ip::containerPort

③ hostPort:containerPort

④ containerPort

实例测试Nginx容器

docker run --name nginxTest -d -p 91:80 nginx

说明:docker 启动容器时,本地无该容器时会自动从Docker Hup下载引用

-d #后台运行

-p #宿主机端口:容器端口 #开放容器端口到宿主机端口

–name #自定义容器名称

浏览器访问http://服务器ip:91 ,如果出现Nginx主页则表示启动成功。

查看容器状态

查看正在运行容器详情 docker ps

查看所有容器详情 docker ps -a

– CONTAINER ID #容器ID

– IMAGE #镜像

– CREATED #创建时间

– STATUS #状态 Up代表正在运行,Exited 表示已停止运行

– PORTS #端口

– NAMES #容器名称

查看容器日志 格式:docker logs -f -t --tail 行数 容器名 或者 docker logs -f -t --tail 行数 容器ID docker logs -f -t --tail 200 483a128fdb39 停止容器 docker stop 容器ID 或 docker stop 容器名称 强制停止容器 docker kill 容器ID 启动已停止的容器 docker start 容器ID 重启容器 docker restart 容器ID 进入容器 (1)使用docker attach 命令进行容器,有多窗口操作会同步显示和阻塞问题。 docker attach 容器ID (2)使用nsenter进入容器 docker inspect --format "{{.State.Pid}}" 容器ID #查询出pid nsenter --target 查询的pid --mount --uts --ipt --net --pid (3) 推荐 使用docker exec 命令,该命令在1.3.x版本之后提供。 docker exec -it 容器ID /bin/bash 查看容器详情 docker inspect 容器ID 删除容器 docker rm 容器ID #该命令不可删除正在运行的容器,要执意删除加-f 参数 打包镜像为离线包 docker save -o 文件名.tar 镜像名称 加载离线镜像包 docker load < 文件名.tar 使用Dockerfile构建Docker镜像 以上面创建的Nginx为例,创建dockerfiler文件 touch Dockerfile 编辑dockerfiler文件 vim Dockerfile 填入以下内容 FROM nginx
     #添加进入docker容器后的目录(可以不填)
     WORKDIR/opt/hello
     RUNecho '<h1>Hello World!</h1>' >/usr/share/nginx/html/index.html

在Dockerfile所在路径执行以下命令

docker build -t nginx:my .

启动一个docker容器

docker run -d -p 92:80 nginx:my

当然也可指定配置文件路径

docker run -d -p 92:80 -v /u01/hello/config:/opt/hello/config nginx:my

说明:

-d 后台运行,-p 对外暴露端口:内部端口 -v linux文件路径:容器内路径 --name 容器昵称 启动的镜像:版本号 之后只需要在linux 下的/u01/hello/config修改配置,重启容器加载。 浏览器访问http://ip:92 ,可看到“Hello World!”信息。

2.3 设置Docker镜像加速

此时如果用docker pull命令下载镜像,本地会连接hub.docker.com网站去下载,耗时较长,因此我们可以设置docker镜像加速,使得本地连接去国内镜像仓库下载,镜像加速的设置有很多种,本章以阿里云的设置为例,步骤如下:

1.创建目录:
mkdir -p /etc/docker
2.设置镜像仓库地址:
tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://xwx6wxd1.mirror.aliyuncs.com"] } EOF
3.重新加载配置:
systemctl daemon-reload
4.重启docker服务:
systemctl restart docker

至此,机器的标准化准备工作已经完成了,经过了上述操作的机器可以直接拿来安装master,或者作为node加入到kubernetes环境;

三、K8S安装

Kubernetes就是基于容器的集群管理平台

就在Docker容器技术被炒得热火朝天之时,大家发现,如果想要将Docker应用于具体的业务实现,是存在困难的——编排、管理和调度等各个方面,都不容易。于是,人们迫切需要一套管理系统,对Docker及容器进行更高级更灵活的管理。

K8s架构

Docker和K8s实战_第2张图片
 

Kubernetes 中部署的最小单位是 pod,而不是 Docker 容器。实现上 Kubernetes 是不依赖于 Docker 的,完全可以使用其他的容器引擎在 Kubernetes 管理的集群中替代 Docker。在与 Docker 结合使用时,一个 pod 中可以包含一个或多个 Docker 容器。但除了有紧密耦合的情况下,通常一个 pod 中只有一个容器,这样方便不同的服务各自独立地扩展。

手工搭建 Kubernetes 集群是一件很繁琐的事情,为了简化这些操作,就产生了很多安装配置工具,如 Kubeadm ,Kubespray,RKE 等组件,我最终选择了官方的 Kubeadm 主要是不同的 Kubernetes 版本都有一些差异,Kubeadm 更新与支持的会好一些。Kubeadm 是 Kubernetes 官方提供的快速安装和初始化 Kubernetes 集群的工具,目前的还处于孵化开发状态,跟随 Kubernetes 每个新版本的发布都会同步更新, 强烈建议先看下官方的文档了解下各个组件与对象的作用。

Kubernetes 工作原理:

  • 用户可以通过 Kubectl 命令来提交需要运行的 Docker Container 到 K8s 的 APIServer 组件中;
  • 接着 APIServer 接收到用户提交的请求后,会将请求存储到 ETCD 这个键值对存储中;
  • 然后由 Controller Manager 组件来创建出用户定义的控制器类型(Pod ReplicaSet Deployment DaemonSet 等)
  • 然后 Scheduler 组件会对 ETCD 进行扫描,并将用户需要运行的 Docker Container 分配到合适的主机上;
  • 最后由 Kubelet 组件来和 Docker 容器进行交互,创建、删除、停止容器等一系列操作。

https://kubernetes.io/docs/concepts/
https://kubernetes.io/docs/setup/independent/install-kubeadm/
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

在创建Kubernetes集群时,阿里云容器服务提供两种网络插件:Terway和Flannel。

Flannel:使用的是简单稳定的社区的Flannel CNI 插件,配合阿里云的VPC的高速网络,能给集群高性能和稳定的容器网络体验,但功能偏简单,支持的特性少,

例如:不支持基于Kubernetes标准的Network Policy。
Terway:是阿里云容器服务自研的网络插件,将阿里云的弹性网卡分配给容器,支持基于Kubernetes标准的NetworkPolicy来定义容器间的访问策略,支持对单个容器做带宽的限流。对于不需要使用Network Policy的用户,可以选择Flannel,其他情况建议选择Terway。

本文主要介绍flannel的简单使用。

组件介绍:
(1)Master组件:
① Etcd:
etcd是一个数据库,它的目标是构建一个高可用的分布式键值数据库,它是基于GO语言实现。在分布式系统中,各种服务的配置信息的管理分享,服务的发现是一个很基本同时也是很重要的问题。在K8s中用于持久化存储集群中所有的资源对象,如Node、Service、Pod、RC、Namespace等;

② API server:
API Server提供了操作etcd的封装接口API,这些API基本上都是集群中资源对象的增删改查及监听资源变化的接口。它提供了资源对象的唯一操作入口,其他所有组件都必须通过它提供的API来操作资源数据,通过对相关的资源数据“全量查询”+“变化监听”,这些组件可以很“实时”地完成相关的业务功能。

③ Controller Manager:
集群内部的管理控制中心,其主要目的是实现Kubernetes集群的故障检测和恢复的自动化工作,比如根据RC的定义完成Pod的复制或移除,以确保Pod实例数符合RC副本的定义;根据Service与Pod的管理关系,完成服务的Endpoints对象的创建和更新;其他诸如Node的发现、管理和状态监控、死亡容器所占磁盘空间及本地缓存的镜像文件的清理等工作也是由Controller Manager完成的。

④ Scheduler:
集群中的调度器,负责Pod在集群节点中的调度分配。

(2)Node组件:
① Kubelet:
负责本Node节点上的Pod的创建、修改、监控、删除等全生命周期管理,同时Kubelet定时“上报”本Node的状态信息到API Server里。

② Proxy:
实现了Service的代理与软件模式的负载均衡器

其它组件:

  • CoreDNS:主要就是用来给 K8s 的 Service 提供一个域名和 IP 的对应解析关系。
  • Dashboard:主要就是用来给 K8s 提供一个 B/S 结构的访问体系(即,我们可以通过 Web 界面来对 K8s 进行管理)
  • Ingress Controller:主要就是用来实现 HTTP 代理(七层),官方的 Service 仅支持 TCP\UDP 代理(四层)
  • Prometheus:主要就是用来给 K8s 提供一个监控能力,使我们能够更加清晰的看到 K8s 相关组件及 Pod 的使用情况。
  • ELK:主要就是用来给 K8s 提供一个日志分析平台。

3.1 系统环境

系统 k8s版本 docker ip 主机名 配置
centos 7.9 1.24 20.10.17 11.112.20.94  k8s-master 2核4G 
centos 7.9 1.24 20.10.17 11.112.20.95 k8s-node01 2核4G
centos 7.9 20.10.17 11.112.20.96 rancher-master 2核4G
注意:请确保CPU至少2核,内存2G

3.2 准备工作

注意:k8s-master,k8s-node01,k8s-node02都必须执行。

3.2.1 关闭防火墙

如果各个主机启用了防火墙,需要开放Kubernetes各个组件所需要的端口,可以查看Installing kubeadm中的”Check required ports”一节。 这里简单起见在各节点禁用防火墙:

# 临时
systemctl stop firewalld
# 永久 systemctl disable firewalld

3.2.2 禁用selinux

# 临时禁用
setenforce 0
# 永久禁用 
vim /etc/selinux/config    # 或者修改/etc/sysconfig/selinux
SELINUX=disabled

3.2.3 修改k8s.conf文件

复制代码

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system   # 生效
复制代码

3.2.4 开启路由转发

复制代码
echo 1 > /proc/sys/net/ipv4/ip_forward

启用IP转发

修改 /etc/sysctl.conf 文件,添加如下行

  net.ipv4.ip_forward = 1

使用 sysctl -p命令生效

复制代码

3.2.5 关闭swap

# 临时关闭
swapoff -a
# 永久
sed -ri 's/.*swap.*/#&/' /etc/fstab

修改 /etc/fstab 文件,注释掉 SWAP 的自动挂载(永久关闭swap,重启后生效)

# 注释掉以下字段
/dev/mapper/cl-swap     swap                    swap    defaults        0 0

3.2.6 时间同步

 yum install ntpdate -y

  ntpdate ntp1.aliyun.com (centos8)

  ntpdate time.windows.com (centos7)

3.3 修改主机名

3.3.1 登录k8s-master执行

hostnamectl set-hostname k8s-master

vim /etc/hosts
cat /etc/hosts

注意:主机名不能带下划线,只能带中划线
否则安装k8s会报错

could not convert cfg to an internal cfg: nodeRegistration.name: Invalid value: "k8s_master": a DNS-1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')

3.3.2 登录 k8s-node01,rancher-master修改对应主机名

命令格式同上。

3.4 安装docker

参见  二、Docker安装

3.5 安装kubeadm,kubelet,kubectl

kubeadm是集群部署工具

kubectl是集群管理工具,通过command来管理集群

kubelet的k8s集群每个节点的docker管理服务

kubeadm不能帮你安装或者管理kubelet或kubectl,所以你需要 确保它们与通过kubeadm安装的控制平面的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。 然而,控制平面与kubelet间的相差一个次要版本不一致是支持的,但 kubelet 的版本不可以超过API服务器的版本。 例如,1.7.0版本的kubelet可以完全兼容1.8.0版本的API服务器,反之则不可以。

官网安装教程:

官网安装教程地址:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

注意:k8s-master,k8s-node01,k8s-node02都必须执行。

在各节点安装kubeadm,kubelet,kubectl

3.5.1 修改yum安装源

添加 kubernetes 阿里云YUM软件源

复制代码
复制代码
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
复制代码
复制代码

3.5.2 安装软件

目前最新版本是:1.24.3

yum install -y kubelet-1.24.3 kubeadm-1.24.3-0 kubectl-1.24.3-0
设置开机自启动

systemctl enable kubelet && systemctl start kubelet

以上,就是master和node都需要操作的部分。

3.6 离线安装 kubeadm,kubectl,kubelet(方法二)

 3.6.1 安装crictl:

软件crictl是kubeadm/kubelet容器运行时接口(CRI)所需的。

软件下载:下载V1.24.3版本的crictl,与k8s版本一致,下载地址为:https://github.com/kubernetes-sigs/cri-tools/releases

软件上传:将下载的crictl软件包上传到服务器的自定义文件夹中。

软件解压:将crictl软件包进行解压。

文件移动:将crictl软件解压的crictl文件移动到/usr/bin中。

 3.6.2 获取kubeadm/kubelet/kubectl离线包

在一个有网,并且没安装过k8s的服务器上执行yum命令,将需要的相关rpm格式安装包下载到服务器指定文件夹中,以便在无网服务器中安装:

添加阿里云YUM的软件源:

执行命令:

复制代码
cat > /etc/yum.repos.d/kubernetes.repo << EOF

[kubernetes]

name=Kubernetes

baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
复制代码

 3.6.3下载离线安装包

我们需要把来自kubernetes源的kubeadm和4个依赖cri-toolskubectlkubeletkubernetes-cni拷贝到master和node节点。

创建rpm软件存储目录:

mkdir -p /fairy/soft/kubeadm

执行命令:

yum install -y kubelet-1.24.3 kubeadm-1.24.3 kubectl-1.24.3 --downloadonly --downloaddir /fairy/soft/kubeadm

其它无网服务器需要安装时,将/fairy/soft/kubeadm中的所有rpm文件压缩到一个包中,然后上传到目标服务器,执行下面安装命令即可。

 3.6.4 上传kubeadm/kubelet/kubectl离线包

将获取的kubeadm/kubelet/kubectl离线包上传到目标服务器。

 3.6.5 执行安装包

进入到kubeadm/kubelet/kubectl离线包的文件夹中,执行如下安装命令:

执行命令:

rpm -ivh *.rpm --force --nodeps

3.6.6 编写kubelet服务脚本

编写kubelet.service服务文件

复制代码
[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/

[Service] ExecStart=/usr/bin/kubelet Restart=always StartLimitInterval=0 RestartSec=10 [Install] WantedBy=multi-user.target
复制代码

3.6.7 上传服务脚本及授权

将kubelet.service文件上传到服务器/etc/systemd/system/中,并授权:

chmod 777 /etc/systemd/system/kubelet.service

3.6.8 重新加载系统服务

执行命令:

systemctl daemon-reload

3.6.9 操作kubelet服务

开启自启kubelet服务:
执行命令:

systemctl enable kubelet

 3.7 k8s安装

通过kubeadm搭建k8s集群所需要的相关镜像和软件,与k8s版本有对应的兼容关系,查看不同版本的k8s所需要的镜像和软件版本如下操作:

软件k8s的github地址:https://github.com/kubernetes/kubernetes

通过CHANGELOG,点击低版本的log,比如:14、15等,搜索:docker version,可以查看到当前k8s版本兼容的docker版本。

3.7.1 初始化Master节点

登录k8s-master执行

3.7.1.1 查看kubeadm版本

yum list kubeadm --showduplicates

3.7.1.2 下载

yum install --downloadonly --downloaddir ~/k8s/kubernetes kubeadm-1.24.3

3.7.1.3 运行初始化命令

复制代码
kubeadm init
--kubernetes-version=1.24.3\ --apiserver-advertise-address=121.199.31.88\ --image-repository registry.aliyuncs.com/google_containers\ --service-cidr=10.1.0.0/16\ --pod-network-cidr=10.244.0.0/16
复制代码

注意修改apiserver-advertise-address为master节点ip

参数解释:

–kubernetes-version: 用于指定k8s版本;
–apiserver-advertise-address:用于指定kube-apiserver监听的ip地址,就是 master本机IP地址。
–pod-network-cidr:用于指定Pod的网络范围; 10.244.0.0/16
–service-cidr:用于指定SVC的网络范围;
–image-repository: 指定阿里云镜像仓库地址

这一步很关键,由于kubeadm 默认从官网k8s.grc.io下载所需镜像,国内无法访问,因此需要通过–image-repository指定阿里云镜像仓库地址

集群初始化成功后返回如下信息:
记录生成的最后部分内容,此内容需要在其它节点加入Kubernetes集群时执行。
输出如下:

复制代码
复制代码
...
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 121.199.31.88:6443 --token rkt1p6.3m7z7pqfvaehxmxi \
    --discovery-token-ca-cert-hash sha256:dd384c51b5a38cce275dd3e178f6f1601b644f5fc2bc2f8cee9c2b031b119143 
复制代码
复制代码

注意保持好kubeadm join,后面会用到的。

 3.8 离线安装(方法二)

在有网的服务器上下载k8s所需的相关镜像,将对应的镜像导出到服务器指定文件夹中,以便在无网服务器中能够导入镜像,进行使用:

3.8.1 下载k8s镜像

在生产环境,是肯定访问不了k8s.gcr.io这个地址的。在有大陆联网的机器上,也是无法访问的。所以我们需要使用国内镜像先下载下来。

解决办法跟简单,我们也可使用docker命令搜索下

3.8.1.1 查看需要依赖哪些镜像

kubeadm config images list

3.8.1.2 从国内镜像源下载镜像:

复制代码
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.24.3
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.24.3
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.24.3
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.24.3
docker pull registry.aliyuncs.com/google_containers/pause:3.7
docker pull registry.aliyuncs.com/google_containers/coredns:1.8.6
docker pull registry.aliyuncs.com/google_containers/etcd:3.5.3-0
复制代码

3.8.2 导出镜像

将修改为官方tag的镜像导入到tar压缩包中,执行命令:

复制代码
docker save -o kube-proxy-v1.24.3.tar kube-proxy 镜像ID registry.aliyuncs.com/google_containers/kube-proxy:v1.24.3
docker save -o kube-apiserver-v1.24.3.tar kube-apiserver 镜像ID registry.aliyuncs.com/google_containers/kube-apiserver:v1.24.3
docker save -o kube-controller-manager-v1.24.3.tar kube-controller-manager 镜像ID registry.aliyuncs.com/google_containers/kube-controller-manager:v1.24.3
docker save -o kube-scheduler-v1.24.3.tar kube-scheduler 镜像ID registry.aliyuncs.com/google_containers/kube-scheduler:v1.24.3
docker save -o pause-3.7.tar pause 镜像ID registry.aliyuncs.com/google_containers/pause:3.7
docker save -o coredns-1.8.6.tar coredns 镜像ID registry.aliyuncs.com/google_containers/coredns:1.8.6
docker save -o etcd-3.5.3-0.tar etcd 镜像ID registry.aliyuncs.com/google_containers/etcd:3.5.3-0
复制代码

复制代码
eg:
docker save -o kube-proxy-v1.24.3.tar 2ae1ba6417cb registry.aliyuncs.com/google_containers/kube-proxy:v1.24.3
docker save -o kube-apiserver-v1.24.3.tar d521dd763e2e registry.aliyuncs.com/google_containers/kube-apiserver:v1.24.3
docker save -o kube-controller-manager-v1.24.3.tar 586c112956df registry.aliyuncs.com/google_containers/kube-controller-manager:v1.24.3
docker save -o kube-scheduler-v1.24.3.tar 3a5aa3a515f5 registry.aliyuncs.com/google_containers/kube-scheduler:v1.24.3
docker save -o pause-3.7.tar 221177c6082a registry.aliyuncs.com/google_containers/pause:3.7
docker save -o coredns-1.8.6.tar a4ca41631cc7 registry.aliyuncs.com/google_containers/coredns:1.8.6
docker save -o etcd-3.5.3-0.tar aebe758cef4c registry.aliyuncs.com/google_containers/etcd:3.5.3-0
复制代码

3.8.3 导入镜像

将上述导出的镜像包tar传输到需要的服务器上,然后通过docker命令将镜像包tar导入到docker本地仓库中,命令示例:

docker image load -i 镜像包tar文件名称

3.8.4 检查镜像列表

查看docker本地仓库中的镜像列表,

执行命令:

docker images

3.8.5 部署master节点

执行命令:

复制代码

kubeadm init \

  如果使用flannel网络,则要把参数中必须设置--pod-network-cidr=10.244.0.0/16,这个IP地址是固定的。

  如果不用,则不需要

kubeadm init \
--apiserver-advertise-address=121.199.31.88 \
--image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.24.3 \ --service-cidr=10.1.0.0/16 \ --pod-network-cidr=10.244.0.0/16 \ --v=5
复制代码

参数解释:

–kubernetes-version: 用于指定k8s版本;
–apiserver-advertise-address:用于指定kube-apiserver监听的ip地址,就是 master本机IP地址。
–pod-network-cidr:用于指定Pod的网络范围; 10.244.0.0/16
–service-cidr:用于指定SVC的网络范围;
–image-repository: 指定阿里云镜像仓库地址

3.8.6 查看部署结果

出现如下提示信息,表示k8s的master节点部署好了。

3.8.7 生成kubelet环境配置文件

执行命令:

mkdir -p $HOME/.kube

执行命令:

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

执行命令:

sudo chown $(id -u):$(id -g) $HOME/.kube/config

3.8.8 删除主机上train

单机版kubernetes为了运行Pod。需要删除主机上的Train。允许master执行Pod。

执行命令:

kubectl taint nodes --all node-role.kubernetes.io/master-

3.9 安装pod网络插件(CNI)

安装flannel

下载flannel的yml配置文件:

3.9.1 在线下载

mkdir k8s
cd k8s
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

如果yml中的"Network": "11.244.0.0/16"和kubeadm init xxx --pod-network-cidr不一样,就需要修改成一样的。不然可能会使得Node间Cluster IP不通。

由于我上面的kubeadm init xxx --pod-network-cidr就是11.244.0.0/16。所以此yaml文件就不需要更改了。

3.9.1.1 查看yaml需要的镜像

复制代码
复制代码
# cat kube-flannel.yml |grep image|uniq
        image: quay.io/coreos/flannel:v0.12.0-amd64
        image: quay.io/coreos/flannel:v0.12.0-arm64
        image: quay.io/coreos/flannel:v0.12.0-arm
        image: quay.io/coreos/flannel:v0.12.0-ppc64le
        image: quay.io/coreos/flannel:v0.12.0-s390x
复制代码
复制代码

注意:这些镜像都是需要访问谷歌才行的。

3.9.1.2 阿里云容器镜像服务ACR里面是有的

访问链接如下:https://www.aliyun.com/product/acr

注意:必须使用阿里云账号登录才行。

3.9.1.3 点击管理控制台

 

 点击左侧的镜像搜索

 

3.9.1.4 输入关键字:flannel:v0.12.0-amd64,选择第二个。

3.9.1.5 点击复制公网地址

 

 由于我这里是上海区域,所以域名是:registry.cn-shanghai。如果你选的是其他区域,域名也会不一样。

下面就是我们需要的版本号。

3.9.1.6 下载镜像的完整命令为:

docker pull registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-amd64

其他镜像,也都在这里。

所以,所需要的镜像下载命令为:

docker pull registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-amd64
docker pull registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-arm64
docker pull registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-arm
docker pull registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-ppc64le
docker pull registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-s390x

3.9.2 为镜像打tag

保持和yaml文件一样

复制代码
复制代码
docker tag registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-amd64 quay.io/coreos/flannel:v0.12.0-amd64
docker tag registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-arm64 quay.io/coreos/flannel:v0.12.0-arm64
docker tag registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-arm quay.io/coreos/flannel:v0.12.0-arm
docker tag registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-ppc64le quay.io/coreos/flannel:v0.12.0-ppc64le
docker tag registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-s390x quay.io/coreos/flannel:v0.12.0-s390x
复制代码
复制代码

注意:这些镜像,也需要在node节点执行。

3.9.3 加载flannel

kubectl apply -f kube-flannel.yml

3.9.4 查看Pod状态

等待几分钟,确保所有的Pod都处于Running状态

复制代码
复制代码
# kubectl get pod --all-namespaces -o wide
NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE    IP                NODE         NOMINATED NODE   READINESS GATES
kube-system   coredns-7ff77c879f-8jpb7             0/1     Running   0          125m   10.244.0.3        k8s-master   <none>           <none>
kube-system   coredns-7ff77c879f-9gcjr             1/1     Running   0          125m   10.244.0.2        k8s-master   <none>           <none>
kube-system   etcd-k8s-master                      1/1     Running   0          125m   121.199.31.88   k8s-master   <none>           <none>
kube-system   kube-apiserver-k8s-master            1/1     Running   0          125m   121.199.31.88   k8s-master   <none>           <none>
kube-system   kube-controller-manager-k8s-master   1/1     Running   0          125m   121.199.31.88   k8s-master   <none>           <none>
kube-system   kube-flannel-ds-amd64-gz8jd          1/1     Running   0          27s    121.199.31.88   k8s-master   <none>           <none>
kube-system   kube-proxy-wh548                     1/1     Running   0          125m   121.199.31.88   k8s-master   <none>           <none>
kube-system   kube-scheduler-k8s-master            1/1     Running   0          125m   121.199.31.88   k8s-master   <none>           <none>
复制代码
复制代码

注意:coredns容器的网段是10.244.0.0/16

3.9.5 设置开机启动

systemctl enable kubelet

3.10 flannel离线下载(方法三)

3.10.1 在线flannel的yml文件

地址:https://github.com/caoran/kube-flannel.yml/blob/master/kube-flannel.yml

通过该地址将该yml文件下载下来。

3.10.2 上传yml配置文件

将yml配置文件上传到需要的服务器上。

3.10.3 拉取flannel镜像

执行命令:

docker pull registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-amd64

3.10.4 重命名flannel镜像:

执行命令:

docker tag flannel镜像ID quay.io/coreos/flannel:v0.12.0-amd64

3.10.5 删除旧flannel镜像:

执行命令:

docker rmi registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-amd64

3.10.6 生效yml配置文件:

在需要的服务器上,进入到yml配置文件所在的文件夹中,

然后执行命令进行生效:

kubectl apply -f kube-flannel.yml

 

3.11 测试验证k8s

3.11.1 拉取nginx镜像:

手动拉取以下nginx镜像。执行命令:

docker pull nginx

3.11.2 创建nginx容器:

执行命令:

kubectl create deployment nginx --image=nginx

3.11.3 暴露对外端口:

执行命令:

kubectl expose deployment nginx --port=80 --type=NodePort

3.11.4 查询nginx是否运行成功:

执行命令:

kubectl get pod,svc

3.11.5 浏览器测试访问:

在与k8s集群通网络段的windows服务器上的浏览器中,输入k8s集群的master或node节点IP及对应nginx映射出的端口号,进行访问,正常的话是可以访问到nginx欢迎页的。

3.11.6 扩展nginx副本:

kubectl scale deployment nginx --replicas=3

3.11.7 查看pod:

通过对nginx进行了扩展副本,然后查看nginx的pod是几个,是否生效,执行命令:

kubectl get pods

四、node加入集群

4.1 准备工作

请查看上文中的准备工作,确保都执行了!!!

4.1.1 修改主机名部分

改为k8s-node01

hostnamectl set-hostname k8s-node01

4.2 加入节点

登录到node节点,确保已经安装了docker和kubeadm,kubelet,kubectl

kubeadm join 121.199.31.88:6443 --token rkt1p6.3m7z7pqfvaehxmxi \
    --discovery-token-ca-cert-hash sha256:dd384c51b5a38cce275dd3e178f6f1601b644f5fc2bc2f8cee9c2b031b119143

设置开机启动

systemctl enable kubelet

4.3 查看节点

登录k8s-master执行

使用命令查看

复制代码
复制代码
# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME k8s-master Ready master 128m v1.24.3 121.199.31.88 <none> CentOS Linux 7 (Core) 3.10.0-957.el7.x86_64 docker://20.10.17 k8s-node01 Ready <none> 30s v1.24.3 192.168.128.131 <none> CentOS Linux 7 (Core) 3.10.0-957.el7.x86_64 docker://20.10.17 k8s-node02 NotReady <none> 19s v1.24.3 192.168.128.132 <none> CentOS Linux 7 (Core) 3.10.0-957.el7.x86_64 docker://20.10.17
复制代码
复制代码

登录到node节点,查看ip

复制代码
复制代码
# ifconfig 
...
flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 10.244.1.0  netmask 255.255.255.255  broadcast 0.0.0.0
        inet6 fe80::80e7:9eff:fe5d:3d94  prefixlen 64  scopeid 0x20<link>
        ether 82:e7:9e:5d:3d:94  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 8 overruns 0  carrier 0  collisions 0
...
复制代码
复制代码

它会创建一个flannel.1网卡,用来做flannel网络通信的。

五、使用yml发布应用

以flaskapp为例子

5.1 登录k8s-master执行

flaskapp-deployment.yaml

复制代码
复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: flaskapp-1
spec:
  selector:
    matchLabels:
      run: flaskapp-1
  replicas: 1
  template:
    metadata:
      labels:
        run: flaskapp-1
    spec:
      containers:
      - name: flaskapp-1
        image: jcdemo/flaskapp
        ports:
        - containerPort: 5000
复制代码
复制代码

 

flaskapp-service.yaml

复制代码
复制代码
复制代码
apiVersion: v1
kind: Service
metadata:
  name: flaskapp-1
  labels:
    run: flaskapp-1
spec:
  type: NodePort
  ports:
  - port: 5000
    name: flaskapp-port
    targetPort: 5000
    protocol: TCP
    nodePort: 30005
  selector:
    run: flaskapp-1
复制代码
复制代码
复制代码

 

加载yml文件

kubectl apply -f flaskapp-service.yaml 
kubectl apply -f flaskapp-deployment.yaml 

 

查看pod状态

# kubectl get pods -o wide
NAME                          READY   STATUS    RESTARTS   AGE   IP           NODE         NOMINATED NODE   READINESS GATES
flaskapp-1-5d96dbf59b-94v6v   1/1     Running   0          33s   10.244.2.2   k8s-node02   <none>           <none>

等待几分钟,确保为Running状态

 

ping pod ip

复制代码
复制代码
# ping 10.244.2.2 -c 3
PING 10.244.2.2 (10.244.2.2) 56(84) bytes of data.
64 bytes from 10.244.2.2: icmp_seq=1 ttl=63 time=1.86 ms
64 bytes from 10.244.2.2: icmp_seq=2 ttl=63 time=0.729 ms
64 bytes from 10.244.2.2: icmp_seq=3 ttl=63 time=1.05 ms

--- 10.244.2.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 0.729/1.215/1.862/0.477 ms
复制代码
复制代码

确保能正常ping通,表示flannel网络正常。

5.2 访问页面

使用master ip+nodeport访问

http://121.199.31.88:30005/

 

效果如下:

注意:使用node节点ip+nodeport也可以访问。

 

六、安装rancher

通过Rancher安装Kubernetes的文章前面已经写过,但那时是需要FQ才能安装成功(下载gcr.io/google_containers/XXXXX的镜像),本次实战依旧是用Rancher来安装Kubernetes,但是会做一些设置,使得不用FQ也能成功安装K8S环境,另外,在CentOS7环境下,有些设置如果处理不当也会导致安装失败或者加入节点失败,所以也会在本文中交代清楚;

6.1 安装rancher

6.1.1 什么是Rancher?

Rancher官网地址:https://docs.rancher.cn/

Github地址:https://github.com/rancher/

Rancher是一套容器管理平台,它可以帮助组织在生产环境中轻松快捷的部署和管理容器。 Rancher可以轻松地管理各种环境的Kubernetes,满足IT需求并为DevOps团队提供支持。Kubernetes不仅已经成为的容器编排标准,它也正在迅速成为各类云和虚拟化厂商提供的标准基础架构。Rancher用户可以选择使用Rancher Kubernetes Engine(RKE)创建Kubernetes集群,也可以使用GKE,AKS和EKS等云Kubernetes服务。 Rancher用户还可以导入和管理现有的Kubernetes集群。

Rancher支持各类集中式身份验证系统来管理Kubernetes集群。例如,大型企业的员工可以使用其公司Active Directory凭证访问GKE中的Kubernetes集群。IT管理员可以在用户,组,项目,集群和云中设置访问控制和安全策略。 IT管理员可以在单个页面对所有Kubernetes集群的健康状况和容量进行监控。

Rancher为DevOps工程师提供了一个直观的用户界面来管理他们的服务容器,用户不需要深入了解Kubernetes概念就可以开始使用Rancher。 Rancher包含应用商店,支持一键式部署Helm和Compose模板。Rancher通过各种云、本地生态系统产品认证,其中包括安全工具,监控系统,容器仓库以及存储和网络驱动程序。下图说明了Rancher在IT和DevOps组织中扮演的角色。每个团队都会在他们选择的公共云或私有云上部署应用程序。

6.1.2 Rancher v1和v2的区别

Rancher目前分为v1和v2版本,v1版本主要有四个部分组成:基础设施编排、容器编排与调度、应用商店、企业级权限管理。特别是Rancher 1.6提供的编排工具Cattle得到了许多用户的青睐。在Cattle中,你有一个环境,它是管理和计算的边界,即你可以指定权限的最低层级;重要的是,该环境中所有的主机都是专用于此环境。然后,为了组织你的容器,你需要有一个堆栈(Stack),它是一个服务集合的逻辑分组,以及一个作为特定运行镜像的服务。都是提供容器调度与编排,不同之处在于在k8s盛行之前有许多人都搞过容器编排,所以rancher v1上会有几种不同的编排模式,例如cattle ,swarm,kubernetes。从这里可以看出Rahcner v1时代,它给自己的定位是各种编排工具的上层,也就是k8s的上层,然后你再通过它去管理k8s。

因为k8s后来发展得势不可挡,所以Rancher v2应运而生,移除了其他类型的编排工具,只剩下k8s。而到了2.0版本以后、首先是保留了v1.6版本的友好功能如UI和应用商店。同时也增加了很多新的功能、例如:内置CI/CD、告警和日志手机、多集群管理、Rancher Kubernetes Engine(RKE)、与云Kubernetes服务(如GKE、EKS和AKS)集成。

6.1.3Rancher基础架构


大多数Rancher2.0软件运行在Rancher Server节点上,Rancher Server包括用于管理整个Rancher部署的所有组件。下图说明了Rancher2.0的运行架构。该图描绘了管理两个Kubernetes集群的Rancher Server安装:一个由RKE创建,另一个由GKE创建。

6.1.4 Rancher API服务器

Rancher API server建立在嵌入式Kubernetes API服务器和etcd数据库之上。它实现了以下功能:

Rancher API服务器
Rancher API server管理与外部身份验证提供程序(如Active Directory或GitHub)对应的用户身份

认证授权
Rancher API server管理访问控制和安全策略

项目
项目是集群中的一组多个命名空间和访问控制策略的集合

节点
Rancher API server跟踪所有集群中所有节点的标识。

6.1.5 集群控制和Agent

集群控制器和集群代理实现管理Kubernetes集群所需的业务逻辑、主要通过两个方面来实现:

集群控制器实现Rancher安装所需的全局逻辑。它执行以下操作:

为集群和项目配置访问控制策略
通过调用以下方式配置集群:所需的Docker machine驱动程序;像RKE和GKE这样的Kubernetes引擎。
单独的集群代理实例实现相应集群所需的逻辑。它执行以下活动:

工作负载管理,例如每个集群中的pod创建和部署
绑定并应用每个集群全局策略中定义的角色
集群与Rancher Server之间的通信:事件,统计信息,节点信息和运行状况

6.1.6 认证代理

该认证代理转发所有Kubernetes API调用。它集成了身份验证服务,如本地身份验证,Active Directory和GitHub。在每个Kubernetes API调用中,身份验证代理会对调用方进行身份验证,并在将调用转发给Kubernetes主服务器之前设置正确的Kubernetes模拟标头。Rancher使用服务帐户与Kubernetes集群通信。

Rancher和k8s都是用来作为容器的调度与编排系统。但是rancher不仅能够管理应用容器,更重要的一点是能够管理k8s集群。Rancher2.x底层基于k8s调度引擎,通过Rancher的封装,用户可以在不熟悉k8s概念的情况下轻松的通过Rancher来部署容器到k8s集群当中。

为实现上述的功能,Rancher自身提供了一套完整的用于管理k8s的组件,包括Rancher API Server, Cluster Controller, Cluster Agent, Node Agent等等。组件相互协作使得Rancher能够掌控每个k8s集群,从而将多集群的管理和使用整合在统一的Rancher平台中。Rancher增强了一些k8s的功能,并提供了面向用户友好的使用方式。

k8s虽然有dashboard,但是功能没有Rancher强大。因此,企业内部,可以用Rancher来管理k8s集群。
 
所以总结一下,两者的关系是Rancher对k8s进行了功能的拓展与实现了和k8s集群交互的一些便捷工具,包括执行命令行,管理多个 k8s集群,查看k8s集群节点的运行状态等等。

 

6.2 在线安装

6.2.1 指定版本安装

6.2.1.1下载镜像

直接通过docker镜像来运行rancher,先从镜像中心下载rancher镜像,如果是1.x系列的,镜像名为rancher/server,而2.x是rancher/rancher,我使用2.x版本的,所以,执行如下命令即可:

# 先去拉取镜像
docker pull rancher/rancher:stable
或:
docker pull rancher/rancher:v2.3.5

6.2.1.2 使用docker images 查看刚才下载的镜像。

6.2.1.3 创建目录映射(使用数据卷的技术,挂载,docker本地的数据同步到本地中)

mkdir -p /docker/rancher/rancher && mkdir -p /docker/rancher/auditlog

6.2.1.4 启动容器

复制代码
docker run -d --privileged --restart=unless-stopped -p 880:80 -p 8443:443 -v /docker/rancher/rancher:/var/lib/rancher -v /docker/rancher/auditlog:/var/log/auditlog --name rancher rancher/rancher:stable

docker run -d :启动容器(以后台的方式启动)docker run -it 交互的方式启动-v 数据卷的挂载
-p:映射端口(880:80,前者为宿主机端口,后者为容器端口)
--restart=always:重新启动=容器如果异常停止,将自动重启
--restart=unless-stopped :重新启动=除非停止
/docker/rancher/rancher 主机路径


官网方法是 -p 80:80 -p 443:443 即虚拟机80端口映射到容器的80端口,虚拟机443端口映射到容器443端口。
但该方法实际使用时发现端口映射无效,提示 404 page not found。 因此将虚拟机的端口换成其他端口来映射,不使用http和https的80和443端口。
复制代码

这样就安装成功了。

 

6.3 离线安装(rancher)

rancher提供离线安装方式,首先在外网下载好需要用的脚本与docker镜像:

下载地址:https://github.com/rancher/rancher/releases 

6.3.1 推荐下载Stable版本

bug相对较少,不要下载标记为 rc 或 Pre-release 的版本,因为它们在生产环境下是不稳定的。

下载:

rancher-save-images.sh

rancher-load-images.sh 

rancher-images.txt

三个脚本

6.3.2 脚本执行 

./rancher-save-images.sh --image-list ./rancher-images.txt

这个脚本会自动下载rancher需要用的docker镜像。

下载完成后将生成的ancher-images.tar.gz与上面的三个脚本一同复制到内网放在同一目录下。

注:里面存在同一镜像多个版本,可保留一个版本即可

6.3.3 去除重复的镜像源

sort -u rancher-images.txt -o rancher-images.txt
Release文件描述
rancher-images.txt 此文件包含安装 Rancher、创建集群和运行Rancher 工具所需的镜像列表。
rancher-save-images.sh 这个脚本会从 DockerHub 中拉取在文件rancher-images.txt中描述的所有镜像,并将它们保存为文件rancher-images.tar.gz。
rancher-load-images.sh 这个脚本会载入文件rancher-images.tar.gz中的镜像,并将它们推送到您自己的私有镜像库。

6.3.4 将打包好的镜像导入到docker中

执行:

docker load -i rancher.tar

稍等片刻便会导入成功,rancher-load-images.sh 用于将打包好的镜像导入到docker。

6.3.5 启动

导入成功后启动rancher

执行:

sudo docker run -d --restart=unless-stopped -p 80:80 -p 443:443 --privileged rancher/rancher

稍等片刻访问 https://ipaddress就能进入rancher

6.4 访问rancher

在宿主机上打开浏览器,访问https://ip:8443/的登录界面。

 

6.4.1 修改密码

docker logs container-3281 2>&1 | grep "Bootstrap Password:"

 

6.4.1.1 登录后就能看到 rancher的首页

默认是英文,可以点击右上角三横,然后点击英文,选中中文。

6.4.1.2 在master机器执行以下命令

第二种安装方法

复制代码
docker run -d --restart always --name rancher-rancher -p 80:80 rancher/rancher:v2.6.6 && docker logs -f rancher-rancher

eg:
docker run -d --restart always --name rancher-rancher -p 880:80 -p 8443:443 rancher/rancher:v2.6.6 && docker logs -f rancher-rancher
复制代码

以上命令会下载rancher镜像再启动容器,并且会输出容器控制台的信息,等到控制台信息不再滚动时,在浏览器访问https://ip:8080,可以看到初始页面,在页面的右下角选择“简体中文”。

6.5 导入k8s集群

注意:已经有一个k8s集群了,只需要导入即可。

6.5.1 添加集群

6.5.2 点击导入

 

 这里选择最后一个,因为我是ip方式访问的,https访问是不受信任的。

注意:自签证书,也是不受信任的。

只有花钱购买的证书,才是受信任的,可以选择中间的那个。

 

6.5.3 登录k8s-master主机

执行命令:

curl --insecure -sfL https://IP/v3/import/xxpv9dfjtkfwcxcmh475khx2mcscs6mfhmqmbznbkcrf2mkq77l5nm.yaml | kubectl apply -f -

等待几分钟,查看pod

# kubectl get pods -n cattle-system
NAME                                   READY   STATUS    RESTARTS   AGE
cattle-cluster-agent-bf7cbffdd-rqmmw   1/1     Running   0          18s
cattle-node-agent-8fnsq                1/1     Running   0          5s
cattle-node-agent-bqrk9                1/1     Running   0          15s

确保状态为Running

6.5.4 点击集群,确保状态为Active

6.5.5 点击集群test,效果如下:

6.5.6 点击导航栏的主机

效果如下:

 

参考文档 :https://rancher2.docs.rancher.cn/

七、nginx安装

7.1 什么是Nginx?

7.1.1 Nginx介绍

Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器,同时也是一个IMAP、POP3、SMTP代理服务器,Nginx 可以作为一个HTTP服务器进行网站的发布,另外Nginx可以作为反向代理进行负载均衡的实现。

正向代理:服务端不知道客户端。
反向代理:客户端不知道服务端。

7.1.2 Nginx 能用来做什么

静态 HTTP 服务器:Nginx 是一个 HTTP 服务器,可以将服务器上的静态文件(HTML、图片)通过HTTP协议展现给客户端。
反向代理服务器:反向代理是Nginx做的最多的一件事情,客户端不知道服务端的地址,客户端去请求该Nginx,Nginx通过配置的的路由规则将路由分发到不同的机器上,这个过程客户端是不知道服务端的地址的,只知道Nginx的地址.
负载均衡:当网站访问量非常大的时候,可以通过Nginx + 反向代理实现负载均衡。

7.1.3 应该怎么用呢?

简单来说就是先配置好路由规则以及域名、监听端口,然后启动Nginx,启动之后,根据HTTP请求去访问Nginx监听的端口,Nginx会根据URI去匹配指定的资源文件。

7.1.4 Nginx工作原理

nginx以高性能的负载均衡器,缓存,和web服务器闻名,驱动了全球超过 40% 最繁忙的网站。在大多数场景下,默认的 NGINX 和 Linux 设置可以很好的工作,但要达到最佳性能,有些时候必须做些调整。首先我们先了解其工作原理。

Nginx 进程模型:

Nginx采用异步非阻塞的方式来处理网络事件,具体过程:

接收请求:每个Worker都是从master进程fork过来的,在master进程建立好需要listen的socket之后,然后带上这个socketfork出多个进程,所有worker进程的socket会在新链接到来时变得可读,每个work进程都可以去accept这个socket,当一个请求到来时,所有可accept的work进程都会感受到通知,为了保证只有一个accept成功,Nginx提供了一个共享锁来保证同一时刻只有一个work进程accept链接。所有worker进程在注册socket读事件前抢accept_mutex,抢到互斥锁的那个进程可以注册socket读事件,在读事件里面调用accept接收该链接.
处理请求:当一个worker进程在accept这个链接之后,就开始读取请求、解析请求、处理请求、产生数据之后,再返回给客户端之后才断开链接。

7.2 Nginx 配置详解

中文官网:http://nginx.p2hp.com/

英文官网:http://nginx.org/

7.2.1 在线安装nginx

nginx需要的依赖包括:gcc、g++、ssl、pcre、zlib;

查看是否安装 gcc-c++ 

gcc-c++ -v

7.2.1.1 第一步:下载nginx压缩包

可以到官方网站下载安装包也可以通过wget命令下载:

wget -c http://nginx.org/download/nginx-1.23.1.tar.gz
备注:一般会把压缩包放在/usr/local 下

7.2.1.2 第二步:配置nginx安装所需的环境

7.2.1.2.1 安装gcc

安装nginx需要先将源码进行编译,编译需要依赖gcc环境

yum install gcc-c++
7.2.1.2.2 安装PCRE pcre-devel

Nginx的Rewrite模块和HTTP核心模块会使用到PCRE正则表达式语法。这里需要安装两个安装包pcre和pcre-devel。第一个安装包提供编译版本的库,而第二个提供开发阶段的头文件和编译项目的源代码。

yum install -y pcre pcre-devel
7.2.1.2.3 安装zlib

zlib库提供了开发人员的压缩算法,在Nginx的各种模块中需要使用gzip压缩。

yum install -y zlib zlib-devel
7.2.1.2.4 安装Open SSL

nginx不仅支持 http协议,还支持 https(即在 ssl 协议上传输 http),如果使用了 https,需要安装 OpenSSL 库。

yum install -y openssl openssl-devel

7.2.1.3 第三步:解压nginx压缩包并安装

解压 nginx-1.23.1.tar.gz

tar -zxvf nginx-1.23.1.tar.gz

解压之后,进入加压文件
然后进行配置,推荐使用默认配置。 命令如下

cd nginx-1.23.1
./configure (指定目录)

./configure --prefix=/usr/local/nginx  #注意:--prefix是指定安装目录(建议指定)
备注:
configure命令
--prefix=path — 定义服务器文件的完整路径,该路径同时也是configure命令设置的 相对路径(除类库源文件外)以及nginx.conf文件定义的相对路径的基准路径。其默认 值是/usr/local/nginx。
--sbin-path=path — 设置nginx可执行文件的完整路径,该路径仅在安装期间使用, 默认路径为prefix/sbin/nginx。
--conf-path=path — 设置配置文件nginx.conf的完整路径。如有必要,总是可以 在nginx启动时通过命令行参数-cfile指定一个不同的配置文件路径。 默认路径为prefix/conf/nginx.conf。
--pid-path=path — 设置nginx.pid文件的完整路径,该文件存储了主进程的进程ID。安装完成后, 该路径总是可以在nginx.conf文件中用 pid指令来修改。 默认路径为prefix/logs/nginx.pid。
--error-log-path=path — 设置记录主要错误、警告以及调试信息日志的完整路径。安装完成后, 该路径总是可以在nginx.conf文件中用 error_log 指令来修改。 默认路径为prefix/logs/error.log。
--http-log-path=path — 设置记录HTTP服务器主要请求日志的完整路径。安装完成后, 该路径总是可以在nginx.conf文件用 access_log 指令来修改。 默认路径为prefix/logs/access.log
--user=name — 设置工作进程以某非特权用户的身份运行。安装完成后,该用户名总是可以在 nginx.conf文件用user指令来修改。 其默认值为nobody。
--group=name — 设置工作进程以某非特权用户的身份运行。安装完成后,该用户名总是可以在 nginx.conf用user指令来修改。 其默认名称与未授权用户名称相同。
--with-select_module
--without-select_module — 设置是否将select()方法模块编译进nginx中。如果系统平台不支持kqueue、epoll、rtsig或/dev/poll等更合适的方法, 该模块会被自动编译。
--with-poll_module
--without-poll_module — 设置是否将poll()方法模块编译进nginx中。如果系统平台不支持kqueue、epoll、rtsig或/dev/poll等更合适的方法, 该模块会被自动编译。
--without-http_gzip_module — 不编译http_gzip_module模块。该模块可以压缩HTTP服务器的响应,该模块需要zlib库才能编译和运行。
--without-http_rewrite_module — 不编译http_rewrite_module模块。该模块允许HTTP服务器重定向请求,改变请求的URI地址 。创建并运行该模块需要PCRE库支持。
--without-http_proxy_module — 不编译HTTP服务器的代理模块。
--with-http_ssl_module — 为HTTP服务器编译HTTPS协议支持的模块。该模块默认是不编译的。它需要OpenSSL库才能编译和运行。
--with-pcre=path — 设置PCRE库源文件的路径地址。PCRE库的发行版(version 4.48.30)需要先从PCRE站点下载并解压缩。 剩下的安装工作由nginx的./configure和make命令来完成。该库应用于location 指令的正则表达式支持以及ngx_http_rewrite_module模块。
--with-pcre-jit — 编译PCRE库时增加“实时编译(pcre_jit)”支持。
--with-zlib=path — 设置zlib库源文件的路径地址。zlib库的发行版(version 1.1.31.2.5)需要先从zlib站点下载并解压缩。 剩下的安装工作由nginx的./configure和make命令来完成。该库应用于 ngx_http_gzip_module模块。
--with-cc-opt=parameters — 设置将会添加额外参数到CFLAGS变量中。当在FreeBSD使用系统PCRE库时,需要指定 --with-cc-opt="-I /usr/local/include"。 如果需要增加select()方法所支持的文件数量,也可以参照如下方式指定:
--with-cc-opt="-D FD_SETSIZE=2048"--with-ld-opt=parameters — 设置将会在链接(linking)过程中使用的额外参数。当在FreeBSD使用系统PCRE库时,需要指定 --with-ld-opt="-L /usr/local/lib"。
例:
./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-http_ssl_module --with-pcre=../pcre-4.4 --with-zlib=../zlib-1.1.3

7.2.1.4 第四步:编译安装nginx

进入目录 /usr/local/nginx-1.23.1 进行编译

make

如果编译出错,请检查是否前面的4个安装都没有问题。
编译成功之后,就可以安装了

make install

7.2.1.5 第五步:启动nginx

## 启动nginx
/usr/local/nginx/sbin/nginx

## 停止nginx
/usr/local/nginx/sbin/nginx -s stop
## 重新加载
/usr/local/nginx/sbin/nginx -s reload ## 测试配置文件 /usr/local/nginx/sbin/nginx -t

7.2.2 离线安装

Nginx 离线安装依赖gcc、g++ 环境,所以安装前要先检查以下系统中是否自带 gcc 和 g++,如果没有那么就需要先进行安装。

安装 Nginx 之前需要先安装 openssl、pcre、zlib,根据Nginx官网介绍好像对 openssl 的版本没有要求,但对于 pcre 则要求8.44版本、zlib 要求1.2.11版本。

查看系统中是否已安装 gcc

查看系统中是否已安装 gcc

  gcc -v

查看系统中是否已安装 gcc

  g++ -v

7.2.2.1 下载安装包

http://nginx.org/download,找到nginx-1.23.1.tar.gz版本

7.2.2.2 上传到centos文件夹里解压

tar -zvxf nginx-1.31.1.tar.gz

7.2.2.3 安装相关依赖

下载Nginx需要依赖的离线安装包,放到一个文件夹里。下载地址如下:

openssl:https://www.openssl.org/source/

pcre:http://downloads.sourceforge.net/project/pcre/pcre

zlib:http://www.zlib.net/

注:默认放在/usr/local/src目录下

7.2.2.3.1 安装pcre
http://mirror.centos.org/centos/7/os/x86_64/Packages/pcre-devel-8.32-17.el7.x86_64.rpm/

上传后安装 rpm -ivh pcre-devel-8.32-17.el7.x86_64.rpm
7.2.2.3.2 安装zlib
http://mirror.centos.org/centos/7/os/x86_64/Packages/zlib-devel-1.2.7-18.el7.x86_64.rpm

上传后安装 rpm -ivh zlib-devel-1.2.7-18.el7.x86_64.rpm

备注:

还差什么可自行下载,地址:https://centos.pkgs.org/7/centos-x86_64/

7.2.2.4 预编译

cd nginx-1.31.1

./configure --prefix=/opt/nginx #注意:--prefix是指定安装目录(建议指定)

7.2.2.5 编译

make
make install

7.2.2.6 安装完成测试

启动
cd /opt/nginx/sbin ./nginx -t # 注意要加./

备注:

记得要开防火墙端口才能访问80
firewall
-cmd --permanent --add-port=80/tcp service firewalld restart

firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload

7.2.3 nginx配置开机启动详解

7.2.3.1 配置Nginx的系统服务

在/etc/systemd/system路径下创建nginx服务文件

touch /etc/systemd/system/nginx.service

7.2.3.2 配置nginx.service文件

[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
# 这里的路径是通过./configure编译后的文件路径,分别针对启动、停止、重启、退出进行了配置
ExecStart=/usr/local/nginx/nginxMake/sbin/nginx
ExecReload=/usr/local/nginx/nginxMake/sbin/nginx -s reload
ExecStop=/usr/local/nginx/nginxMake/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/nginxMake/sbin/nginx -s quit

[Install]
WantedBy=multi-user.target

7.2.3.3 为nginx.service文件授予可执行权限

chmod +x nginx.service

备注:

重新加载后台任务
systemctl daemon-reload

启动nginx
systemctl start nginx

设置nginx开机自启
systemctl enable nginx

7.2.3.4 为查看服务看nginx是否启动成功

看到下图就说明启动成功了

systemctl status nginx

 

7.2.4 nginx配置文件详解

7.2.4.1 nginx文件结构

...              #全局块

events {         #events块
   ...
}

http      #http块
{
    ...   #http全局块
    server        #server块
    { 
        ...       #server全局块
        location [PATTERN]   #location块
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局块
}

备注:

  • 1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
  • 2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
  • 3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
  • 4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
  • 5、location块:配置请求的路由,以及各种页面的处理情况。

7.2.4.2 nginx配置详解

#定义Nginx运行的用户和用户组
user www www;
#
#nginx进程数,建议设置为等于CPU总核心数.
worker_processes 8;
#
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;
#
#进程文件
pid /var/run/nginx.pid;
#
#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致.
worker_rlimit_nofile 65535;
#
#工作模式与连接数上限
events
{
    #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型.
    use epoll;
    #单个进程最大连接数(最大连接数=连接数*进程数)
    worker_connections 1024;    #最大连接数,默认为512
}
#
#设定http服务器
http
{
    include mime.types; #文件扩展名与文件类型映射表
    default_type application/octet-stream; #默认文件类型
    #charset utf-8; #默认编码
    server_names_hash_bucket_size 128; #服务器名字的hash表大小
    client_header_buffer_size 32k; #上传文件大小限制
    large_client_header_buffers 4 64k; #设定请求缓
    client_max_body_size 8m; #设定请求缓
      keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。
    # 开启目录列表访问,合适下载服务器,默认关闭.
    autoindex on; # 显示目录
    autoindex_exact_size on; # 显示文件大小 默认为on,显示出文件的确切大小,单位是bytes 改为off后,显示出文件的大概大小,单位是kB或者MB或者GB
    autoindex_localtime on; # 显示文件时间 默认为off,显示的文件时间为GMT时间 改为on后,显示的文件时间为文件的服务器时间
    
    sendfile on; # 开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载.注意:如果图片显示不正常把这个改成off.
    tcp_nopush on; # 防止网络阻塞
    tcp_nodelay on; # 防止网络阻塞
    
    
    # FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度.下面参数看字面意思都能理解.
    fastcgi_connect_timeout 300; ## 链接
    fastcgi_send_timeout 300;  ##读取 是指nginx进程向fastcgi进程发送request的整个过程的超时时间
    fastcgi_read_timeout 300;  ##发请求 是指fastcgi进程向nginx进程发送response的整个过程的超时时间
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    
    # gzip模块设置
    gzip on; #开启gzip压缩输出
    gzip_min_length 1k; #允许压缩的页面的最小字节数,页面字节数从header偷得content-length中获取.默认是0,不管页面多大都进行压缩.建议设置成大于1k的字节数,小于1k可能会越压越大
    gzip_buffers 4 16k; #表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果
    gzip_http_version 1.1; #压缩版本(默认1.1,目前大部分浏览器已经支持gzip解压.前端如果是squid2.5请使用1.0)
    gzip_comp_level 2; #压缩等级.1压缩比最小,处理速度快.9压缩比最大,比较消耗cpu资源,处理速度最慢,但是因为压缩比最大,所以包最小,传输速度快
    gzip_types text/plain application/x-javascript text/css application/xml;
    #压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn.
    gzip_vary on;#选项可以让前端的缓存服务器缓存经过gzip压缩的页面.例如:用squid缓存经过nginx压缩的数据
    
    #开启限制IP连接数的时候需要使用
    #limit_zone crawler $binary_remote_addr 10m;
    
    ##upstream的负载均衡,四种调度算法(下例主讲)##
    
    #虚拟主机的配置
    server
    {
        # 监听端口
        listen 80;
        # 域名可以有多个,用空格隔开
        server_name 127.0.0.1;
        # HTTP 自动跳转 HTTPS
        rewrite ^(.*) https://www.baidu.com;
        deny 127.0.0.1;  #拒绝的ip
        allow 172.18.5.54; #允许的ip 
    }
    upstream myserver {   
      server 127.0.0.1:8080;
      server 192.168.24.189:8080 backup;  #热备
    }
    server
    {
        # 监听端口 HTTPS
        listen 443 ssl;
        server_name https://www.baidu.com;
        root /data/www/;
        # 配置域名证书
        ssl_certificate      C:\WebServer\Certs\certificate.crt;
        ssl_certificate_key  C:\WebServer\Certs\private.key;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_protocols SSLv2 SSLv3 TLSv1;
        ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
        ssl_prefer_server_ciphers  on;
    
        index index.html index.htm index.php;
        
        location ~ .*\.(php|php5)?$
        {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi.conf;
        }
        
        # 配置地址拦截转发,解决跨域验证问题
        location /oauth/{
            proxy_pass https://localhost:13580/oauth/;
            proxy_set_header HOST $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        
        # 图片缓存时间设置
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
            expires 10d;
        }
        
        # JS和CSS缓存时间设置
        location ~ .*\.(js|css)?$ {
            expires 1h;
        }

        # 日志格式设定
        log_format access '$server_name $remote_addr -$remote_user [$time_local] "$request"'
                  '$status $uptream_status $body_bytes_sent "$http_referer"'
                  '"$http_user_agent" "$http_x_forwarded_for" '
                  '$ssl_protocol $ssl_cipher $upstream_addr $request_time $upstream_response_time';
       # 定义本虚拟主机的访问日志
        access_log /var/log/nginx/access.log access;
        
        # 设定查看Nginx状态的地址.StubStatus模块能够获取Nginx自上次启动以来的工作状态,此模块非核心模块,需要在Nginx编译安装时手工指定才能使用
        location /NginxStatus {
            stub_status on;
            access_log on;
            auth_basic "NginxStatus";
            auth_basic_user_file conf/htpasswd;
            #htpasswd文件的内容可以用apache提供的htpasswd工具来产生.
        }
    }
}

备注:

  • 1.与remoteaddr与http_x_forwarded_for 用以记录客户端的ip地址;
  • 2.$remote_user :用来记录客户端用户名称;
  • 3.$time_local : 用来记录访问时间与时区;
  • 4.$request : 用来记录请求的url与http协议;
  • 5.$status : 用来记录请求状态;成功是200,
  • 6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;
  • 7.$http_referer :用来记录从那个页面链接访问过来的;
  • 8.$http_user_agent :记录客户端浏览器的相关信息;
  • 9.惊群现象:一个网路连接到来,多个睡眠的进程被同事叫醒,但只有一个进程能获得链接,这样会影响系统性能。
  • 10.每个指令必须有分号结束。

7.2.4.3 日志配置解析

'$server_name $remote_addr - $remote_user [$time_local] "$request"'
'$status $uptream_status $body_bytes_sent "$http_referer"'
'"$http_user_agent" "$http_x_forwarded_for" '
'$ssl_protocol $ssl_cipher $upstream_addr $request_time $upstream_response_time'
  • $server_name:虚拟主机名称。
  • $remote_addr:远程客户端的IP地址,请求者IP。
  • -:空白,用一个“-”占位符替代,历史原因导致还存在。
  • $remote_user:远程客户端用户名称,用于记录浏览者进行身份验证时提供的名字,如登录百度的用户名scq2099yt,如果没有登录就是空白。
  • [$time_local]:访问的时间与时区,比如07/Jun/2016:08:54:27 +0800,时间信息最后的"+0800"表示服务器所处时区位于UTC之后的8小时。
  • $request:请求的URI和HTTP协议,这是整个PV日志记录中最有用的信息,记录服务器收到一个什么样的请求
  • $status:记录请求返回的http状态码,比如成功是200。
  • $uptream_status:upstream状态,比如成功是200.
  • $body_bytes_sent:发送给客户端的文件主体内容的大小,比如899,可以将日志每条记录中的这个值累加起来以粗略估计服务器吞吐量。
  • $http_referer:记录从哪个页面链接访问过来的。
  • $http_user_agent:客户端浏览器信息
  • http_x_forwarded_for:客户端的真实ip,通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过http_x_forwarded_for:客户端的真实ip,通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
  • $ssl_protocol:SSL协议版本,比如TLSv1。
  • $ssl_cipher:交换数据中的算法,比如RC4-SHA。
  • $upstream_addr:upstream的地址,即真正提供服务的主机地址。
  • $request_time:整个请求的总时间。
  • $upstream_response_time:请求过程中,upstream的响应时间。`
    ### 4.Nginx代理服务的配置说明
 
  • 1.如果我们的代理只允许接受get,post请求方法的一种
proxy_method get;    #支持客户端的请求方法。post/get;
  • 2.负载均衡
proxy_connect_timeout 1;   #nginx服务器与被代理的服务器建立连接的超时时间,默认60秒
proxy_read_timeout 1; #nginx服务器想被代理服务器组发出read请求后,等待响应的超时间,默认为60秒。
proxy_send_timeout 1; #nginx服务器想被代理服务器组发出write请求后,等待响应的超时间,默认为60秒。
proxy_ignore_client_abort on;  #客户端断网时,nginx服务器是否终端对被代理服务器的请求。默认为off。
  • 3.如果使用upstream指令配置啦一组服务器作为被代理服务器,服务器中的访问算法遵循配置的负载均衡规则,同时可以使用该指令配置在发生哪些异常情况时,将请求顺次交由下一组服务器处理。
    • error:建立连接或向被代理的服务器发送请求或读取响应信息时服务器发生错误。
    • timeout:建立连接,想被代理服务器发送请求或读取响应信息时服务器发生超时。
    • invalid_header:被代理服务器返回的响应头异常。
    • off:无法将请求分发给被代理的服务器。
    • http_400,....:被代理服务器返回的状态码为400,500,502,等。

 

proxy_next_upstream timeout;  #反向代理upstream中设置的服务器组,出现故障时,被代理服务器返回的状态值。error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
  • 4.通过http获取客户的真是ip而不是获取代理服务器的ip地址
proxy_set_header Host $host; #只要用户在浏览器中访问的域名绑定了 VIP VIP 下面有RS;则就用$host ;host是访问URL中的域名和端口  www.taobao.com:80
proxy_set_header X-Real-IP $remote_addr;  #把源IP 【$remote_addr,建立HTTP连接header里面的信息】赋值给X-Real-IP;这样在代码中 $X-Real-IP来获取 源IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来,用 【,】隔开;代码中用 echo $x-forwarded-for |awk -F, '{print $1}' 来作为源IP
include       mime.types;   #文件扩展名与文件类型映射表
    default_type  application/octet-stream; #默认文件类型,默认为text/plain
    #access_log off; #取消服务日志    
    log_format myFormat ' $remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
    access_log log/access.log myFormat;  #combined为日志格式的默认值
    sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。
    proxy_connect_timeout 1;   #nginx服务器与被代理的服务器建立连接的超时时间,默认60秒
    proxy_read_timeout 1; #nginx服务器想被代理服务器组发出read请求后,等待响应的超时间,默认为60秒。
    proxy_send_timeout 1; #nginx服务器想被代理服务器组发出write请求后,等待响应的超时间,默认为60秒。
    proxy_http_version 1.0 ; #Nginx服务器提供代理服务的http协议版本1.01.1,默认设置为1.0版本。
    #proxy_method get;    #支持客户端的请求方法。post/get;
    proxy_ignore_client_abort on;  #客户端断网时,nginx服务器是否终端对被代理服务器的请求。默认为off。
    proxy_ignore_headers "Expires" "Set-Cookie";  #Nginx服务器不处理设置的http相应投中的头域,这里空格隔开可以设置多个。
    proxy_intercept_errors on;    #如果被代理服务器返回的状态码为400或者大于400,设置的error_page配置起作用。默认为off。
    proxy_headers_hash_max_size 1024; #存放http报文头的哈希表容量上限,默认为512个字符。
    proxy_headers_hash_bucket_size 128; #nginx服务器申请存放http报文头的哈希表容量大小。默认为64个字符。
    proxy_next_upstream timeout;  #反向代理upstream中设置的服务器组,出现故障时,被代理服务器返回的状态值。error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
    #proxy_ssl_session_reuse on; 默认为on,如果我们在错误日志中发现“SSL3_GET_FINSHED:digest check failed”的情况时,可以将该指令设置为off。
5

7.2.4.5 代理配置的配置文件

.Nginx负载均衡详解
upstream myserver { 
      server  192.168.24.200:8080;
      server  192.168.24.205:8080;
    }
 server {
        ....
        location  / {         
           proxy_pass  myserver;#请求转向mysvr 定义的服务器列表         
           proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
            #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

备注:

1、热备:如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBBBBBBBBBBB.....
upstream myserver { 
      server  http://192.168.24.200:8080;
      server  http://192.168.24.205:8080; backup;  #热备     
    }
2、轮询:nginx默认权重就是轮询,都默认为1,服务器处理请求的顺序:ABABABABAB....
upstream myserver { 
      server  192.168.24.200:8080;
      server  192.168.24.205:8080;       
    }
3、加权轮询:跟据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。下面服务器的请求顺序为:ABBABBABBABBABB....
upstream myserver { 
     server  192.168.24.200:8080 weight=1;
     server  192.168.24.205:8080 weight=2;
}
4.ip_hash:nginx会让相同的客户端ip请求相同的服务器。
upstream myserver { 
      server  192.168.24.200:8080
      server  192.168.24.205:8080
      ip_hash;
    }
5.关于nginx负载均衡配置的几个状态参数讲解。
down,表示当前的server暂时不参与负载均衡。
backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
weight 默认为1.weight越大,负载的权重就越大。
 

upstream myserver { 
      server 192.168.24.200:8080 weight=2 max_fails=2 fail_timeout=2;
      server 192.168.24.205:8080 weight=1 max_fails=2 fail_timeout=1;    
    }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2022-07-15 16:24  O波V步  阅读(1811)  评论(1编辑  收藏  举报