一、組件介紹
- 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高可用集群已經部署完畢!