2020/05/22

Http ProxyをGKE上に構築する

gkek8ssquid

概要

Titleの通りですが、Http Proxy ServerであるsquidをGKEを使って導入しました。
目的としては、オフィス外などのネットワークから、テスト環境のサイトに接続する時に使っています。
テスト環境のサイトはIP Whitelistを使って、アクセス制限をかけています。
オフィス環境以外の場所からアクセスしたい時に、Proxyサーバーを経由すると、開発環境のサーバーからはProxyサーバー(のNAT)のIPアドレスから
アクセスがきたものと認識します。
なので、Proxyサーバー(のNAT)のIPアドレスをIP White listに追加することで、オフィス外の環境からのアクセスを実現しています。

実施事項

以下の通り設定ファイルを作って、deployしました。

k8sのデプロイ内容詳細

事前準備

  • htpasswdコマンドを使って、基本認証のユーザー・パスワードを作成します。
% htpasswd -c passwords basic-user-name
New password: XXXXXXX
Re-type new password: XXXXXXX
% cat passwords
basic-user-name:YYYYYYYYYYYYYYYYY.
  • 公開するためのelastic ip addressを作成しておきます。

k8sへのデプロイ設定ファイル及び順序

namespace

apiVersion: v1
kind: Namespace
metadata:
  name: squid

config map

apiVersion: v1
kind: ConfigMap
metadata:
  name: squid-config
  namespace: squid
data:
  squid.conf: |
    auth_param basic program /usr/lib/squid3/basic_ncsa_auth /etc/squid3/passwords
    acl authenticated proxy_auth REQUIRED
    http_access allow authenticated
    http_port 3128
  passwords: |
    basic-user-name:YYYYYYYYYYYYYYYYY. # <- 事前準備で作成したpasswordsの内容

deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: squid
  namespace: squid
  labels:
    app: squid
spec:
  replicas: 1
  selector:
    matchLabels:
      app: squid
  template:
    metadata:
      labels:
        app: squid
        node: backend
    spec:
      containers:
        - name: squid
          image: sameersbn/squid:3.5.27-2
          ports:
            - containerPort: 3128
              protocol: TCP
              name: squid
          volumeMounts:
            - name: data
              mountPath: /var/spool/squid
            - name: squid-config
              mountPath: /etc/squid/squid.conf
              subPath: squid.conf
            - name: squid-config
              mountPath: /etc/squid3/passwords
              subPath: passwords
      volumes:
        - name: data
          emptyDir: {}
        - name: squid-config
          configMap:
            name: squid-config

service

apiVersion: v1
kind: Service
metadata:
  name: squid
  namespace: squid
spec:
  type: LoadBalancer
  loadBalancerIP: <XXX.XXX.XXX.XXX> # <- 事前準備で作成した外部IPアドレスの値
  ports:
    - name: squid
      port: 3128
      targetPort: squid
      protocol: TCP
  selector:
    app: squid

これらのdeploy後に、内部DNSにAレコードを追加します。
また、特定のip範囲からしかproxyに接続できないようにFirewallを設定します。