【Docker从入门到入土 6】Consul详解+Docker https安全认证(附证书申请方式)

news2024/9/23 23:26:32

Part 6

  • 一、服务注册与发现的概念
    • 1.1 cmp问题
    • 1.2 服务注册与发现
  • 二、Consul ----- 服务自动发现和注册
    • 2.1 简介
    • 2.2 为什么要用consul?
    • 2.3 consul的架构
    • 2.3 Consul-template
  • 三、consul架构部署
    • 3.1 Consul服务器
      • Step1 建立 Consul 服务
      • Step2 查看集群信息
      • Step3 通过 http api 获取集群信息
      • Step4 测试能否访问consul的web界面
    • 3.2 Registrator服务器
      • Step1 安装 Gliderlabs/Registrator
      • Step2 测试服务发现功能是否正常
      • Step3 验证 http 和 nginx 服务是否注册到 consul
    • 3.3 配置consul-template
      • Step1 准备 template nginx 模板文件
      • Step2 安装nginx
      • Step3 配置 nginx
      • Step4 配置并启动 template
      • Step5 访问 template-nginx
      • Step6 增加一个 nginx 容器节点
    • 3.4 补充知识,consul多节点
  • 四、Docker安全
    • 4.1 Docker 安全基线标准(注意事项)
    • 4.2 常用的安全配置方法
  • 五、Docker https安全认证
    • 5.1 背景
    • 5.2 使用证书访问的工作流程
    • 5.3 如何获取证书?
    • 5.4 使用OpenSSL创建自签名证书的步骤
    • 5.6 nginx如何支持https?

一、服务注册与发现的概念

服务注册与发现是微服务架构中不可或缺的重要组件。

1.1 cmp问题

在这里插入图片描述

起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的通过接口访问。

直到后来出现了多个节点的分布式架构,起初的解决手段是在服务前端负载均衡,这样前端必须要知道所有后端服务的网络位置,并配置在配置文件中。

这里就会有几个问题:
●如果需要调用后端服务A-N,就需要配置N个服务的网络位置,配置很麻烦
●后端服务的网络位置变化,都需要改变每个调用者的配置

1.2 服务注册与发现

img

既然有这些问题,那么服务注册与发现就是解决这些问题的

后端服务A-N可以把当前自己的网络位置注册到服务发现模块,服务发现就以K-V的方式记录下来,K一般是服务名,V就是IP:PORT。

服务发现模块定时的进行健康检查,轮询查看这些后端服务能不能访问的了。

前端在调用后端服务A-N的时候,就跑去服务发现模块问下它们的网络位置,然后再调用它们的服务

这样的方式就可以解决上面的问题了,前端完全不需要记录这些后端服务的网络位置,前端和后端完全解耦!

二、Consul ----- 服务自动发现和注册

2.1 简介

Consul是google开源的一个使用go语言开发的,实现服务自动注册和发现的一种工具

2.2 为什么要用consul?

为了解决后端应用服务器集群节点数量很多,前端负载均衡器配置和管理会很麻烦的问题

负载均衡器的节点配置条目数量会很多,后端节点的网络位置发生了变化还需要修改所有调用这些后端节点的负载均衡器配置等问题)

2.3 consul的架构

consul由两种模式组成:cilent模式server模式

在这里插入图片描述

Client模式 :可用于接收后端服务发来的注册信息,并转发给server节点,没有持久化能力。

Server模式:可用于接受后端服务/client模式的节点发来的注册信息,还可在server节点之前同步注册信息,具有持久化注册信息到本地的能力。

Server模式下还有个特殊的节点: server-leader节点

在这里插入图片描述

Server-Leader节点负责同步注册信息给其它的server节点,并对各个节点做健康检查

Leader基于Raft算法进行选举,在Leader选举过程中,整个集群都无法对外提供服务。

2.3 Consul-template

Consul-Template是基于Consul的自动替换配置文件的应用。

Consul-Template是一个守护进程,用于实时查询Consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件。

更新完成以后,可以选择运行 shell 命令执行更新操作,重新加载 Nginx。

三、consul架构部署

在这里插入图片描述

ServerIPUsage
Consul服务器192.168.2.102运行consul服务、nginx服务、consul-template守护进程
Registrator服务器192.168.2.103运行registrator容器、运行nginx容器
systemctl stop firewalld.service
setenforce 0

3.1 Consul服务器

不需要安装docker

Step1 建立 Consul 服务

1.建立工作目录,上传并解压代码包

mkdir /opt/consul
cp consul_0.9.2_linux_amd64.zip /opt/consul

cd /opt/consul
unzip consul_0.9.2_linux_amd64.zip

在这里插入图片描述

mv consul /usr/local/bin/

2.设置代理,在后台启动 consul 服务端

#启动consul server
consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.2.102 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &

在这里插入图片描述

#查看相关端口
netstat -natp | grep consul

在这里插入图片描述

#启动consul后默认会监听5个端口:
8300:replication、leader farwarding的端口
8301:lan cossip的端口
8302:wan gossip的端口
8500:web ui界面的端口
8600:使用dns协议查看节点信息的端口

Step2 查看集群信息

#查看members状态
consul members

在这里插入图片描述

#查看集群状态
consul operator raft list-peers

在这里插入图片描述

consul info | grep leader

在这里插入图片描述

Step3 通过 http api 获取集群信息

curl 127.0.0.1:8500/v1/status/peers 			
#查看集群server成员
curl 127.0.0.1:8500/v1/status/leader			
#集群 server-leader
curl 127.0.0.1:8500/v1/catalog/services		
#注册的所有服务
curl 127.0.0.1:8500/v1/catalog/nginx			
#查看 nginx 服务信息
curl 127.0.0.1:8500/v1/catalog/nodes			
#集群节点详细信息

在这里插入图片描述

Step4 测试能否访问consul的web界面

浏览器访问
http://192.168.2.102:8500

在这里插入图片描述

3.2 Registrator服务器

容器服务自动加入 Nginx 集群

Step1 安装 Gliderlabs/Registrator

Gliderlabs/Registrator 可检查容器运行状态自动注册,还可注销 docker 容器的服务到服务配置中心。

目前支持 Consul、Etcd 和 SkyDNS2。

docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
--ip=192.168.2.103 \
consul://192.168.2.102:8500

# registrator为容器名
# host为网络模式
# always为重启策略

在这里插入图片描述

Step2 测试服务发现功能是否正常

docker run -itd -p:83:80 --name test-01 -h test01 nginx
docker run -itd -p:84:80 --name test-02 -h test02 nginx
docker run -itd -p:88:80 --name test-03 -h test03 httpd
docker run -itd -p:89:80 --name test-04 -h test04 httpd				#-h:设置容器主机名

在这里插入图片描述

Step3 验证 http 和 nginx 服务是否注册到 consul

通过consul web界面验证

浏览器中,输入 http://192.168.2.102:8500,在 Web 页面中“单击 NODES”,然后单击“consurl-server01”,会出现 5 个服务。
在这里插入图片描述

在consul server 通过curl命令测试

#通过curl命令查询到Consul上注册的一些服务
curl 127.0.0.1:8500/v1/catalog/services 

在这里插入图片描述

3.3 配置consul-template

在consul服务器上操作。

Step1 准备 template nginx 模板文件

vim /opt/consul/nginx.ctmpl

#定义nginx upstream一个简单模板
upstream http_backend {
  {{range service "nginx"}}
   server {{.Address}}:{{.Port}};
   {{end}}
}

#定义一个server,监听8000端口,反向代理到upstream
server {
    listen 8000;
    server_name localhost 192.168.2.102;
    access_log /var/log/nginx/kgc.com-access.log;							#修改日志路径
    index index.html index.php;
    location / {
        proxy_set_header HOST $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Client-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://http_backend;
    }
}

Step2 安装nginx

#安装依赖
yum -y install pcre-devel zlib-devel gcc gcc-c++ make
#新建用户
useradd -M -s /sbin/nologin nginx
tar zxvf nginx-1.24.0.tar.gz -C /opt/

cd /opt/nginx-1.24.0/
#编译安装
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

Step3 配置 nginx

vim /usr/local/nginx/conf/nginx.conf

......
http {
     include       mime.types;
     include  vhost/*.conf;       				#添加虚拟主机目录
     default_type  application/octet-stream;
......

在这里插入图片描述

#创建虚拟主机目录
mkdir /usr/local/nginx/conf/vhost

#创建日志文件目录
mkdir /var/log/nginx

#启动nginx
nginx

在这里插入图片描述

Step4 配置并启动 template

#解压代码包
unzip consul-template_0.19.3_linux_amd64.zip -d /opt/

cd /opt/
mv consul-template /usr/local/bin/

在这里插入图片描述

#在前台启动 template 服务,启动后不要按 ctrl+c 中止 consul-template 进程。
consul-template --consul-addr 192.168.2.102:8500 \
--template "/opt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/byyb.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info

在这里插入图片描述

#另外打开一个终端查看生成配置文件
cd /usr/local/nginx/conf/vhost/
cat byyb.conf

在这里插入图片描述

Step5 访问 template-nginx

docker ps -a

在这里插入图片描述

docker exec -it 4aafb2347a01 bash
echo "this is test1 web" > /usr/share/nginx/html/index.html


docker exec -it 26274cd201c7 bash
echo "this is test2 web" > /usr/share/nginx/html/index.html

在这里插入图片描述

浏览器访问:http://192.168.2.102:8000/ ,并不断刷新。

注:访问失败的话,需要开启路由转发。

net.ipv4.ip_forward = 1

在这里插入图片描述

Step6 增加一个 nginx 容器节点

1)增加一个 nginx 容器节点,测试服务发现及配置更新功能

在registor节点添加

docker run -itd -p:85:80 --name test-05 -h test05 nginx

在这里插入图片描述

2)查看子配置文件

cd /usr/local/nginx/conf/vhost/
cat byyb.conf

在这里插入图片描述

3)在新容器节点添加测试页面,测试能否负载均衡

docker ps -a

docker exec -it c6715b2533bf bash
echo "this is test1 web" > /usr/share/nginx/html/index.html

在这里插入图片描述

浏览器访问:http://192.168.2.102:8000/ ,并不断刷新
在这里插入图片描述

可以看到,请求正常轮询到各个容器节点

3.4 补充知识,consul多节点

consul -leave  脱离节点
       -enable-script-checks=true :设置检查服务为可用
       -datacenter : 数据中心名称
       -join :加入到已有的集群中
#添加一台已有docker环境的服务器192.168.2.104/24加入已有的群集中
consul agent \
-server \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.2.104 \
-client=0.0.0.0 \
-node=consul-server02 \
-enable-script-checks=true  \
-datacenter=dc1  \
-join 192.168.2.102 &> /var/log/consul.log &
consul members

四、Docker安全

4.1 Docker 安全基线标准(注意事项)

1)尽量不用 --privileged 运行容器(授权容器root用户用户宿主机的root权限);

2)尽量不用 --network host 运行容器(使用host网络模式共享宿主机的网络命名空间);

3)尽量不在容器中运行 ssh 服务;

4)尽量不把宿主机系统的关键敏感挂载到容器中。

4.2 常用的安全配置方法

1)尽量使用最小化的镜像

2)尽量以单一进程运行容器

3)尽量在容器中使用最新版本的应用

4)尽量安装最新版本的docker

5)尽量使用官方的镜像或自已构建镜像;

6)尽量给容器分配独立的文件系统

7)尽量以资源限制的方式运行容器 ;-m --cpu-quota- --cpuset-cpus -device-write-bps

8)尽量以只读的方式挂载数据卷(持久化容器数据到宿主机时除外); -v 宿主机目录:容器目录:ro

9)尽量设置容器重启次数 ;--restart on-failure:N

10)尽量以最低权限运行容器。

五、Docker https安全认证

5.1 背景

为了防止链路劫持、会话劫持等问题导致 Docker 通信时被中间人攻击,c/s 两端应该通过 TLS 加密方式通讯。

5.2 使用证书访问的工作流程

或者说,https请求访问的过程
在这里插入图片描述

服务端会事先通过 CA 签发服务器端证书和私钥

1)客户端发起 https 请求到服务端的 443 端口;

2)服务器会先返回一个包含公钥、证书有效期、CA机构等信息的证书给客户端;

3)客户端会先通过 CA 验证服务端证书的有效性,如果证书有效,则会在客户端随机生成一个会话密钥并通过服务端发来的公钥加密后,再发给服务端;

4)服务端会用私钥解密获取客户端发来的会话密钥,之后双方即可通过会话密码加密/解密来实现密文通信。

5.3 如何获取证书?

1)在阿里云、腾讯云、华为云等云服务商申请一年有效期的免费证书或者购买付费的证书

2)在服务器本地使用 openssl、mkcert、cfssl、certbot(Let’s Encrypt)等工具生成私有证书

5.4 使用OpenSSL创建自签名证书的步骤

创建自签名证书大致分为三步, 创建CA证书, 创建自签名请求, CA签名。

1)创建CA私钥和证书

#创建 CA 私钥文件
openssl genrsa -out ca.key 2048

#2048为位长

在这里插入图片描述

#创建 CA 证书文件
openssl req -new -x509 -days 3650 -key ca.key -out ca.pem  
这是 OpenSSL 工具生成自签名 X.509 证书的命令。让我逐个解释:

# `openssl req`: 执行 OpenSSL 工具,使用 "req" 子命令来创建证书请求。

# `-new`: 表示创建一个新的证书请求(Certificate Signing Request)。

#`-x509`: 表示创建自签名 X.509 证书。

#`-days 3650`: 表示生成的证书有效期为 3650 天(大约 10 年)。

#`-key ca.key`: 指定用来签名证书的密钥文件为 "ca.key"。

#`-out ca.pem`: 表示将生成的证书输出到文件 "ca.pem"。

在这里插入图片描述

2)创建服务端自签名请求文件

#创建服务端私钥文件
openssl genrsa -out server.key 2048  

在这里插入图片描述

#创建服务端证书自签名请求文件
openssl req -new -key server.key -out server.csr   

在这里插入图片描述

3)基于CA证书、私钥和服务端自签名请求文件,签发服务端证书

#创建服务端证书文件
openssl x509 -req -days 3650 -in server.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out server.pem 

在这里插入图片描述
在这里插入图片描述

4)证书的使用测试

我们使用自签名证书实现通过https访问harbor私有仓库

私有仓库的部署过程,详见我的另一篇博客【Docker从入门到入土 4】使用Harbor搭建Docker私有仓库 ,这里只标明额外的配置。

#编辑配置文件
vim /usr/local/harbor/harbor.yml
...

 13 https:
 14   # https port for harbor, default is 443
 15   port: 443
 16   # The path of cert and key files for nginx
 17   certificate: /opt/ct/server.pem
 18   private_key: /opt/ct/server.key
....

在这里插入图片描述
在这里插入图片描述

cd /usr/local/harbor/

./prepare

./install.sh

在这里插入图片描述

#浏览器访问
https://192.168.2.102

在这里插入图片描述

在这里插入图片描述

5.6 nginx如何支持https?

1)编译安装时需要添加 --with-http_ssl_module 模板;

2)修改配置文件,添加 ssl 配置

http {
    server {
        #SSL 访问端口号为 443
        listen   443 ssl;
        # 填写绑定证书的域名
        server_name  域名;
        root html;
        index index.html index.htm;
		# 指定SSL证书和私钥路径
        ssl_certificate     /usr/local/nginx/conf/cert/xxxxx.pem;
        ssl_certificate_key  /usr/local/nginx/conf/cert/xxxxx.key;

        # ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; 
		# 指定SSL服务器端支持的协议版本
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;  
        ssl_prefer_server_ciphers  on;

        location /welcome {
            root   html;
            index  index.html index.htm;
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1134461.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UE4/5 竖排文字文本

方法一、使用多行文本组件 新建一个Widget Blueprint 添加Text 或者 Editable Text(Multi-Line) 、TextBox(Multi-Line) 组件。 添加文字,调整字号,调整成竖排文字。 在Wrapping (换行)面板中 : 勾选 Auto Wrap te…

java/javaswing/窗体程序,人脸识别系统,人脸追踪,计算机视觉

源码下载地址 支持:远程部署/安装/调试、讲解、二次开发/修改/定制 源码下载地址

Openssl数据安全传输平台011:秘钥协商客户端

文章目录 0. 代码仓库拷贝jsoncpp库至工程目录下编译protobuf类文件Message.proto VS 2022 设置 0. 代码仓库 https://github.com/Chufeng-Jiang/OpenSSL_Secure_Data_Transmission_Platform/tree/main/Preparation 拷贝jsoncpp库至工程目录下 编译protobuf类文件 VS2022 pr…

K8s 部署 CNI 网络组件+k8s 多master集群部署+负载均衡

------------------------------ 部署 CNI 网络组件 ------------------------------ ---------- 部署 flannel ---------- K8S 中 Pod 网络通信: ●Pod 内容器与容器之间的通信 在同一个 Pod 内的容器(Pod 内的容器是不会跨宿主机的)共享同一…

Java —— 数组

目录 1. 数组的基本概念 1.1 什么是数组? 为什么要有数组? 1.2 数组的创建及初始化 1.3 数组的使用 1.3.1 数组中元素访问 1.3.4 遍历数组 2. 数组是引用类型 2.1 初识JVM的内存分布 2.2 基本类型变量与引用类型变量 2.3 认识null 3. 数组的应用场景 3.1 保存数据…

数学与经济管理

数学与经济管理(2-4分) 章节概述 最小生成树问题 答案:23 讲解地址:74-最小生成树问题_哔哩哔哩_bilibili 最短路径问题 答案:81 讲解地址:75-最短路径问题_哔哩哔哩_bilibili 网络与最大流量问题 真题 讲解…

记录--vue3实现excel文件预览和打印

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 在前端开发中,有时候一些业务场景中,我们有需求要去实现excel的预览和打印功能,本文在vue3中如何实现Excel文件的预览和打印。 预览excel 关于实现excel文档在…

API自动化测试:如何构建高效的测试流程!

一、引言 在当前的软件开发环境中,API(Application Programming Interface)扮演了极为重要的角色,连接着应用的各个部分。对API进行自动化测试能够提高测试效率,降低错误,确保软件产品的质量。本文将通过实…

C语言学习笔记总结(一)

C语言基础 字节大小 char:1 字节 unsigned char:1 字节 short:2 字节 unsigned short:2 字节 int:通常为 4 字节(32 位平台)或 8 字节(64 位平台) unsigned int&#x…

starrock通过导入实现数据变更

当数据文件中同时包含 UPSERT 和 DELETE 操作时,必须添加 __op 字段,并且确保数据文件中包含一个代表操作类型的列,取值为 0 或 1。其中,取值为 0 时代表 UPSERT 操作,取值为 1 时代表 DELETE 操作。 数据样例 准备数据…

[蓝桥杯-610]分数

题面 解答 这一题如果不知道数论结论的话,做这个题会有两种天壤之别的体验 此题包含以下两个数论知识 1. 2^02^12^2...2^(n-1)2^n-1 2. 较大的数如果比较小的数的两倍大1或者小1,则两者互质 所以答案就是2^n-1/2^(n-1) 标程1 我的初次解答 #in…

分享一款spring渗透测试工具-支持springboot敏感路径扫描和spring漏洞扫描

工具简介: SBSCAN是一款专注于spring框架的渗透测试工具,可以对指定站点进行spring boot敏感信息扫描以及进行spring相关漏洞的扫描与验证。 最全的敏感路径字典:最全的spring boot站点敏感路径字典,帮你全面检测站点是否存在敏…

ZYNQ中Block Memory Generator数据位宽更改

1.场景: 实际使用中,启用了PS中AXI_GP端口的AXI总线,总线的位宽设置为32bit。所需控制的BRAM的接口是AXI接口,数据位宽是64bit。其他设备的AXI接口都是32bit。 2.问题: 搭建好block原理图后,BRAM这…

Kafak - 单机/集群快速安装指北(3.x版本)

文章目录 官方下载地址上传安装包解压安装包到指定目录修改解压包名为kafka修改config目录下的配置文件server.propertie配置环境变量其他机器同上 - 修改配置文件中的brokerid启动集群停止Kraft 方式部署集群----(不使用zookeeper) 官方下载地址 http://kafka.apache.org/dow…

STM32G030F6P6点灯闪烁

前言 (1)如果有嵌入式企业需要招聘湖南区域日常实习生,任何区域的暑假Linux驱动实习岗位,可C站直接私聊,或者邮件:zhangyixu02gmail.com,此消息至2025年1月1日前均有效 (2&#xff0…

机器学习——正则化

正则化 在机器学习学习中往往不知道需要不知道选取的特征个数,假如特征个数选取过少,容易造成欠拟合,特征个数选取过多,则容易造成过拟合。由此为了保证模型能够很好的拟合样本,同时为了不要出现过拟合现象&#xff0…

Kafka与Spark案例实践

1.概述 Kafka系统的灵活多变,让它拥有丰富的拓展性,可以与第三方套件很方便的对接。例如,实时计算引擎Spark。接下来通过一个完整案例,运用Kafka和Spark来合理完成。 2.内容 2.1 初始Spark 在大数据应用场景中,面对…

NineData:高效、安全、可靠的DB2数据管理平台

Db2 是老牌厂商 IBM 研发和维护的关系型数据库管理系统。作为一个拥有悠久历史的数据库系统,Db2 凭借它的高可靠、可扩展和高安全性等诸多优点,在如今的数据库市场依然占据相当大的份额。 对于诸多金融行业的企业而言, Db2 作为承载其核心业务…

一键自助建站系统api版系统源码

自助建站系统,一建建站系统api版,自动建站 安装推荐php7.2或7.2以下都行 可使用虚拟主机或者服务器进行搭建。 分站进入网站后台 域名/admin 初始账号123456qq.com密码123456 找到后台的网站设置 将主站域名及你在主站的通信secretId和通信secretKey填进去。 即可正常使用 通信…

Vue2 - 脚手架中整合 Vditor(全网唯一一篇帮你搞定)

目录 一、Vue2 框架整合 Vditor 1.1、安装 1.2、引入 Vditor 相关文件 1.3、配置 Vditor 1.4、使用 Vditor 一、Vue2 框架整合 Vditor 1.1、安装 npm install vditor --save 1.2、引入 Vditor 相关文件 import Vditor from "vditor" import "vditor/dist/…