文章目錄
- 1、k8s簡介
- 1.1、部署方式的變遷
- 1.2、定義
- 1.3、Kubernetes提供的功能
- 2、虛擬機快速搭建k8s集群
- 2.1、虛擬機配置(centos7 2G內存2個處理器)
- 2.2、基礎環境準備
- 2.3、docker安裝(易踩坑)
- 2.4、安裝k8s組件
- 2.5、master節點部署
- 2.6、部署網絡插件
- 2.7、2臺node節點的虛機加入主節點
- 2.8、驗證集群是否部署成功
- 2.9、設置ipvs模式
- 3、集群管理方式
- 3.1、分類方式
- 3.2、master-node 架構
- 4、K8S工作原理和組件介紹
- 4.1、結構圖
- 4.2、基本組件介紹
- 4.3、部署一個應用在K8S底層的全流程
- 4.4、原理分解
- 4.4.1、主節點(master)
- 4.4.2、工作節點(node)
- 4.5、組件交互原理
1、k8s簡介
1.1、部署方式的變遷
- 傳統部署時代:
- 在物理服務器上運行應用程序
- 無法為應用程序定義資源邊界
- 導致資源分配問題
例如,如果在物理服務器上運行多個應用程序,則可能會出現一個應用程序占用大部分資源的情況, 結果可能導致其他應用程序的性能下降。 一種解決方案是在不同的物理服務器上運行每個應用程序,但是由于資源利用不足而無法擴展, 并且維護許多物理服務器的成本很高。
- 虛擬化部署時代:
- 作為解決方案,引入了虛擬化
- 虛擬化技術允許你在單個物理服務器的 CPU 上運行多個虛擬機(VM)
- 虛擬化允許應用程序在 VM 之間隔離,并提供一定程度的安全
- 一個應用程序的信息 不能被另一應用程序隨意訪問。
- 虛擬化技術能夠更好地利用物理服務器上的資源
- 因為可輕松地添加或更新應用程序 ,所以可以實現更好的可伸縮性,降低硬件成本等等。
- 每個 VM 是一臺完整的計算機,在虛擬化硬件之上運行所有組件,包括其自己的操作系統。
缺點:虛擬層冗余導致的資源浪費與性能下降
- 容器部署時代:
- 容器類似于 VM,但可以在應用程序之間共享操作系統(OS)。
- 容器被認為是輕量級的。
- 容器與 VM 類似,具有自己的文件系統、CPU、內存、進程空間等。
- 由于它們與基礎架構分離,因此可以跨云和 OS 發行版本進行移植。
- 參照【Docker隔離原理- namespace 6項隔離(資源隔離)與 cgroups 8項資源限制(資源限制)】
裸金屬:真正的物理服務器
容器優勢:
- 敏捷性 敏捷應用程序的創建和部署:與使用 VM 鏡像相比,提高了容器鏡像創建的簡便性和效率。
- 及時性 持續開發、集成和部署:通過快速簡單的回滾(由于鏡像不可變性),支持可靠且頻繁的 容器鏡像構建和部署。
- **解耦性:**關注開發與運維的分離:在構建/發布時創建應用程序容器鏡像,而不是在部署時。 從而將應用程序與基礎架構分離。
- 可觀測性 可觀察性不僅可以顯示操作系統級別的信息和指標,還可以顯示應用程序的運行狀況和其他指標信號。
- 跨平臺 跨開發、測試和生產的環境一致性:在便攜式計算機上與在云中相同地運行。
- 可移植 跨云和操作系統發行版本的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、 Google Kubernetes Engine 和其他任何地方運行。
- 簡易性 以應用程序為中心的管理:提高抽象級別,從在虛擬硬件上運行 OS 到使用邏輯資源在 OS 上運行應用程序。
- 大分布式 松散耦合、分布式、彈性、解放的微服務:應用程序被分解成較小的獨立部分, 并且可以動態部署和管理 - 而不是在一臺大型單機上整體運行。
- 隔離性 資源隔離:可預測的應用程序性能。
- 高效性 資源利用:高效率和高密度
1.2、定義
Kubernetes 是一個可移植的、可擴展的開源平臺,用于管理容器化的工作負載和服務,可促進聲明式配置和自動化。 Kubernetes 擁有一個龐大且快速增長的生態系統。Kubernetes 的服務、支持和工具廣泛可用。
1.3、Kubernetes提供的功能
-
服務發現和負載均衡
Kubernetes 可以使用 DNS 名稱或自己的 IP 地址公開容器,如果進入容器的流量很大, Kubernetes 可以負載均衡并分配網絡流量,從而使部署穩定。 -
存儲編排
Kubernetes 允許你自動掛載你選擇的存儲系統,例如本地存儲、公共云提供商等。 -
自動部署和回滾
你可以使用 Kubernetes 描述已部署容器的所需狀態,它可以以受控的速率將實際狀態 更改為期望狀態。例如,你可以自動化 Kubernetes 來為你的部署創建新容器, 刪除現有容器并將它們的所有資源用于新容器。 -
自動完成裝箱計算
Kubernetes 允許你指定每個容器所需 CPU 和內存(RAM)。 當容器指定了資源請求時,Kubernetes 可以做出更好的決策來管理容器的資源。 -
自我修復
Kubernetes 重新啟動失敗的容器、替換容器、殺死不響應用戶定義的 運行狀況檢查的容器,并且在準備好服務之前不將其通告給客戶端。 -
密鑰與配置管理
Kubernetes 允許你存儲和管理敏感信息,例如密碼、OAuth 令牌和 ssh 密鑰。 你可以在不重建容器鏡像的情況下部署和更新密鑰和應用程序配置,也無需在堆棧配置中暴露密鑰
為了生產環境的容器化大規模應用編排,必須有一個自動化的框架或系統
2、虛擬機快速搭建k8s集群
2.1、虛擬機配置(centos7 2G內存2個處理器)
建議最小硬件配置:2核CPU、2G內存、20G硬盤 服務器最好可以訪問
名稱 | IP |
---|---|
master | 192.168.40.128 |
node01 | 192.168.40.129 |
node02 | 192.168.40.130 |
2.2、基礎環境準備
為三臺虛擬機設置主機名
hostnamectl set-hostname k8s-master / k8s-node01 / k8s-node02 ==> 三臺主機分別設置主機名
hostnamectl status
echo “127.0.0.1 $(hostname)” >> /etc/hosts
關閉 selinux
sed -i ‘s/enforcing/disabled/’ /etc/selinux/config
setenforce 0
關閉 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
執行命令以應用
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.設置鏡像倉庫
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 社區版 ee 企業版
# 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節點部署
192.168.40.128換成自己主節點的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######按照提示繼續######
## init完成后第一步:復制相關文件夾
## 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
## 導出環境變量
## Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
2.6、部署網絡插件
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
2.7、2臺node節點的虛機加入主節點
##在兩臺node節點虛擬機上執行master節點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、驗證集群是否部署成功
#獲取所有節點
kubectl get nodes#給節點打標簽
## k8s中萬物皆對象。node:機器 Pod:應用容器
###加標簽
kubectl label node k8s-02 node-role.kubernetes.io/worker=''
###去標簽
kubectl label node k8s-02 node-role.kubernetes.io/worker-
## k8s集群,機器重啟了會自動再加入集群,master重啟了會自動再加入集群控制中心
2.9、設置ipvs模式
k8s整個集群為了訪問通;默認是用iptables,性能下(kube-proxy在集群之間同步iptables的內容)#1、查看默認kube-proxy 使用的模式
kubectl logs -n kube-system kube-proxy-28xv4
#2、需要修改 kube-proxy 的配置文件,修改mode 為ipvs。默認iptables,但是集群大了以后就很慢
kubectl edit cm kube-proxy -n kube-system
修改如下ipvs:excludeCIDRs: nullminSyncPeriod: 0sscheduler: ""strictARP: falsesyncPeriod: 30skind: KubeProxyConfigurationmetricsBindAddress: 127.0.0.1:10249mode: "ipvs"###修改了kube-proxy的配置,為了讓重新生效,需要殺掉以前的Kube-proxykubectl get pod -A|grep kube-proxykubectl delete pod kube-proxy-pqgnt -n kube-system
### 修改完成后可以重啟kube-proxy以生效
文章目錄
- 1、k8s簡介
- 1.1、部署方式的變遷
- 1.2、定義
- 1.3、Kubernetes提供的功能
- 2、虛擬機快速搭建k8s集群
- 2.1、虛擬機配置(centos7 2G內存2個處理器)
- 2.2、基礎環境準備
- 2.3、docker安裝(易踩坑)
- 2.4、安裝k8s組件
- 2.5、master節點部署
- 2.6、部署網絡插件
- 2.7、2臺node節點的虛機加入主節點
- 2.8、驗證集群是否部署成功
- 2.9、設置ipvs模式
- 3、集群管理方式
- 3.1、分類方式
- 3.2、master-node 架構
- 4、K8S工作原理和組件介紹
- 4.1、結構圖
- 4.2、基本組件介紹
- 4.3、部署一個應用在K8S底層的全流程
- 4.4、原理分解
- 4.4.1、主節點(master)
- 4.4.2、工作節點(node)
- 4.5、組件交互原理
3、集群管理方式
3.1、分類方式
主從:
(1)主從同步/復制 (MYSQL 主 – MYSQL 從 => MYSQL就是典型的主從同步方式)
(2)主管理從 (K8S屬于主管理從的方式)
分片 :也叫數據集群
(1)每個機器上都一樣
(2)每個機器都之存儲一部分東西,所有機器上的數據加起來是完整的
3.2、master-node 架構
master 和 worker怎么交互
master決定worker里面都有什么
worker只是和master (API) 通信; 每一個節點自己干自己的活
程序員使用UI或者CLI操作k8s集群的master,就可以知道整個集群的狀況
4、K8S工作原理和組件介紹
4.1、結構圖
4.2、基本組件介紹
master節點(Control Plane【控制面板】):master節點控制整個集群master節點上有一些核心組件:- Controller Manager:控制管理器
- etcd:鍵值數據庫(redis)【記賬本,記事本】
- scheduler:調度器
- api server:api網關(所有的控制都需要通過api-server)node節點(worker工作節點):- kubelet(監工):每一個node節點上必須安裝的組件。
- kube-proxy:代理, 代理網絡
4.3、部署一個應用在K8S底層的全流程
開發人員:調用CLI或者使用K8S頁面管理工具告訴master,我們現在要部署一個tomcat應用- 程序員的所有調用都先去master節點的網關api-server,這是matser的唯一入口(類似于mvc模式中的c層)
- 收到的請求先交給master的api-server,由api-server交給controller-mannager進行控制
- controller-mannager 進行 應用部署
- controller-mannager 會生成一次部署信息。 tomcat --image:tomcat6 --port 8080, 但是真正不部署應用
- 部署信息被記錄在etcd中
- scheduler調度器從etcd數據庫中,拿到要部署的應用,開始調度,然后看哪個節點比較合適
- scheduler把算出來的調度信息再放到etcd中
- 每一個node節點的監控kubelet,隨時和master保持聯系的(給api-server發送請求不斷獲取最新數據),所有節點的kubelet就會從master
- 假設node2的kubelet最終收到了命令,要部署。
- kubelet就自己run一個應用在當前機器上,隨時給master匯報當前應用的狀態信息,分配ip
- node和master是通過master的api-server聯系的
- 每一個機器上的kube-proxy能知道集群的所有網絡,只要node訪問別人或者別人訪問node,node上的kube-proxy網絡代理自動計算進行流量轉發
下圖和上圖一樣的,再理解一下
4.4、原理分解
4.4.1、主節點(master)
快速介紹:
- master也要裝kubelet和kubeproxy
- 前端訪問(UI\CLI):
- kube-apiserver:
- scheduler:
- controller manager:
- etcd
- kubelet+kubeproxy每一個節點的必備+docker(容器運行時環境)
4.4.2、工作節點(node)
快速介紹:
- Pod:
- docker run 啟動的是一個container(容器),容器是docker的基本單位,一個應用是一個容器
- kubelet run 啟動的一個應用稱為一個Pod;Pod是k8s的基本單位。
- Pod是容器的一個再封裝
- 應用 => pod => docker的容器
- 一個容器往往代表不了一個基本應用。博客(php+mysql合起來完成)
- 準備一個Pod 可以包含多個 container;一個Pod代表一個基本的應用。
- IPod(看電影、聽音樂、玩游戲)【一個基本產品,原子】
- Pod(music container、movie container)【一個基本產品,原子的】
- Kubelet:監工,負責交互master的api-server以及當前機器的應用啟停等,在master機器就是master的小助手。每一臺機器真正干活的都是這個 Kubelet
- Kube-proxy:
4.5、組件交互原理
部署流程再說明
想讓k8s部署一個tomcat?0、開機默認所有節點的kubelet、master節點的scheduler(調度器)、controller-manager(控制管理器)一直監聽master的api-server發來的事件變化(for ::)1、程序員使用命令行工具: kubectl ; kubectl create deploy tomcat --image=tomcat8(告訴master讓集群使用tomcat8鏡像,部署一個tomcat應用)2、kubectl命令行內容發給api-server,api-server保存此次創建信息到etcd3、etcd給api-server上報事件,說剛才有人給我里面保存一個信息。(部署Tomcat[deploy])4、controller-manager監聽到api-server的事件,是 (部署Tomcat[deploy])5、controller-manager 處理這個 (部署Tomcat[deploy])的事件。controller-manager會生成Pod的部署信息【pod信息】6、controller-manager 把Pod的信息交給api-server,再保存到etcd7、etcd上報事件【pod信息】給api-server。8、scheduler專門監聽 【pod信息】 ,拿到 【pod信息】的內容,計算,看哪個節點合適部署這個Pod【pod調度過后的信息(node: node-02)】,9、scheduler把 【pod調度過后的信息(node: node-02)】交給api-server保存給etcd10、etcd上報事件【pod調度過后的信息(node: node-02)】,給api-server11、其他節點的kubelet專門監聽 【pod調度過后的信息(node: node-02)】 事件,集群所有節點kubelet從api-server就拿到了 【pod調度過后的信息(node: node-02)】 事件12、每個節點的kubelet判斷是否屬于自己的事情;node-02的kubelet發現是他的事情13、node-02的kubelet啟動這個pod。匯報給master當前啟動好的所有信息