Kubernetes

Ở bài viết trước, mình đã giới thiệu việc Xây dựng máy chủ Kubernetes On-premise, tuy nhiên quá trình vận hành có nhiều hạn chế:

  • Hoạt động chỉ với 1 node
  • Phải chỉnh sửa Nginx Ingress
  • Khó khăn trong cấu hình Mail server

Sau thời gian nghiên cứu, mình quyết định thiết kế lại kiến trúc hạ tầng cho hệ thống, tham khảo từ bài viết: Kubernetes Cluster using Vagrant and AnsibleRecommended steps after a Kubernetes Cluster deployment tuy nhiên có một vài thay đổi cho phù hợp với yêu cầu riêng:

  • Cài Ingess Nginx thay vì dùng Istio Ingress
  • Cài Cert manager để tạo và quản lý SSL certificate
Infrastructure Architect

Cài Ingess Nginx:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.44.0/deploy/static/provider/baremetal/deploy.yaml

Cài Cert Manager:

kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.2.0/cert-manager.yaml

Bên cạnh các VM thiết lập làm Kubernetes Node, Zimbra được cài đặt trên 1 VM riêng với hostname: mail.my-domain.com

HAProxy

Cài đặt HAproxy trên Ubuntu

sudo apt update
sudo apt -y install haproxy

Chỉnh sửa hosts file của DEV PC bằng lệnh sudo nano /etc/hosts và thêm các cấu hình

192.168.50.1 haproxy
# Nhớ thay IP của bạn vào
192.168.50.a k8s-m-1
192.168.50.b k8s-n-1
192.168.50.c k8s-n-2
192.168.50.d k8s-n-3
# Zimbra Mail
192.168.50.xxx zimbra

Cấu hình HAProxy

Trong Kubernetes cluster của mình sử dụng Nginx Ingress để quản lý các traffic http và https từ internet đến và đi clusters. Hiện tại mình đang sử dụng HAProxy theo hướng dẫn Using a self-provisioned edge, vì vậy HAProxy chỉ đóng vai trò route traffic đến Zimbra Mail và Ingress Nginx. Tiếp theo mình phải tìm NodePort của Ingress Nginx, khi đó HAProxy sẽ trỏ tới: nodeip:ingress-port . Tìm nodeport của Ingress Nginx:

kubectl -n ingress-nginx get svc

Kết quả trả về sẽ có dạng:

NAME                                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.104.7.116    <none>        80:30918/TCP,443:32647/TCP   33d
ingress-nginx-controller-admission   ClusterIP   10.104.187.47   <none>        443/TCP                      33d

Chúng ta chỉnh sửa HAProxy bằng cách sửa /etc/haproxy/haproxy.cfg, tham khảo cấu hình của mình:

global
	log /dev/log	local0
	log /dev/log	local1 notice
	chroot /var/lib/haproxy
	stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
	stats timeout 30s
	user haproxy
	group haproxy
	daemon

	# Default SSL material locations
	ca-base /etc/ssl/certs
	crt-base /etc/ssl/private

	# See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
	ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
	ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
	ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets

defaults
	log	global
	mode	http
	option	httplog
	option	dontlognull
	timeout connect 5000
	timeout client  50000
	timeout server  50000
	errorfile 400 /etc/haproxy/errors/400.http
	errorfile 403 /etc/haproxy/errors/403.http
	errorfile 408 /etc/haproxy/errors/408.http
	errorfile 500 /etc/haproxy/errors/500.http
	errorfile 502 /etc/haproxy/errors/502.http
	errorfile 503 /etc/haproxy/errors/503.http
	errorfile 504 /etc/haproxy/errors/504.http


# HAproxy for web servers

frontend https
	bind *:443
	mode tcp
	option tcplog
	acl tls req.ssl_hello_type 1
	tcp-request inspect-delay 5s
	tcp-request content accept if tls
	# Mail server dùng backend riêng
	acl zimbra req.ssl_sni -i mail.my-domain.com
	use_backend zimbra_https if zimbra
	default_backend https


frontend http
	bind *:80
	mode http
	option httplog
	option forwardfor
	# Mail server dùng backend riêng
	acl zimbra hdr_end(host) -i mail.my-domain.com
	use_backend zimbra_http if zimbra	
	default_backend http


backend https
	mode tcp
	balance roundrobin
	server k8s-n-1 192.168.50.b:32647 check port 32647 send-proxy
	server k8s-n-2 192.168.50.c:32647 check port 32647 send-proxy
	server k8s-n-3 192.168.50.d:32647 check port 32647 send-proxy
backend http
	mode http
	balance roundrobin
	server k8s-n-1 192.168.50.b:30918 check port 30918 send-proxy
	server k8s-n-2 192.168.50.c:30918 check port 30918 send-proxy
	server k8s-n-3 192.168.50.d:30918 check port 30918 send-proxy

backend zimbra_http
	mode http
	option forwardfor
	server zimbra 192.168.50.xxx:80 check port 80
backend zimbra_https
	mode tcp
	option ssl-hello-chk
	server zimbra 192.168.50.xxx:443 check port 443
	
# Cấu hình riêng cho mail server Zimbra	
frontend zimbra_25
	bind *:25
	mode tcp
	option tcplog
	default_backend zimbra_25
frontend zimbra_389
	bind *:389
	mode tcp
	option tcplog
	default_backend zimbra_389
frontend zimbra_636
	bind *:636
	mode tcp
	option tcplog
	default_backend zimbra_636
frontend zimbra_587
	bind *:587
	mode tcp
	option tcplog	
	default_backend zimbra_587
frontend zimbra_465
	bind *:465
	mode tcp
	option tcplog
	default_backend zimbra_465
frontend zimbra_993
	bind *:993
	mode tcp
	option tcplog
	default_backend zimbra_993
frontend zimbra_995
	bind *:995
	mode tcp
	option tcplog	
	default_backend zimbra_995
frontend zimbra_7071
	bind *:7071
	mode tcp
	option tcplog	
	default_backend zimbra_7071
frontend zimbra_5222
	bind *:5222
	mode tcp
	option tcplog	
	default_backend zimbra_5222
frontend zimbra_5223
	bind *:5223
	mode tcp
	option tcplog	
	default_backend zimbra_5223


backend zimbra_25
	mode tcp
	server zimbra 192.168.50.xxx:25 check port 25
backend zimbra_389
	mode tcp
	server zimbra 192.168.50.xxx:389 check port 389
backend zimbra_636
	mode tcp
	server zimbra 192.168.50.xxx:636 check port 636
backend zimbra_465
	mode tcp
	server zimbra 192.168.50.xxx:465 check port 465
backend zimbra_587
	mode tcp
	server zimbra 192.168.50.xxx:587 check port 587
backend zimbra_993
	mode tcp
	server zimbra 192.168.50.xxx:993 check port 993 
backend zimbra_995
	mode tcp
	server zimbra 192.168.50.xxx:995 check port 995
backend zimbra_7071
	mode tcp
	server zimbra 192.168.50.xxx:7071 check port 7071
backend zimbra_5222
	mode tcp
	server zimbra 192.168.50.xxx:5222 check port 5222
backend zimbra_5223
	mode tcp
	server zimbra 192.168.50.xxx:5223 check port 5223


# HAproxy Monitoring Config
listen stats

bind 192.168.1.135:8080
	mode http 
	option forwardfor 
	option httpclose 
	stats enable 
	stats show-legends 
	stats refresh 5s 
	stats uri /stats                             
	stats realm Haproxy\ Statistics 
	stats auth admin:admin            #Login User and Password for the monitoring 
	stats admin if TRUE 
	default_backend http