?
?
?
個人主頁:征服bug-CSDN博客
kubernetes專欄:kubernetes_征服bug的博客-CSDN博客?
目錄
1 集群組件
1.1 控制平面組件(Control Plane Components)
1.2 Node 組件
1.3 插件 (Addons)
2 集群架構詳細
3 集群搭建[重點]
3.1 minikube
3.2 裸機安裝
-
集群組件
-
核心概念
-
集群安裝
1 集群組件
-
集群 cluster : 將同一個軟件服務多個節(jié)點組織到一起共同為系統(tǒng)提供服務過程稱之為該軟件的集群。redis 集群、es集群、mongo 等。
-
k8s 集群: 多個節(jié)點: 3 個節(jié)點 角色: 1.master 節(jié)點/control plane 控制節(jié)點 2. work node: 工作節(jié)點(pod 容器:應用程序容器)
????????當部署完 Kubernetes,便擁有了一個完整的集群。一組工作機器,稱為節(jié)點, 會運行容器化應用程序。每個集群至少有一個工作節(jié)點
。工作節(jié)點會托管 Pod
,而 Pod 就是作為應用負載的組件。 控制平面管理集群中的工作節(jié)點和 Pod
。
?
1.1 控制平面組件(Control Plane Components)
????????控制平面組件會為集群做出全局決策,比如資源的調度。 以及檢測和響應集群事件,例如當不滿足部署的 replicas 字段時, 要啟動新的 pod
)。
????????控制平面組件可以在集群中的任何節(jié)點上運行。 然而,為了簡單起見,設置腳本通常會在同一個計算機上啟動所有控制平面組件, 并且不會在此計算機上運行用戶容器。
-
kube-apiserver
API server是 Kubernetes 控制平面的組件,
該組件負責公開了 Kubernetes API,負責處理接受請求的工作
。 API server 是 Kubernetes 控制平面的前端。Kubernetes API 服務器的主要實現(xiàn)是 kube-apiserver。kube-apiserver
設計上考慮了水平擴縮,也就是說,它可通過部署多個實例來進行擴縮。 你可以運行kube-apiserver
的多個實例,并在這些實例之間平衡流量。 -
etcd
一致且高度可用的鍵值存儲,用作 Kubernetes 的所有集群數據的后臺數據庫
。 -
kube-scheduler
kube-scheduler
是控制平面的組件, 負責監(jiān)視新創(chuàng)建的、未指定運行節(jié)點 node 的 Pods, 并選擇節(jié)點來讓 Pod 在上面運行。調度決策考慮的因素包括單個 Pod 及 Pods 集合的資源需求、軟硬件及策略約束、 親和性及反親和性規(guī)范、數據位置、工作負載間的干擾及最后時限。 -
kube-controller-manager
kube-controller-manager 是控制平面的組件, 負責運行控制器進程。從邏輯上講, 每個控制器都是一個單獨的進程, 但是為了降低復雜性,它們都被編譯到同一個可執(zhí)行文件,并在同一個進程中運行。
這些控制器包括:
-
節(jié)點控制器(Node Controller):負責在節(jié)點出現(xiàn)故障時進行通知和響應
-
任務控制器(Job Controller):監(jiān)測代表一次性任務的 Job 對象,然后創(chuàng)建 Pods 來運行這些任務直至完成
-
端點分片控制器(EndpointSlice controller):填充端點分片(EndpointSlice)對象(以提供 Service 和 Pod 之間的鏈接)。
-
服務賬號控制器(ServiceAccount controller):為新的命名空間創(chuàng)建默認的服務賬號(ServiceAccount)。
-
-
cloud-controller-manager (optional 可選)
一個 Kubernetes 控制平面組件, 嵌入了特定于云平臺的控制邏輯。 云控制器管理器(Cloud Controller Manager)允許你將你的集群連接到云提供商的 API 之上, 并將與該云平臺交互的組件同與你的集群交互的組件分離開來。
cloud-controller-manager
僅運行特定于云平臺的控制器。 因此如果你在自己的環(huán)境中運行 Kubernetes,或者在本地計算機中運行學習環(huán)境, 所部署的集群不需要有云控制器管理器。與kube-controller-manager
類似,cloud-controller-manager
將若干邏輯上獨立的控制回路組合到同一個可執(zhí)行文件中, 供你以同一進程的方式運行。 你可以對其執(zhí)行水平擴容(運行不止一個副本)以提升性能或者增強容錯能力。下面的控制器都包含對云平臺驅動的依賴:
-
節(jié)點控制器(Node Controller):用于在節(jié)點終止響應后檢查云提供商以確定節(jié)點是否已被刪除
-
路由控制器(Route Controller):用于在底層云基礎架構中設置路由
-
服務控制器(Service Controller):用于創(chuàng)建、更新和刪除云提供商負載均衡器
-
1.2 Node 組件
節(jié)點組件會在每個節(jié)點上運行,負責維護運行的 Pod 并提供 Kubernetes 運行環(huán)境。
-
kubelet
kubelet 會在集群中每個節(jié)點(node)上運行。 它保證容器(containers)都運行在 Pods 中。
kubelet 接收一組通過各類機制提供給它的 PodSpecs, 確保這些 PodSpecs 中描述的容器處于運行狀態(tài)且健康。 kubelet 不會管理不是由 Kubernetes 創(chuàng)建的容器。
-
kube-proxy
kube-proxy是集群中每個節(jié)點(node)上所運行的網絡代理, 實現(xiàn) Kubernetes 服務(Service)概念的一部分。
kube-proxy 維護節(jié)點上的一些網絡規(guī)則, 這些網絡規(guī)則會允許從集群內部或外部的網絡會話與 Pod 進行網絡通信。
如果操作系統(tǒng)提供了可用的數據包過濾層,則 kube-proxy 會通過它來實現(xiàn)網絡規(guī)則。 否則,kube-proxy 僅做流量轉發(fā)。
-
容器運行時(Container Runtime)
容器運行環(huán)境是負責運行容器的軟件。
Kubernetes 支持許多容器運行環(huán)境,例如 containerd、 CRI-0、Docker 以及 Kubernetes CRI 的其他任何實現(xiàn)。
1.3 插件 (Addons)
-
DNS
盡管其他插件都并非嚴格意義上的必需組件,但幾乎所有 Kubernetes 集群都應該有集群 DNS因為很多示例都需要 DNS 服務。
-
Web 界面(儀表盤)
Dashboard 是 Kubernetes 集群的通用的、基于 Web 的用戶界面。 它使用戶可以管理集群中運行的應用程序以及集群本身, 并進行故障排除。
-
容器資源監(jiān)控
容器資源監(jiān)控將關于容器的一些常見的時間序列度量值保存到一個集中的數據庫中, 并提供瀏覽這些數據的界面。
-
集群層面日志
集群層面日志機制負責將容器的日志數據保存到一個集中的日志存儲中, 這種集中日志存儲提供搜索和瀏覽接口。
2 集群架構詳細
?
-
總結
-
Kubernetes 集群由多個節(jié)點組成,節(jié)點分為兩類:一類是屬于管理平面的主節(jié)點/控制節(jié)點(Master Node);一類是屬于運行平面的工作節(jié)點(Worker Node)。顯然,復雜的工作肯定都交給控制節(jié)點去做了,工作節(jié)點負責提供穩(wěn)定的操作接口和能力抽象即可。
-
3 集群搭建[重點]
-
minikube 只是一個 K8S 集群模擬器,只有一個節(jié)點的集群,只為測試用,master 和 worker 都在一起。
-
裸機安裝 至少需要兩臺機器(主節(jié)點、工作節(jié)點個一臺),需要自己安裝 Kubernetes 組件,配置會稍微麻煩點。 缺點:配置麻煩,缺少生態(tài)支持,例如負載均衡器、云存儲。
-
直接用云平臺 Kubernetes 可視化搭建,只需簡單幾步就可以創(chuàng)建好一個集群。 優(yōu)點:安裝簡單,生態(tài)齊全,負載均衡器、存儲等都給你配套好,簡單操作就搞定
-
k3s
安裝簡單,腳本自動完成。
優(yōu)點:輕量級,配置要求低,安裝簡單,生態(tài)齊全。
3.1 minikube
?
3.2 裸機安裝
0 環(huán)境準備
-
節(jié)點數量: 3 臺虛擬機 centos7
-
硬件配置: 2G或更多的RAM,2個CPU或更多的CPU,硬盤至少30G 以上
-
網絡要求: 多個節(jié)點之間網絡互通,每個節(jié)點能訪問外網
1 集群規(guī)劃
-
k8s-node1:10.15.0.5
-
k8s-node2:10.15.0.6
-
k8s-node3:10.15.0.7
2 設置主機名
$ hostnamectl set-hostname k8s-node1 ?
$ hostnamectl set-hostname k8s-node2
$ hostnamectl set-hostname k8s-node3
3 同步 hosts 文件
如果 DNS 不支持主機名稱解析,還需要在每臺機器的
/etc/hosts
文件中添加主機名和 IP 的對應關系:
cat >> /etc/hosts <<EOF
192.168.2.4 k8s-node1
192.168.2.5 k8s-node2
192.168.2.6 k8s-node3
EOF
4 關閉防火墻
$ systemctl stop firewalld && systemctl disable firewalld
5 關閉 SELINUX
注意: ARM 架構請勿執(zhí)行,執(zhí)行會出現(xiàn) ip 無法獲取問題!
$ setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
6 關閉 swap 分區(qū)
$ swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstab
7 同步時間
$ yum install ntpdate -y
$ ntpdate time.windows.com
8 安裝 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
9 添加源
-
查看源
$ yum repolist
-
添加源 x86
$ 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/
-
添加源 ARM
$ cat << EOF > kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64
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/
11 安裝 k8s
# 安裝最新版本
$ yum install -y kubelet kubeadm kubectl
?
# 指定版本安裝
# yum install -y kubelet-1.26.0 kubectl-1.26.0 kubeadm-1.26.0
?
# 啟動 kubelet
$ sudo systemctl enable kubelet && sudo systemctl start kubelet && sudo systemctl status kubelet
12 初始化集群
-
注意: 初始化 k8s 集群僅僅需要再在 master 節(jié)點進行集群初始化!
$ kubeadm init \
--apiserver-advertise-address=本機masterIP地址 \
--pod-network-cidr=10.244.0.0/16 \
--image-repository registry.aliyuncs.com/google_containers \
--cri-socket=unix:///var/run/containerd/containerd.sock
?
# 添加新節(jié)點
$ kubeadm token create --print-join-command --ttl=0
$ kubeadm join 10.15.0.21:6443 --token xjm7ts.gu3ojvta6se26q8i --discovery-token-ca-cert-hash sha256:14c8ac5c04ff9dda389e7c6c505728ac1293c6aed5978c3ea9c6953d4a79ed34
13 配置集群網絡
創(chuàng)建配置: kube-flannel.yml ,執(zhí)行 kubectl apply -f kube-flannel.yml文章來源:http://www.zghlxwxcb.cn/news/detail-622267.html
-
注意: 只在主節(jié)點執(zhí)行即可!
文章來源地址http://www.zghlxwxcb.cn/news/detail-622267.html
---
kind: Namespace
apiVersion: v1
metadata:
name: kube-flannel
labels:
? pod-security.kubernetes.io/enforce: privileged
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: flannel
rules:
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- apiGroups:
- ""
resources:
- nodes
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- nodes/status
verbs:
- patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: flannel
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: flannel
subjects:
- kind: ServiceAccount
name: flannel
namespace: kube-flannel
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: flannel
namespace: kube-flannel
---
kind: ConfigMap
apiVersion: v1
metadata:
name: kube-flannel-cfg
namespace: kube-flannel
labels:
? tier: node
? app: 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-ds
namespace: kube-flannel
labels:
? tier: node
? app: flannel
spec:
selector:
? matchLabels:
? ? app: flannel
template:
? metadata:
? ? labels:
? ? ? tier: node
? ? ? app: flannel
? spec:
? ? affinity:
? ? ? nodeAffinity:
? ? ? ? requiredDuringSchedulingIgnoredDuringExecution:
? ? ? ? ? nodeSelectorTerms:
? ? ? ? ? - matchExpressions:
? ? ? ? ? ? - key: kubernetes.io/os
? ? ? ? ? ? ? operator: In
? ? ? ? ? ? ? values:
? ? ? ? ? ? ? - linux
? ? hostNetwork: true
? ? priorityClassName: system-node-critical
? ? tolerations:
? ? - operator: Exists
? ? ? effect: NoSchedule
? ? serviceAccountName: flannel
? ? initContainers:
? ? - name: install-cni-plugin
? ? ? #image: flannelcni/flannel-cni-plugin:v1.1.0 for ppc64le and mips64le (dockerhub limitations may apply)
? ? ? image: docker.io/rancher/mirrored-flannelcni-flannel-cni-plugin:v1.1.0
? ? ? command:
? ? ? - cp
? ? ? args:
? ? ? - -f
? ? ? - /flannel
? ? ? - /opt/cni/bin/flannel
? ? ? volumeMounts:
? ? ? - name: cni-plugin
? ? ? ? mountPath: /opt/cni/bin
? ? - name: install-cni
? ? ? #image: flannelcni/flannel:v0.20.2 for ppc64le and mips64le (dockerhub limitations may apply)
? ? ? image: docker.io/rancher/mirrored-flannelcni-flannel:v0.20.2
? ? ? command:
? ? ? - cp
? ? ? args:
? ? ? - -f
? ? ? - /etc/kube-flannel/cni-conf.json
? ? ? - /etc/cni/net.d/10-flannel.conflist
? ? ? volumeMounts:
? ? ? - name: cni
? ? ? ? mountPath: /etc/cni/net.d
? ? ? - name: flannel-cfg
? ? ? ? mountPath: /etc/kube-flannel/
? ? containers:
? ? - name: kube-flannel
? ? ? #image: flannelcni/flannel:v0.20.2 for ppc64le and mips64le (dockerhub limitations may apply)
? ? ? image: docker.io/rancher/mirrored-flannelcni-flannel:v0.20.2
? ? ? command:
? ? ? - /opt/bin/flanneld
? ? ? args:
? ? ? - --ip-masq
? ? ? - --kube-subnet-mgr
? ? ? resources:
? ? ? ? requests:
? ? ? ? ? cpu: "100m"
? ? ? ? ? memory: "50Mi"
? ? ? ? limits:
? ? ? ? ? cpu: "100m"
? ? ? ? ? memory: "50Mi"
? ? ? securityContext:
? ? ? ? privileged: false
? ? ? ? capabilities:
? ? ? ? ? add: ["NET_ADMIN", "NET_RAW"]
? ? ? env:
? ? ? - name: POD_NAME
? ? ? ? valueFrom:
? ? ? ? ? fieldRef:
? ? ? ? ? ? fieldPath: metadata.name
? ? ? - name: POD_NAMESPACE
? ? ? ? valueFrom:
? ? ? ? ? fieldRef:
? ? ? ? ? ? fieldPath: metadata.namespace
? ? ? - name: EVENT_QUEUE_DEPTH
? ? ? ? value: "5000"
? ? ? volumeMounts:
? ? ? - name: run
? ? ? ? mountPath: /run/flannel
? ? ? - name: flannel-cfg
? ? ? ? mountPath: /etc/kube-flannel/
? ? ? - name: xtables-lock
? ? ? ? mountPath: /run/xtables.lock
? ? volumes:
? ? - name: run
? ? ? hostPath:
? ? ? ? path: /run/flannel
? ? - name: cni-plugin
? ? ? hostPath:
? ? ? ? path: /opt/cni/bin
? ? - name: cni
? ? ? hostPath:
? ? ? ? path: /etc/cni/net.d
? ? - name: flannel-cfg
? ? ? configMap:
? ? ? ? name: kube-flannel-cfg
? ? - name: xtables-lock
? ? ? hostPath:
? ? ? ? path: /run/xtables.lock
? ? ? ? type: FileOrCreate
14 查看集群狀態(tài)
# 查看集群節(jié)點狀態(tài) 全部為 Ready 代表集群搭建成功
$ kubectl get nodes
NAME ? ? ? STATUS ? ROLES ? ? ? ? ? AGE ? VERSION
k8s-node1 ? Ready ? control-plane ? 21h ? v1.26.0
k8s-node2 ? Ready ? <none> ? ? ? ? 21h ? v1.26.0
k8s-node3 ? Ready ? <none> ? ? ? ? 21h ? v1.26.0
? # 查看集群系統(tǒng) pod 運行情況,下面所有 pod 狀態(tài)為 Running 代表集群可用
$ kubectl get pod -A
NAMESPACE ? ? NAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? AGE
default ? ? ? nginx ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1/1 ? ? Running ? 0 ? ? ? ? 21h
kube-flannel ? kube-flannel-ds-gtq49 ? ? ? ? ? ? ? 1/1 ? ? Running ? 0 ? ? ? ? 21h
kube-flannel ? kube-flannel-ds-qpdl6 ? ? ? ? ? ? ? 1/1 ? ? Running ? 0 ? ? ? ? 21h
kube-flannel ? kube-flannel-ds-ttxjb ? ? ? ? ? ? ? 1/1 ? ? Running ? 0 ? ? ? ? 21h
kube-system ? coredns-5bbd96d687-p7q2x ? ? ? ? ? ?1/1 ? ? Running ? 0 ? ? ? ? 21h
kube-system ? coredns-5bbd96d687-rzcnz ? ? ? ? ? ?1/1 ? ? Running ? 0 ? ? ? ? 21h
kube-system ? etcd-k8s-node1 ? ? ? ? ? ? ? ? ? ? ?1/1 ? ? Running ? 0 ? ? ? ? 21h
kube-system ? kube-apiserver-k8s-node1 ? ? ? ? ? ?1/1 ? ? Running ? 0 ? ? ? ? 21h
kube-system ? kube-controller-manager-k8s-node1 ? 1/1 ? ? Running ? 0 ? ? ? ? 21h
kube-system ? kube-proxy-mtsbp ? ? ? ? ? ? ? ? ? ?1/1 ? ? Running ? 0 ? ? ? ? 21h
kube-system ? kube-proxy-v2jfs ? ? ? ? ? ? ? ? ? ?1/1 ? ? Running ? 0 ? ? ? ? 21h
kube-system ? kube-proxy-x6vhn ? ? ? ? ? ? ? ? ? ?1/1 ? ? Running ? 0 ? ? ? ? 21h
kube-system ? kube-scheduler-k8s-node1 ? ? ? ? ? ?1/1 ? ? Running ? 0 ? ? ? ? 21h
到了這里,關于【云原生】k8s組件&架構介紹與K8s最新版部署的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!