以二進制文件安裝K8S之部署Master高可用集羣

如下以二進制文件方式部署安全的Kubernetes Master高可用集羣,具體步驟如下:
1.下載Kubernetes服務的二進制文件
2.部署kube-apiserver服務
3.創建客戶端CA證書
4.創建客戶端連接kube-apiserver服務所需的kubeconfig配置文件
5.部署kube-controller-manager服務
6.部署kube-scheduler服務
7.使用HAProxy和keepalived部署高可用負載均衡器

下載Kubernetes服務的二進制文件

從Kubernetes的官方GitHub代碼庫頁面下載各組件的二進制文件,在Releases頁面找到需要下載的版本號,單擊CHANGELOG鏈接,跳轉到已編譯好的Server端二進制(Server Binaries)文件的下載頁面進行下載。

也可以直接進入到這個頁面單擊對應版本的CHNAGELOG文件,即可跳轉到已編譯好的Server端二進制文件下載頁面。

可以分別下載Server BinariesNode Binaries二進制文件。
Server Binaries中包含不同系統架構的服務端可執行文件,例如kubernetes-server-linux-amd64.tar.gz文件包含了x86架構下Kubernetes需要運行的全部服務程序文件;Node Binaries則包含了不同系統架構、不同操作系統的Node需要運行的服務程序文件,包括Linux版和Windows版等。

主要的服務程序二進制文件列表如下所示:

文件名 說明
kube-apiserver kube-apiserver主程序
kube-apiserver.docker_tag kube-apiserver docker鏡像的tag
kube-apiserver.tar kube-apisener docker鏡像文件
kube-controller-manager kube-controller-manager主程序
kube-controller-manager.docker_tag kube-controller-manager docker鏡像的tag
kube-controller-manager.tar kube-controller-manager docker鏡像文件
kube-scheduler kube-scheduler主程序
kube-scheduler.docker_tag kube-scheduler docker鏡像的tag
kube-scheduler.tar kube-scheduler docker鏡像文件
kubelet kubelet主程序
kube-proxy kube-proxy主程序
kube-proxy.docker_tag kube-proxy docker鏡像的tag
kube-proxy.tar kube-proxy docker鏡像文件
kubectl 客戶端命令行工具
kubeadm Kubernetes集羣安裝命令行工具
apiextensions-apiserver 提供實現自定義資源對象的擴展API Server
kube-aggregator 聚合API Server程序

在Kubernetes的Master節點上需要部署的服務包括etcdkube-apiserverkube-controller-managerkube-scheduler
在工作節點(Worker Node)上需要部署的服務包括dockerkubeletkube-proxy。當然,在本實例中由於需要在Master節點上以容器方式部署HAProxy和KeepAlived,所以在Master節點上也需要安裝Docker環境。
將Kubernetes的二進制可執行文件(kube-apiserverkube-controller-managerkube-scheduler)複製到/usr/bin目錄下,然後在/usr/lib/systemd/system目錄下爲各服務創建systemd服務配置文件,這樣就完成了軟件的安裝。

部署kube-apiserver服務

先確保已經在所有Master節點上將kube-apiserver複製到/usr/bin目錄下。

(1)設置kube-apiserver服務需要的CA相關證書。

準備master_ssl.cnf文件用於生成x509 v3版本的證書,示例如下:

[ req ]
req_extensions = v3_req
distinguished_name = req_distinguished_name

[ req_distinguished_name ]

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.cluster.local
DNS.5 = k8s-1
DNS.6 = k8s-2
DNS.7 = k8s-3
IP.1 = 169.169.0.1
IP.2 = 192.168.3.135
IP.3 = 192.168.3.136
IP.4 = 192.168.3.137
IP.5 = 192.168.3.100

在該文件中主要需要在subjectAltName字段([alt_names])設置Master服務的全部域名和IP地址,包括:

  • DNS主機名,例如k8s-1k8s-2k8s-3等,主機名需要添加到/etct/hosts文件中;
  • Master Service虛擬服務名稱,例如kubernetes.default等;
  • IP地址,包括各kube-apiserver所在主機的IP地址和負載均衡器的IP地址,例如192.168.3.135、192.168.3.136、192.168.3.137和192.168.3.100;
  • Master Service虛擬服務的ClusterIP地址,例如169.169.0.1。

然後使用openssl命令創建kube-apiserver的服務端CA證書,包括apiserver.keyapiserver.crt文件,將其複製到/etc/kubernetes/pki目錄下:

openssl genrsa -out apiserver.key 2048
openssl req -new -key apiserver.key -config master_ssl.cnf -subj "/CN=192.168.3.135" -out apiserver.csr
openssl x509 -req -in apiserver.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 36500 -extensions v3_req -extfile master_ssl.cnf -out apiserver.crt

apiserver.crtapiserver.key拷貝到所有個Master節點的/etc/kubernetes/pki目錄下。

(2)爲kube-apiserver服務創建systemd服務配置文件/usr/lib/systemd/system/kube-apiserver.service,內容如下:

[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes

[Service]
EnvironmentFile=/etc/kubernetes/apiserver
ExecStart=/usr/bin/kube-apiserver $KUBE_API_ARGS
Restart=always

[Install]
WantedBy=multi-user.target

所有Master節點都要做相同的配置。

(3)配置文件/etc/kubernetes/apiserver的內容通過環境變量KUBE_API_ARGS設置kube-apiserver的全部啓動參數,包含CA安全配置的啓動參數示例如下:

KUBE_API_ARGS="--insecure-port=0 \
--secure-port=6443 \
--tls-cert-file=/etc/kubernetes/pki/apiserver.crt \
--tls-private-key-file=/etc/kubernetes/pki/apiserver.key \
--client-ca-file=/etc/kubernetes/pki/ca.crt \
--apiserver-count=3 --endpoint-reconciler-type=master-count \
--etcd-servers=https://192.168.3.135:2379,https://192.168.3.136:2379,https://192.168.3.137:2379 \
--etcd-cafile=/etc/kubernetes/pki/ca.crt \
--etcd-certfile=/etc/etcd/pki/etcd_client.crt \
--etcd-keyfile=/etc/etcd/pki/etcd_client.key \
--service-cluster-ip-range=169.169.0.0/16 \
--service-node-port-range=30000-32767 \
--allow-privileged=true \
--logtostderr=false --log-dir=/var/log/kubernetes --v=0"

主要參數說明如下:

  • --secure-port:HTTPS端口號,默認值爲6443。
  • --insecure-port:HTTP端口號,默認值爲8080,設置爲0表示關閉HTTP訪問。
  • --tls-cert-file:服務端CA證書文件全路徑,例如/etc/kubernetes/pki/apiserver.crt。
  • --tls-private-key-file:服務端CA私鑰文件全路徑,例如/etc/kubernetes/pki/apiserver.key。
  • --client-ca-file:CA根證書全路徑,例如/etc/kubernetes/pki/ca.crt。
  • --apiserver-count:API Server實例數量,例如3,需要同時設置參數--endpoint-reconciler-type=master-count。
  • --etcd-servers:連接etcd的URL列表,這裏使用HTTPS,例如https://192.168.3.135:2379、https://192.168.3.136:2379和https://192.168.3.137:2379
  • --etcd-cafile:etcd使用的CA根證書文件全路徑,例如/etc/kubernetes/pki/ca.crt。
  • --etcd-certfile:etcd客戶端CA證書文件全路徑,例如/etc/etcd/pki/etcd_client.crt。
  • --etcd-keyfile:etcd客戶端私鑰文件全路徑,例如/etc/etcd/pki/etcd_client.key。
  • --service-cluster-ip-range:Service虛擬IP地址範圍,以CIDR格式表示,例如169.169.0.0/16,該IP範圍不能與物理機的IP地址有重合。
  • --service-node-port-range:Service可使用的物理機端口號範圍,默認值爲30000~32767。
  • --allow-privileged:是否允許容器以特權模式運行,默認值爲true。
  • --logtostderr:是否將日誌輸出到stderr,默認值爲true,當使用systemd系統時,日誌將被輸出到journald子系統。設置爲false表示不輸出到stderr,可以輸出到日誌文件。
  • --log-dir:日誌的輸出目錄,例如/var/log/kubernetes。
  • --v:日誌級別。

所有Master節點都要做相同的配置。

(4)在配置文件準備完畢後,在所有Master主機上分別啓動kube-apiserver服務,並設置爲開機自啓動:

# 啓動kube-apiserver服務並設置開機啓動
systemctl start kube-apiserver && systemctl enable kube-apiserver

# 查看kube-apiserver服務狀態
systemctl status kube-apiserver

如果服務啓動失敗,可以查看啓動日誌:journalctl -xefu kube-apiserver

創建客戶端CA證書

kube-controller-managerkube-schedulerkubeletkube-proxy服務作爲客戶端連接kube-apiserver服務,需要爲它們創建客戶端CA證書進行訪問。

(1)通過openssl工具創建CA證書和私鑰文件,命令如下:

openssl genrsa -out client.key 2048
openssl req -new -key client.key -subj "/CN=admin" -out client.csr
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 36500

其中,-subj參數中“/CN”的名稱可以被設置爲“admin”,用於標識連接kube-apiserver的客戶端用戶的名稱。

(2)將生成的client.keyclient.crt文件保存在/etc/kubernetes/pki目錄下(所有Master節點都需要執行該操作)。

創建客戶端連接kube-apiserver服務所需的kubeconfig配置文件

本節爲kube-controller-managerkube-schedulerkubeletkube-proxy服務統一創建一個kubeconfig文件作爲連接kube-apiserver服務的配置文件,後續也作爲kubectl命令行工具連接kube-apiserver服務的配置文件。

kubeconfig文件中主要設置訪問kube-apiserver的URL地址及所需CA證書等的相關參數,示例如下:

apiVersion: v1
kind: Config
clusters:
- name: default
  cluster:
    server: https://192.168.3.100:9443
    certificate-authority: /etc/kubernetes/pki/ca.crt
users:
- name: admin
  user:
    client-certificate: /etc/kubernetes/pki/client.crt
    client-key: /etc/kubernetes/pki/client.key
contexts:
- context:
    cluster: default
    user: admin
  name: default
current-context: default

其中的關鍵配置參數如下:

  • server:配置爲負載均衡器(HAProxy)使用的VIP地址(如192.168.3.100)和HAProxy監聽的端口號(如9443)。
  • client-certificate:配置爲客戶端證書文件(client.crt)全路徑。
  • client-key:配置爲客戶端私鑰文件(client.key)全路徑。
  • certificate-authority:配置爲CA根證書(ca.crt)全路徑。
  • users中的name和context中的user是連接API Server的用戶名,設置爲與客戶端證書中的“/CN”名稱保持一致,例如“admin”。

kubeconfig文件保存到/etc/kubernetes目錄下(所有Master節點都需要執行該操作)。

部署kube-controller-manager服務

前提:在所有Master節點上分別將kube-controller-manager複製到/usr/bin目錄下。

(1)爲kube-controller-manager服務創建systemd服務配置文件/usr/lib/systemd/system/kube-controller-manager.service,內容如下:

[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/kubernetes/kubernetes

[Service]
EnvironmentFile=/etc/kubernetes/controller-manager
ExecStart=/usr/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_ARGS
Restart=always

[Install]
WantedBy=multi-user.target

所有Master節點都需要添加上述配置。

(2)配置文件/etc/kubernetes/controller-manager的內容爲通過環境變量KUBE_CONTROLLER_MANAGER_ARGS設置的kube-controller-manager的全部啓動參數,包含CA安全配置的啓動參數示例如下:

KUBE_CONTROLLER_MANAGER_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig \
--leader-elect=true \
--service-cluster-ip-range=169.169.0.0/16 \
--service-account-private-key-file=/etc/kubernetes/pki/apiserver.key \
--root-ca-file=/etc/kubernetes/pki/ca.crt \
--log-dir=/var/log/kubernetes --logtostderr=false --v=0"

對主要參數說明如下。

  • --kubeconfig:與API Server連接的相關配置。
  • --leader-elect:啓用選舉機制,在3個節點的環境中應被設置爲true。
  • --service-account-private-key-file:爲ServiceAccount自動頒發token使用的私鑰文件全路徑,例如/etc/kubernetes/pki/apiserver.key。
  • --root-ca-file:CA根證書全路徑,例如/etc/kubernetes/pki/ca.crt。
  • --service-cluster-ip-range:Service虛擬IP地址範圍,以CIDR格式表示,例如169.169.0.0/16,與kube-apiserver服務中的配置保持一致。

所有Master節點都需要添加上述配置。

(3)配置文件準備完畢後,在所有Master主機上分別啓動kube-controller-manager服務,並設置爲開機自啓動:

# 啓動kube-controller-manager並設置爲開機啓動
systemctl start kube-controller-manager && systemctl enable kube-controller-manager
# 查看kube-controller-manager服務狀態
systemctl status kube-controller-manager

如果啓動失敗,查看kube-controller-manager日誌:journalctl -xefu kube-controller-manager

部署kube-scheduler服務

前提:在所有Master節點上分別將kube-scheduler複製到/usr/bin目錄下。

(1)爲kube-scheduler服務創建systemd服務配置文件/usr/lib/systemd/system/kube-scheduler.service,內容如下:

[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/kubernetes/kubernetes

[Service]
EnvironmentFile=/etc/kubernetes/scheduler
ExecStart=/usr/bin/kube-scheduler $KUBE_SCHEDULER_ARGS
Restart=always

[Install]
WantedBy=multi-user.target

在所有Master節點添加上述配置。

(2)配置文件/etc/kubernetes/scheduler的內容爲通過環境變量KUBE_SCHEDULER_ARGS設置的kube-scheduler的全部啓動參數,示例如下:

KUBE_SCHEDULER_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig \
--leader-elect=true \
--logtostderr=false --log-dir=/var/log/kubernetes --v=0"

對主要參數說明如下。

  • --kubeconfig:與API Server連接的相關配置。
  • --leader-elect:啓用選舉機制,在3個節點的環境中應被設置爲true。

在所有Master節點添加上述配置。

(3)在配置文件準備完畢後,在所有Master節點上分別啓動kube-scheduler服務,並設置爲開機自啓動:

# 啓動kube-scheduler並設置爲開機啓動
systemctl start kube-scheduler && systemctl enable kube-scheduler
# 查看kube-scheduler服務運行狀態
systemctl status kube-scheduler

如果啓動失敗,查看kube-scheduler日誌:journalctl -xefu kube-scheduler

通過systemctl status <service_name>驗證服務的啓動狀態,狀態爲running並且沒有報錯日誌表示啓動成功。

# 查看kube-apiserver服務運行狀態
systemctl status kube-apiserver.service
# 查看kube-controller-manager服務運行狀態
systemctl status kube-controller-manager.service
# 查看kube-scheduler服務運行狀態
systemctl status kube-scheduler.service

至此,一個支持3個節點高可用的K8S Master集羣基礎服務就搭建完畢了,接下來繼續配置負載均衡和高可用。

使用HAProxy和keepalived部署高可用負載均衡器

接下來,在3個kube-apiserver服務的前端部署HAProxy和keepalived,使用VIP 192.168.3.100作爲Master的唯一入口地址,供客戶端訪問。
HAProxyKeepalived均部署爲至少有兩個實例的高可用架構,以避免單點故障。

下面以在192.168.3.135和192.168.3.136兩臺服務器上部署爲例進行說明。
HAProxy負責將客戶端請求轉發到後端的3個kube-apiserver實例上,keepalived負責維護VIP 192.168.3.100的高可用。

HAProxy和keepalived的部署架構如圖:

接下來對部署HAProxy和keepalived組件進行說明。

1)部署兩個HAProxy實例

準備HAProxy的配置文件haproxy.cfg,內容示例如下:

global
    log 127.0.0.1 local2
    chroot /var/lib/haproxy
    pidfile /var/run/haproxy.pid
    maxconn 4096
    user haproxy
    group haproxy
    daemon
    stats socket /var/lib/haproxy/stats

defaults
    mode http
    log global
    option httplog
    option dontlognull
    option http-server-close
    option forwardfor except 127.0.0.0/8
    option redispatch
    retries 3
    timeout http-request 10s
    timeout queue 1m
    timeout connect 10s
    timeout client 1m
    timeout server 1m
    timeout http-keep-alive 10s
    timeout check 10s
    maxconn 3000

frontend kube-apiserver
    mode tcp
    bind *:9443
    option tcplog
    default_backend kube-apiserver

listen stats
    mode http
    bind *:8888
    stats auth admin:password # 這裏輸入的admin和password是將來訪問/stats時需要輸入的用戶名和密碼
    stats refresh 5s
    stats realm HAProxy\ Statistics
    stats uri /stats
    log 127.0.0.1 local3 err

backend kube-apiserver
    mode tcp
    balance roundrobin
    server k8s-master1 192.168.3.135:6443 check
    server k8s-master2 192.168.3.136:6443 check
    server k8s-master3 192.168.3.137:6443 check

對主要參數說明如下。

  • frontend:HAProxy的監聽協議和端口號,使用TCP,端口號爲9443。
  • backend:後端3個kube-apiserver的地址,以IP:Port方式表示,例如192.168.3.135:6443、192.168.3.136:6443和192.168.3.137:6443;mode字段用於設置協議,此處爲tcp;balance字段用於設置負載均衡策略,例如roundrobin爲輪詢模式。
  • listen stats:狀態監控的服務配置,其中,bind用於設置監聽端口號爲8888;stats auth用於配置訪問賬號;stats uri用於配置訪問URL路徑,例如/stats。

下面以Docker容器方式運行HAProxy且鏡像使用haproxytech/haproxy-debian爲例進行說明。

在兩臺服務器192.168.3.135和192.168.3.136上啓動HAProxy,將配置文件haproxy.cfg掛載到容器的/usr/local/etc/haproxy目錄下,啓動命令如下:

docker run -d --name k8s-haproxy --net=host --restart=always -v ${PWD}/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro haproxytech/haproxy-debian:2.3

在一切正常的情況下,通過瀏覽器訪問http://192.168.3.135:8888/stats地址即可訪問HAProxy的管理頁面,登錄後查看到的主頁界面如下圖所示。

這裏主要關注最後一個表格,其內容爲haproxy.cfg配置文件中backend配置的3個kube-apiserver地址,它們的狀態均爲“UP”,表示與3個kube-apiserver服務成功建立連接,說明HAProxy工作正常。

2)部署兩個keepalived實例

Keepalived用於維護VIP地址的高可用,同樣在192.168.3.135和192.168.3.136兩臺服務器上進行部署。
主要需要配置keepalived監控HAProxy的運行狀態,當某個HAProxy實例不可用時,自動將VIP地址切換到另一臺主機上。
下面對keepalived的配置和啓動進行說明。

在第1臺服務器192.168.3.135上創建配置文件keepalived.conf,內容如下:

! Configuration File for keepalived

global_defs {
	router_id LVS_1
}

vrrp_script checkhaproxy
{
	script "/usr/bin/check-haproxy.sh"
	interval 2
	weight -30
}

vrrp_instance VI_1 {
	state MASTER
	interface ens32
	virtual_router_id 51
	priority 100
	advert_int 1

	virtual_ipaddress {
		192.168.3.100/24 dev ens32
	}
	
	authentication {
		auth_type PASS
		auth_pass password
	}
	
	track_script {
		checkhaproxy
	}
}

主要參數在vrrp_instance段中進行設置,說明如下。

  • vrrp_instance VI_1:設置keepalived虛擬路由器VRRP的名稱。
  • state:設置爲“MASTER”,將其他keepalived均設置爲“BACKUP”。
  • interface:待設置VIP地址的網卡名稱。
  • virtual_router_id:例如51。
  • priority:優先級,例如100。
  • virtual_ipaddress:VIP地址,例如192.168.18.100/24。
  • authentication:訪問keepalived服務的鑑權信息。
  • track_script:HAProxy健康檢查腳本。

KeepAlived需要持續監控HAProxy的運行狀態,在某個HAProxy實例運行不正常時,自動切換到運行正常的HAProxy實例上。
需要創建一個HAProxy健康檢查腳本,定期運行該腳本進行監控,例如新建腳本check-haproxy.sh並將其保存到/usr/bin目錄下(其實不用放在/usr/bin目錄下也可以,只需要放在將來啓動KeepAlived容器的路徑上即可),內容示例如下:

#!/bin/bash

count=`netstat -apn | grep 9443 | wc -l`
if [ $count -gt 0 ]; then
	exit 0
else
	exit 1
fi

若檢查成功,則應返回0;若檢查失敗,則返回非0值。
該腳本需要拷貝到2臺安裝KeepAlived的Master節點上:192.168.3.135和192.168.3.136 。

KeepAlived根據上面的配置,會每隔2s檢查一次HAProxy的運行狀態。例如,如果在192.168.3.135上檢查失敗,KeepAlived就會將VIP地址切換到正常運行HAProxy的192.168.3.136服務器上,保證VIP 192.168.3.100地址的高可用。

在第2臺服務器192.168.3.136上創建配置文件keepalived.conf,內容示例如下:

! Configuration File for keepalived

global_defs {
	router_id LVS_2
}

vrrp_script checkhaproxy
{
	script "/usr/bin/check-haproxy.sh"
	interval 2
	weight -30
}

vrrp_instance VI_1 {
	state BACKUP
	interface ens32
	virtual_router_id 51
	priority 100
	advert_int 1

	virtual_ipaddress {
		192.168.3.100/24 dev ens32
	}
	
	authentication {
		auth_type PASS
		auth_pass password
	}
	
	track_script {
		checkhaproxy
	}
}

這裏與第1個keepalived配置的主要差異如下。

  • vrrp_instance中的state被設置爲“BACKUP”,這是因爲在整個keepalived集羣中只能有一個被設置爲“MASTER”。如果keepalived集羣不止2個實例,那麼除了MASTER,其他都應被設置爲“BACKUP”。
  • vrrp_instance的值“VI_1”需要與MASTER的配置相同,表示它們屬於同一個虛擬路由器組(VRRP),當MASTER不可用時,同組的其他BACKUP實例會自動選舉出一個新的MASTER。
  • HAProxy健康檢查腳本check-haproxy.sh與第1個keepalived的相同。

下面以Docker容器方式運行KeepAlived且鏡像使用osixia/keepalived爲例進行說明。
在兩臺服務器192.168.3.135和192.168.3.136上啓動KeepAlived,將配置文件keepalived.conf掛載到容器的/container/service/keepalived/assets目錄下,啓動命令如下:

docker run -d --name k8s-keepalived --restart=always --net=host --cap-add=NET_ADMIN --cap-add=NET_BROADCAST --cap-add=NET_RAW -v ${PWD}/keepalived.conf:/container/service/keepalived/assets/keepalived.conf -v ${PWD}/check-haproxy.sh:/usr/bin/check-haproxy.sh osixia/keepalived:2.0.20 --copy-service

在運行正常的情況下,KeepAlived會在服務器192.168.3.135的網卡ens32上設置192.168.3.100的IP地址,同樣在服務器192.168.3.135上運行的HAProxy將在該IP地址上監聽9443端口號,對需要訪問k8s Master的客戶端提供負載均衡器的入口地址,即192.168.3.100:9443

通過ip addr命令查看服務器192.168.3.135的IP地址信息,可以看到在ens32網卡上新增了192.168.3.100地址:

[root@m1 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:ce:e7:52 brd ff:ff:ff:ff:ff:ff
    inet 192.168.3.135/24 brd 192.168.3.255 scope global noprefixroute dynamic ens32
       valid_lft 1597sec preferred_lft 1597sec
    inet 192.168.3.100/24 scope global secondary ens32 # 這裏是虛擬IP:192.168.3.100
       valid_lft forever preferred_lft forever
    inet6 fe80::e88e:f064:183d:7826/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:d6:0a:3a:d3 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
[root@m1 ~]#

使用curl命令即可驗證通過HAProxy的192.168.3.100:9443地址是否可以訪問到kube-apiserver服務:

[root@m1 ~]# curl -v -k https://192.168.3.100:9443
* Rebuilt URL to: https://192.168.3.100:9443/
*   Trying 192.168.3.100...
* TCP_NODELAY set
* Connected to 192.168.3.100 (192.168.3.100) port 9443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, [no content] (0):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, [no content] (0):
* TLSv1.3 (IN), TLS handshake, Request CERT (13):
* TLSv1.3 (IN), TLS handshake, [no content] (0):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, [no content] (0):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, [no content] (0):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, [no content] (0):
* TLSv1.3 (OUT), TLS handshake, Certificate (11):
* TLSv1.3 (OUT), TLS handshake, [no content] (0):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: CN=192.168.3.129
*  start date: Aug 18 10:25:22 2023 GMT
*  expire date: Jul 25 10:25:22 2123 GMT
*  issuer: CN=192.168.3.129
*  SSL certificate verify result: self signed certificate (18), continuing anyway.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* TLSv1.3 (OUT), TLS app data, [no content] (0):
* TLSv1.3 (OUT), TLS app data, [no content] (0):
* TLSv1.3 (OUT), TLS app data, [no content] (0):
* Using Stream ID: 1 (easy handle 0x55fbc97556b0)
* TLSv1.3 (OUT), TLS app data, [no content] (0):
> GET / HTTP/2
> Host: 192.168.3.100:9443
> User-Agent: curl/7.61.1
> Accept: */*
> 
* TLSv1.3 (IN), TLS handshake, [no content] (0):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS app data, [no content] (0):
* Connection state changed (MAX_CONCURRENT_STREAMS == 250)!
* TLSv1.3 (OUT), TLS app data, [no content] (0):
* TLSv1.3 (IN), TLS app data, [no content] (0):
* TLSv1.3 (IN), TLS app data, [no content] (0):
* TLSv1.3 (IN), TLS app data, [no content] (0):
< HTTP/2 401 
< cache-control: no-cache, private
< content-type: application/json
< content-length: 165
< date: Fri, 18 Aug 2023 10:49:43 GMT
< 
* TLSv1.3 (IN), TLS app data, [no content] (0):
{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {
    
  },
  "status": "Failure",
  "message": "Unauthorized",
  "reason": "Unauthorized",
  "code": 401
* Connection #0 to host 192.168.3.100 left intact
}
[root@m1 ~]#

可以看到TCP/IP連接創建成功,得到響應碼爲401的應答,說明通過VIP地址192.168.3.100成功訪問到了後端的kube-apiserver服務。
至此,Master上所需的3個服務就全部啓動完成了,即:一個3節點高可用支持安全訪問的K8S Master集羣就搭建完畢了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章