K8S多个主节点部署旨在以一种没有单一故障点的方式设置Kubernetes及其支持组件。单个master节点的群集很容易产生故障,而多master节点群集使用多个主节点,每个主节点都可以访问相同的工作节点。在单个主集群中,API服务器,控制器管理器等重要组件仅位于单个主节点上,如果失败,则无法创建更多服务,pod等。但是,在多master节点环境中,这些重要组件在多个节点上运行,通常生产环境中建议使用三个master节点。如果任何master节点失效,其他master节点仍能保证群集正常运行。

    多主机的优点:

    在单个master设置中,主节点管理etcd数据库,API服务器,控制器管理器和调度程序以及工作节点。但是,如果该单个master节点发生故障,则所有工作节点也会发生故障,整个群集将失效。

    相比之下,在多主设置中,多主设备可为单个群集提供高可用性并提高网络性能。

    多主机设置可防止各种故障模式,从单个工作节点丢失到主节点的etcd服务故障。通过提供冗余,多主集群为最终用户提供高可用性系统。

 

k8s部署高可用mysql集群 k8s高可用集群多个主节点_Server

    下面讲介绍通过F5 的LTM和AWAF模块实现k8s集群master节点的高可用和安全防护。

    环境介绍:(由于测试PC内存不足,无法安装多个master节点,实验以单个master节点来演示,多节点环境下只需增加pool member即可)

    K8S集群:

    master node:10.1.1.174

    worker node: 10.1.1.175

    F5 BIGIP:

    VS地址: 10.1.1.100

    配置过程介绍:

    1. 安装并部署k8s。配置和部署过程不再赘述,大家可参考kubernetes官网步骤。配置完成后通过kubectl cluster-info查看集群状态

k8s@k8s-node1:~$ kubectl cluster-info
 Kubernetes master is running at https://10.1.1.174:6443
 KubeDNS is running at https://10.1.1.174:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxyTo further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

    2. 配置F5 BIGIP。该过程包括配置Vlan, self ip以及pool和VS。

    网络部分配置:

 

[root@k8s:Active:Standalone] dosl7 # tmsh list net vlan management
 net vlan management {
     fwd-mode l3
     if-index 176
     interfaces {
         1.1 { }
     }
     tag 4094
 }
 [root@k8s:Active:Standalone] dosl7 # tmsh list net self management-ip
 net self management-ip {
     address 10.1.1.176/24
     allow-service {
         default
     }
     traffic-group traffic-group-local-only
     vlan management
 }

 

Pool和VS部分配置:

 在Pool中增加了k8s master节点的地址,并增加了健康检查实时检测master节点的健康状况。下面例子中使用了简单的ping探测,在实际生产环境中可以通过定制化健康检查模拟发送API请求,确保master节点从服务角度的可用性。增加新的master节点只需对应增加pool member。

[root@k8s:Active:Standalone] dosl7 # tmsh list ltm pool k8s-master
 ltm pool k8s-master {
     members {
         10.1.1.174:sun-sr-https {
             address 10.1.1.174
             session monitor-enabled
             state up
         }
     }
     monitor gateway_icmp
 }

VS层面除了配置了基本的负载功能外还基于安全特性增加了AWAF针对API的防护策略以及针对master集群的DDos保护。

[root@k8s:Active:Standalone] dosl7 # tmsh list ltm virtual
 ltm virtual k8s-master-vs {
     destination 10.1.1.100:sun-sr-https
     ip-protocol tcp
     mask 255.255.255.255
     policies {
         asm_auto_l7_policy__k8s-master-vs { }
     }
     pool k8s-master
     profiles {
         api_ddos { }
         clientssl {
             context clientside
         }
         http { }
         k8s_api_protect.app/ASM_k8s_api_protect { }
         serverssl {
             context serverside
         }
         tcp { }
         websecurity { }
     }
     security-log-profiles {
         local-dos
     }
     source 0.0.0.0/0
     source-address-translation {
         type automap
     }
     translate-address enabled
     translate-port enabled
     vs-index 11
 }

 

    测试过程:

    1. 基本负载功能:

     通过F5发布的VS实现k8s master节点的访问。使用kubectl命令通过F5 VS查询集群状态,以下命令显示查询成功。

k8s@k8s-node1:~$ kubectl -s https://10.1.1.100:6443 get node --insecure-skip-tls-verify=true
 NAME        STATUS     ROLES    AGE    VERSION
 k8s-node1   Ready      master   125d   v1.13.1
 k8s-node2   NotReady   <none>   125d   v1.13.1

    2. kube-hunter安全扫描:

    kube-hunber是aqua发布的开源工具,可以发现Kubernetes集群中的安全问题。

    通过kube-hunber对集群进行扫描:

 

Choose one of the options below:
 1. Remote scanning      (scans one or more specific IPs or DNS names)
 2. Subnet scanning      (scans subnets on all local network interfaces)
 3. IP range scanning    (scans a given IP range)
 Your choice: 1
 Remotes (separated by a ','): 10.1.1.174
 ~ Started
 ~ Discovering Open Kubernetes Services...Report will be available at:
 +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 | https://kube-hunter.aquasec.com/report.html?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0aW1lIjoxNTU2NTAzMjg3Ljc0MjM5OCwiZW1haWwiOiJqLnlhbkBmNS5jb20iLCJyIjoiZTJkYzUyNTkifQ.ezrzL-G57mOr1IqMO1YII0o7Duvzx-H9aGnEq9uwc6Y |
 +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+|
 | Etcd:
 |   type: open service
 |   service: Etcd
 |_  host: 10.1.1.174:2379
 |
 | Kubelet API:
 |   type: open service
 |   service: Kubelet API
 |_  host: 10.1.1.174:10250
 |
 | API Server:
 |   type: open service
 |   service: API Server
 |_  host: 10.1.1.174:6443----------
Nodes
 +-------------+------------+
 | TYPE        | LOCATION   |
 +-------------+------------+
 | Node/Master | 10.1.1.174 |
 +-------------+------------+Detected Services
 +-------------+------------------+----------------------+
 | SERVICE     | LOCATION         | DESCRIPTION          |
 +-------------+------------------+----------------------+
 | Kubelet API | 10.1.1.174:10250 | The Kubelet is the   |
 |             |                  | main component in    |
 |             |                  | every Node, all pod  |
 |             |                  | operations goes      |
 |             |                  | through the kubelet  |
 +-------------+------------------+----------------------+
 | Etcd        | 10.1.1.174:2379  | Etcd is a DB that    |
 |             |                  | stores cluster's     |
 |             |                  | data, it contains    |
 |             |                  | configuration and    |
 |             |                  | current state        |
 |             |                  | information, and     |
 |             |                  | might contain        |
 |             |                  | secrets              |
 +-------------+------------------+----------------------+
 | API Server  | 10.1.1.174:6443  | The API server is in |
 |             |                  | charge of all        |
 |             |                  | operations on the    |
 |             |                  | cluster.             |
 +-------------+------------------+----------------------+No vulnerabilities were found


 

1.13.1版本的master没有发现安全漏洞。对1.10.2版本进行扫描可发现安全漏洞。

 

k8s部署高可用mysql集群 k8s高可用集群多个主节点_html_02

 经过F5 VS访问则可以屏蔽高风险CVE,告警仅针对与自签发证书。

 

k8s部署高可用mysql集群 k8s高可用集群多个主节点_Server_03

 

    3. 针对master节点发起SQL注入测试,经过F5 AWAF防护后,请求被拦截。

k8s@k8s-node1:~$ curl -k https://10.1.1.100:6443/api/v1/namespaces/default/services?limit=500' or 1=1 --'
 <html><head><title>Request Rejected</title></head><body>The requested URL was rejected. Please consult with your administrator.<br><br>Your support ID is: 2542351585300712947<br><br><a href='javascript:history.back();'>[Go Back]</a></body></html>

   BIGIP图形界面中可以看到相应的拦截日志:

 

k8s部署高可用mysql集群 k8s高可用集群多个主节点_k8s部署高可用mysql集群_04

    4. 通过ab客户端模拟向api server发起DDoS攻击,通过F5 VS上开启的应用层DDoS攻击,可以对攻击进行拦截。

 

ab -n 1000 -c 10 https://10.1.1.100:6443/api/v1/namespaces/default/services?limit=500
Concurrency Level:      10
 Time taken for tests:   30.531 seconds
 Complete requests:      1000
 Failed requests:        806

 

k8s部署高可用mysql集群 k8s高可用集群多个主节点_Server_05

 

    总之,通过BIGIP 可以实现k8s集群高可用,同时可以从安全防护角度可以确保k8s的稳定持续交付。