Professional Documents
Culture Documents
為什麼想針對應用程式虛擬化呢?我們知道軟體工程強調模組化,如果我們能將大型系統模組化,可以帶來
許多好處,例如更好維護、更易於重複使用、易於更新、除錯。將應用程式虛擬化就如同模組化的概念,我
們期望系統更加容易維運與佈署,例如我可以把購物網站拆解成處理購物交易的金流服務、處理貨運狀況的
物流服務、處理訂單的服務。如此一來我們可以讓數個系統共用同一個金流服務,不管是 A,B,C 店家的金流
服務或者另外建構了一個線上付費課程平台,都可以使用同一個金流服務,不必重複開發,並且我可以更容
易地把服務複製成好幾個,以便服務不同地區的使用者,增加系統的負載能力。
換言之,一個大型系統,其實可以拆解成數個應用程式或服務,如果是作業系統等級的虛擬化技術,我們只
能針對整個系統進行虛擬化,也就是複製整個系統包含硬體資源(CPU、Memory)來增加負載能力。會需要
耗費較大的記憶體資源與運算資源,我們沒辦法只增加系統中某個子服務或應用的實體數量。
一個應用程式有許多相依性的程式庫與執行環境(Bins/Libs),Docker 將應用程式與這些相依性資源封裝成
一個 Container,像圖中就有綠色、橘色和紅色三種 Container,這些 Container 必須執行在 Docker Engine
這個環境上,就如同上圖右邊的傳統虛擬化技術必須有一層 Hypervisor,可在其上運行虛擬化的作業系
統。
組件解釋
Kubernetes 是幹啥的我就不講了。
etcd 是負責設定檔同步的。
flanneld 是負責私有網路的。
說白了,Kubernetes 很多事情都不負責,都是由其他開源軟體來做
名詞解釋
- node,集群中的物理節點,可以理解為一台主機。當然,我們的試驗中都是虛擬機器。一個集群中一般存在很多
node 。
下載解壓拷貝
首先解壓壓縮包,之後修改 list-master.list 和 list-node.list 。請保證 master 只有一台,node 至少三台。
之後執行 s0-deploy-to-master.sh ,將所需檔複製到 master 。
Master 節點上
登錄到 master,進入 /root/kubernetes/ ,執行 s1-ssh-nopasswd-copy.sh ,將創建免密登錄金鑰,並複製到所有 node 節點上,這
樣接下來所有遠端執行命令都不需要再輸入金鑰了。
執行 s2-sync-scripts.sh ,將所需文件部署到 node。
執行 mastery.sh ,腳本將在 master 和所有 node 上一次執行 x01.sh 至 x07.sh 腳本(部分腳本只在 master 上或 node 上執
行)。
執行完成後,Kubernetes 集群就創建好了。
很方便吧。
當然,還是需要簡單描述下這些腳本都執行了啥。
腳本簡述
x01.sh 至 x07.sh
這些腳本只是引用了其他腳本。
00.全域環境變數
01.二進位檔案和鏡像文件部署
02.證書 CA 文件
03.etcd 集群創建
04.kubectl 部署
05.flanneld
這些名詞都已經講過了。
07.kubelet
kubelet 是真正幹活的。
本步驟是在節點安裝 kubelet、kube-proxy。
集群功能驗證
my-php-test
安裝 my-php-test
驗證
到這裡,Kubernetes 集群功能就算是能用了。
traefik 正是做這個的。
執行 ./get-ingress.sh 檢查 ingress 狀態
從可以訪問集群的任意位置,訪問 noded-ip。
好了,能用了。
從外部訪問
有個最為簡單的方案,如果是自建機房的話,在網路最外層,是必須買硬體防火牆的,可以將請求負載均衡到所有節點
上。如果防火牆沒有這個功能,則最好再自建負載均衡伺服器,這方面的方案非常多,就不介紹了。
出口負載均衡或者出口防火牆如果故障了,那就是活該斷網。
實踐方案建議
當然了,還有很多可選方案,但對於一般開發者來講,降低學習難度和維護成本是第一目的,所以:
服務應用採用容器
資料庫採用現成的分散式資料庫方案
檔存儲採用現成的物件存儲
安裝 haproxy
$ yum install -y haproxy
配置 haproxy
listen stats
bind *:9000
mode http
stats enable
stats hide-version
frontend k8s-api
bind 192.168.1.137:443
mode tcp
option tcplog
tcp-request inspect-delay 5s
default_backend k8s-api
backend k8s-api
mode tcp
option tcplog
option tcp-check
balance roundrobin
default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
bind 192.168.1.137:80
mode tcp
option tcplog
default_backend k8s-http-api
backend k8s-http-api
mode tcp
option tcplog
option tcp-check
balance roundrobin
default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
啟動 haproxy
$ sudo systemctl start haproxy
haproxy stats
問題
方式 1:使用阿裡雲 SLB
方式 2:使用 keepalived
開啟路由轉發,這裡我們定義虛擬 IP 為:192.168.1.139
$ vi /etc/sysctl.conf
# 添加以下內容
net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind = 1
# 驗證並生效
$ sysctl -p
# 驗證是否生效
$ cat /proc/sys/net/ipv4/ip_forward
安裝 keepalived:
$ vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
router_id kube_api
vrrp_script check_haproxy {
# 自身狀態檢測
interval 3
weight 5
vrrp_instance haproxy-vip {
# 使用單播通信,默認是組播通信
unicast_src_ip 192.168.1.137
unicast_peer {
192.168.1.138
# 初始化狀態
state MASTER
# 虛擬 ip 綁定的網卡 (這裡根據你自己的實際情況選擇網卡)
interface eth0
# 此 ID 要與 Backup 配置一致
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
virtual_ipaddress {
# 虛擬 ip 位址
192.168.1.139
}
track_script {
check_haproxy
virtual_server 192.168.1.139 80 {
delay_loop 5
lvs_sched wlc
lvs_method NAT
persistence_timeout 1800
protocol TCP
real_server 192.168.1.137 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
delay_loop 5
lvs_sched wlc
lvs_method NAT
persistence_timeout 1800
protocol TCP
weight 1
TCP_CHECK {
connect_port 443
connect_timeout 3
# 查看日誌
$ journalctl -f -u keepalived
驗證虛擬 IP:
$ ip addr
kube-apiserver ha
img
負載均衡/高可用方案 (K8s)
其核心思想是讓 k8s master 節點中的各類組件具備高可用性,消除單點故障。
原文網址:https://kknews.cc/code/l9yjbmg.html
該架構有如下特點:
- 集群中的各個組件均通過容器方式啟動,並且設置重啟策略為 always。這樣當他們出現故障意外退出後,能被自動拉起。
- Worker 節點上的 nginx-proxy 擁有 API server 的地址列表,負責代理 kubelet、kube-proxy 發往 API server 的請求。
原文網址:https://kknews.cc/code/l9yjbmg.html
配置負載均衡器
...
stream {
upstream apiserver {
server {
listen 6443;
proxy_connect_timeout 1s;
proxy_timeout 10s;
proxy_pass apiserver;
...
這時,通過負載均衡器提供的埠訪問 API server 會出現異常 Unable to connect to the server: x509: certificate is valid for xxx, not
192.168.0.10。這裡需要將負載均衡器的 IP 地址或域名加入到 API server 的 PKI 證書中,可以通過 cluster.yml 中的 authentication 配置項
完成此功能。
authentication:
strategy: x509
sans:
- "192.168.0.10"
驗證
在完成上述所有步驟後,可以通過命令 kubectl get nodes 查看節點狀態。如果所有節點的狀態均為 Ready,則表示集群部署成功。
總結
原文網址:https://kknews.cc/code/l9yjbmg.html
Summary:
Nginx – HA on worker Node (No more than 100 pods per node)
k8s 监控方案调研
Grafana: 開源 DashBoard,後端支援多種資料庫,如:Influxdb、Prometheus…,外掛程式也比較多,功能強大。非常適合
用於做展示。
InfluxDB: 開源時間序列資料庫,性能高效
子。
https://www.servicemesher.com/blog/prometheus-monitor-k8s-1/