一、Kubernetes 簡介
1、概念:
Kubernetes?又稱 k8s,是一個可移植、可擴展的開源平臺,用于管理容器化應用和服務,通過 Kubernetes 能夠進行應用的自動化部署和擴縮容。(k8s不是容器,而是一套容器編排系統)
官網:Kubernetes
2、k8s作用:
(1) 部署方式的變更:
① 傳統部署時代:在同一臺物理服務器上運行多個應用程序,會導致資源分配出現問題 ;每個應用程序都運行在不同的物理服務器上,當某個應用程序資源利用率不高時,剩余資源無法被分配給其他應用程序,且維護物理服務器的成本很高。
② 虛擬化部署時代:虛擬化技術允許在單個物理服務器的 CPU 上運行多臺虛擬機(VM),使應用程序在不同 VM 之間被彼此隔離。每個 VM 是一臺完整的計算機,在虛擬化硬件之上運行所有組件,包括其自己的操作系統。
③ 容器部署時代:每個容器都具有自己的文件系統、CPU、內存、進程空間等,由于它們與基礎架構分離,因此可以跨云和 OS 發行版本進行移植。容器解決了應用和基礎環境異構的問題,讓應用做到一次構建,多次部署。
(2) k8s能做什么:
k8s 提供了一個框架或平臺,能夠支持和管理分布式系統的彈性運行:
① 服務發現和負載均衡:k8s提供內置的服務發現機制和負載均衡功能,可以分配網絡流量,使部署穩定。
② 存儲編排:k8s支持多種存儲解決方案,包括本地存儲、網絡存儲和云存儲,為應用程序提供持久性存儲選項。
③ 自動部署和回滾:k8s支持自動化的回滾機制,能夠在應用程序更新失敗或出現問題時自動恢復先前的狀態 ;同時也支持滾動更新,使得應用程序能夠平滑地進行版本更新。
④ 自動裝箱:k8s可以基于容器對應用運行環境的資源配置要求自動部署應用容器;
⑤ 自我修復:當所部署的 Node 節點有問題時,會對容器進行重新部署和重新調度;當容器未通過監控檢查時,會關閉此容器直到容器正常運行時,才會對外提供服務。
⑥ 密鑰和配置管理:k8s 提供了一套機制來管理敏感信息、密鑰和配置數據,使得應用程序能夠安全地訪問這些信息。
(3) k8s與docker compose的區別:
① Kubernetes 適用于大規模、復雜的容器編排和管理,它設計用于在多節點集群中部署、管理和擴展容器化應用程序,具備高度的可擴展性和彈性。
② Docker Compose 適用于單主機上的開發和測試環境,它允許在單個主機上定義和運行多個容器,并配置這些容器之間的關聯性,但通常不適用于在生產環境中管理大規模的集群。
二、Kubernetes組件和架構
1、集群組件
(1) 集群介紹:
① 集群:將同一個軟件的多臺服務器組織到一起,共同為系統提供服務,稱為該軟件的集群。
② k8s集群的角色:
control plane:控制節點(主節點) ;work node:工作節點 ;pod:應用程序容器
k8s集群中,一組工作的集群,稱為工作節點,每個集群里至少有一個工作節點,工作節點里托管著Pod,控制節點管理集群中的工作節點和Pod。
(2) 控制平面組件(Control Plane Components)
控制平面組件會為集群做出全局決策,比如資源的調度,以及檢測和響應集群事件。
① kube-apiserver:所有命令請求的入口,可以運行多個?kube-apiserver?實例進行水平擴縮;
② etcd:數據存儲,高可用的鍵值存儲,用作 Kubernetes 所有集群數據的后臺數據庫;
③ kube-scheduler:資源調度和分配,負責監視新創建的、未指定運行節點的?Pods, 并選擇節點來讓 Pod 在上面運行;
④ kube-controller-manager:調度 Pod 的控制進程。
(3) Node組件:
在每個工作節點上運行,負責維護運行的 Pod 并提供 Kubernetes 運行環境。
① kubelet:master節點派遣到node節點的代表,負責管理容器的運行;
② kube-proxy:kube-proxy 是集群中每個工作節點上所運行的網絡代理;
③ 容器運行時 (Container Runtime):負責管理 Kubernetes 環境中容器的執行和生命周期,使 Kubernetes 能夠有效運行容器,如?containerd、CRI-O 等。
三、k8s搭建:
1、配置要求:
三臺虛擬機,硬件配置:2GB 或更多 RAM,2 個 CPU 或更多 CPU,硬盤 30GB 或更多;
集群中所有機器之間網絡互通;
可以訪問外網,需要拉取鏡像。
2、系統配置:
● 配置主機名和域名解析:
● 關閉防火墻和SELinux;
● 關閉 swap 交換分區:swapoff -a !& sed -ri 's/.*swap.*/#&/' /etc/fstab
● 設置時間同步:
yum install -y ntpdate
ntpdate time.windows.com
3、安裝 containerd:
Containerd 是一個開源的容器運行時工具,它提供了容器的核心功能 ;Docker 構建在 containerd 之上,并提供了更多的功能和工具。
① 安裝 yum-config-manager 相關依賴:
yum install -y yum-utils device-mapper-persistent-data lvm2
② 添加 containerd yum 源:
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
③ 安裝 containerd:
yum install -y containerd.io cri-tools
④ 編寫 containerd 配置文件:
cat > /etc/containerd/config.toml <<EOF
disabled_plugins = ["restart"]
[plugins.linux]
shim_debug = true
[plugins.cri.registry.mirrors."docker.io"]
endpoint = ["https://frz7i079.mirror.aliyuncs.com"]
[plugins.cri]
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.2"
EOF
⑤ 啟動 containerd 服務并配置開機自啟動:
systemctl enable containerd && systemctl start containerd && systemctl status containerd
⑥ 添加 containerd 配置:
cat > /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
⑦ 配置 k8s 網絡配置:
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
⑧ 加載 overlay br_netfilter 模塊并查看當前配置是否生效:
modprobe overlay
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
4、搭建k8s集群:
① 添加 k8s yum 源:
cat <<EOF > kubernetes.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
EOF
mv kubernetes.repo /etc/yum.repos.d/
② 安裝k8s并啟動 kubelet:
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet &&systemctl start kubelet && systemctl status kubelet
5、初始化集群(在master節點操作):
kubeadm init \
--apiserver-advertise-address=192.168.198.133 \
--pod-network-cidr=10.244.0.0/16 \
--image-repository registry.aliyuncs.com/google_containers \
--cri-socket=unix:///var/run/containerd/containerd.sock
① 在使用集群前執行以下命令:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
② 添加新節點:
將主節點的令牌信息復制給節點1、2
③ 配置集群網絡:
在主節點創建 kube-flannel.yml
---
kind: Namespace
apiVersion: v1
metadata:name: kube-flannellabels:pod-security.kubernetes.io/enforce: privileged
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: flannel
rules:
- apiGroups:- ""resources:- podsverbs:- get
- apiGroups:- ""resources:- nodesverbs:- get- list- watch
- apiGroups:- ""resources:- nodes/statusverbs:- patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: flannel
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: flannel
subjects:
- kind: ServiceAccountname: flannelnamespace: kube-flannel
---
apiVersion: v1
kind: ServiceAccount
metadata:name: flannelnamespace: kube-flannel
---
kind: ConfigMap
apiVersion: v1
metadata:name: kube-flannel-cfgnamespace: kube-flannellabels:tier: nodeapp: flannel
data:cni-conf.json: |{"name": "cbr0","cniVersion": "0.3.1","plugins": [{"type": "flannel","delegate": {"hairpinMode": true,"isDefaultGateway": true}},{"type": "portmap","capabilities": {"portMappings": true}}]}net-conf.json: |{"Network": "10.244.0.0/16","Backend": {"Type": "vxlan"}}
---
apiVersion: apps/v1
kind: DaemonSet
metadata:name: kube-flannel-dsnamespace: kube-flannellabels:tier: nodeapp: flannel
spec:selector:matchLabels:app: flanneltemplate:metadata:labels:tier: nodeapp: flannelspec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/osoperator: Invalues:- linuxhostNetwork: truepriorityClassName: system-node-criticaltolerations:- operator: Existseffect: NoScheduleserviceAccountName: flannelinitContainers:- name: install-cni-pluginimage: docker.io/rancher/mirrored-flannelcni-flannel-cni-plugin:v1.1.0command:- cpargs:- -f- /flannel- /opt/cni/bin/flannelvolumeMounts:- name: cni-pluginmountPath: /opt/cni/bin- name: install-cniimage: docker.io/rancher/mirrored-flannelcni-flannel:v0.20.2command:- cpargs:- -f- /etc/kube-flannel/cni-conf.json- /etc/cni/net.d/10-flannel.conflistvolumeMounts:- name: cnimountPath: /etc/cni/net.d- name: flannel-cfgmountPath: /etc/kube-flannel/containers:- name: kube-flannelimage: docker.io/rancher/mirrored-flannelcni-flannel:v0.20.2command:- /opt/bin/flanneldargs:- --ip-masq- --kube-subnet-mgrresources:requests:cpu: "100m"memory: "50Mi"limits:cpu: "100m"memory: "50Mi"securityContext:privileged: falsecapabilities:add: ["NET_ADMIN", "NET_RAW"]env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: EVENT_QUEUE_DEPTHvalue: "5000"volumeMounts:- name: runmountPath: /run/flannel- name: flannel-cfgmountPath: /etc/kube-flannel/- name: xtables-lockmountPath: /run/xtables.lockvolumes:- name: runhostPath:path: /run/flannel- name: cni-pluginhostPath:path: /opt/cni/bin- name: cnihostPath:path: /etc/cni/net.d- name: flannel-cfgconfigMap:name: kube-flannel-cfg- name: xtables-lockhostPath:path: /run/xtables.locktype: FileOrCreate
執行命令:kubectl apply -f kube-flannel.yml
④ 查看集群狀態和pods運行情況: