• 1. Squid简介
  • 2. 问题描述
  • 3. k8s集群中容器化部署Squid
  • 3.1 环境说明
  • 3.2 在公网节点使用docker安装squid
  • 3.3 配置受信
  • 3.4 修改Squid配置文件
  • 4. 代理上网
  • 4.1 为其它节点上的docker配置代理
  • 4.2 为k8s集群中的pod配置代理
  • 5. 总结


1. Squid简介

   Squid Cache(简称为Squid)是HTTP代理服务器软件。Squid用途广泛,可以作为缓存服务器,可以过滤流量帮助网络安全,也可以作为代理服务器链中的一环,向上级代理转发数据或直接连接互联网。Squid的主要作用和应用场景有:

  • 用来做前置的Web缓存,加快用户访问Web的速度
  • 代理内网用户访问互联网资源
  • 设置访问控制策略,控制用户的上网行为
  • 主要支持http、ftp等应用协议

参考: https://hub.docker.com/r/sameersbn/squid

2. 问题描述

   通常公司内部服务器只有指定的节点具备出网权限,当其他节点需要访问公网时,需要通过该节点代理上网。步骤如下:

  • 在公网节点上容器化部署Squid,提供HTTP正向代理
  • 在其它节点上配置docker代理

3. k8s集群中容器化部署Squid

3.1 环境说明

   本文中涉及三台服务器,仅有master节点具有公网访问能力(也可指定为其它节点)。

角色

私网IP

公网IP

k8s-master

172.18.25.81

8.135.19.91

k8s-node1

172.18.25.82

k8s-node2

172.18.25.83

3.2 在公网节点使用docker安装squid

使用docker安装squid

  • 从docker hub下载容器
docker pull sameersbn/squid:3.5.27-2
  • 在docker中创建容器
docker run --name squid -d --restart=always \
  --publish 3128:3128 \
  --volume /srv/docker/squid/cache:/var/spool/squid \
  sameersbn/squid:3.5.27-2

3.3 配置受信

  • 安装htpasswd
yum install httpd-tools
  • 生成认证文件
# squid_passwd为认证文件名,squid为账号名

htpasswd -c squid_passwd squid
# 这里输入两次密码:123456
  • 将认证文件拷贝至容器
docker cp squid_passwd squid:/etc/squid/

3.4 修改Squid配置文件

配置squid

  • 从Squid容器中导出默认配置文件
docker cp squid:/etc/squid/squid.conf ./
  • 去掉注释
awk '/^[^#]/' squid.conf > squid-simple.conf
  • 编辑配置文件
vim squid-simple.conf
  • 添加以下三行至“http_access deny all”上面(因为过滤规则是从上至下的)
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/squid_passwd
acl ncsa_users proxy_auth REQUIRED
http_access allow ncsa_users
  • 将配置文件导入Squid容器
docker cp squid-simple.conf squid:/etc/squid/squid.conf
  • 重启docker
docker restart squid
  • 附上完整配置文件:squid.conf
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/squid_passwd
acl ncsa_users proxy_auth REQUIRED
http_access allow ncsa_users
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localhost
http_access deny all
http_port 3128
coredump_dir /var/spool/squid
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern (Release|Packages(.gz)*)$      0       20%     2880
refresh_pattern .               0       20%     4320

4. 代理上网

4.1 为其它节点上的docker配置代理

配置docker代理

  • 环境配置,格式:http://{帐号名}:{密码}@{公网节点的私网IP}:3128
# mkdir -p /etc/systemd/system/docker.service.d
# vim /etc/systemd/system/docker.service.d/http-proxy.conf

[Service]
Environment="HTTP_PROXY=http://squid:123456@172.18.25.81:3128" "HTTPS_PROXY=http://squid:123456@172.18.25.81:3128" "NO_PROXY="
  • 使配置生效并重启docker
systemctl daemon-reload &&
systemctl restart docker
  • 拉取镜像验证
docker pull busybox:latest

4.2 为k8s集群中的pod配置代理

  • 在Deployment中加上env配置
apiVersion: apps/v1
kind: Deployment
metadata:
  name: 
  labels:
    app: 
spec:
  selector:
    matchLabels:
      app: 
  replicas: 
  template:
    metadata:
      name: 
      labels:
        app: 
    spec:
      containers:
        - name: 
          image: 
          imagePullPolicy: 
          ports:
            - containerPort: 
          env:
          - name: http_proxy
            value: http://squid:123456@172.18.25.81:3128
          - name: https_proxy
            value: http://squid:123456@172.18.25.81:3128

5. 总结

水平有限,一些细节、问题没有考虑到;此外,部署方式还可以加以改进:

  • 公网节点的squid部署可采用声明式部署的方式
  • 其它节点的代理可在搭建集群时统一预先配置