一、kubernetes
1、簡介
kubernetes,簡稱K8s(庫伯內特),是用8代替名字中間的8個字符“ubernete”而成的縮寫
云計算的三種主要服務模式——基礎設施即服務(IaaS)、平臺即服務(PaaS)和軟件即服務(SaaS)
Kubernetes是一個應用于大規模部署你分布式應用的平臺,它管理著一系列的主機或服務器(Node節點),節點中最小單元Pod
- Kubernetes 是一個可移植的、可擴展的開源平臺,用于管理容器化的工作負載和服務,可促進聲明式配置和自動化。Kubernetes 擁有一個龐大且快速增長的生態系統。Kubernetes 的服務、支持和工具廣泛可用。
- Kubernetes 這個名字源于希臘語,意為
“舵手”
或“飛行員”
。k8s 這個縮寫是因為 k 和 s 之間有八個字符的關系。 Google 在 2014 年開源了 Kubernetes 項目。Kubernetes 建立在Google 在大規模運行生產工作負載方面擁有十幾年的經驗的基礎上,結合了社區中最好的想法和實踐
官網地址:https://kubernetes.io/
為什么使用K8s
-
容器是打包和運行應用程序的最佳方式,在生產環境中,我們需要管理運行應用程序的容器,并且確保這些容器不會停機。如果一個容器發生了故障,則需要手動啟動另一個容器,太麻煩了;如果有一個系統能夠幫助我們處理這些行為,是不是會很方便?
-
Kubernetes 就能解決上面提出的一系列的問題。Kubernetes 為我們提供了一個可彈性運行的分布式系統的框架,Kubernetes 可以滿足我們的擴展要求、故障轉移、部署模式等,如:Kubernetes 可以輕松管理系統的 Canary(金絲雀) 部署。
-
Kubernetes 為我們提供下面的功能:
-
①
服務發現和負載均衡
:Kubernetes 可以使用 DNS 名稱或自己的 IP 地址公開容器,如果進入容器的流量很大,Kubernetes 可以負載均衡并分配網絡流量,從而使得部署穩定。 -
②
存儲編排
:Kubernetes 允許我們自動掛載自己選擇的存儲系統,如:本地存儲、公有云提供商等。 -
③
自動部署和回滾
:我們可以使用 Kubernetes 描述已部署容器的所需狀態,Kubernetes 可以以受控的速率將實際狀態更改為期望狀態,如:我們可以自動化 Kubernetes 來為我們的部署創建新的容器,刪除現有容器并將它們的所有資源用于新的容器。 -
④
自動完成裝箱計算
:Kubernetes 允許我們指定每個容器所需要的 CPU 和內存(RAM)。當容器指定了資源請求時,Kubernetes 可以做出更好的決策來管理容器的資源。 -
⑤
自我修復
:Kubernetes 重新啟動失敗的容器、替換容器、殺死不響應用戶定義的運行狀況檢查的容器,并且在準備好服務之前不將其通告給客戶端。 -
⑥
密鑰和配置管理
:Kubernetes 允許我們存儲和管理敏感信息,如:密碼、OAuth2 令牌和 SSH 密鑰。我們可以在不重建容器鏡像的情況下部署和更新密鑰和應用程序配置,也無需再堆棧配置中暴露密鑰。
2、Kubernetes的特點:
1、自我修復在節點故障時重新啟動失敗的容器,替換和重新部署,保證預期的副本數量;殺死健康檢查失敗的容器,并且在未準備好之前不會處理客戶端的請求,確保線上服務不中斷。2、彈性收縮使用命令、UI 或者基于 CPU 使用情況自動快速擴容和縮容應用程序實例,保證應用業務高峰并發時的高可用性;業務低峰時回收資源,以最小成本運行服務。3、自動部署和回滾采用滾動更新策略更新應用,一次更新一個 Pod,而不是同時刪除所有 Pod,如果更新過程中出現問題,將回滾更改,確保升級升級過程中不影響業務運行4、服務發現和負載均衡能夠為多個容器提供統一訪問入庫(內部 IP 地址和一個 DNS 名稱),并且負載均衡關聯所有容器,使用戶無需考慮容器 IP 的問題5、存儲編排能夠掛載外部存儲系統,無論是來自本地存儲,公有云(如:AWS),還是網絡存儲(如:NFS、ClusterFS、Ceph)都可以作為集群資源的一部分使用,極大提供存儲使用的靈活
3、K8S集群原理
- Master 節點(Control Plane【控制面板】):Master 節點控制整個集群。
- Controller Manager:控制管理器。
- etcd:鍵值數據庫,類似于 Redis。
- scheduler:調度器。
- api-server:api網關(所有的控制都需要通過api-server)。
- Node 節點(worker工作節點):
- kubelet(監工):每一個 Node 節點上必須安裝的組件,負責交互 master 的 api-server 以及當前機器的應用啟停等,在 master 機器就是 master 的小助手。每一臺機器真正干活的都是這個 Kubelet 。
- kube-proxy:代理網絡。
- Pod:
- docker run 啟動的是一個 container(容器),容器是 Docker 的基本單位,一個應用就是一個容器。
- kubectl run 啟動的是一個應用稱為一個 Pod ,Pod 是 Kubernetes 的基本單位。
- Pod 是對容器的再一次封裝。
- Pod 類似于 Java 日志體系中的 Slf4j ,而 Docker 中的容器類似于 Java 日志體系中的 Logback 等日志實現。
- 一個容器往往代表不了一個基本應用,如:博客系統(WordPress,PHP + MySQL);但是一個 Pod 可以包含多個 Container,一個 Pod 可以代表一個基本的應用。
4、主控節點 / Master 組件
kubectl: 命令行工具
Dashboard: 可視化界面
api-server: 接口服務,給予REST風格開放,K8S接口的服務,集群統一入口,各組件的協調者,提供認證、授權、訪問控制、API注冊和發現等機制,以 RESTful API 的方式提供接口服務,所有對象資源的增刪改查和監聽都由 API Server 處理后提交給 Etcd 存儲。
controller-manager:控制器管理器,負責各個類型的控制器針對k8S 中的各種資源進行管理,控制器管理程序,負責控制器的管理,控制器和資源一一對應,控制器用于維護集群的狀態,如:故障檢測、自動擴展、滾動更新等常規后臺任務。
cloud-controller-manager: 云控制器管理器,第三方云平臺提供控制API對接管理功能
kube-scheduler: 調度程序,負責資源的調度,按照預定的調度策略將 Pod 調度到相應的機器上,調度程序根據調度算法為新創建的 Pod 選擇一個 Node 節點,可以任意部署,可以部署在同一個節點上,也可以部署在不同的節點上Etcd Cluster:分布式鍵值存儲系統集群,用于保存集群狀態數據,如:Pod、Service 等資源對象信息。
5、工作節點 / Node 組件
1)Kubelet:主控節點代理程序,在 Node 節點上執行 Master 節點安排的任務,它將每個 Pod 轉換成一組容器,用于管理本節點運行容器的生命周期,如:創建容器、Pod 掛載數據卷、下載 Secret 、獲取容器和節點狀態等工作。2)Kube-Proxy:網絡代理程序,在 Node 節點上實現 Pod 網絡代理,負責為 Service 提供 Cluster 內部的服務發現、網絡規劃和負載均衡。3)container-runtime: Docker容器引擎,負責所有具體的映像下載和容器運行、containerd、CRI-O4)Pod: 容器1 容器2
7、第三方插件
1)Flannel Finnal 是一個為 K8s 原生集成的三層網絡解決方案,主要用于解決容器之間的網絡(CNI 網絡)通信問題,Flannel 為每個 Node 工作節點分配獨立的子網網段,并將所有的網絡信息存儲在 Etcd 數據庫中。脫離 CNI 網絡的 K8s 集群是無法工作的,因此在部署 K8s 集群時必須部署 Flannel 插件。2)CoreDN SCoreDNS 是一個為 K8s 原生集成的域名發現解決方案,主要用于將 K8s 服務的動態 IP 地址自動映射成為 "<service-name>:<service-namespace>" 規則的 DNS 域名。因 K8s 在創建服務時會分配動態的 IP 地址,因此當在【B 容器 】中使用【A 容器】發布的服務,因為【A 容器】的服務對應的 IP 是動態可變的,所以應當通過該服務對應的 DNS 獲取,例如:"htp(s)://:"。3)Dashboard Dashboard 是一個為 K8s 原生集成的用戶界面,主要用于 K8s 的可視化管理。使用 Dashboard 可以監控、管理 K8s 集群和集群中的各類資源(如 Deployment,Job,DaemonSet 等等),還可以完成對 Deployment 實現彈性伸縮、發起滾動升級、重啟 Pod 或者使用向導創建新應用等管理行為。4)Ingress-Nginx Ingress-Nginx 是一個為 K8s 原生集成的服務網關,主要用于對集群中的服務(通常是 Http 或 Https 服務)的外部訪問的 API 對象,以及提供負載平衡、SSL 終端和基于名稱的虛擬主機
8、應用場景
K8s 主要應用于云架構和云原生的部署場景。
“云” 是使用容器構建的一套服務集群網絡,它由很多的容器構成;
“K8s” 則是用來管理云中的容器平臺工具
1、云架構
PaaS(平臺即服務): 運營商提供 MySQL 、Redis、MQ、Elasticsearch 等數據庫或中間件等服務;用戶租用(購買或分配權限)后直接使用。
SaaS(軟件即服務):運營商提供應用系統的部署和發布等服務;用戶租用(購買或分配權限)后直接使用
2、云原生
為了讓應用程序(項目,服務軟件)都運行在云上的解決方案,這樣方案叫做云原生,有以下特點:容器化:所有的服務都必須部署在容器中;微服務:Web 服務架構是微服務架構;CI/CD:可持續交互和可持續部署;DevOps:開發和運維密不可分
二、K8s環境安裝
一、前期準備
K8s-master01 k8s-node1 k8s-node02
kubernetes 版本: 1.23.6
Docker版本:20+
k8s: 1.23.6
docker官網版本:20.10.0 https://docs.docker.com/engine/release-notes/20.10/
清華云:docker下載離線版本https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/static/stable/x86_64/
-
根據Kubernetes官方文檔和相關可靠資源,以下是一些常見Kubernetes版本推薦的Docker版本:
- Kubernetes 1.13 到 1.19:推薦使用Docker 1.13.1 到 19.03.x版本。
- Kubernetes 1.20:推薦使用Docker 1.13.1 到 19.03.x版本,但Kubernetes官方開始逐步廢棄對Docker作為容器運行時的直接支持。
- Kubernetes 1.21 到 1.22:推薦使用Docker 1.19.3 到 20.10.x版本。
- Kubernetes 1.23及以上版本:建議使用符合容器運行時接口(CRI)的運行時,如containerd或CRI-O,不再支持Docker作為容器運行時。
2.注意事項?:
-
從Kubernetes 1.20開始,Kubernetes官方逐步廢棄了對Docker作為容器運行時的直接支持。對于Kubernetes 1.23及更高版本,kubeadm默認使用containerd作為容器運行時,不再支持Docker。
-
如果你的集群仍在使用Docker作為容器運行時,建議盡快遷移到CRI兼容的運行時,以確保與Kubernetes的兼容性。
K8S-master01:
centos7、2CPU、4G 內存、40G存儲空間(將虛擬機磁盤存儲為單個文件)、NAT模式、帶GUI服務器安裝、打開網卡
K8S-node01:
centos7、2G 內存、40G存儲空間(將虛擬機磁盤存儲為單個文件)、NAT模式、帶GUI服務器安裝、打開網卡
K8S-node02:
centos7、2G 內存、40G存儲空間(將虛擬機磁盤存儲為單個文件)、NAT模式、帶GUI服務器安裝、打開網卡
最終目標
在所有節點上安裝Docker 和kubeadm
部署Kubernetes Master
部署容器網絡插件
部署Kubernetes Node,將節點加入Kubernetes 集群中
部署Dashboard Web 頁面,可視化查看Kubernetes 資源
二、虛擬機安裝完畢進入linux操作系統-所有的節點及master配置
現在centos7不支持更新了換yum源,更新阿里云yum源
[root@localhost ~]# rm -rf /etc/yum.repos.d/*
[root@localhost ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@localhost ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@localhost ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@localhost ~]# yum repolist -v
1、最小安裝沒有ifconfig命令: yum search ifconfig提示包名為: net-tools.x86_64使用yum安裝: yum -y install net-tools.x86_64沒有vim命令: yum -y install vim*
2、關閉防火墻[root@localhost ~]# systemctl stop firewalld[root@localhost ~]# systemctl disable firewalld3、關閉SELINUX:[root@k8smaster ~]# vi /etc/selinux/configSELINUX=disabled4、關閉swap:
[root@k8smaster ~]# swapoff -a
[root@k8smaster ~]# vim /etc/fstab 關閉swap那行 ##/dev/mapper/centos-swap swap swap分區指的是虛擬內存分區,它的作用是在物理內存使用完之后,將磁盤空間虛擬成內存來使用啟用swap設備會對系統的性能產生非常負面的影響,因此kubernetes要求每個節點都要禁用swap設備但是如果因為某些原因確實不能關閉swap分區,就需要在集群安裝過程中通過明確的參數進行配置說明 5、設置主機名
[root@k8s-master ~]# hostnamectl set-hostname k8s-master
[root@k8s-node01 ~]# hostnamectl set-hostname k8s-node01[root@k8smaster ~]# vim /etc/hosts192.168.110.140 k8s-master192.168.110.141 k8s-node016、將橋接的IPv4流量傳遞到iptables的鏈
[root@k8smaster ~]# vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
[root@k8smaster ~]# sysctl --system #生效7、設置時間同步
[root@k8smaster ~]# yum -y install ntpdate
[root@k8smaster ~]# ntpdate time.windows.com #測試命令
22 Jun 18:56:53 ntpdate[8157]: adjust time server 20.189.79.72 offset -0.006902 sec
2、安裝Docker
[root@k8s-master ~]#yum -y install docker-ce-20.10.16 docker-ce-cli-20.10.16 containerd.io
[root@k8s-node01 ~]#yum -y install docker-ce-20.10.16 docker-ce-cli-20.10.16 containerd.io
#啟動服務及設置開機自啟
[root@k8s-master ~]# systemctl start docker containerd
[root@k8s-master ~]# systemctl enable docker containerd
添加鏡像加速器
cat > /etc/docker/daemon.json << EOF
{"dns": ["8.8.8.8", "8.8.4.4"],"insecure-registries":["192.168.200.15"],"registry-mirrors": ["https://docker.1ms.run","https://hub.mirrorify.net","https://docker.m.daocloud.io","https://dockerproxy.com","https://docker.mirrors.ustc.edu.cn","https://docker.nju.edu.cn","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://hub-mirror.c.163.com","https://mirror.baidubce.com"]
}
EOF
[root@k8s-master ~]# systemctl daemon-reload
[root@k8s-master ~]# systemctl restart docker containerd
3、安裝k8s-配置repo文件
[root@k8s-master ~]# vim /etc/yum.repos.d/k8s.repo
[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
4、安裝kubeadm kubele 和 kubectl
注意: master 和node節點都裝
[root@k8s-master ~]#yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
[root@k8s-node01 ~]#yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
#啟動服務
[root@k8s-master ~]# systemctl start kubelet
[root@k8s-master ~]# systemctl enable kubelet
5、修改containerd源
# 生成 containerd 的默認配置文件
[root@k8s-master ~]# containerd config default > /etc/containerd/config.toml
[root@k8s-master ~]# vim /etc/containerd/config.tomlsandbox_image = "registry.k8s.io/pause:3.6"#修改為:sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"[root@k8s-master ~]# systemctl daemon-reload
[root@k8s-master ~]# systemctl restart docker containerd
6、master配置初始化
kubeadm init --apiserver-advertise-address=192.168.110.140 --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version=v1.23.6 --service-cidr=10.96.0.0/16 --pod-network-cidr=10.244.0.0/16#參數說明
-–apiserver-advertise-address:通告偵聽地址
–-image-repository:指定鏡像地址使用阿里云的,默認會使用谷歌鏡像
–-kubernetes-version:指定當前的kubernetes的版本
–-pod-network-cidr=10.244.0.0/16:flannel網絡的固定地址范圍
[root@k8s-master ~]# kubeadm reset 重置
常見的錯誤1
解決辦法:加速器配置文件
[root@k8s-master ~]# vim /etc/docker/daemon.json
"exec-opts": ["native.cgroupdriver=systemd"]
[root@k8s-node01 ~]# systemctl daemon-reload
[root@k8s-node01 ~]# systemctl restart docker
解決錯誤之后,重置了初始化命令
[root@k8s-master ~]# kubeadm reset 重置
繼續執行如下命令
kubeadm init --apiserver-advertise-address=192.168.110.140 --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version=v1.23.6 --service-cidr=10.96.0.0/16 --pod-network-cidr=10.244.0.0/16
如何執行正常的界面如下
pod節點需要加入時,執行提示命令:
kubeadm join 192.168.110.140:6443 --token 1hft5e.vb1xncstdogsk4ay \--discovery-token-ca-cert-hash sha256:a5d9376d48397caf6ed1f9daf59d51a41cfe012d0e85b15e5eb158c312cba49a
7、使用kubectl工具
[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# chown $(id -u):$(id -g) $HOME/.kube/config
[root@k8s-master ~]# export KUBECONFIG=/etc/kubernetes/admin.conf
[root@k8s-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane,master 31m v1.23.6
8、node節點加入kubernetes
[root@k8s-node01 ~]# kubeadm join 192.168.110.140:6443 --token 1hft5e.vb1xncstdogsk4ay \--discovery-token-ca-cert-hash sha256:a5d9376d48397caf6ed1f9daf59d51a41cfe012d0e85b15e5eb158c312cba49a
常見錯誤2:端口被占用了
[root@k8s-node01 ~]# kubeadm reset #重置,根據提示輸入y
9、網絡插件的安裝
CNI(Container Network Interface)是 Kubernetes 集群的網絡模型,用于定義容器與容器之間的通信方式。在部署 CNI 網絡組件之前,需要選擇合適的 CNI 插件,例如 Calico、Flannel 等。 在部署 CNI 插件之前,需要安裝相應的依賴軟件,例如 Docker、etcd 等。然后,根據所選的 CNI 插件的文檔,進行相應的配置和安裝。一旦 CNI 插件安裝完成,Kubernetes 集群中的節點將自動加入到網絡中,并能夠與其他節點進行通信
9.1部署Calico插件
[root@k8s-master ~]# mkdir /opt/k8s
[root@k8s-master ~]# cd /opt/k8s
[root@k8s-master k8s]# wget https://calico-v3-25.netlify.app/archive/v3.25/manifests/calico.yaml
#如果是下載到Windows下,上傳到系統的/root/再執行如下命令
[root@k8s-master k8s]# cp /root/calico.yaml /opt/k8s/[root@k8s-master k8s]# grep image calico.yamlimage: docker.io/calico/cni:v3.25.0imagePullPolicy: IfNotPresentimage: docker.io/calico/cni:v3.25.0imagePullPolicy: IfNotPresentimage: docker.io/calico/node:v3.25.0imagePullPolicy: IfNotPresentimage: docker.io/calico/node:v3.25.0imagePullPolicy: IfNotPresentimage: docker.io/calico/kube-controllers:v3.25.0imagePullPolicy: IfNotPresent#修改配置文件,不適用默認的dokcer.io網站下載
[root@k8s-master k8s]# sed -i 's#docker.io/##g' calico.yaml
# 執行calico.yml
[root@k8s-master k8s]# kubectl apply -f calico.yaml
#查看節點的狀態
[root@k8s-master k8s]# kubectl get pod -n kube-system
[root@k8s-master k8s]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-cd8566cf-rcqpf 1/1 Running 0 6m39s
calico-node-d2hvm 1/1 Running 0 6m39s
calico-node-mfdqw 1/1 Running 0 6m39s
coredns-6d8c4cb4d-js7jd 1/1 Running 0 4h14m
coredns-6d8c4cb4d-n9m22 1/1 Running 0 4h14m
etcd-k8s-master 1/1 Running 0 4h14m
kube-apiserver-k8s-master 1/1 Running 0 4h14m
kube-controller-manager-k8s-master 1/1 Running 0 4h14m
kube-proxy-fm5gr 1/1 Running 0 3h39m
kube-proxy-grw5b 1/1 Running 0 4h14m
kube-scheduler-k8s-master 1/1 Running 0 4h14m
[root@k8s-master k8s]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 4h16m v1.23.6
k8s-node01 Ready <none> 3h41m v1.23.6
[root@k8s-master k8s]#
總結整體的部署思路/過程
1、根據要求安裝虛擬機 k8s-master (2個CPU 4G內存) k8s-node
2、對系統初始化設置:Yum源配置 防火墻配置 SELINUX 主機名配置 虛擬內存 hosts文件設置
3、安裝docker kubelet kubeadm kubectl
4、在k8s-master上配置 初始化 kubeadm init
5、在k8s-node 上 kubeadm join
6、互通:網絡管理插件