1、k8s簡介
1.1、部署方式的變遷
-
傳統(tǒng)部署時(shí)代:
- 在物理服務(wù)器上運(yùn)行應(yīng)用程序
- 無法為應(yīng)用程序定義資源邊界
- 導(dǎo)致資源分配問題
例如,如果在物理服務(wù)器上運(yùn)行多個(gè)應(yīng)用程序,則可能會出現(xiàn)一個(gè)應(yīng)用程序占用大部分資源的情況, 結(jié)果可能導(dǎo)致其他應(yīng)用程序的性能下降。 一種解決方案是在不同的物理服務(wù)器上運(yùn)行每個(gè)應(yīng)用程序,但是由于資源利用不足而無法擴(kuò)展, 并且維護(hù)許多物理服務(wù)器的成本很高。
-
虛擬化部署時(shí)代:
- 作為解決方案,引入了虛擬化
- 虛擬化技術(shù)允許你在單個(gè)物理服務(wù)器的 CPU 上運(yùn)行多個(gè)虛擬機(jī)(VM)
- 虛擬化允許應(yīng)用程序在 VM 之間隔離,并提供一定程度的安全
- 一個(gè)應(yīng)用程序的信息 不能被另一應(yīng)用程序隨意訪問。
- 虛擬化技術(shù)能夠更好地利用物理服務(wù)器上的資源
- 因?yàn)榭奢p松地添加或更新應(yīng)用程序 ,所以可以實(shí)現(xiàn)更好的可伸縮性,降低硬件成本等等。
- 每個(gè) VM 是一臺完整的計(jì)算機(jī),在虛擬化硬件之上運(yùn)行所有組件,包括其自己的操作系統(tǒng)。
缺點(diǎn):虛擬層冗余導(dǎo)致的資源浪費(fèi)與性能下降
-
容器部署時(shí)代:
- 容器類似于 VM,但可以在應(yīng)用程序之間共享操作系統(tǒng)(OS)。
- 容器被認(rèn)為是輕量級的。
- 容器與 VM 類似,具有自己的文件系統(tǒng)、CPU、內(nèi)存、進(jìn)程空間等。
- 由于它們與基礎(chǔ)架構(gòu)分離,因此可以跨云和 OS 發(fā)行版本進(jìn)行移植。
- 參照【Docker隔離原理- namespace 6項(xiàng)隔離(資源隔離)與 cgroups 8項(xiàng)資源限制(資源限制)】
裸金屬:真正的物理服務(wù)器
容器優(yōu)勢:
- 敏捷性 敏捷應(yīng)用程序的創(chuàng)建和部署:與使用 VM 鏡像相比,提高了容器鏡像創(chuàng)建的簡便性和效率。
- 及時(shí)性 持續(xù)開發(fā)、集成和部署:通過快速簡單的回滾(由于鏡像不可變性),支持可靠且頻繁的 容器鏡像構(gòu)建和部署。
- **解耦性:**關(guān)注開發(fā)與運(yùn)維的分離:在構(gòu)建/發(fā)布時(shí)創(chuàng)建應(yīng)用程序容器鏡像,而不是在部署時(shí)。 從而將應(yīng)用程序與基礎(chǔ)架構(gòu)分離。
- 可觀測性 可觀察性不僅可以顯示操作系統(tǒng)級別的信息和指標(biāo),還可以顯示應(yīng)用程序的運(yùn)行狀況和其他指標(biāo)信號。
- 跨平臺 跨開發(fā)、測試和生產(chǎn)的環(huán)境一致性:在便攜式計(jì)算機(jī)上與在云中相同地運(yùn)行。
- 可移植 跨云和操作系統(tǒng)發(fā)行版本的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、 Google Kubernetes Engine 和其他任何地方運(yùn)行。
- 簡易性 以應(yīng)用程序?yàn)橹行牡墓芾恚禾岣叱橄蠹墑e,從在虛擬硬件上運(yùn)行 OS 到使用邏輯資源在 OS 上運(yùn)行應(yīng)用程序。
- 大分布式 松散耦合、分布式、彈性、解放的微服務(wù):應(yīng)用程序被分解成較小的獨(dú)立部分, 并且可以動態(tài)部署和管理 - 而不是在一臺大型單機(jī)上整體運(yùn)行。
- 隔離性 資源隔離:可預(yù)測的應(yīng)用程序性能。
- 高效性 資源利用:高效率和高密度
1.2、定義
Kubernetes 是一個(gè)可移植的、可擴(kuò)展的開源平臺,用于管理容器化的工作負(fù)載和服務(wù),可促進(jìn)聲明式配置和自動化。 Kubernetes 擁有一個(gè)龐大且快速增長的生態(tài)系統(tǒng)。Kubernetes 的服務(wù)、支持和工具廣泛可用。
1.3、Kubernetes提供的功能
-
服務(wù)發(fā)現(xiàn)和負(fù)載均衡
Kubernetes 可以使用 DNS 名稱或自己的 IP 地址公開容器,如果進(jìn)入容器的流量很大, Kubernetes 可以負(fù)載均衡并分配網(wǎng)絡(luò)流量,從而使部署穩(wěn)定。 -
存儲編排
Kubernetes 允許你自動掛載你選擇的存儲系統(tǒng),例如本地存儲、公共云提供商等。 -
自動部署和回滾
你可以使用 Kubernetes 描述已部署容器的所需狀態(tài),它可以以受控的速率將實(shí)際狀態(tài) 更改為期望狀態(tài)。例如,你可以自動化 Kubernetes 來為你的部署創(chuàng)建新容器, 刪除現(xiàn)有容器并將它們的所有資源用于新容器。 -
自動完成裝箱計(jì)算
Kubernetes 允許你指定每個(gè)容器所需 CPU 和內(nèi)存(RAM)。 當(dāng)容器指定了資源請求時(shí),Kubernetes 可以做出更好的決策來管理容器的資源。 -
自我修復(fù)
Kubernetes 重新啟動失敗的容器、替換容器、殺死不響應(yīng)用戶定義的 運(yùn)行狀況檢查的容器,并且在準(zhǔn)備好服務(wù)之前不將其通告給客戶端。 -
密鑰與配置管理
Kubernetes 允許你存儲和管理敏感信息,例如密碼、OAuth 令牌和 ssh 密鑰。 你可以在不重建容器鏡像的情況下部署和更新密鑰和應(yīng)用程序配置,也無需在堆棧配置中暴露密鑰
為了生產(chǎn)環(huán)境的容器化大規(guī)模應(yīng)用編排,必須有一個(gè)自動化的框架或系統(tǒng)
2、虛擬機(jī)快速搭建k8s集群
2.1、虛擬機(jī)配置(centos7 2G內(nèi)存2個(gè)處理器)
建議最小硬件配置:2核CPU、2G內(nèi)存、20G硬盤 服務(wù)器最好可以訪問
名稱 | IP |
---|---|
master | 192.168.40.128 |
node01 | 192.168.40.129 |
node02 | 192.168.40.130 |
2.2、基礎(chǔ)環(huán)境準(zhǔn)備
為三臺虛擬機(jī)設(shè)置主機(jī)名
hostnamectl set-hostname k8s-master / k8s-node01 / k8s-node02 ==> 三臺主機(jī)分別設(shè)置主機(jī)名
hostnamectl status
echo “127.0.0.1 $(hostname)” >> /etc/hosts
關(guān)閉 selinux
sed -i ‘s/enforcing/disabled/’ /etc/selinux/config
setenforce 0
關(guān)閉 swap
swapoff -a
sed -ri ‘s/.swap./#&/’ /etc/fstab
將橋接的 IPv4 流量傳遞到 iptables 的鏈
修改 /etc/sysctl.conf
如果有配置,則修改
sed -i “s#^net.ipv4.ip_forward.#net.ipv4.ip_forward=1#g" /etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-ip6tables.#net.bridge.bridge-nf-call-ip6tables=1#g” /etc/sysctl.conf
sed -i “s#^net.bridge.bridge-nf-call-iptables.#net.bridge.bridge-nf-call-iptables=1#g" /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.all.disable_ipv6.#net.ipv6.conf.all.disable_ipv6=1#g” /etc/sysctl.conf
sed -i “s#^net.ipv6.conf.default.disable_ipv6.#net.ipv6.conf.default.disable_ipv6=1#g" /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.lo.disable_ipv6.#net.ipv6.conf.lo.disable_ipv6=1#g” /etc/sysctl.conf
sed -i “s#^net.ipv6.conf.all.forwarding.*#net.ipv6.conf.all.forwarding=1#g” /etc/sysctl.conf
可能沒有,追加
echo “net.ipv4.ip_forward = 1” >> /etc/sysctl.conf
echo “net.bridge.bridge-nf-call-ip6tables = 1” >> /etc/sysctl.conf
echo “net.bridge.bridge-nf-call-iptables = 1” >> /etc/sysctl.conf
echo “net.ipv6.conf.all.disable_ipv6 = 1” >> /etc/sysctl.conf
echo “net.ipv6.conf.default.disable_ipv6 = 1” >> /etc/sysctl.conf
echo “net.ipv6.conf.lo.disable_ipv6 = 1” >> /etc/sysctl.conf
echo “net.ipv6.conf.all.forwarding = 1” >> /etc/sysctl.conf
執(zhí)行命令以應(yīng)用
sysctl -p
2.3、docker安裝(易踩坑)
# 1.卸載舊的版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2.安裝基本的安裝包
sudo yum install -y yum-utils
# 3.設(shè)置鏡像倉庫
sudo yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 阿里云鏡像
# 更像軟件包索引
yum makecache fast
# 4.安裝docker引擎
yum install docker-ce docker-ce-cli containerd.io # docker-ce 社區(qū)版 ee 企業(yè)版
# 5.啟動Docker
systemctl enable docker && systemctl start docker # 代表啟動成功
# 6.測試docker可以docker的常用命令
docker version
docker images
docker ps
# 7.配置鏡像加速
#配置docker加速
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
# 重啟docker
systemctl restart docker
# 查看docker信息
docker info
2.4、安裝k8s組件
配置軟件源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安裝指定版本并啟動
yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0
systemctl enable kubelet && systemctl start kubelet
2.5、master節(jié)點(diǎn)部署
192.168.40.128換成自己主節(jié)點(diǎn)的IP地址
kubeadm init \
--apiserver-advertise-address=192.168.40.128 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all
######按照提示繼續(xù)######
## init完成后第一步:復(fù)制相關(guān)文件夾
## To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
## 導(dǎo)出環(huán)境變量
## Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
2.6、部署網(wǎng)絡(luò)插件
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
2.7、2臺node節(jié)點(diǎn)的虛機(jī)加入主節(jié)點(diǎn)
##在兩臺node節(jié)點(diǎn)虛擬機(jī)上執(zhí)行master節(jié)點(diǎn)kubeadm init 后生成的join代碼
kubeadm join 192.168.40.128:6443 --token ixvxxd.oamu833eimbkvwt6 --discovery-token-ca-cert-hash sha256:fb6c95e8999315d12267287162973c08e319c731ac5f706d22199b2dfe08b8c2
**建議先重啟node上的kubeadm**
kubeadm reset
## 過期怎么辦
kubeadm token create --print-join-command
kubeadm token create --ttl 0 --print-join-command
kubeadm join --token y1eyw5.ylg568kvohfdsfco --discovery-token-ca-cert-hash sha256: 6c35e4f73f72afd89bf1c8c303ee55677d2cdb1342d67bb23c852aba2efc7c73
2.8、驗(yàn)證集群是否部署成功
#獲取所有節(jié)點(diǎn)
kubectl get nodes
#給節(jié)點(diǎn)打標(biāo)簽
## k8s中萬物皆對象。node:機(jī)器 Pod:應(yīng)用容器
###加標(biāo)簽
kubectl label node k8s-02 node-role.kubernetes.io/worker=''
###去標(biāo)簽
kubectl label node k8s-02 node-role.kubernetes.io/worker-
## k8s集群,機(jī)器重啟了會自動再加入集群,master重啟了會自動再加入集群控制中心
2.9、設(shè)置ipvs模式
k8s整個(gè)集群為了訪問通;默認(rèn)是用iptables,性能下(kube-proxy在集群之間同步iptables的內(nèi)容)
#1、查看默認(rèn)kube-proxy 使用的模式
kubectl logs -n kube-system kube-proxy-28xv4
#2、需要修改 kube-proxy 的配置文件,修改mode 為ipvs。默認(rèn)iptables,但是集群大了以后就很慢
kubectl edit cm kube-proxy -n kube-system
修改如下
ipvs:
excludeCIDRs: null
minSyncPeriod: 0s
scheduler: ""
strictARP: false
syncPeriod: 30s
kind: KubeProxyConfiguration
metricsBindAddress: 127.0.0.1:10249
mode: "ipvs"
###修改了kube-proxy的配置,為了讓重新生效,需要?dú)⒌粢郧暗腒ube-proxy
kubectl get pod -A|grep kube-proxy
kubectl delete pod kube-proxy-pqgnt -n kube-system
### 修改完成后可以重啟kube-proxy以生效
3、集群管理方式
3.1、分類方式
主從:
(1)主從同步/復(fù)制 (MYSQL 主 – MYSQL 從 => MYSQL就是典型的主從同步方式)
(2)主管理從 (K8S屬于主管理從的方式)
分片 :也叫數(shù)據(jù)集群
(1)每個(gè)機(jī)器上都一樣
(2)每個(gè)機(jī)器都之存儲一部分東西,所有機(jī)器上的數(shù)據(jù)加起來是完整的
3.2、master-node 架構(gòu)
master 和 worker怎么交互
master決定worker里面都有什么
worker只是和master (API) 通信; 每一個(gè)節(jié)點(diǎn)自己干自己的活
程序員使用UI或者CLI操作k8s集群的master,就可以知道整個(gè)集群的狀況
4、K8S工作原理和組件介紹
4.1、結(jié)構(gòu)圖
4.2、基本組件介紹
master節(jié)點(diǎn)(Control Plane【控制面板】):master節(jié)點(diǎn)控制整個(gè)集群
master節(jié)點(diǎn)上有一些核心組件:
- Controller Manager:控制管理器
- etcd:鍵值數(shù)據(jù)庫(redis)【記賬本,記事本】
- scheduler:調(diào)度器
- api server:api網(wǎng)關(guān)(所有的控制都需要通過api-server)
node節(jié)點(diǎn)(worker工作節(jié)點(diǎn)):
- kubelet(監(jiān)工):每一個(gè)node節(jié)點(diǎn)上必須安裝的組件。
- kube-proxy:代理, 代理網(wǎng)絡(luò)
4.3、部署一個(gè)應(yīng)用在K8S底層的全流程
開發(fā)人員:調(diào)用CLI或者使用K8S頁面管理工具告訴master,我們現(xiàn)在要部署一個(gè)tomcat應(yīng)用
- 程序員的所有調(diào)用都先去master節(jié)點(diǎn)的網(wǎng)關(guān)api-server,這是matser的唯一入口(類似于mvc模式中的c層)
- 收到的請求先交給master的api-server,由api-server交給controller-mannager進(jìn)行控制
- controller-mannager 進(jìn)行 應(yīng)用部署
- controller-mannager 會生成一次部署信息。 tomcat --image:tomcat6 --port 8080, 但是真正不部署應(yīng)用
- 部署信息被記錄在etcd中
- scheduler調(diào)度器從etcd數(shù)據(jù)庫中,拿到要部署的應(yīng)用,開始調(diào)度,然后看哪個(gè)節(jié)點(diǎn)比較合適
- scheduler把算出來的調(diào)度信息再放到etcd中
- 每一個(gè)node節(jié)點(diǎn)的監(jiān)控kubelet,隨時(shí)和master保持聯(lián)系的(給api-server發(fā)送請求不斷獲取最新數(shù)據(jù)),所有節(jié)點(diǎn)的kubelet就會從master
- 假設(shè)node2的kubelet最終收到了命令,要部署。
- kubelet就自己run一個(gè)應(yīng)用在當(dāng)前機(jī)器上,隨時(shí)給master匯報(bào)當(dāng)前應(yīng)用的狀態(tài)信息,分配ip
- node和master是通過master的api-server聯(lián)系的
- 每一個(gè)機(jī)器上的kube-proxy能知道集群的所有網(wǎng)絡(luò),只要node訪問別人或者別人訪問node,node上的kube-proxy網(wǎng)絡(luò)代理自動計(jì)算進(jìn)行流量轉(zhuǎn)發(fā)
下圖和上圖一樣的,再理解一下
4.4、原理分解
4.4.1、主節(jié)點(diǎn)(master)
快速介紹:
- master也要裝kubelet和kubeproxy
- 前端訪問(UI\CLI):
- kube-apiserver:
- scheduler:
- controller manager:
- etcd
- kubelet+kubeproxy每一個(gè)節(jié)點(diǎn)的必備+docker(容器運(yùn)行時(shí)環(huán)境)
4.4.2、工作節(jié)點(diǎn)(node)
快速介紹:文章來源:http://www.zghlxwxcb.cn/news/detail-656045.html
- Pod:
- docker run 啟動的是一個(gè)container(容器),容器是docker的基本單位,一個(gè)應(yīng)用是一個(gè)容器
- kubelet run 啟動的一個(gè)應(yīng)用稱為一個(gè)Pod;Pod是k8s的基本單位。
- Pod是容器的一個(gè)再封裝
- 應(yīng)用 => pod => docker的容器
- 一個(gè)容器往往代表不了一個(gè)基本應(yīng)用。博客(php+mysql合起來完成)
- 準(zhǔn)備一個(gè)Pod 可以包含多個(gè) container;一個(gè)Pod代表一個(gè)基本的應(yīng)用。
- IPod(看電影、聽音樂、玩游戲)【一個(gè)基本產(chǎn)品,原子】
- Pod(music container、movie container)【一個(gè)基本產(chǎn)品,原子的】
- Kubelet:監(jiān)工,負(fù)責(zé)交互master的api-server以及當(dāng)前機(jī)器的應(yīng)用啟停等,在master機(jī)器就是master的小助手。每一臺機(jī)器真正干活的都是這個(gè) Kubelet
- Kube-proxy:
4.5、組件交互原理
部署流程再說明文章來源地址http://www.zghlxwxcb.cn/news/detail-656045.html
想讓k8s部署一個(gè)tomcat?
0、開機(jī)默認(rèn)所有節(jié)點(diǎn)的kubelet、master節(jié)點(diǎn)的scheduler(調(diào)度器)、controller-manager(控制管理器)一直監(jiān)聽master的api-server發(fā)來的事件變化(for ::)
1、程序員使用命令行工具: kubectl ; kubectl create deploy tomcat --image=tomcat8(告訴master讓集群使用tomcat8鏡像,部署一個(gè)tomcat應(yīng)用)
2、kubectl命令行內(nèi)容發(fā)給api-server,api-server保存此次創(chuàng)建信息到etcd
3、etcd給api-server上報(bào)事件,說剛才有人給我里面保存一個(gè)信息。(部署Tomcat[deploy])
4、controller-manager監(jiān)聽到api-server的事件,是 (部署Tomcat[deploy])
5、controller-manager 處理這個(gè) (部署Tomcat[deploy])的事件。controller-manager會生成Pod的部署信息【pod信息】
6、controller-manager 把Pod的信息交給api-server,再保存到etcd
7、etcd上報(bào)事件【pod信息】給api-server。
8、scheduler專門監(jiān)聽 【pod信息】 ,拿到 【pod信息】的內(nèi)容,計(jì)算,看哪個(gè)節(jié)點(diǎn)合適部署這個(gè)Pod【pod調(diào)度過后的信息(node: node-02)】,
9、scheduler把 【pod調(diào)度過后的信息(node: node-02)】交給api-server保存給etcd
10、etcd上報(bào)事件【pod調(diào)度過后的信息(node: node-02)】,給api-server
11、其他節(jié)點(diǎn)的kubelet專門監(jiān)聽 【pod調(diào)度過后的信息(node: node-02)】 事件,集群所有節(jié)點(diǎn)kubelet從api-server就拿到了 【pod調(diào)度過后的信息(node: node-02)】 事件
12、每個(gè)節(jié)點(diǎn)的kubelet判斷是否屬于自己的事情;node-02的kubelet發(fā)現(xiàn)是他的事情
13、node-02的kubelet啟動這個(gè)pod。匯報(bào)給master當(dāng)前啟動好的所有信息
到了這里,關(guān)于k8s簡介及虛擬機(jī)快速搭建k8s集群的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!