1、Kubernetes簡介
Kubernetes,簡稱K8s,是用8代替名字中間的8個字符“ubernete”而成的縮寫。Kubernetes是Google開源的一個容器編排引擎,用于自動部署、擴展和管理容器化應(yīng)用程序, 現(xiàn)在由Cloud Native Computing Foundation (CNCF) 維護。
主要特性:
- 自動化部署和復制
- 自動擴縮容
- 負載均衡
- 自我修復
- 服務(wù)發(fā)現(xiàn)和配置管理
官網(wǎng):https://kubernetes.io/zh-cn/
Github開源地址:https://github.com/kubernetes/kubernetes
2、Kubernetes安裝方式
我們可以通過官網(wǎng)文檔查看k8s的幾種安裝方式。文檔地址:https://kubernetes.io/zh-cn/docs/tasks/tools/
- kubeadm:官方推薦的快速部署工具
- 二進制包:所有組件都是二進制文件,靈活性高,比較麻煩
- minikube:本地單節(jié)點測試環(huán)境
- kind:使用Docker容器運行本地Kubernetes集群,將Kubernetes所需要的所有組件全部部署在一個Docker容器中,可以很方便的搭建Kubernetes集群
根據(jù)調(diào)查,二進制包雖然提供了很大的靈活性,但因為配置復雜度高,通常只會被少數(shù)有特殊需求的場景采用。目前使用最多的安裝方式為:使用kubeadm
進行安裝和使用minikube
進行安裝 ,kubeadm
主要用于搭建生產(chǎn)環(huán)境集群,而minikube
主要用于個人學習本地開發(fā)環(huán)境安裝。kind
只有在少數(shù)資源不夠的環(huán)境下才會使用。
以下為minikube
和kubeadm
這兩種安裝方式的不同點進行對比:
安裝和啟動方式不同:
- MiniKube安裝:安裝
Minikube
相對簡單,可以通過下載安裝包使用Minikube
程序進行安裝,只需運行minikube start
命令即可?,然后就可以部署應(yīng)用程序,擴容和管理集群。 - kubeadm安裝: 安裝
Kubernetes
需要更多的步驟,使用kubeadm
、kubelet
、kubectl
三個工具進行管理安裝,部署Kubernetes
集群,一主二從。然后部署應(yīng)用程序,擴容和管理集群。
用途不同:
- Minikube?:
Minikube
是一個輕量級的Kubernetes
集群,主要用于在本地開發(fā)和測試。它通過虛擬化技術(shù)在一個單獨的虛擬化實例中運行Kubernetes
控制平面組件,使得我們可以在本地環(huán)境中模擬Kubernetes
集群,從而進行開發(fā)和調(diào)試?。 - kubeadm:
Kubernetes
是一個強大的容器編排平臺,用于在生產(chǎn)環(huán)境中部署和管理大規(guī)模的容器化應(yīng)用程序。它支持多節(jié)點集群,能夠處理更復雜的部署需求和更大的負載?。
適用場景不同:
- ?Minikube?: 適用于開發(fā)者和測試人員,在本地環(huán)境中快速搭建和測試
Kubernetes
應(yīng)用,方便進行開發(fā)和調(diào)試? - kubeadm: 適用于生產(chǎn)環(huán)境,能夠處理大規(guī)模的容器部署和管理任務(wù),支持多節(jié)點集群,適合在云平臺或數(shù)據(jù)中心部署?
總結(jié):
通過上面可以看出,Minikube
是一個用于在本地快速部署Kubernetes
集群的工具,比較適用于開發(fā)和測試環(huán)境的使用,而kubeadm
是一個用于生產(chǎn)環(huán)境的容器編排使用,具有強大且復雜的功能。
3、安裝Docker
需要保證服務(wù)器已經(jīng)安裝Docker
,這里不在描述,如果不清楚可以查看以下文章:
https://www.cnblogs.com/sowler/p/18228732
通過上面文章安裝成功后,需要更新 Cgroup Driver 為systemd
Cgroup Driver: cgroupfs
"exec-opts": ["native.cgroupdriver=systemd"]
systemctl daemon-reload
systemctl restart docker
Cgroup Driver: systemd
4、安裝Harbor
Harbor是Docker存儲鏡像的私有化倉庫,有時候因為網(wǎng)絡(luò)問題連接不上Docker Hub
鏡像倉庫,可以搭建私有化倉庫,從私有倉庫進行獲取。不清楚搭建可以查看以下文章:
https://www.cnblogs.com/sowler/p/18242819
如果不想搭建私有化倉庫也可以,需要配置Docker
獲取的鏡像源地址,配置為一些開源的鏡像源地址。雖說因為國內(nèi)污點嚴重問題各大廠商關(guān)閉了鏡像源地址,但是還是可以找到一些可以訪問Docker Hub
的鏡像源的。以下地址親測有效:
{
"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
是一個工具,用于在單個節(jié)點上部署一個本地的Kubernetes集群。這對于開發(fā)者在本地開發(fā)環(huán)境進行Kubernetes應(yīng)用測試和調(diào)試非常有用。它能夠在個人計算機上啟動一個輕量級的虛擬機或容器,并在這個環(huán)境中部署一個完整的Kubernetes集群,包括API服務(wù)器、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
當停止集群后,所有的容器和服務(wù)都會停止運行,但集群的配置和存儲的數(shù)據(jù)(如果有持久化存儲配置)會保留。
刪除集群:
minikube delete
使用該命令可以刪除整個Minikube集群。這將清除所有與集群相關(guān)的資源,包括虛擬機、容器鏡像等。如果需要重新創(chuàng)建集群,需要再次運行minikube start命令。
5.2、二進制安裝
二進制文件下載地址:https://kubernetes.io/releases/download/#binaries
使用二進制安裝k8s
相對來說比較麻煩,需要自己配置一些相關(guān)參數(shù)和啟動腳本。本次不使用該方法配置。感興趣的朋友可以在網(wǎng)上找一些相關(guān)文章進行安裝。
5.3、Kubeadm安裝
5.3.1、介紹
前面已經(jīng)提到了,通過 kubeadm
進行安裝,需要安裝kubeadm
、kubelet
和kubectl
三個控件,以下是相關(guān)控件的作用介紹:
- Kubeadm: 用于快速部署
Kubernetes
集群的官方工具,主要功能:集群初始化節(jié)點加入刪除、證書管理、組件升級 - kubectl:
kubectl
是 Kubernetes
的命令行工具,可以通過它與 Kubernetes
集群進行交互,執(zhí)行各種操作,例如部署應(yīng)用、管理資源(如Pods、Services、Deployments等)、 查看集群狀態(tài)以及調(diào)試問題等。它是與Kubernetes API server
通信的主要方式,允許用戶控制和配置集群中的各個組件。 - Kubelet:
Kubelet
是運行在每個Kubernetes
節(jié)點上的代理服務(wù),是Kubernetes
集群的核心組件之一。它的主要職責是確保該節(jié)點上的Pod
按照Kubernetes API Server
指定的狀態(tài)正確運行。Kubelet
負責接收來自API Server
的指令,創(chuàng)建、監(jiān)控和管理Pod
及其容器,還負責健康檢查、生命周期管理以及與容器運行時進行交互以執(zhí)行具體容器操作。kubelet就相當于是守護進程,Kubernetes
會自動管理,不需要我們做多余的操作。
5.3.2、通過yum安裝
通過yum
配置國內(nèi)阿里云開源的k8s
鏡像進行部署是相對來說比較簡單的,本篇文章使用yum
進行安裝。
安裝前準備工作:檢查服務(wù)器
systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld
vim /etc/selinux/config
SELINUX=disabled
[root@linux-k8s ~]
total used free shared buff/cache available
Mem: 3.6G 298M 1.7G 8.9M 1.6G 3.0G
Swap: 0B 0B 0B
cat /etc/fstab
/opt/swapdata swap swap defaults 0 0
配置加載內(nèi)核模塊
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
添加該配置文件確保在系統(tǒng)啟動時加載br_netfilter
內(nèi)核模塊。br_netfilter
模塊是 Kubernetes
中處理橋接網(wǎng)絡(luò)流量的關(guān)鍵模塊。Kubernetes
網(wǎng)絡(luò)模型通常需要通過橋接(bridge)來連接容器和主機網(wǎng)絡(luò),br_netfilter
模塊使得這些橋接流量能夠被iptables
規(guī)則處理。容器網(wǎng)絡(luò)通常使用Linux
橋接來進行通信,如果沒有這個模塊,容器和主機之間的網(wǎng)絡(luò)流量就不能經(jīng)過 iptables
規(guī)則處理,可能會導致網(wǎng)絡(luò)隔離和通信問題。因此,啟用 br_netfilter
讓 Linux
橋接流量能夠經(jīng)過 iptables 規(guī)則進行過濾和管理。
設(shè)置iptables
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
Kubernetes 集群通常使用 Linux 網(wǎng)絡(luò)橋接(如 docker0)和 iptables 來管理容器的網(wǎng)絡(luò)流量。通過加載 br_netfilter 內(nèi)核模塊,并啟用橋接流量經(jīng)過 iptables 的處理,可以確保容器的網(wǎng)絡(luò)流量能夠被適當?shù)囊?guī)則過濾和路由。這是 Kubernetes 網(wǎng)絡(luò)模型正常工作的關(guān)鍵步驟,特別是在涉及到多節(jié)點、Pod 網(wǎng)絡(luò)隔離和網(wǎng)絡(luò)策略時。這些配置確保 Kubernetes 的網(wǎng)絡(luò)組件(如 CNI 插件)能夠正確地實現(xiàn)容器之間的網(wǎng)絡(luò)通信,并且能夠按需進行流量控制和隔離。
配置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 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 ~]
-bash: kubeadm: command not found
vim /root/.bashrc
export PATH=$PATH:/usr/bin/yum
source /root/.bashrc
[root@linux-k8s ~]
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 ~]
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 是主節(jié)點的IP地址,確保其他節(jié)點能夠通過該地址訪問API服務(wù)器,如果為公網(wǎng)地址需要控制臺開放2379 2389 6443端口
--image-repository registry.aliyuncs.com/google_containers 指定了容器鏡像的倉庫地址,Kubernetes默認使用k8s.gcr.io作為鏡像倉庫,由于無法訪問使用了阿里云的鏡像倉庫
--kubernetes-version v1.20.9 安裝的版本,避免版本不匹配引發(fā)潛在的問題,使用特定版本確保在集群中運行的所有組件都是兼容的。
--service-cidr=172.16.0.0/16 集群中的service服務(wù)(如 ClusterIP 類型的服務(wù))分配的地址池, 表示服務(wù)IP會從172.16.0.1到172.16.255.254之間的地址分配
--pod-network-cidr=172.17.0.1/16 設(shè)置Pod網(wǎng)絡(luò)的CIDR地址池,所有Pods將會使用的IP地址范圍,表示Pod網(wǎng)絡(luò)會使用172.17.0.1到172.17.255.254范圍的IP地址。注意:地址池是用于Pod內(nèi)部通信的,需要與選擇的CNI插件相兼容,常見的CNI插件如Calico、Flannel會使用該地址池為Pod分配IP地址,確保Flannel網(wǎng)絡(luò)插件的配置與此CIDR地址池一致。
初始化報錯

執(zhí)行以下命令解決
yum install -y conntrack
conntrack -L
去除linux-servertwo警告
hostname
hostnamectl set-hostname linux-servertwo
10.0.4.16 linux-servertwo
[root@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 ~]
[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
net.ipv4.ip_forward = 1
sudo sysctl -p
[root@linux-servertwo ~]
[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設(shè)置,Kubeadm初始化成功后控制臺會打印這些指令命令,執(zhí)行以下命令:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
如果集群部署,其它工作節(jié)點需要執(zhí)行join命令加入該節(jié)點,由于本次是單節(jié)點運行,不需要執(zhí)行加入命令。
kubeadm join 10.0.4.16:6443 --token no9c55.flvu76gcqgk7xqtb \
--discovery-token-ca-cert-hash sha256:97bc27e3bb67d3d0b7adfca65c934a140ac2c16708bed62f9c49fbd9332cec41
kubeadm token create --print-join-command
查看節(jié)點
[root@linux-servertwo ~]
NAME STATUS ROLES AGE VERSION
linux-servertwo NotReady control-plane,master 13m v1.20.9
驗證集群狀態(tài)

出現(xiàn)該報錯是因為是/etc/kubernetes/manifests/
下的kube-controller-manager.yaml
和kube-scheduler.yaml
設(shè)置的默認端口是0
導致的,注釋掉對應(yīng)的port
即可。
cd /etc/kubernetes/manifests
vim kube-controller-manager.yaml
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
- --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
vim kube-scheduler.yaml
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
[root@linux-servertwo manifests]
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節(jié)點的污點
Kubernetes
集群的Master
節(jié)點是十分重要的,一個高可用的Kubernetes
集群一般會存在3個以上的master
節(jié)點,為了保證master
節(jié)點的穩(wěn)定性,一般不推薦將業(yè)務(wù)的Pod
調(diào)度到master
節(jié)點上,本文使用單機部署,所以需要去除master
節(jié)點的污點。Kubernetes
中默認master
節(jié)點是不能調(diào)度任何pod
的,如果我們要想單節(jié)點使用k8s
,需要提前將主節(jié)點污點去除,官網(wǎng)污點相關(guān)的說明:kubectl taint | Kubernetes: https://kubernetes.io/zh-cn/docs/reference/kubectl/generated/kubectl_taint/
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]
NAME STATUS ROLES AGE VERSION
linux-servertwo NotReady control-plane,master 75m v1.20.9
kubectl describe node linux-servertwo
配置Label標簽
kubectl label node node1 node-role.kubernetes.io/master=
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
6、安裝網(wǎng)絡(luò)插件(CNI)
Kubernetes網(wǎng)絡(luò)插件,通常被稱為CNI(Container Network Interface),用于在Kubernetes集群中提供容器之間的網(wǎng)絡(luò)連接和通信功能。CNI 插件是 Kubernetes網(wǎng)絡(luò)架構(gòu)的一個核心部分,它負責為Pod 分配網(wǎng)絡(luò)地址、處理網(wǎng)絡(luò)流量以及為容器提供網(wǎng)絡(luò)隔離。Flannel和Calico是兩種常用的網(wǎng)絡(luò)插件,它們各自具有不同的特點和應(yīng)用場景,他們的作用是讓集群中的不同節(jié)點主機創(chuàng)建的Docker容器都具有全集群唯一的虛擬IP地址,從而使得不同節(jié)點上的容器能夠獲得同屬一個內(nèi)網(wǎng)且不重復的IP地址。
6.1、Flannel的使用場景
Flannel是一個簡單易用的CNI插件,主要聚焦于為Kubernetes提供基本的容器網(wǎng)絡(luò)功能。它的設(shè)計目標是為小到中等規(guī)模的集群提供一種輕量級的網(wǎng)絡(luò)解決方案。Flannel 適用于以下場景:
- 小型或中型集群或開發(fā)/測試環(huán)境:Flannel通常適用于規(guī)模較小、網(wǎng)絡(luò)拓撲相對簡單的集群。它比較輕量,不需要復雜的配置。適合運行在一個不需要復雜網(wǎng)絡(luò)策略的小型或中型Kubernetes集群。特別適合開發(fā)、測試和實驗環(huán)境。
- 沒有復雜網(wǎng)絡(luò)策略要求的環(huán)境:Flannel不提供復雜的網(wǎng)絡(luò)策略功能,它的主要目標是為Pod提供基本的IP地址分配和通信能力。對于不需要對網(wǎng)絡(luò)流量進行細粒度控制的環(huán)境,F(xiàn)lannel是一個非常簡單且易于配置的網(wǎng)絡(luò)方案。
- 低資源消耗的集群:Flannel配置和管理相對簡單,資源消耗較低。它使用VXLAN或UDP作為網(wǎng)絡(luò)后端,通常適合資源受限的環(huán)境。對于資源有限的環(huán)境,如邊緣計算、單機部署或開發(fā)/測試集群,F(xiàn)lannel 的資源消耗較少,能夠滿足基本的網(wǎng)絡(luò)需求。
- 沒有高性能需求的場景:Flannel 的網(wǎng)絡(luò)性能通常不如 Calico 或 Cilium,因為它使用的是一種簡單的網(wǎng)絡(luò)隧道技術(shù)(如 VXLAN),適合對網(wǎng)絡(luò)性能要求不高的環(huán)境。對于對網(wǎng)絡(luò)延遲和吞吐量要求不高的應(yīng)用,F(xiàn)lannel 是一個合適的選擇。
- 臨時或?qū)嶒炐约海?/strong>Flannel 可以用來支持那些臨時搭建、沒有高網(wǎng)絡(luò)需求的集群環(huán)境,例如實驗性項目或 POC(概念驗證)集群。
6.2、Calico的使用場景
Calico是一個功能強大的CNI插件,它不僅提供基本的容器網(wǎng)絡(luò)功能,還支持更復雜的網(wǎng)絡(luò)策略和高級功能,如IP路由、網(wǎng)絡(luò)安全、流量控制和負載均衡等。Calico 適用于對網(wǎng)絡(luò)性能、安全性和可擴展性有較高要求的場景。以下是Calico的典型使用場景:
- 大規(guī)模集群或多集群環(huán)境:Calico 支持大規(guī)模集群的高性能網(wǎng)絡(luò)通信,支持跨多個數(shù)據(jù)中心或云平臺的網(wǎng)絡(luò)連接。它采用高效的路由技術(shù)(如 BGP 和 IP-in-IP),可以應(yīng)對大規(guī)模和復雜的網(wǎng)絡(luò)環(huán)境。如果部署的Kubernetes集群是大規(guī)模的,或者需要跨多個數(shù)據(jù)中心或云區(qū)域部署,Calico 由于其高可擴展性和支持跨節(jié)點的路由,適用于這種大規(guī)模的集群管理。
- 需要復雜網(wǎng)絡(luò)策略和流量控制的環(huán)境:Calico 提供強大的網(wǎng)絡(luò)策略功能,可以定義細粒度的訪問控制規(guī)則,控制不同 Pod 或命名空間之間的流量。這對于有高安全性要求的應(yīng)用尤為重要。如果需要部署一個嚴格的網(wǎng)絡(luò)安全控制 Kubernetes 集群,或應(yīng)用需要按照訪問控制列表(ACL)進行網(wǎng)絡(luò)隔離和流量管理,Calico 是一個非常合適的選擇。它允許你實現(xiàn)基于 IP、端口、命名空間等層級的精確控制。
- 需要高網(wǎng)絡(luò)性能的場景:Calico 基于 IP 路由的網(wǎng)絡(luò)架構(gòu)通常比 Flannel 更高效,尤其是在大規(guī)模集群中。它支持 BGP(邊界網(wǎng)關(guān)協(xié)議),提供快速的路由功能和高吞吐量。對于需要低延遲、高吞吐量網(wǎng)絡(luò)性能的應(yīng)用(如大規(guī)模分布式數(shù)據(jù)庫、大數(shù)據(jù)分析平臺等),Calico 提供了更優(yōu)的性能,適用于需要高網(wǎng)絡(luò)性能的生產(chǎn)環(huán)境。
- 云原生和微服務(wù)架構(gòu):Calico 提供對云原生應(yīng)用、微服務(wù)架構(gòu)的良好支持,尤其是在管理復雜的服務(wù)網(wǎng)格、服務(wù)發(fā)現(xiàn)、負載均衡等方面有很大優(yōu)勢。在構(gòu)建基于微服務(wù)的云原生應(yīng)用時,Calico 的網(wǎng)絡(luò)策略、流量管理功能以及對服務(wù)網(wǎng)格(如 Istio)的支持,可以幫助更好地管理和保護集群中的流量。
- 混合云或多云環(huán)境:Calico 允許在不同的云環(huán)境(如 AWS、GCP、Azure 等)之間建立虛擬網(wǎng)絡(luò),支持跨云網(wǎng)絡(luò)通信,并能有效管理跨云的網(wǎng)絡(luò)流量。如果需要部署 Kubernetes 集群在一個混合云或多云環(huán)境,需要跨不同云平臺的 Kubernetes 集群進行通信,Calico 可以幫助你實現(xiàn)網(wǎng)絡(luò)跨平臺的統(tǒng)一管理。
- 需要高可用性和彈性網(wǎng)絡(luò)的場景:Calico 通過支持 BGP 動態(tài)路由和其他冗余機制,提高了網(wǎng)絡(luò)的可靠性和彈性。它能夠自動應(yīng)對節(jié)點故障和網(wǎng)絡(luò)變化,確保集群網(wǎng)絡(luò)的高可用性。對于需要高可用性和自動化恢復的企業(yè)級應(yīng)用或生產(chǎn)環(huán)境,Calico 的高可用網(wǎng)絡(luò)設(shè)計非常適合。
- Kubernetes 集群與虛擬機混合部署:通過Calico可以在Kubernetes環(huán)境中部署虛擬機,Calico 可以同時支持容器和虛擬機,適用于虛擬化和容器化混合的環(huán)境。
6.3、Flannel與Calico的對比總結(jié)
特性 | Flannel | Calico |
---|
網(wǎng)絡(luò)架構(gòu) | 簡單的 IP 分配和通信 | 高效的路由,支持 BGP |
性能 | 性能較低,適用于小規(guī)模集群 | 高性能,適用于大規(guī)模集群 |
網(wǎng)絡(luò)策略 | 不支持復雜網(wǎng)絡(luò)策略 | 強大的網(wǎng)絡(luò)策略功能 |
網(wǎng)絡(luò)安全 | 簡單的網(wǎng)絡(luò)隔離 | 強大的安全控制,支持 ACL 和安全組 |
擴展性 | 適用于小型、中型集群 | 適用于大規(guī)模集群 |
適用場景 | 小型集群、開發(fā)/測試、臨時集群 | 大規(guī)模集群、企業(yè)級環(huán)境、混合云、多云環(huán)境 |
所以通過以上應(yīng)用功能對比,如果需要簡單、輕量、易于配置的網(wǎng)絡(luò)方案,適合小型集群、開發(fā)環(huán)境或者臨時集群,可以使用 Flannel。如果需要高性能、大規(guī)模擴展能力以及復雜的網(wǎng)絡(luò)策略,尤其是在生產(chǎn)環(huán)境中對安全性和網(wǎng)絡(luò)隔離有嚴格要求的場景。使用Calico更加合適。
總結(jié):
通過以上分析,由于本篇使用的是單節(jié)點部署,使用Flannel更為合適。
6.4、kube-flannel安裝
Flannel官網(wǎng):https://github.com/flannel-io/flannel#deploying-flannel-manually
下載文件
wget https://github.com/flannel-io/flannel/releases/download/v0.24.3/kube-flannel.yml
更改網(wǎng)絡(luò)
vim kube-flannel.yml
net-conf.json: |
{
"Network": "172.17.0.1/16",
"Backend": {
"Type": "vxlan"
}
}
當網(wǎng)絡(luò)插件使用 VXLAN 類型時,它會在每個 Kubernetes 節(jié)點之間創(chuàng)建一個虛擬隧道,允許跨節(jié)點的 Pod 之間進行通信。具體來說,VXLAN 技術(shù)提供以下幾個重要功能:
- 跨主機網(wǎng)絡(luò)連接:VXLAN 允許 Kubernetes 集群中的 Pod 即使在不同物理主機上,也能直接通信。
- 可擴展性:VXLAN 支持大規(guī)模的網(wǎng)絡(luò)虛擬化,能夠創(chuàng)建多達 16,777,216 個虛擬網(wǎng)絡(luò)。
- 網(wǎng)絡(luò)隔離:每個 VXLAN 網(wǎng)絡(luò)都有唯一的標識符(VNI),使得網(wǎng)絡(luò)間相互隔離,不會干擾。
配置成功后,執(zhí)行命令發(fā)布Flannel
[root@linux-servertwo kubernetes]
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
[root@linux-servertwo kubernetes]
NAME READY STATUS RESTARTS AGE
kube-flannel-ds-fvzcp 1/1 Running 0 13s
[root@linux-servertwo kubernetes]
NAME STATUS ROLES AGE VERSION
linux-servertwo Ready control-plane,master 24h v1.20.9
查看所有Pod是否啟動成功
kubectl get pod -n kube-system

發(fā)現(xiàn)兩個pod未啟動,執(zhí)行以下命令查看失敗的原因(這里是第一次安裝的時候會出現(xiàn)的問題,當進行第二次安裝的時候沒有出現(xiàn)該問題,可能當時是網(wǎng)絡(luò)原因,如果查看Pod啟動情況發(fā)現(xiàn)都啟動成功了,可以不進行配置,這里只做下記錄)
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 的配置文件通常包括子網(wǎng)配置文件(subnet.env),位于/run/flannel/
目錄下。如果文件缺失,可能是因為Flannel
沒有正確初始化。
[root@linux-servertwo kubernetes]
FLANNEL_NETWORK=172.17.0.0/16
FLANNEL_SUBNET=172.17.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
配置成功,我們可以發(fā)現(xiàn)目前所有pod都已經(jīng)啟動了。

Kubenetes移除Flannel
kubectl delete daemonset kube-flannel-ds-fvzcp -n kube-flannel
kubectl delete configmap kube-flannel-ds-fvzcp -n kube-flannel
kubectl delete serviceaccount flannel -n kube-flannel
kubectl get daemonset -n kube-flannel
kubectl get pod -n kube-flannel
確認所有Pod啟動成功
當安裝成功Flannel
后,最后需要再次確認下所安裝的所有Pod
是否全部啟動成功,如果還有啟動失敗的Pod
,在找其他方法去解決。
[root@linux-servertwo kubernetes]
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
7、部署kubernetes-dashboard
Kubernetes
安裝部署成功后,接下來就安裝我們的第一個K8s
應(yīng)用kubernetes-dashboard
。kubernetes-dashboard
是K8s
官方推薦的圖形化管理工具,它的作用是簡化集群操作,適用于習慣于圖形界面而非命令行的用戶。kubernetes-dashboard
是一個基于 Web 的用戶界面,用于管理和監(jiān)控 Kubernetes 集群中的應(yīng)用程序,幫助用戶查看集群的狀態(tài)、管理應(yīng)用程序資源、執(zhí)行常見的管理操作等。
Github官網(wǎng)地址:https://github.com/kubernetes/dashboard
查看版本兼容性
找到和我們安裝k8s
的版本所兼容的版本

由于本次下載的是1.20.9
,所以找到兼容該版本的dashboard
進行下載,在Linux
中執(zhí)行以下命令下載上圖中的版本。
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml
默認Dashboard
只能集群內(nèi)部訪問,修改Service
為NodePort
類型,暴露到外部:
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
發(fā)布應(yīng)用
[root@linux-servertwo kubernetes]
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]
NAME READY STATUS RESTARTS AGE
dashboard-metrics-scraper-79c5968bdc-tl4gr 1/1 Running 0 37s
kubernetes-dashboard-9f9799597-2spkv 1/1 Running 0 37s
[root@linux-servertwo kubernetes]
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命名空間下更為詳細的信息
[root@linux-servertwo kubernetes]

通過以上查看,可以發(fā)現(xiàn)kubernetes-dashboard
部署成功了,接下來通過瀏覽器訪問31001
端口,查看是否可以訪問成功。訪問地址:http://NodeIP:31001
Client sent an HTTP request to an HTTPS server.

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

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

通過登錄頁面可以看到,要想進入系統(tǒng)需要進行登錄。登錄系統(tǒng)需要輸入Token
信息,下面就來獲取登錄的Token
首先創(chuàng)建用戶
[root@linux-servertwo kubernetes]
serviceaccount/dashboard-admin created
給創(chuàng)建的用戶授權(quán)
[root@linux-servertwo kubernetes]
clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin created
獲取用戶Token
[root@linux-servertwo kubernetes]
dashboard-admin-token-29nxl kubernetes.io/service-account-token 3 5m41s
[root@linux-servertwo kubernetes]
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、總結(jié)
關(guān)于Kubernetes
的安裝介紹到這里就結(jié)束了,雖然安裝的過程中有點小曲折,但是還算是正常啟動成功了。相對于搭建集群的K8s
,使用單節(jié)點安裝確實方便了許多,非常適合新手去學習k8s
?轉(zhuǎn)自https://www.cnblogs.com/sowler/p/18672064
該文章在 2025/4/8 9:50:56 編輯過