K8s組件簡介及keepalived、haproxy、harbor、kubeasz安裝k8s高可用集群


一、組件介紹

  1. Kube-Apiserver
- Kubernetes API server提供了k8s各類資源對象的增刪改查及watch等HTTP Rest接口,這些對象包括Pods、services、replicationcontrollers等
API Sercer為REST操作提供服務,並為集群的共享狀態提供前端,所有其他組件都通過該前端進行交互。
- RESTful API:是REST風格的網絡接口,REST描述的是在網絡中client和server的一種交互形式 - RSET:是一種軟件架構風格,或者說是一種規范,其強調HTTP應當以資源為中心,並且規范了URI的風格,規范了HTTP請求動作(GET/PUT/PST/DELETE/HEAD/OPTIONS)的使用,具有對應語義 - apiserver默認端口:6443 - 當有一個操作到來時,會先由apiserver進行認證、鑒權、准入控制 - kubectl如何知道自己訪問哪個apiserver?在/root/.kube/config 中指定了api-server地址及訪問令牌 API版本: Alpha:預覽版,可能包含bug或錯誤,后期版本會修復且不兼容之前版本 Beta:測試版。如storage.k8s.io/v1beta1,可能存在不穩定或潛在bug,不建議生產 v1:穩定版。如apps/v1 經過驗證的stable版本,可以生產環境使用

2.Kube-Controller-manager

負責容器的副本管理
- 包括一些子控制器(副本控制器、節點控制器、命名空間控制器、和服務賬號控制器等),控制器作為集群內部的管理控制中,負責集群內Node、Pod副本、服務端點、命名空間、服務賬號、起源定額的管理,當某個Node意外宕機時,Controller Manager會及時發現並執行自動化修復流程,確保集群中的Pod副本始終處於預期工作狀態。
注意:及時發現不是立即發現!

- controller-manager會周期性的檢查系Node的狀態,如果Node掛了,會重建該Node上所有的Pod
    - controller-manager控制器每間隔5s檢查一次節點的狀態
    - 如果controller-manager沒有收到來自節點的心跳,則將該node節點標記為不可達(標記為不可達之前等待40s)
    - 如果該Node節點被標記為不可達后5分鍾內還沒有恢復,那么controller-manager會刪除該Node上的所有Pod並在其他可用節點重建這些Pod
    
node monitor period:        節點監視周期 5s
nide monitor grace period: 節點監視器寬限,40s
pod eviction timeout:        pod驅逐超時時間,5s

kube-controller以守護進程啟動時有很多默認啟動參數(可啟動指定或在.service中增刪改)
如:
    --pod-eviction-timeout=5min    ##node宕機時pod驅逐時間

3.Kube-Schedule

Kubernetes調度器是一個控制面進程,負責講Pods指派到節點上
主要任務:把我們要創建的Pod分配到指定的Node上,由Node節點上的kubelet接收任務並調用當前的運行時去創建容器

- 通過調度算法為待調度Pod列表的每個Pod從可用Node列表中選擇一個最合適的Node,並將信息返回api-server中,apiserver將信息存儲到etcd上
注意:Pod列表中有時候是多個Pod,調度Pod時為一個一個調度。調度時會根據節點的信息,如先排除不可用或不符合條件的節點,如果有指定范圍的節點,就從指定范圍中選,然后根據資源給節點進行打分,最終選擇分數高的node進行調度,將結果返回apiserver,apiserver存儲入etcd。
- node節點上的kubelet通過API Sercer監聽到Kubernetes Scheduler產生的Pod綁定信息,然后獲取對應的Pod清單,下載image,並啟動容器。

# 策略
- LeastRequestedPriority
    優先從備選節點列表中選擇資源消耗最少的節點
- CalculateNodeLabelPriority
    優先選擇含指定Label的節點
- BalancedResourceAllocation
    優先從備選節點列表中選擇各項資源使用率最均衡的節點
    
- 具體為使用yaml文件或一個POST請求去創建pod

4.Kube-Proxy

運行在每個節點上,指定服務的訪問規則,可以通過一組后端進行簡單的tcp、udp、sctp(功能更強)流轉發或在一組后端進行循環TCP、UDP和SCTP轉發,用戶必須使用apiserver API 創建一個服務來配置代理,其實就是kube-proxy通過在主機上維護網絡規則並執行連續轉發來實現Kubernetes服務訪問。

- kube-proxy運行在每個節點上,監聽API Server中服務對象的變化,再通過管理IPtables或者ipvs來實現網絡的轉發

- kube-proxy不同的版本可支持三種工作模式
    - USERSpace:k8s v1.1之前使用,k8s1.2以后就已被淘汰
    - IPtables:k8s 1.1版本開始支持 1.2版本為默認
    - IPVS k8s 1.9引入 1.11為正式版本,需要安裝ipvsadm(不裝也能用,主要使用ipvsadm命令查看ipvs規則)、ipset工具包和加載ip_vs內核模塊
    
- 還可根據報文的匹配,來決定是否允許用戶的訪問,或拒絕用戶的訪問,加了策略可以說只有當前ns服務能夠訪問,其他ns服務無法訪問

overlay:有三個網絡 node、svc、pod (均為獨立子網)

使用IPVS模式,Kube-Proxy會監視Kubernetes Service對象和Endpoints,調用宿主機內核Netlink接口以相應地創建IPVS規則並定期與Kubernetes Service對象Endpoints對象同步IPVS規則,
以確保IPVS狀態與期望一致,訪問服務時,流量將被重定向到其中一個后端Pod,IPVS使用哈希表作為底層數據結構並在內核空間中工作,這意味着IPVS可以更快地重定向流量,
並且在同步代理規則時具有更好的性能,此外,IPVS為負載均衡算法提供了更多選項,例如:rr(輪詢調度)、Ic (最小連接數)、dh (目標哈希)、sh (源哈希)、sed (最短期望延遲)、nq(不排隊調度)等。

5.Kubelet

kubelet是運行在每個worker節點的代理組件,他會監視已分配給節點的Pod,具體功能:
- 向master匯報node節點的狀態信息
- 接收指令並在Pod中創建docker容器
- 准備Pod所需的數據卷
- 返回Pod的運行狀態
- 在node節點執行容器健康檢查

- Node上的kubelet會跟apiserver有長連接
- 每個節點的kubelet會不斷向api-server匯報當前節點的容器的狀態,會不斷更新,當Pod出現什么事件,如Pod掛了,都會匯報給api-server

6.etcd

etcd是CoreOS公司開發,目前是Kubernetes默認使用的key-value數據存儲系統,用於保存kunernetes所有集群數據,etcd支持分布式集群功能,生產環境使用需要為etcd提供定期備份機制

etcd是兼具一致性和高可用性的兼職數據庫,可作為保存kubernetes所有集群數據庫的后台數據庫。通常需要有個備份計划。
https://etcd.io/ #官網
https://github.com/etcd-io/etcd  ##github

# 寫數據過程
主庫寫了,復制到從庫,3個節點要復制兩次,才能完成一份數據的寫入,如果是5個節點,要復制4次,這就是寫放大,寫的性能直線下降但讀性能有很大提升,5個庫都可以讀

復制集群或者鏡像集群:每個節點的數據都是完全一樣的時間,備份數據從哪個etcd節點上復制都行

7.coredns

dns發展:skydns、kube-dns、coredns

主要作用:在k8s中負責域名的解析,有了dns就可在容器內部通過svc名去訪問其他容器的服務,規則為 pod名.svc名.namespace名.svc.cluster.local (一般都是通過svc去訪問,所以一般不加pod名)

8.dashboard

功能相對較少,只有一些管理的操作,一般通過命令行去管理操作

pod調度流程

0、controllermanager、scheduler、kubelet發起watch分Replicaset 、pod(destNode="") pod(destNode="myNode")
1、kubectl創建Replicaset,由apiserver接收
2、apiserver將該信息存入etcd
3、etcd上報事件到apiserver
4、apiserver上報事件replicaset create,
5、controllermanager獲得事件,創建出pod,並返回apiserver
6、apiserver將該創建pod信息返回ETCD
7、etcd上報pod create事件到apiserver
8、apiserver上報 pod create 事件
9、scheduler訂閱該事件,收到后將調度結果(pod bound node)返回apiserver
10、apiserver將更新的pod信息返回etcd
11、etcd收到事件后,上報pod bound node 事件到apiserver
12、kubelet訂閱apiserver,收到該pod調度到自己節點上的信息
13、kubelet調用底層容器服務(如docker)將容器創建出來

二、K8S集群搭建

1、集群資源規划

系統選用ubuntu-server_20.04.3

由於是在自己的虛擬機上搭建,給的資源相對較少,可根據自己的需要提升機器資源配置

角色  IP 內存 CPU
master-01 etcd-01 192.168.1.10 3 2
master-02 etcd-02 192.168.1.11 3 2
master-03 etcd-03 192.168.1.12 3 2
harbor-01 192.168.1.13 1 1
haproxy-01 192.168.1.15 1 1
haproxy-02 192.168.1.16 1 1
worker-01 192.168.1.20 2 2
worker-02 192.168.1.21 2 2
vip 192.168.1.22 192.168.1.23 192.168.1.24    

集群圖示

 

 

2.安裝keepalived+haproxy

1、將所有的https源改為http源

sed -i 's/https/http/g' /etc/apt/sources.list
apt update

2、安裝keepalived

1、在haproxy-01、haproxy-02中安裝keepalived
    root@haproxy-01:/etc/keepalived# apt install -y keepalived
2、拷貝配置文件
    root@haproxy-01:~# cd /etc/keepalived/
    root@haproxy-01:/etc/keepalived# ls /usr/share/doc/keepalived/samples/keepalived.conf.vrrp
    root@haproxy-01:/etc/keepalived# cp !$ ./
    root@haproxy-01:/etc/keepalived# cp keepalived.conf.vrrp keepalived.conf
3、修改配置文件
    vim /etc/keepalived/keepalived.conf

keepalived配置文件

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen
   }
   #notification_email_from Alexandre.Cassen@firewall.loc
   #smtp_server 192.168.200.1
   #smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER    ##拷貝到另一台主機位BACKUP
    interface eth0
    garp_master_delay 10
    smtp_alert
    virtual_router_id 51
    priority 100   ##拷貝到另一台主機優先級降低
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.22 dev eth0 label eth0:0
        192.168.1.23 dev eth0 label eth0:1
        192.168.1.24 dev eth0 label eth0:2

        # optional label. should be of the form "realdev:sometext" for
        # compatibility with ifconfig.
    }
}
}

4、復制到haproxy-02,修改兩處配置
  state BACKUP
  priority 80
5、測試keepalived的vip漂移
  # 手動關閉haproxy-01上的keepalived
  systemctl stop keepalived.service
6、查看haproxy-01與haproxy-02的IP狀態

 

 測試成功!

 

7、手動恢復haproxy-01的keepalived
  systemctl start keepalived.service
8、查看vip是否回來

9、在兩台機器上設置開啟自啟動

  systemctl enable keepalived

systemctl enable haproxy

3.安裝haproxy

1、在haproxy-01、haproxy-02上安裝haproxy
  apt install -y haproxy
2、備份配置文件
  root@haproxy-01:/etc/haproxy# cp haproxy.cfg haproxy.cfg.bak
3、修改配置文件(在最后添加)

listen k8s-api-6443
bind 192.168.1.22:6443
mode tcp
server master1 192.168.1.10:6443 check inter 3s fall 3 rise 1
server master2 192.168.1.11:6443 check inter 3s fall 3 rise 1
server master3 192.168.1.12:6443 check inter 3s fall 3 rise 1


4、重啟haproxy服務
  root@haproxy-01:/etc/haproxy# systemctl restart haproxy
  systemctl status haproxy.service
5、查看地址是否監聽
  root@haproxy-01:/etc/haproxy# ss -tln

6、將配置文件拷貝過去haproxy-02
7、重啟haproxy-02上的haproxy服務
  發現啟動失敗:原因為該節點沒有vip,而linux默認不監聽自身沒有的ip
8、查看日志

9、解決,開啟內核中的一個參數

  sysctl -a |grep load_bind
  net.ipv4.ip_nonlocal_bind = 0 #為0是不允許應用程序監聽在本機沒有的地址上去,需要改為1
10、修改(注意,兩台主機都要改,防止vip飄走時另一主機無法使用)

echo net.ipv4.ip_nonlocal_bind = 1 >> /etc/sysctl.conf

11、生效
  sysctl -p #內核參數生效
12、重啟沒有vip的節點上的haproxy
  systemctl restart haproxy.service
13、在兩台機器上設置開機自啟動

4.安裝harbor

1、安裝docker及docker-compose (通過已有安裝包進行安裝)
2、從github下載harbor安裝包
  harbor-offline-installer-v2.4.2.tgz
3、解壓
  root@harbor-01:/usr/local/harbor# tar xf harbor-offline-installer-v2.4.2.tgz
4、進入harbor目錄
  root@harbor-01:/usr/local/harbor# cd harbor/
5、使用自簽名證書部署https的harbor
  root@harbor-01:/usr/local/harbor/harbor# mkdir certs
  root@harbor-01:/usr/local/harbor/harbor# cd certs/
  root@harbor-01:/usr/local/harbor/harbor/certs# openssl genrsa -out ./harbor-ca.key
  root@harbor-01:/usr/local/harbor/harbor/certs# openssl req -x509 -new -nodes -key ./harbor-ca.key -subj "/CN=harbor.mageedu.local" -days 7120 -out ./harbor-ca.crt
6、備份配置文件
  root@harbor-01:/usr/local/harbor/harbor# cp harbor.yml.tmpl harbor.yml
7、修改配置文件(部分修改記錄)

hostname: 192.168.1.13
    certificate: /usr/local/harbor/harbor/certsharbor-ca.crt
    private_key: /usr/local/harbor/harbor/certs/harbor-ca.key
harbor_admin_password: 123456
data_volume: /data

8、安裝

root@harbor-01:/usr/local/harbor/harbor# ./install.sh --help

Note: Please set hostname and other necessary attributes in harbor.yml first. DO NOT use localhost or 127.0.0.1 for hostname, because Harbor needs to be accessed by external clients.
Please set --with-notary if needs enable Notary in Harbor, and set ui_url_protocol/ssl_cert/ssl_cert_key in harbor.yml bacause notary must run under https. 
Please set --with-trivy if needs enable Trivy in Harbor
Please set --with-chartmuseum if needs enable Chartmuseum in Harbor

## 	--with-notary				##是否驗證請求,強制驗證你的請求是不是ssl,會驗證你的key,可以不開
##	--with-trivy   				##掃描鏡像組件,一定打開
##	--with-chartmuseum  		##支持helm使用,一定打開

root@harbor-01:/usr/local/harbor/harbor# ./install.sh --with-trivy --with-chartmuseum

  

 5.kubeasz安裝k8s集群准備工作--安裝ansible

## 以master-01為部署節點
1、安裝ansible
  root@master-01:~# apt install -y ansible
2、生成密鑰
  root@master-01:~# ssh-keyge
3、設置ansible的配置文件
  host_key_checking = False ##開啟這個參數,在未驗證過的主機不需要yes確認
4、、設置好被控制的機器
5、、下發密鑰(需配置好hosts,並將第3步完成才可使用下面命令,否則使用ssh-copy-id手動傳到各個節點)
  ansible all -m authorized_key -k -a "user=root key='{{ lookup('file', '/root/.ssh/id_rsa.pub') }}' path='/root/.ssh/authorized_keys' manage_dir=no"
6、給python3.8做軟連接
  root@master-01:/etc/ansible# ansible all -m shell -a 'ln -sv /usr/bin/python3.8 /usr/bin/python'

 6.kubeasz安裝k8s集群准備工作--下載kubeasz並配置

1、修改要下載的ezdown的版本(版本跟k8s對應)
  root@master-01:/etc/ansible# export release=3.2.0
2、下載ezdown
  root@master-01:/etc/ansible# wget https://github.com/easzlab/kubeasz/releases/download/${release}/ezdown
3、可在腳本文件中修改需要安裝的k8s版本,這里將docker版本改為19.03.15

4、給腳本加執行泉下
  chmode +x ezdown
5、查看參數
  ./ezdown --help
6、下載包到/etc/kubeasz
  ./ezdown -D

原理:使用docker去下載鏡像,用此鏡像啟動一個容器,將容器里面的東西拷貝到本地
docker安裝,下載完后解壓,將二進制放到指定位置,再將docker.service復制到/etc/systemd/system/docker.service
下載完成后,在/etc/kubeasz/bin 下,已經有很多可執行程序,到時候安裝會直接從該目錄下拷貝

 

 

7、創建一個集群環境

 cd /etc/kubeasz
 root@master-01:/etc/kubeasz# ./ezctl new clustername
 root@master-01:/etc/kubeasz# ./ezctl new k8s-cluster1


創建完成后會生成該集群名的目錄(./cluster/k8s-cluster1),會將./example/hosts.multi.node ./example/config.yml拷貝到這個目錄下,前者是ansible所需要的文件,后者是集群的配置文件(集群有效期,網絡參數等)

 

8、下載完成后,需要修改東西(進行集群規划)
進入你的集群目錄
  root@master-01:/etc/kubeasz# cd clusters/k8s-cluster1/
9、修改hosts

注意:此時master只有兩台,是為了后期學習如何在集群加入master節點。

  vim hosts

# 'etcd' cluster should have odd member(s) (1,3,5,...)
[etcd]
192.168.1.10   ##修改
192.168.1.11   ##修改
192.168.1.12   ##修改

# master node(s)
[kube_master]
192.168.1.10   ##修改
192.168.1.11   ##修改

# work node(s)
[kube_node]
192.168.1.20   ##修改
192.168.1.21   ##修改

# [optional] harbor server, a private docker registry
# 'NEW_INSTALL': 'true' to install a harbor server; 'false' to integrate with existed one
[harbor]
#192.168.1.8 NEW_INSTALL=false

# [optional] loadbalance for accessing k8s from outside
[ex_lb]
192.168.1.6 LB_ROLE=backup EX_APISERVER_VIP=192.168.1.22 EX_APISERVER_PORT=6443   ##修改
192.168.1.7 LB_ROLE=master EX_APISERVER_VIP=192.168.1.22 EX_APISERVER_PORT=6443   ##修改

# [optional] ntp server for the cluster
[chrony]
#192.168.1.1

[all:vars]
# --------- Main Variables ---------------
# Secure port for apiservers
SECURE_PORT="6443"

# Cluster container-runtime supported: docker, containerd
CONTAINER_RUNTIME="docker"   ##修改

# Network plugins supported: calico, flannel, kube-router, cilium, kube-ovn
CLUSTER_NETWORK="calico"

# Service proxy mode of kube-proxy: 'iptables' or 'ipvs'
PROXY_MODE="ipvs"

# K8S Service CIDR, not overlap with node(host) networking
SERVICE_CIDR="10.100.0.0/16"   ##修改

# Cluster CIDR (Pod CIDR), not overlap with node(host) networking
CLUSTER_CIDR="10.200.0.0/16"   ##修改

# NodePort Range
NODE_PORT_RANGE="30000-40000"   ##修改。默認30000-32767

# Cluster DNS Domain
CLUSTER_DNS_DOMAIN="cluster.local"

# -------- Additional Variables (don't change the default value right now) ---
# Binaries Directory
bin_dir="/usr/local/bin"   ##修改,將第三方與系統命令區分開

# Deploy Directory (kubeasz workspace)
base_dir="/etc/kubeasz"

# Directory for a specific cluster
cluster_dir="{{ base_dir }}/clusters/k8s-cluster1"

# CA and other components cert/key Directory
ca_dir="/etc/kubernetes/ssl"

- 啟用倉庫鏡像(ENABLE_MIRROR_REGISTRY: true),會加一些mirrors,加速鏡像下載,啟動之后,有些配置是可以改的
/etc/kubeasz/playbooks/03.runtime.yml
當你想修改docker安裝的daemon.json,可以直接改 /etc/kubeasz/roles/docker/templates/daemon.json.j2

 

10.修改config.yml

############################
# prepare
############################
# 可選離線安裝系統軟件包 (offline|online)
INSTALL_SOURCE: "online"

# 可選進行系統安全加固 github.com/dev-sec/ansible-collection-hardening
OS_HARDEN: false

# 設置時間源服務器【重要:集群內機器時間必須同步】
ntp_servers:
  - "ntp1.aliyun.com"
  - "time1.cloud.tencent.com"
  - "0.cn.pool.ntp.org"

# 設置允許內部時間同步的網絡段,比如"10.0.0.0/8",默認全部允許
local_network: "0.0.0.0/0"


############################
# role:deploy
############################
# default: ca will expire in 100 years
# default: certs issued by the ca will expire in 50 years
CA_EXPIRY: "876000h"
CERT_EXPIRY: "876000h"

# kubeconfig 配置參數
CLUSTER_NAME: "k8s-cluster1"    # 改
CONTEXT_NAME: "context-{{ CLUSTER_NAME }}"

# k8s version
K8S_VER: "1.23.1"

############################
# role:etcd
############################
# 設置不同的wal目錄,可以避免磁盤io競爭,提高性能
ETCD_DATA_DIR: "/var/lib/etcd"
ETCD_WAL_DIR: ""


############################
# role:runtime [containerd,docker]
############################
# ------------------------------------------- containerd
# [.]啟用容器倉庫鏡像
ENABLE_MIRROR_REGISTRY: true

# [containerd]基礎容器鏡像
SANDBOX_IMAGE: "easzlab/pause:3.6"

# [containerd]容器持久化存儲目錄
CONTAINERD_STORAGE_DIR: "/var/lib/containerd"

# ------------------------------------------- docker
# [docker]容器存儲目錄
DOCKER_STORAGE_DIR: "/var/lib/docker"

# [docker]開啟Restful API
ENABLE_REMOTE_API: false

# [docker]信任的HTTP倉庫
INSECURE_REG: '["127.0.0.1/8","192.168.1.14"]'   # 改


############################
# role:kube-master
############################
# k8s 集群 master 節點證書配置,可以添加多個ip和域名(比如增加公網ip和域名)
MASTER_CERT_HOSTS:
  - "192.168.1.22"    # 改
  - "k8s.test.io"
  #- "www.test.com"

# node 節點上 pod 網段掩碼長度(決定每個節點最多能分配的pod ip地址)
# 如果flannel 使用 --kube-subnet-mgr 參數,那么它將讀取該設置為每個節點分配pod網段
# https://github.com/coreos/flannel/issues/847
NODE_CIDR_LEN: 24


############################
# role:kube-node
############################
# Kubelet 根目錄
KUBELET_ROOT_DIR: "/var/lib/kubelet"

# node節點最大pod 數
MAX_PODS: 500

# 配置為kube組件(kubelet,kube-proxy,dockerd等)預留的資源量
# 數值設置詳見templates/kubelet-config.yaml.j2
KUBE_RESERVED_ENABLED: "no"

# k8s 官方不建議草率開啟 system-reserved, 除非你基於長期監控,了解系統的資源占用狀況;
# 並且隨着系統運行時間,需要適當增加資源預留,數值設置詳見templates/kubelet-config.yaml.j2
# 系統預留設置基於 4c/8g 虛機,最小化安裝系統服務,如果使用高性能物理機可以適當增加預留
# 另外,集群安裝時候apiserver等資源占用會短時較大,建議至少預留1g內存
SYS_RESERVED_ENABLED: "no"

# haproxy balance mode
BALANCE_ALG: "roundrobin"


############################
# role:network [flannel,calico,cilium,kube-ovn,kube-router]
############################
# ------------------------------------------- flannel
# [flannel]設置flannel 后端"host-gw","vxlan"等
FLANNEL_BACKEND: "vxlan"
DIRECT_ROUTING: false

# [flannel] flanneld_image: "quay.io/coreos/flannel:v0.10.0-amd64"
flannelVer: "v0.15.1"
flanneld_image: "easzlab/flannel:{{ flannelVer }}"

# [flannel]離線鏡像tar包
flannel_offline: "flannel_{{ flannelVer }}.tar"

# ------------------------------------------- calico
# [calico]設置 CALICO_IPV4POOL_IPIP=“off”,可以提高網絡性能,條件限制詳見 docs/setup/calico.md
CALICO_IPV4POOL_IPIP: "Always"

# [calico]設置 calico-node使用的host IP,bgp鄰居通過該地址建立,可手工指定也可以自動發現
IP_AUTODETECTION_METHOD: "can-reach={{ groups['kube_master'][0] }}"

# [calico]設置calico 網絡 backend: brid, vxlan, none
CALICO_NETWORKING_BACKEND: "brid"

# [calico]更新支持calico 版本: [v3.3.x] [v3.4.x] [v3.8.x] [v3.15.x]
calico_ver: "v3.19.3"

# [calico]calico 主版本
calico_ver_main: "{{ calico_ver.split('.')[0] }}.{{ calico_ver.split('.')[1] }}"

# [calico]離線鏡像tar包
calico_offline: "calico_{{ calico_ver }}.tar"

# ------------------------------------------- cilium
# [cilium]CILIUM_ETCD_OPERATOR 創建的 etcd 集群節點數 1,3,5,7...
ETCD_CLUSTER_SIZE: 1

# [cilium]鏡像版本
cilium_ver: "v1.4.1"

# [cilium]離線鏡像tar包
cilium_offline: "cilium_{{ cilium_ver }}.tar"

# ------------------------------------------- kube-ovn
# [kube-ovn]選擇 OVN DB and OVN Control Plane 節點,默認為第一個master節點
OVN_DB_NODE: "{{ groups['kube_master'][0] }}"

# [kube-ovn]離線鏡像tar包
kube_ovn_ver: "v1.5.3"
kube_ovn_offline: "kube_ovn_{{ kube_ovn_ver }}.tar"

# ------------------------------------------- kube-router
# [kube-router]公有雲上存在限制,一般需要始終開啟 ipinip;自有環境可以設置為 "subnet"
OVERLAY_TYPE: "full"

# [kube-router]NetworkPolicy 支持開關
FIREWALL_ENABLE: "true"

# [kube-router]kube-router 鏡像版本
kube_router_ver: "v0.3.1"
busybox_ver: "1.28.4"

# [kube-router]kube-router 離線鏡像tar包
kuberouter_offline: "kube-router_{{ kube_router_ver }}.tar"
busybox_offline: "busybox_{{ busybox_ver }}.tar"


############################
# role:cluster-addon
############################
# coredns 自動安裝
dns_install: "no"    # 改
corednsVer: "1.8.6"
ENABLE_LOCAL_DNS_CACHE: false  ##生產環境可以打開
dnsNodeCacheVer: "1.21.1"
# 設置 local dns cache 地址
LOCAL_DNS_CACHE: "169.254.20.10"

# metric server 自動安裝
metricsserver_install: "no"   # 改
metricsVer: "v0.5.2"

# dashboard 自動安裝
dashboard_install: "no"   # 改
dashboardVer: "v2.4.0"
dashboardMetricsScraperVer: "v1.0.7"

# ingress 自動安裝
ingress_install: "no"
ingress_backend: "traefik"
traefik_chart_ver: "10.3.0"

# prometheus 自動安裝
prom_install: "no"
prom_namespace: "monitor"
prom_chart_ver: "12.10.6"

# nfs-provisioner 自動安裝
nfs_provisioner_install: "no"
nfs_provisioner_namespace: "kube-system"
nfs_provisioner_ver: "v4.0.2"
nfs_storage_class: "managed-nfs-storage"
nfs_server: "192.168.1.10"
nfs_path: "/data/nfs"

############################
# role:harbor
############################
# harbor version,完整版本號
HARBOR_VER: "v2.1.3"
HARBOR_DOMAIN: "harbor.yourdomain.com"
HARBOR_TLS_PORT: 8443

# if set 'false', you need to put certs named harbor.pem and harbor-key.pem in directory 'down'
HARBOR_SELF_SIGNED_CERT: true

# install extra component
HARBOR_WITH_NOTARY: false
HARBOR_WITH_TRIVY: false
HARBOR_WITH_CLAIR: false
HARBOR_WITH_CHARTMUSEUM: true

11.由於我們自己安裝了負載均衡器,所以不需要幫我們初始化負載均衡器

/etc/kubeasz/playbooks/01.prepare.yml

# [optional] to synchronize system time of nodes with 'chrony' 
- hosts:
  - kube_master
  - kube_node
  - etcd
#  - ex_lb    注釋
#  - chrony      注釋
  roles:
  - { role: os-harden, when: "OS_HARDEN|bool" }
  - { role: chrony, when: "groups['chrony']|length > 0" }

# to create CA, kubeconfig, kube-proxy.kubeconfig etc.
- hosts: localhost
  roles:
  - deploy

# prepare tasks for all nodes
- hosts:
  - kube_master
  - kube_node
  - etcd
  roles:
  - prepare

至此,准備工作完畢

7.使用kubeasz安裝k8s集群

1、第一步,基礎環境准備

root@master-01:/etc/kubeasz# ./ezctl setup k8s-cluster1 01
    這些會執行/etc/kubeasz/roles/prepare/tasks/  下定義的任務
    /etc/kubeasz/roles/prepare/templates/95-k8s-sysctl.conf.j2  ##內核參數配置

基礎環境部署的yaml文件位置

2、安裝etcd

root@master-01:/etc/kubeasz# ./ezctl setup k8s-cluster1 02

 3、安裝docker,當機器安裝過docker不會再次安裝

root@master-01:/etc/kubeasz# ./ezctl setup k8s-cluster1 03

4、安裝master

root@master-01:/etc/kubeasz# ./ezctl setup k8s-cluster1 04

5、安裝node

root@master-01:/etc/kubeasz# ./ezctl setup k8s-cluster1 05

 6、安裝calico

root@master-01:/etc/kubeasz# ./ezctl setup k8s-cluster1 06

 

 至此,基本的k8s高可用集群已經部署完畢!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM