一、初始化實(shí)驗(yàn)環(huán)境
詳情請(qǐng)參考 :
【Kubernetes】kubeadm安裝k8s穩(wěn)定版(1.23.1)高可用集群
這里不再贅述
這部分內(nèi)容還沒(méi)發(fā)布。。。后續(xù)有空再整理更新啦。
二、安裝containerd服務(wù)
2.1、安裝containerd
master、node節(jié)點(diǎn)都需要操作
# 1、安裝
yum install containerd.io-1.6.6 -y
# 2、生成containerd配置文件
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
# 3、修改配置文件
vim /etc/containerd/config.toml
# 把SystemdCgroup = false修改成
SystemdCgroup = true
# 把sandbox_image = "k8s.gcr.io/pause:3.6"修改成
sandbox_image="registry.aliyuncs.com/google_containers/pause:3.7"
# 4、配置 containerd 開(kāi)機(jī)啟動(dòng),并啟動(dòng) containerd
systemctl enable containerd --now
# 5、修改/etc/crictl.yaml文件
cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
# 6、重啟contaiinerd
systemctl restart containerd
2.2、安裝docker
docker也要安裝,docker跟containerd不沖突,安裝docker是為了能基于dockerfile構(gòu)建鏡像。
master、node節(jié)點(diǎn)都需要操作
yum install docker-ce -y
systemctl enable docker --now
2.3、配置鏡像加速器
# 1、配置containerd鏡像加速器,k8s所有節(jié)點(diǎn)均按照以下配置:
# 編輯vim /etc/containerd/config.toml文件
# 找到config_path = "",修改成如下目錄:
config_path = "/etc/containerd/certs.d"
# 2、添加/etc/containerd/certs.d/docker.io/hosts.toml文件
mkdir /etc/containerd/certs.d/docker.io/ -p
vim /etc/containerd/certs.d/docker.io/hosts.toml
#寫(xiě)入如下內(nèi)容:
[host."https://vh3bm52y.mirror.aliyuncs.com",host."https://registry.docker-cn.com"]
capabilities = ["pull"]
# 3、重啟containerd:
systemctl restart containerd
# 4、配置docker鏡像加速器,k8s所有節(jié)點(diǎn)均按照以下配置
vim /etc/docker/daemon.json
# 寫(xiě)入如下內(nèi)容:
{
"registry-mirrors":["https://vh3bm52y.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"]
}
# 5、重啟docker:
systemctl restart docker
三、安裝初始化k8s需要的軟件包
3臺(tái)機(jī)器都要安裝
yum install -y kubelet-1.25.0 kubeadm-1.25.0 kubectl-1.25.0
systemctl enable kubelet
注:每個(gè)軟件包的作用
- Kubeadm: kubeadm是一個(gè)工具,用來(lái)初始化k8s集群的
- kubelet: 安裝在集群所有節(jié)點(diǎn)上,用于啟動(dòng)Pod的,kubeadm安裝k8s,k8s控制節(jié)點(diǎn)和工作節(jié)點(diǎn)的組件,都是基于pod運(yùn)行的,只要pod啟動(dòng),就需要kubelet
- kubectl: 通過(guò)kubectl可以部署和管理應(yīng)用,查看各種資源,創(chuàng)建、刪除和更新各種組件
四、kubeadm初始化k8s集群
4.1、設(shè)置容器運(yùn)行時(shí)
[root@master ~]# crictl config runtime-endpoint /run/containerd/containerd.sock
[root@node01 ~]# crictl config runtime-endpoint /run/containerd/containerd.sock
[root@node02 ~]# crictl config runtime-endpoint /run/containerd/containerd.sock
4.2、生成并修改配置文件
kubeadm config print init-defaults > kubeadm.yaml
kubeadm.yaml一定要自己通過(guò)kubeadm config print init-defaults命令生成,根據(jù)我們自己的需求修改配置,比如修改 imageRepository 的值,kube-proxy 的模式為 ipvs,需要注意的是由于我們使用的containerd作為運(yùn)行時(shí),所以在初始化節(jié)點(diǎn)的時(shí)候需要指定cgroupDriver為systemd
vim kubeadm.yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 10.32.1.147 # 控制節(jié)點(diǎn)的ip
bindPort: 6443
nodeRegistration:
criSocket: unix:///run/containerd/containerd.sock # 指定containerd容器運(yùn)行時(shí)
imagePullPolicy: IfNotPresent
name: master # 控制節(jié)點(diǎn)主機(jī)名
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers # 指定阿里云鏡像倉(cāng)庫(kù)地址
kind: ClusterConfiguration
kubernetesVersion: 1.25.0 # k8s版本
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16 # 指定pod網(wǎng)段, 需要新增加這個(gè)
serviceSubnet: 10.96.0.0/12
scheduler: {}
# 最后追加插入以下這8行
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs # 生成防火請(qǐng)規(guī)則存入ipvs,否則就存入iptables里面了
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd # kubelet驅(qū)動(dòng)
4.2、初始化安裝
kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification
顯示如下,說(shuō)明安裝完成:
特別提醒:
–image-repository registry.aliyuncs.com/google_containers為保證拉取鏡像不到國(guó)外站點(diǎn)拉取,手動(dòng)指定倉(cāng)庫(kù)地址為registry.aliyuncs.com/google_containers。kubeadm默認(rèn)從k8s.gcr.io拉取鏡像。
mode: ipvs 表示kube-proxy代理模式是ipvs,如果不指定ipvs,會(huì)默認(rèn)使用iptables,但是iptables效率低,所以我們生產(chǎn)環(huán)境建議開(kāi)啟ipvs,阿里云和華為云托管的K8s,也提供ipvs模式,如下:
4.3、修改config文件,對(duì)kubectl進(jìn)行授權(quán)
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady control-plane 11m v1.25.0
# 備注:NotReady表示沒(méi)裝網(wǎng)絡(luò)插件
[root@master ~]# kubectl get pods -n kube-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
coredns-7f8cbcb969-hfscf 0/1 Pending 0 12m <none> <none> <none> <none>
coredns-7f8cbcb969-lvd69 0/1 Pending 0 12m <none> <none> <none> <none>
etcd-master 1/1 Running 0 12m 10.32.1.147 master <none> <none>
kube-apiserver-master 1/1 Running 0 12m 10.32.1.147 master <none> <none>
kube-controller-manager-master 1/1 Running 0 12m 10.32.1.147 master <none> <none>
kube-proxy-zr9fq 1/1 Running 0 12m 10.32.1.147 master <none> <none>
kube-scheduler-master 1/1 Running 0 12m 10.32.1.147 master <none> <none>
# 注意:上面coredns是pending狀態(tài),沒(méi)裝網(wǎng)絡(luò)插件,正常,等裝完網(wǎng)絡(luò)插件,就變成running
五、擴(kuò)容k8s集群-添加工作節(jié)點(diǎn)
5.1、 kubeadm join
node01、node02上面都要操作
[root@master ~]# kubeadm token create --print-join-command
kubeadm join 10.32.1.147:6443 --token mjtwr8.0q4kj2lyccm0ldnw --discovery-token-ca-cert-hash sha256:d0e45daeda533addf757b5e89d0d2dbe1c00375cacab40bcaf07b1fb55b81148
[root@node01 ~]# kubeadm join 10.32.1.147:6443 --token mjtwr8.0q4kj2lyccm0ldnw --discovery-token-ca-cert-hash sha256:d0e45daeda533addf757b5e89d0d2dbe1c00375cacab40bcaf07b1fb55b81148
[root@node02 ~]# kubeadm join 10.32.1.147:6443 --token mjtwr8.0q4kj2lyccm0ldnw --discovery-token-ca-cert-hash sha256:d0e45daeda533addf757b5e89d0d2dbe1c00375cacab40bcaf07b1fb55b81148
出現(xiàn)以下結(jié)果代表加入成功:
5.2、節(jié)點(diǎn)打標(biāo)簽
# 查看集群節(jié)點(diǎn)狀況
[root@master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master NotReady control-plane 38m v1.25.0
node01 NotReady <none> 3m v1.25.0
node02 NotReady <none> 108s v1.25.0
# 對(duì)node節(jié)點(diǎn)打標(biāo)簽,顯示work
[root@master ~]# kubectl label nodes node01 node-role.kubernetes.io/work=work
node/node01 labeled
[root@master ~]# kubectl label nodes node02 node-role.kubernetes.io/work=work
node/node02 labeled
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady control-plane 45m v1.25.0
node01 NotReady work 10m v1.25.0
node02 NotReady work 9m34s v1.25.0
5.3、工作節(jié)點(diǎn)執(zhí)行kubectl
目前工作節(jié)點(diǎn)是不能執(zhí)行kubectl的,因?yàn)楣ぷ鞴?jié)點(diǎn)上沒(méi)有$HOME/.kube/config文件。
[root@node01 ~]# kubectl get nodes
The connection to the server localhost:8080 was refused - did you specify the right host or port?
You have new mail in /var/spool/mail/root
[root@node01 ~]# mkdir $HOME/.kube/
You have new mail in /var/spool/mail/root
[root@node02 ~]# mkdir $HOME/.kube/
You have new mail in /var/spool/mail/root
# 將config文件copy到節(jié)點(diǎn)的對(duì)應(yīng)位置
[root@master ~]# scp /root/.kube/config node01:/root/.kube/
config 100% 5635 396.5KB/s 00:00
[root@master ~]# scp /root/.kube/config node02:/root/.kube/
config 100% 5635 2.5MB/s 00:00
# 這樣就可以使用kubectl 命令了
[root@node01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady control-plane 52m v1.25.0
node01 NotReady work 16m v1.25.0
node02 NotReady work 15m v1.25.0
You have new mail in /var/spool/mail/root
[root@node02 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady control-plane 52m v1.25.0
node01 NotReady work 16m v1.25.0
node02 NotReady work 15m v1.25.0
You have new mail in /var/spool/mail/root
六、安裝kubernetes網(wǎng)絡(luò)組件-Calico
6.1、組件安裝
上傳calico.yaml到master上,使用yaml文件安裝calico 網(wǎng)絡(luò)插件 。
注:在線下載配置文件地址是: https://docs.projectcalico.org/manifests/calico.yaml
[root@master ~]# kubectl apply -f calico.yaml
[root@master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master Ready control-plane 62m v1.25.0
node01 Ready work 26m v1.25.0
node02 Ready work 25m v1.25.0
6.2、Calico架構(gòu)圖
Calico網(wǎng)絡(luò)模型主要工作組件:
1.Felix:運(yùn)行在每一臺(tái) Host 的 agent 進(jìn)程,主要負(fù)責(zé)網(wǎng)絡(luò)接口管理和監(jiān)聽(tīng)、路由、ARP 管理、ACL 管理和同步、狀態(tài)上報(bào)等。保證跨主機(jī)容器網(wǎng)絡(luò)互通。
2.etcd:分布式鍵值存儲(chǔ),相當(dāng)于k8s集群中的數(shù)據(jù)庫(kù),存儲(chǔ)著Calico網(wǎng)絡(luò)模型中IP地址等相關(guān)信息。主要負(fù)責(zé)網(wǎng)絡(luò)元數(shù)據(jù)一致性,確保 Calico 網(wǎng)絡(luò)狀態(tài)的準(zhǔn)確性;
3.BGP Client(BIRD):Calico 為每一臺(tái) Host 部署一個(gè) BGP Client,即每臺(tái)host上部署一個(gè)BIRD。 主要負(fù)責(zé)把 Felix 寫(xiě)入 Kernel 的路由信息分發(fā)到當(dāng)前 Calico 網(wǎng)絡(luò),確保 Workload 間的通信的有效性;
4.BGP Route Reflector:在大型網(wǎng)絡(luò)規(guī)模中,如果僅僅使用 BGP client 形成 mesh 全網(wǎng)互聯(lián)的方案就會(huì)導(dǎo)致規(guī)模限制,因?yàn)樗泄?jié)點(diǎn)之間倆倆互聯(lián),需要 N^2 個(gè)連接,為了解決這個(gè)規(guī)模問(wèn)題,可以采用 BGP 的 Router Reflector 的方法,通過(guò)一個(gè)或者多個(gè) BGP Route Reflector 來(lái)完成集中式的路由分發(fā)。
6.3、 calico網(wǎng)絡(luò)插件配置文件說(shuō)明
calico.yam文件中
……
containers:
# Runs calico-node container on each Kubernetes node. This
# container programs network policy and routes on each
# host.
- name: calico-node
image: docker.io/calico/node:v3.18.0
……
env:
# Use Kubernetes API as the backing datastore.
- name: DATASTORE_TYPE
value: "kubernetes"
# Cluster type to identify the deployment type
- name: CLUSTER_TYPE
value: "k8s,bgp"
# Auto-detect the BGP IP address.
- name: IP
value: "autodetect"
#pod網(wǎng)段
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
# Enable IPIP
- name: CALICO_IPV4POOL_IPIP
value: "Always"
calico-node服務(wù)的主要參數(shù)如下:
CALICO_IPV4POOL_IPIP:是否啟用IPIP模式。啟用IPIP模式時(shí),Calico將在Node上創(chuàng)建一個(gè)名為tunl0的虛擬隧道。IP Pool可以使用兩種模式:BGP或IPIP。使用IPIP模式時(shí),設(shè)置CALICO_IPV4POOL_IPIP=“Always”,不使用IPIP模式時(shí),設(shè)置CALICO_IPV4POOL_IPIP=“Off”,此時(shí)將使用BGP模式。
IP_AUTODETECTION_METHOD:獲取Node IP地址的方式,默認(rèn)使用第1個(gè)網(wǎng)絡(luò)接口的IP地址,對(duì)于安裝了多塊網(wǎng)卡的Node,可以使用正則表達(dá)式選擇正確的網(wǎng)卡,例如"interface=eth.*"表示選擇名稱以eth開(kāi)頭的網(wǎng)卡的IP地址。
- name: IP_AUTODETECTION_METHOD
value: "interface=ens33"
6.4、calico的IPIP模式和BGP模式對(duì)比分析
1)IPIP
把一個(gè)IP數(shù)據(jù)包又套在一個(gè)IP包里,即把IP層封裝到IP層的一個(gè) tunnel,它的作用其實(shí)基本上就相當(dāng)于一個(gè)基于IP層的網(wǎng)橋,一般來(lái)說(shuō),普通的網(wǎng)橋是基于mac層的,根本不需要IP,而這個(gè)ipip則是通過(guò)兩端的路由做一個(gè)tunnel,把兩個(gè)本來(lái)不通的網(wǎng)絡(luò)通過(guò)點(diǎn)對(duì)點(diǎn)連接起來(lái);
calico以ipip模式部署完畢后,node上會(huì)有一個(gè)tunl0的網(wǎng)卡設(shè)備,這是ipip做隧道封裝用的,也是一種overlay模式的網(wǎng)絡(luò)。當(dāng)我們把節(jié)點(diǎn)下線,calico容器都停止后,這個(gè)設(shè)備依然還在,執(zhí)行 rmmodipip命令可以將它刪除。
2)BGP
BGP模式直接使用物理機(jī)作為虛擬路由路(vRouter),不再創(chuàng)建額外的tunnel
邊界網(wǎng)關(guān)協(xié)議(BorderGateway Protocol, BGP)是互聯(lián)網(wǎng)上一個(gè)核心的去中心化的自治路由協(xié)議。它通過(guò)維護(hù)IP路由表或‘前綴’表來(lái)實(shí)現(xiàn)自治系統(tǒng)(AS)之間的可達(dá)性,屬于矢量路由協(xié)議。BGP不使用傳統(tǒng)的內(nèi)部網(wǎng)關(guān)協(xié)議(IGP)的指標(biāo),而是基于路徑、網(wǎng)絡(luò)策略或規(guī)則集來(lái)決定路由。因此,它更適合被稱為矢量性協(xié)議,而不是路由協(xié)議,通俗的說(shuō)就是將接入到機(jī)房的多條線路(如電信、聯(lián)通、移動(dòng)等)融合為一體,實(shí)現(xiàn)多線單IP;
BGP 機(jī)房的優(yōu)點(diǎn):服務(wù)器只需要設(shè)置一個(gè)IP地址,最佳訪問(wèn)路由是由網(wǎng)絡(luò)上的骨干路由器根據(jù)路由跳數(shù)與其它技術(shù)指標(biāo)來(lái)確定的,不會(huì)占用服務(wù)器的任何系統(tǒng);
官方提供的calico.yaml模板里,默認(rèn)打開(kāi)了ip-ip功能,該功能會(huì)在node上創(chuàng)建一個(gè)設(shè)備tunl0,容器的網(wǎng)絡(luò)數(shù)據(jù)會(huì)經(jīng)過(guò)該設(shè)備被封裝一個(gè)ip頭再轉(zhuǎn)發(fā)。這里,calico.yaml中通過(guò)修改calico-node的環(huán)境變量:CALICO_IPV4POOL_IPIP來(lái)實(shí)現(xiàn)ipip功能的開(kāi)關(guān):默認(rèn)是Always,表示開(kāi)啟;Off表示關(guān)閉ipip。
6.5、測(cè)試k8s網(wǎng)絡(luò)和dns是否正常
[root@master ~]# kubectl run busybox --image docker.io/library/busybox:1.28 --image-pull-policy=IfNotPresent --restart=Never --rm -it busybox -- sh
If you don't see a command prompt, try pressing enter.
/ # ping www.baidu.com
PING www.baidu.com (110.242.68.3): 56 data bytes
64 bytes from 110.242.68.3: seq=0 ttl=48 time=32.680 ms
64 bytes from 110.242.68.3: seq=1 ttl=48 time=32.587 ms
^C
--- www.baidu.com ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 32.587/32.633/32.680 ms
通過(guò)上面可以看到能訪問(wèn)網(wǎng)絡(luò),說(shuō)明calico網(wǎng)絡(luò)插件已經(jīng)被正常安裝了。
/ # nslookup kubernetes.default.svc.cluster.local
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: kubernetes.default.svc.cluster.local
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
10.96.0.10 就是我們coreDNS的clusterIP,說(shuō)明coreDNS配置好了。
解析內(nèi)部Service的名稱,是通過(guò)coreDNS去解析的。
注意:busybox要用指定的1.28版本,不能用最新版本,最新版本,nslookup會(huì)解析不到dns和ip
6.6、ctr和crictl區(qū)別
背景:在部署k8s的過(guò)程中,經(jīng)常要對(duì)鏡像進(jìn)行操作(拉取、刪除、查看等)
問(wèn)題:使用過(guò)程中會(huì)發(fā)現(xiàn)ctr和crictl有很多相同功能,也有些不同,那區(qū)別到底在哪里?
說(shuō)明:
1.ctr是containerd自帶的CLI命令行工具,crictl是k8s中CRI(容器運(yùn)行時(shí)接口)的客戶端,k8s使用該客戶端和containerd進(jìn)行交互;
2.ctr和crictl命令具體區(qū)別如下,也可以–help查看。crictl缺少對(duì)具體鏡像的管理能力,可能是k8s層面鏡像管理可以由用戶自行控制,能配置pod里面容器的統(tǒng)一鏡像倉(cāng)庫(kù),鏡像的管理可以有habor等插件進(jìn)行處理。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-792855.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-792855.html
到了這里,關(guān)于【Kubernetes】kubeadm安裝k8s1.25.0高可用集群的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!