无码国模产在线观看免费-无码国内精品久久人妻-无码国内精品久久综合88-无码国内精品人妻少妇-无码国内精品人妻少妇蜜桃视频-无码国语中文在线播放

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

部署簡單的單節點k8s

freeflydom
2025年4月8日 9:50 本文熱度 411

1、Kubernetes簡介

Kubernetes,簡稱K8s,是用8代替名字中間的8個字符“ubernete”而成的縮寫。Kubernetes是Google開源的一個容器編排引擎,用于自動部署、擴展和管理容器化應用程序, 現在由Cloud Native Computing Foundation (CNCF) 維護。

主要特性:

  • 自動化部署和復制
  • 自動擴縮容
  • 負載均衡
  • 自我修復
  • 服務發現和配置管理

官網:https://kubernetes.io/zh-cn/

Github開源地址:https://github.com/kubernetes/kubernetes

2、Kubernetes安裝方式

我們可以通過官網文檔查看k8s的幾種安裝方式。文檔地址:https://kubernetes.io/zh-cn/docs/tasks/tools/

  • kubeadm:官方推薦的快速部署工具
  • 二進制包:所有組件都是二進制文件,靈活性高,比較麻煩
  • minikube:本地單節點測試環境
  • kind:使用Docker容器運行本地Kubernetes集群,將Kubernetes所需要的所有組件全部部署在一個Docker容器中,可以很方便的搭建Kubernetes集群

根據調查,二進制包雖然提供了很大的靈活性,但因為配置復雜度高,通常只會被少數有特殊需求的場景采用。目前使用最多的安裝方式為:使用kubeadm進行安裝和使用minikube進行安裝 ,kubeadm主要用于搭建生產環境集群,而minikube主要用于個人學習本地開發環境安裝。kind只有在少數資源不夠的環境下才會使用。

以下為minikubekubeadm這兩種安裝方式的不同點進行對比:

安裝和啟動方式不同:

  • MiniKube安裝:安裝Minikube相對簡單,可以通過下載安裝包使用Minikube程序進行安裝,只需運行minikube start命令即可?,然后就可以部署應用程序,擴容和管理集群。
  • kubeadm安裝: 安裝Kubernetes需要更多的步驟,使用kubeadmkubeletkubectl三個工具進行管理安裝,部署Kubernetes集群,一主二從。然后部署應用程序,擴容和管理集群。

用途不同:

  • Minikube?: Minikube是一個輕量級的Kubernetes集群,主要用于在本地開發和測試。它通過虛擬化技術在一個單獨的虛擬化實例中運行Kubernetes控制平面組件,使得我們可以在本地環境中模擬Kubernetes集群,從而進行開發和調試?。
  • kubeadm: Kubernetes是一個強大的容器編排平臺,用于在生產環境中部署和管理大規模的容器化應用程序。它支持多節點集群,能夠處理更復雜的部署需求和更大的負載?。

適用場景不同:

  • ?Minikube?: 適用于開發者和測試人員,在本地環境中快速搭建和測試Kubernetes應用,方便進行開發和調試?
  • kubeadm: 適用于生產環境,能夠處理大規模的容器部署和管理任務,支持多節點集群,適合在云平臺或數據中心部署?

總結:

通過上面可以看出,Minikube是一個用于在本地快速部署Kubernetes集群的工具,比較適用于開發和測試環境的使用,而kubeadm是一個用于生產環境的容器編排使用,具有強大且復雜的功能。

3、安裝Docker

需要保證服務器已經安裝Docker,這里不在描述,如果不清楚可以查看以下文章:

https://www.cnblogs.com/sowler/p/18228732

通過上面文章安裝成功后,需要更新 Cgroup Driver 為systemd

# Docker 在默認情況下使用的 Cgroup Driver 為 cgroupfs
# docker info 查看  Cgroup Driver 屬性
Cgroup Driver: cgroupfs
# 在/etc/docker 目錄下 daemon.json文件, 添加配置 exec-opts 屬性
"exec-opts": ["native.cgroupdriver=systemd"]
# 重新啟動docker
systemctl daemon-reload
systemctl restart docker
# 再次執行 docker info 查看  Cgroup Driver 屬性
Cgroup Driver: systemd

4、安裝Harbor

Harbor是Docker存儲鏡像的私有化倉庫,有時候因為網絡問題連接不上Docker Hub 鏡像倉庫,可以搭建私有化倉庫,從私有倉庫進行獲取。不清楚搭建可以查看以下文章:

https://www.cnblogs.com/sowler/p/18242819

如果不想搭建私有化倉庫也可以,需要配置Docker獲取的鏡像源地址,配置為一些開源的鏡像源地址。雖說因為國內污點嚴重問題各大廠商關閉了鏡像源地址,但是還是可以找到一些可以訪問Docker Hub的鏡像源的。以下地址親測有效:

# 在/etc/docker 目錄下創建 daemon.json文件,配置 registry-mirrors 屬性
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io", 
    "https://dockerproxy.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://docker.nju.edu.cn",
    "https://docker.hpcloud.cloud",
    "https://docker.m.daocloud.io",
    "https://docker.unsee.tech",
    "https://docker.1panel.live",
    "http://mirrors.ustc.edu.cn",
    "https://docker.chenby.cn",
    "http://mirror.azure.cn",
    "https://dockerpull.org",
    "https://dockerhub.icu",
    "https://hub.rat.dev"]
}

5、Kubernetes安裝

5.1、Minikube安裝

介紹:

Minikube是一個工具,用于在單個節點上部署一個本地的Kubernetes集群。這對于開發者在本地開發環境進行Kubernetes應用測試和調試非常有用。它能夠在個人計算機上啟動一個輕量級的虛擬機或容器,并在這個環境中部署一個完整的Kubernetes集群,包括API服務器、etcd、kubelet等核心組件。

Minikube 使用文檔:https://minikube.sigs.k8s.io/docs/

Github開源地址:https://github.com/kubernetes/minikube

安裝包下載:https://minikube.sigs.k8s.io/docs/start/?arch=%2Fwindows%2Fx86-64%2Fstable%2F.exe+download

使用文檔:https://kubernetes.io/zh-cn/docs/tutorials/hello-minikube/

啟動和停止集群:

啟動命令:

minikube start --driver=docker

停止:

minikube stop

當停止集群后,所有的容器和服務都會停止運行,但集群的配置和存儲的數據(如果有持久化存儲配置)會保留。

刪除集群:

minikube delete

使用該命令可以刪除整個Minikube集群。這將清除所有與集群相關的資源,包括虛擬機、容器鏡像等。如果需要重新創建集群,需要再次運行minikube start命令。

5.2、二進制安裝

二進制文件下載地址:https://kubernetes.io/releases/download/#binaries

使用二進制安裝k8s相對來說比較麻煩,需要自己配置一些相關參數和啟動腳本。本次不使用該方法配置。感興趣的朋友可以在網上找一些相關文章進行安裝。

5.3、Kubeadm安裝

5.3.1、介紹

前面已經提到了,通過 kubeadm 進行安裝,需要安裝kubeadmkubeletkubectl三個控件,以下是相關控件的作用介紹:

  • Kubeadm: 用于快速部署Kubernetes集群的官方工具,主要功能:集群初始化節點加入刪除、證書管理、組件升級
  • kubectl:kubectl是 Kubernetes 的命令行工具,可以通過它與 Kubernetes 集群進行交互,執行各種操作,例如部署應用、管理資源(如Pods、Services、Deployments等)、 查看集群狀態以及調試問題等。它是與Kubernetes API server通信的主要方式,允許用戶控制和配置集群中的各個組件。
  • Kubelet:Kubelet 是運行在每個Kubernetes節點上的代理服務,是Kubernetes集群的核心組件之一。它的主要職責是確保該節點上的Pod按照Kubernetes API Server指定的狀態正確運行。Kubelet負責接收來自API Server的指令,創建、監控和管理Pod及其容器,還負責健康檢查、生命周期管理以及與容器運行時進行交互以執行具體容器操作。kubelet就相當于是守護進程,Kubernetes會自動管理,不需要我們做多余的操作。

5.3.2、通過yum安裝

通過yum配置國內阿里云開源的k8s鏡像進行部署是相對來說比較簡單的,本篇文章使用yum進行安裝。

安裝前準備工作:檢查服務器

# 查看防火墻狀態
 systemctl status firewalld
# 停止、禁用防火墻
 systemctl stop firewalld
 systemctl disable firewalld
 
 # 禁用 SELinux
 vim /etc/selinux/config
 # 設置 disabled
 SELINUX=disabled
 
# 如果配置了交換內存,需要關閉 Swap
[root@linux-k8s ~]# free -mh
              total        used        free      shared  buff/cache   available
Mem:           3.6G        298M        1.7G        8.9M        1.6G        3.0G
Swap:            0B          0B          0B
# 查看fstab
cat /etc/fstab 
# 刪除或注釋追加的內容
/opt/swapdata swap swap defaults 0 0

配置加載內核模塊

# 設置iptables和相關網絡配置確保容器網絡的正確性
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

添加該配置文件確保在系統啟動時加載br_netfilter內核模塊。br_netfilter 模塊是 Kubernetes中處理橋接網絡流量的關鍵模塊。Kubernetes網絡模型通常需要通過橋接(bridge)來連接容器和主機網絡,br_netfilter模塊使得這些橋接流量能夠被iptables規則處理。容器網絡通常使用Linux橋接來進行通信,如果沒有這個模塊,容器和主機之間的網絡流量就不能經過 iptables規則處理,可能會導致網絡隔離和通信問題。因此,啟用 br_netfilter讓 Linux橋接流量能夠經過 iptables 規則進行過濾和管理。

設置iptables

# 開啟橋接流量的 iptables 處理
cat > /etc/sysctl.d/k8s.conf << EOF 
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1 
EOF
# net.bridge.bridge-nf-call-ip6tables:是否將橋接的 IPv6 流量傳遞給 ip6tables
# net.bridge.bridge-nf-call-iptables:是否將橋接的 IPv4 流量傳遞給 iptables
# 作用: 這些設置指示 Linux 內核在處理橋接(如容器網絡)的 IPv4 和 IPv6 流量時,將流量傳遞給 iptables 來進行進一步的處理
# 為什么需要:Kubernetes 使用 iptables 來進行網絡地址轉換(NAT)和流量控制。如果這些參數沒有啟用,Kubernetes 的網絡策略、Pod 網絡之間的通信和其他流量控制規則可能無法生效,因為橋接流量不會經過 iptables 規則。啟用這些設置可以確保容器間的流量會被正確地處理,確保網絡策略得以實施。

Kubernetes 集群通常使用 Linux 網絡橋接(如 docker0)和 iptables 來管理容器的網絡流量。通過加載 br_netfilter 內核模塊,并啟用橋接流量經過 iptables 的處理,可以確保容器的網絡流量能夠被適當的規則過濾和路由。這是 Kubernetes 網絡模型正常工作的關鍵步驟,特別是在涉及到多節點、Pod 網絡隔離和網絡策略時。這些配置確保 Kubernetes 的網絡組件(如 CNI 插件)能夠正確地實現容器之間的網絡通信,并且能夠按需進行流量控制和隔離。

配置Yum安裝k8s鏡像源

# 設置yum安裝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

安裝Kubeadm、Kubelet、Kubectl

# 通過yum安裝指定版本的控件
yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9
# 輸出以下信息安裝完成
Installed:
  kubeadm.x86_64 0:1.20.9-0                             kubectl.x86_64 0:1.20.9-0                             kubelet.x86_64 0:1.20.9-0                            
Dependency Installed:
  kubernetes-cni.x86_64 0:1.2.0-0                                                                                                                                   
Complete!
# 安裝成功后,查看安裝版本,提示沒有該命令
[root@linux-k8s ~]# kubeadm version
-bash: kubeadm: command not found
# 使用yum下載后,提示沒有該命令,把yum加入環境變量
# 編輯.bashrc
vim /root/.bashrc
# 添加以下信息
export PATH=$PATH:/usr/bin/yum
# 重新加載
source /root/.bashrc
# 再次查看安裝版本
[root@linux-k8s ~]# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.9", GitCommit:"7a576bc3935a6b555e33346fd73ad77c925e9e4a", GitTreeState:"clean", BuildDate:"2021-07-15T21:00:30Z", GoVersion:"go1.15.14", Compiler:"gc", Platform:"linux/amd64"}
[root@linux-k8s ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.9", GitCommit:"7a576bc3935a6b555e33346fd73ad77c925e9e4a", GitTreeState:"clean", BuildDate:"2021-07-15T21:01:38Z", GoVersion:"go1.15.14", Compiler:"gc", Platform:"linux/amd64"}
The connection to the server localhost:8080 was refused - did you specify the right host or port?

Kubeadm 初始化

kubeadm init --apiserver-advertise-address=10.0.4.16 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20.9  --service-cidr=172.16.0.0/16  --pod-network-cidr=172.17.0.1/16
--apiserver-advertise-address=10.0.4.16 是主節點的IP地址,確保其他節點能夠通過該地址訪問API服務器,如果為公網地址需要控制臺開放2379 2389 6443端口
--image-repository registry.aliyuncs.com/google_containers 指定了容器鏡像的倉庫地址,Kubernetes默認使用k8s.gcr.io作為鏡像倉庫,由于無法訪問使用了阿里云的鏡像倉庫
--kubernetes-version v1.20.9 安裝的版本,避免版本不匹配引發潛在的問題,使用特定版本確保在集群中運行的所有組件都是兼容的。
--service-cidr=172.16.0.0/16 集群中的service服務(如 ClusterIP 類型的服務)分配的地址池, 表示服務IP會從172.16.0.1到172.16.255.254之間的地址分配
--pod-network-cidr=172.17.0.1/16 設置Pod網絡的CIDR地址池,所有Pods將會使用的IP地址范圍,表示Pod網絡會使用172.17.0.1到172.17.255.254范圍的IP地址。注意:地址池是用于Pod內部通信的,需要與選擇的CNI插件相兼容,常見的CNI插件如Calico、Flannel會使用該地址池為Pod分配IP地址,確保Flannel網絡插件的配置與此CIDR地址池一致。
# service-cidr和pod-network-cidr是配置service、pod網段設置,可以隨意配置,不沖突即可

初始化報錯

執行以下命令解決

yum install -y conntrack
# conntrack是Linux內核的一部分,用于跟蹤網絡連接的狀態。Kubernetes使用它來實現網絡策略和連接跟蹤等功能,如果沒有安裝conntrack,則 Kubernetes初始化會失敗
# 驗證 conntrack 是否安裝成功
conntrack -L

去除linux-servertwo警告

# 查看當前主機名:
hostname
# 如果需要更改主機名,執行:
hostnamectl set-hostname linux-servertwo 
# 修改/etc/hosts 加入地址映射:
10.0.4.16  linux-servertwo
# 測試是否加入成功:
[root@linux-servertwo ~]# ping linux-servertwo
PING linux-servertwo (10.0.4.16) 56(84) bytes of data.
64 bytes from linux-servertwo (10.0.4.16): icmp_seq=1 ttl=64 time=0.035 ms
64 bytes from linux-servertwo (10.0.4.16): icmp_seq=2 ttl=64 time=0.044 ms
^C
--- linux-servertwo ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms

重置kubeadm重新初始化

# 重置
kubeadm reset -f
#再次執行
[root@linux-servertwo ~]# kubeadm init --apiserver-advertise-address=10.0.4.16 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20.9  --service-cidr=172.16.0.0/16  --pod-network-cidr=172.17.0.1/16
[init] Using Kubernetes version: v1.20.9
[preflight] Running pre-flight checks
        [WARNING SystemVerification]: this Docker version is not on the list of validated versions: 26.1.3. Latest validated version: 19.03
error execution phase preflight: [preflight] Some fatal errors occurred:
        [ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher
# 解決以上問題:
# 永久啟用 IP 轉發,編輯 /etc/sysctl.conf 文件,添加或修改以下行:
net.ipv4.ip_forward = 1
#然后運行以下命令以應用更改:
sudo sysctl -p
# 再次初始化,初始化成功
[root@linux-servertwo ~]# kubeadm init --apiserver-advertise-address=10.0.4.16 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20.9  --service-cidr=172.16.0.0/16  --pod-network-cidr=172.17.0.1/16
[init] Using Kubernetes version: v1.20.9
......
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
Your Kubernetes control-plane has initialized successfully!
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
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.0.4.16:6443 --token no9c55.flvu76gcqgk7xqtb \
    --discovery-token-ca-cert-hash sha256:97bc27e3bb67d3d0b7adfca65c934a140ac2c16708bed62f9c49fbd9332cec41 

Kubectl設置,Kubeadm初始化成功后控制臺會打印這些指令命令,執行以下命令:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

如果集群部署,其它工作節點需要執行join命令加入該節點,由于本次是單節點運行,不需要執行加入命令。

kubeadm join 10.0.4.16:6443 --token no9c55.flvu76gcqgk7xqtb \
    --discovery-token-ca-cert-hash sha256:97bc27e3bb67d3d0b7adfca65c934a140ac2c16708bed62f9c49fbd9332cec41 
# 該命令初始化成功后控制臺會打印,僅工作節點執行
# 如果后面忘記了join執行命令,可以在主節點執行以下命令重新生成
kubeadm token create --print-join-command

查看節點

[root@linux-servertwo ~]# kubectl get nodes
NAME              STATUS     ROLES                  AGE   VERSION
linux-servertwo   NotReady   control-plane,master   13m   v1.20.9

驗證集群狀態

# kubectl get cs

出現該報錯是因為是/etc/kubernetes/manifests/下的kube-controller-manager.yamlkube-scheduler.yaml設置的默認端口是0導致的,注釋掉對應的port即可。

# 首先進入 manifests
cd /etc/kubernetes/manifests
# 編輯 kube-controller-manager.yaml
vim kube-controller-manager.yaml
# --port=0的作用是禁用kube-controller-manager啟動HTTP服務。這種做法可以提高安全性,防止暴露不必要的端點。注釋 - --port=0后, 啟動HTTP服務,會降低安全性。
 spec:
  containers:
  - command:
    - kube-controller-manager
    - --allocate-node-cidrs=true
    - --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf
    - --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf
    - --bind-address=127.0.0.1
    - --client-ca-file=/etc/kubernetes/pki/ca.crt
    - --cluster-cidr=172.17.0.1/16
    - --cluster-name=kubernetes
    - --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt
    - --cluster-signing-key-file=/etc/kubernetes/pki/ca.key
    - --controllers=*,bootstrapsigner,tokencleaner
    - --kubeconfig=/etc/kubernetes/controller-manager.conf
    - --leader-elect=true
#    - --port=0
    - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
    - --root-ca-file=/etc/kubernetes/pki/ca.crt
    - --service-account-private-key-file=/etc/kubernetes/pki/sa.key
    - --service-cluster-ip-range=172.16.0.0/16
    - --use-service-account-credentials=true
#  編輯 kube-scheduler.yaml
vim kube-scheduler.yaml
#  注釋 - --port=0
spec:
  containers:
  - command:
    - kube-scheduler
    - --authentication-kubeconfig=/etc/kubernetes/scheduler.conf
    - --authorization-kubeconfig=/etc/kubernetes/scheduler.conf
    - --bind-address=127.0.0.1
    - --kubeconfig=/etc/kubernetes/scheduler.conf
    - --leader-elect=true
#    - --port=0
# 再次查看集群狀態
[root@linux-servertwo manifests]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE             ERROR
controller-manager   Healthy   ok                  
scheduler            Healthy   ok                  
etcd-0               Healthy   {"health":"true"}  

去除master節點的污點

Kubernetes集群的Master節點是十分重要的,一個高可用的Kubernetes集群一般會存在3個以上的master節點,為了保證master節點的穩定性,一般不推薦將業務的Pod調度到master節點上,本文使用單機部署,所以需要去除master節點的污點。Kubernetes中默認master節點是不能調度任何pod的,如果我們要想單節點使用k8s,需要提前將主節點污點去除,官網污點相關的說明:kubectl taint | Kuberneteshttps://kubernetes.io/zh-cn/docs/reference/kubectl/generated/kubectl_taint/

#執行該命令去除master污點
kubectl taint nodes --all node-role.kubernetes.io/master-
# 設置污點
kubectl taint nodes <node-name> key1=value1:NoSchedule
# 去除污點
kubectl taint nodes <node-name> key1:NoSchedule-
# 查看所有節點
[root@linux-servertwo manifests]# kubectl get nodes
NAME              STATUS     ROLES                  AGE   VERSION
linux-servertwo   NotReady   control-plane,master   75m   v1.20.9
# 查看節點詳情:可以查看到節點設置的污點信息 Taints: 屬性
kubectl describe node linux-servertwo

配置Label標簽

# 設置Label
kubectl label node node1 node-role.kubernetes.io/master=
# 移除Label
kubectl label node node1 node-role.kubernetes.io/master-
kubectl label nodes <node-name> node-role.kubernetes.io/control-plane= --overwrite
kubectl label nodes <node-name> node-role.kubernetes.io/master= --overwrite
kubectl label nodes <node-name> node-role.kubernetes.io/node= --overwrite
#查看標簽
kubectl get nodes --show-labels
#查看節點詳情
kubectl describe node linux-servertwo
# 標簽的命名: Kubernetes 中,角色標簽通常使用 node-role.kubernetes.io/<role> 的格式。
# --overwrite: 如果節點已經有相同的標簽,使用 --overwrite 選項可以覆蓋現有標簽。
# 角色的意義:  control-plane 和 master 通常用于標識控制平面節點,而 node 用于標識工作節點。

6、安裝網絡插件(CNI)

Kubernetes網絡插件,通常被稱為CNI(Container Network Interface),用于在Kubernetes集群中提供容器之間的網絡連接和通信功能。CNI 插件是 Kubernetes網絡架構的一個核心部分,它負責為Pod 分配網絡地址、處理網絡流量以及為容器提供網絡隔離。Flannel和Calico是兩種常用的網絡插件,它們各自具有不同的特點和應用場景,他們的作用是讓集群中的不同節點主機創建的Docker容器都具有全集群唯一的虛擬IP地址,從而使得不同節點上的容器能夠獲得同屬一個內網且不重復的IP地址。

6.1、Flannel的使用場景

Flannel是一個簡單易用的CNI插件,主要聚焦于為Kubernetes提供基本的容器網絡功能。它的設計目標是為小到中等規模的集群提供一種輕量級的網絡解決方案。Flannel 適用于以下場景:

  • 小型或中型集群或開發/測試環境:Flannel通常適用于規模較小、網絡拓撲相對簡單的集群。它比較輕量,不需要復雜的配置。適合運行在一個不需要復雜網絡策略的小型或中型Kubernetes集群。特別適合開發、測試和實驗環境。
  • 沒有復雜網絡策略要求的環境:Flannel不提供復雜的網絡策略功能,它的主要目標是為Pod提供基本的IP地址分配和通信能力。對于不需要對網絡流量進行細粒度控制的環境,Flannel是一個非常簡單且易于配置的網絡方案。
  • 低資源消耗的集群:Flannel配置和管理相對簡單,資源消耗較低。它使用VXLAN或UDP作為網絡后端,通常適合資源受限的環境。對于資源有限的環境,如邊緣計算、單機部署或開發/測試集群,Flannel 的資源消耗較少,能夠滿足基本的網絡需求。
  • 沒有高性能需求的場景:Flannel 的網絡性能通常不如 Calico 或 Cilium,因為它使用的是一種簡單的網絡隧道技術(如 VXLAN),適合對網絡性能要求不高的環境。對于對網絡延遲和吞吐量要求不高的應用,Flannel 是一個合適的選擇。
  • 臨時或實驗性集群:Flannel 可以用來支持那些臨時搭建、沒有高網絡需求的集群環境,例如實驗性項目或 POC(概念驗證)集群。

6.2、Calico的使用場景

Calico是一個功能強大的CNI插件,它不僅提供基本的容器網絡功能,還支持更復雜的網絡策略和高級功能,如IP路由、網絡安全、流量控制和負載均衡等。Calico 適用于對網絡性能、安全性和可擴展性有較高要求的場景。以下是Calico的典型使用場景:

  • 大規模集群或多集群環境:Calico 支持大規模集群的高性能網絡通信,支持跨多個數據中心或云平臺的網絡連接。它采用高效的路由技術(如 BGP 和 IP-in-IP),可以應對大規模和復雜的網絡環境。如果部署的Kubernetes集群是大規模的,或者需要跨多個數據中心或云區域部署,Calico 由于其高可擴展性和支持跨節點的路由,適用于這種大規模的集群管理。
  • 需要復雜網絡策略和流量控制的環境:Calico 提供強大的網絡策略功能,可以定義細粒度的訪問控制規則,控制不同 Pod 或命名空間之間的流量。這對于有高安全性要求的應用尤為重要。如果需要部署一個嚴格的網絡安全控制 Kubernetes 集群,或應用需要按照訪問控制列表(ACL)進行網絡隔離和流量管理,Calico 是一個非常合適的選擇。它允許你實現基于 IP、端口、命名空間等層級的精確控制。
  • 需要高網絡性能的場景:Calico 基于 IP 路由的網絡架構通常比 Flannel 更高效,尤其是在大規模集群中。它支持 BGP(邊界網關協議),提供快速的路由功能和高吞吐量。對于需要低延遲、高吞吐量網絡性能的應用(如大規模分布式數據庫、大數據分析平臺等),Calico 提供了更優的性能,適用于需要高網絡性能的生產環境。
  • 云原生和微服務架構:Calico 提供對云原生應用、微服務架構的良好支持,尤其是在管理復雜的服務網格、服務發現、負載均衡等方面有很大優勢。在構建基于微服務的云原生應用時,Calico 的網絡策略、流量管理功能以及對服務網格(如 Istio)的支持,可以幫助更好地管理和保護集群中的流量。
  • 混合云或多云環境:Calico 允許在不同的云環境(如 AWS、GCP、Azure 等)之間建立虛擬網絡,支持跨云網絡通信,并能有效管理跨云的網絡流量。如果需要部署 Kubernetes 集群在一個混合云或多云環境,需要跨不同云平臺的 Kubernetes 集群進行通信,Calico 可以幫助你實現網絡跨平臺的統一管理。
  • 需要高可用性和彈性網絡的場景:Calico 通過支持 BGP 動態路由和其他冗余機制,提高了網絡的可靠性和彈性。它能夠自動應對節點故障和網絡變化,確保集群網絡的高可用性。對于需要高可用性和自動化恢復的企業級應用或生產環境,Calico 的高可用網絡設計非常適合。
  • Kubernetes 集群與虛擬機混合部署:通過Calico可以在Kubernetes環境中部署虛擬機,Calico 可以同時支持容器和虛擬機,適用于虛擬化和容器化混合的環境。

6.3、Flannel與Calico的對比總結

特性FlannelCalico
網絡架構簡單的 IP 分配和通信高效的路由,支持 BGP
性能性能較低,適用于小規模集群高性能,適用于大規模集群
網絡策略不支持復雜網絡策略強大的網絡策略功能
網絡安全簡單的網絡隔離強大的安全控制,支持 ACL 和安全組
擴展性適用于小型、中型集群適用于大規模集群
適用場景小型集群、開發/測試、臨時集群大規模集群、企業級環境、混合云、多云環境

所以通過以上應用功能對比,如果需要簡單、輕量、易于配置的網絡方案,適合小型集群、開發環境或者臨時集群,可以使用 Flannel。如果需要高性能、大規模擴展能力以及復雜的網絡策略,尤其是在生產環境中對安全性和網絡隔離有嚴格要求的場景。使用Calico更加合適。

總結:

通過以上分析,由于本篇使用的是單節點部署,使用Flannel更為合適。

6.4、kube-flannel安裝

Flannel官網:https://github.com/flannel-io/flannel#deploying-flannel-manually

下載文件

 wget https://github.com/flannel-io/flannel/releases/download/v0.24.3/kube-flannel.yml

更改網絡

 # 修改下載的kube-flannel.yml文件
 vim kube-flannel.yml
 
 # 找到net-conf.json屬性,配置Network和初始化的 kubeadm init  --pod-network-cidr=172.17.0.1/16 的IP一致,Backend.Type的類型為vxlan
 net-conf.json: |
    {
      "Network": "172.17.0.1/16",
      "Backend": {
        "Type": "vxlan"
      }
    }

當網絡插件使用 VXLAN 類型時,它會在每個 Kubernetes 節點之間創建一個虛擬隧道,允許跨節點的 Pod 之間進行通信。具體來說,VXLAN 技術提供以下幾個重要功能:

  • 跨主機網絡連接:VXLAN 允許 Kubernetes 集群中的 Pod 即使在不同物理主機上,也能直接通信。
  • 可擴展性:VXLAN 支持大規模的網絡虛擬化,能夠創建多達 16,777,216 個虛擬網絡。
  • 網絡隔離:每個 VXLAN 網絡都有唯一的標識符(VNI),使得網絡間相互隔離,不會干擾。

配置成功后,執行命令發布Flannel

[root@linux-servertwo kubernetes]# kubectl apply -f kube-flannel.yml
namespace/kube-flannel created
serviceaccount/flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
You have new mail in /var/spool/mail/root
# 查看是否發布成功,出現 Running 狀態,說明 Flannel 插件安裝成功
[root@linux-servertwo kubernetes]# kubectl get pods -n kube-flannel
NAME                    READY   STATUS    RESTARTS   AGE
kube-flannel-ds-fvzcp   1/1     Running   0          13s
# 查看節點狀態 
[root@linux-servertwo kubernetes]# kubectl get nodes
NAME              STATUS   ROLES                  AGE   VERSION
linux-servertwo   Ready    control-plane,master   24h   v1.20.9
# 通過查看節點狀態發現STATUS列表,由之前的 NotReady 變為 Ready 說明已經正常工作了
# Ready:表示該節點已經成功加入集群,且所有必需的組件正在運行中,能夠正常調度Pods
# NotReady:表示該節點出現了問題,無法正常工作,可能是因為網絡、系統故障或Kubernetes組件沒有啟動成功

查看所有Pod是否啟動成功

# 執行命令查看Pod啟動情況:
kubectl get pod -n kube-system

發現兩個pod未啟動,執行以下命令查看失敗的原因(這里是第一次安裝的時候會出現的問題,當進行第二次安裝的時候沒有出現該問題,可能當時是網絡原因,如果查看Pod啟動情況發現都啟動成功了,可以不進行配置,這里只做下記錄)

kubectl describe pod coredns-7f89b7bc75-2k74p  -n kube-system

networkPlugin cni failed to set up pod "coredns-7f89b7bc75-2k74p_kube-system" network: loadFlannelSubnetEnv failed: open /run/flannel/subnet.env:no such file or directory

Flannel 的配置文件通常包括子網配置文件(subnet.env),位于/run/flannel/目錄下。如果文件缺失,可能是因為Flannel沒有正確初始化。

# 如果沒有,可以創建一個subnet.env文件, 加入以下信息
[root@linux-servertwo kubernetes]# cat /run/flannel/subnet.env
FLANNEL_NETWORK=172.17.0.0/16
FLANNEL_SUBNET=172.17.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
#FLANNEL_NETWORK:指定整個網絡范圍。 代表的子網范圍是 172.17.0.0 到 172.17.255.255
#FLANNEL_SUBNET:指定一個子網,該子網將被分配給 Flannel 網絡插件。代表的子網范圍是 172.17.0.0 到 172.17.0.255
#FLANNEL_MTU:指定網絡的最大傳輸單元(默認為 1450 字節)。
#FLANNEL_IPMASQ:設置是否啟用 IP 轉發和網絡地址轉換(IP Masquerading),通常啟用

配置成功,我們可以發現目前所有pod都已經啟動了。

Kubenetes移除Flannel

# 刪除 DaemonSet
kubectl delete daemonset kube-flannel-ds-fvzcp -n kube-flannel
# 刪除 ConfigMap
kubectl delete configmap kube-flannel-ds-fvzcp -n kube-flannel
# 刪除 ServiceAccount
kubectl delete serviceaccount flannel -n kube-flannel
# 驗證 DaemonSet 是否已刪除
kubectl get daemonset -n kube-flannel
# 驗證 Pod 是否已刪除
kubectl get pod -n kube-flannel

確認所有Pod啟動成功

當安裝成功Flannel后,最后需要再次確認下所安裝的所有Pod是否全部啟動成功,如果還有啟動失敗的Pod,在找其他方法去解決。

# 執行以下命令查看所有命名空間的Pod運行情況
[root@linux-servertwo kubernetes]# kubectl get pod --all-namespaces
NAMESPACE      NAME                                      READY   STATUS    RESTARTS   AGE
kube-flannel   kube-flannel-ds-fvzcp                     1/1     Running   0          18h
kube-system    coredns-7f89b7bc75-5p49z                  1/1     Running   0          42h
kube-system    coredns-7f89b7bc75-6crzd                  1/1     Running   0          42h
kube-system    etcd-linux-servertwo                      1/1     Running   0          42h
kube-system    kube-apiserver-linux-servertwo            1/1     Running   0          42h
kube-system    kube-controller-manager-linux-servertwo   1/1     Running   0          42h
kube-system    kube-proxy-btbwc                          1/1     Running   0          42h
kube-system    kube-scheduler-linux-servertwo            1/1     Running   0          42h
# 可以以上輸出可以發現所有Pod都已經啟動成功了
# READY Pod 中容器的就緒狀態 格式為:就緒容器數 / 總容器數 ,通過輸出可以發現都已經準備就緒
# STATUS 為:Running,表示 Pod 處于運行狀態。如果為:CrashLoopBackOff,表示該Pod中的容器因某些錯誤崩潰并且正進入重啟循環
# RESTARTS  Pod 中容器的重啟次數 顯示為 0 說明容器沒有重啟,就表示啟動成功了。如果經歷了容器多次重啟,可能說明它遇到了錯誤或其他問題。則會顯示一個數字,表示重啟的次數

7、部署kubernetes-dashboard

Kubernetes安裝部署成功后,接下來就安裝我們的第一個K8s應用kubernetes-dashboardkubernetes-dashboardK8s官方推薦的圖形化管理工具,它的作用是簡化集群操作,適用于習慣于圖形界面而非命令行的用戶。kubernetes-dashboard是一個基于 Web 的用戶界面,用于管理和監控 Kubernetes 集群中的應用程序,幫助用戶查看集群的狀態、管理應用程序資源、執行常見的管理操作等。

Github官網地址:https://github.com/kubernetes/dashboard

查看版本兼容性

找到和我們安裝k8s的版本所兼容的版本

由于本次下載的是1.20.9,所以找到兼容該版本的dashboard進行下載,在Linux中執行以下命令下載上圖中的版本。

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml

默認Dashboard只能集群內部訪問,修改ServiceNodePort類型,暴露到外部:

# 在spec中添加配置信息type: NodePort 在ports中加入 nodePort: 31001  # 新增
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  type: NodePort  # 新增
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 31001  # 新增
  selector:
    k8s-app: kubernetes-dashboard

發布應用

# 部署應用
[root@linux-servertwo kubernetes]# kubectl apply -f recommended.yaml
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created
# 查看是否發布成功
[root@linux-servertwo kubernetes]# kubectl get pods -n kubernetes-dashboard
NAME                                         READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-79c5968bdc-tl4gr   1/1     Running   0          37s
kubernetes-dashboard-9f9799597-2spkv         1/1     Running   0          37s
# 查看kubernetes-dashboard命名空間下的暴露端口
[root@linux-servertwo kubernetes]# kubectl get svc -A | grep kubernetes-dashboard
kubernetes-dashboard   dashboard-metrics-scraper   ClusterIP   172.16.130.109   <none>        8000/TCP                 3m35s
kubernetes-dashboard   kubernetes-dashboard        NodePort    172.16.240.39    <none>        443:31001/TCP            3m35s

查看kubernetes-dashboard命名空間下更為詳細的信息

# 查看kubernetes-dashboard命名空間下更為詳細的信息
[root@linux-servertwo kubernetes]# kubectl get pod,svc -n kubernetes-dashboard -o wide

通過以上查看,可以發現kubernetes-dashboard 部署成功了,接下來通過瀏覽器訪問31001端口,查看是否可以訪問成功。訪問地址:http://NodeIP:31001

Client sent an HTTP request to an HTTPS server.

通過訪問,瀏覽器頁面報以上錯誤信息,根據提示加上https:// 進行訪問,地址:https://NodeIP:31001 ,再次訪問

通過查找發現谷歌的Google Chrome和微軟的Microsoft Edge因為地址不安全,會攔截該地址,使用火狐瀏覽器Firefox可以訪問。訪問成功頁面如下:

通過登錄頁面可以看到,要想進入系統需要進行登錄。登錄系統需要輸入Token信息,下面就來獲取登錄的Token

首先創建用戶

# 執行:kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard 創建 service account
[root@linux-servertwo kubernetes]# kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
serviceaccount/dashboard-admin created

給創建的用戶授權

# 執行: kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin 綁定默認cluster-admin管理員集群角色
[root@linux-servertwo kubernetes]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin created

獲取用戶Token

# 執行:kubectl get secrets -n kubernetes-dashboard | grep dashboard-admin
[root@linux-servertwo kubernetes]# kubectl get secrets -n kubernetes-dashboard | grep dashboard-admin
dashboard-admin-token-29nxl        kubernetes.io/service-account-token   3      5m41s
# 根據獲取到的 dashboard-admin-token-29nxl 查看詳情
[root@linux-servertwo kubernetes]# kubectl describe secrets dashboard-admin-token-29nxl -n kubernetes-dashboard
Name:         dashboard-admin-token-29nxl
Namespace:    kubernetes-dashboard
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: dashboard-admin
              kubernetes.io/service-account.uid: 7d9a046c-c6dd-4dfa-affb-b76c1c079521
Type:  kubernetes.io/service-account-token
Data
====
namespace:  20 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6ImtZNmxMM2cyTnI2NHVmRGdtU19GbUEyNlhiRHg1THVFWXliZXl2NWQycHMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tMjlueGwiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiN2Q5YTA0NmMtYzZkZC00ZGZhLWFmZmItYjc2YzFjMDc5NTIxIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.NBRUjyHXD6zCeiboJP946fOJfWn2dVtC4n7VvfzUH805g4EgaNFM2I4ADN5UUGdfLnKaO71MG1JESYemh1SSkdG8jg7yXWioiSl7pAhZUnhJYNAOgiE-nHA01yCISTTR30CL3OCjx8lkRLPxTRz31DMlqxC8cy4ToPD4iqyDrZOYlZWkGtuFf8SBz-xm4T5SUKvPvl0y8P1ThZw6uD1AhXmCZvH2KveLPm2S_kjoCC3aR5ElcaeU-jbjqcIudxSdLjzLSj11M6jYSc-7hY7zAVYiZF3dCGFDkej3j3eZWPt2lPwjoWSpUdJRqK_eAQMN2wot4l0SpHG0pOS1USNxxw
ca.crt:     1066 bytes

復制token到輸入框

點擊登錄,登錄成功進入首頁面。

8、總結

關于Kubernetes的安裝介紹到這里就結束了,雖然安裝的過程中有點小曲折,但是還算是正常啟動成功了。相對于搭建集群的K8s,使用單節點安裝確實方便了許多,非常適合新手去學習k8s

?轉自https://www.cnblogs.com/sowler/p/18672064



該文章在 2025/4/8 9:50:56 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 亚洲免费福利在线视频 | 日韩欧美国产一区精品 | 欧美三级真做在线观看 | 免费国产成人高清在线观看视频 | 粗大的内捧猛烈 | 成年黄色视频爱雨 | 国产精品亚洲专区无码影院 | 51精产国品一二三产区区 | 国产ts在线观看视 | 51精品视频全部免费的意义 | 日本一卡二卡三四卡在线观看免费视频 | a片日本少妇偷人妻中文字幕 | 欧美精品一区二区A片免费 欧美精品一区二区黄A片 | 美女诱惑性感揉胸 | 动漫av纯肉无码a | 亚洲天堂2017手机在线 | av大片 | 国产三级精品 | aⅴ色欲av片无码精品小说 | 在线成本人动漫视频网站 | 精品久久久一二三区 | av中文片在线观看 | 亚洲自偷自拍另类 | 亚洲免费久久在线视频精品播放 | 国产精品视频白浆合集 | 久久99精品久久久久久清纯直播 | 在线观看av中文字幕不卡 | 久久在线 | 国产亚洲综合激情校园小说 | 国产亚洲精品久久久久久国模美 | 2024精品国产综合久久 | 被强行糟蹋的女人A片 | 国模粉嫩小泬视频在线观看 | 国产日韩欧美另类制服 | 超清波多野结衣精品一区 | 成人精品久久亚洲欧美成人综合在线 | 伊人久久精品亚洲午夜 | 国产黄毛片 | 精品国产一区二区三区久久狼黑人 | 九九香蕉视频 | 国产精品一区二区AV交换 |