0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

k8s基礎(chǔ)環(huán)境部署+master高可用實(shí)現(xiàn)步驟

馬哥Linux運(yùn)維 ? 來(lái)源:馬哥Linux運(yùn)維 ? 作者:馬哥Linux運(yùn)維 ? 2022-08-26 10:46 ? 次閱讀

一、前言

二、基礎(chǔ)環(huán)境部署

1)前期準(zhǔn)備(所有節(jié)點(diǎn))

2)安裝容器 docker(所有節(jié)點(diǎn))

3)配置 k8s yum 源(所有節(jié)點(diǎn))

4)將 sandbox_image 鏡像源設(shè)置為阿里云 google_containers 鏡像源(所有節(jié)點(diǎn))

5)配置 containerd cgroup 驅(qū)動(dòng)程序 systemd(所有節(jié)點(diǎn))

6)開(kāi)始安裝 kubeadm,kubelet 和 kubectl(master 節(jié)點(diǎn))

7)使用 kubeadm 初始化集群(master 節(jié)點(diǎn))

8)安裝 Pod 網(wǎng)絡(luò)插件(CNI:Container Network Interface)(master)

9)node 節(jié)點(diǎn)加入 k8s 集群

10)配置 IPVS

11)集群高可用配置

12)部署 Nginx+Keepalived 高可用負(fù)載均衡器

三、k8s 管理平臺(tái) dashboard 環(huán)境部署

1)dashboard 部署

2)創(chuàng)建登錄用戶

3)配置 hosts 登錄 dashboard web

四、k8s 鏡像倉(cāng)庫(kù) harbor 環(huán)境部署

1)安裝 helm

2)配置 hosts

3)創(chuàng)建 stl 證書(shū)

4)安裝 ingress

5)安裝 nfs

6)創(chuàng)建 nfs provisioner 和持久化存儲(chǔ) SC

7)部署 Harbor(Https 方式)

一、前言

二、基礎(chǔ)環(huán)境部署

1)前期準(zhǔn)備(所有節(jié)點(diǎn))

1、修改主機(jī)名和配置 hosts

先部署 1master 和 2node 節(jié)點(diǎn),后面再加一個(gè) master 節(jié)點(diǎn)

#在192.168.0.113執(zhí)行
hostnamectlset-hostnamek8s-master-168-0-113
#在192.168.0.114執(zhí)行
hostnamectlset-hostnamek8s-node1-168-0-114
#在192.168.0.115執(zhí)行
hostnamectlset-hostnamek8s-node2-168-0-115

配置 hosts

cat>>/etc/hosts<

2、配置 ssh 互信

#直接一直回車(chē)就行
ssh-keygen

ssh-copy-id-i~/.ssh/id_rsa.pubroot@k8s-master-168-0-113
ssh-copy-id-i~/.ssh/id_rsa.pubroot@k8s-node1-168-0-114
ssh-copy-id-i~/.ssh/id_rsa.pubroot@k8s-node2-168-0-115

3、時(shí)間同步

yuminstallchrony-y
systemctlstartchronyd
systemctlenablechronyd
chronycsources

4、關(guān)閉防火墻

systemctlstopfirewalld
systemctldisablefirewalld

5、關(guān)閉 swap

#臨時(shí)關(guān)閉;關(guān)閉swap主要是為了性能考慮
swapoff-a
#可以通過(guò)這個(gè)命令查看swap是否關(guān)閉了
free
#永久關(guān)閉
sed-ri's/.*swap.*/#&/'/etc/fstab

6、禁用 SELinux

#臨時(shí)關(guān)閉
setenforce0
#永久禁用
sed-i's/^SELINUX=enforcing$/SELINUX=disabled/'/etc/selinux/config

7、允許 iptables 檢查橋接流量(可選,所有節(jié)點(diǎn))

若要顯式加載此模塊,請(qǐng)運(yùn)行 sudo modprobe br_netfilter,通過(guò)運(yùn)行 lsmod | grep br_netfilter 來(lái)驗(yàn)證 br_netfilter 模塊是否已加載,

sudomodprobebr_netfilter
lsmod|grepbr_netfilter

為了讓 Linux 節(jié)點(diǎn)的 iptables 能夠正確查看橋接流量,請(qǐng)確認(rèn) sysctl 配置中的 net.bridge.bridge-nf-call-iptables 設(shè)置為 1。例如:

cat<

2)安裝容器 docker(所有節(jié)點(diǎn))

提示:v1.24 之前的 Kubernetes 版本包括與 Docker Engine 的直接集成,使用名為 dockershim 的組件。這種特殊的直接整合不再是 Kubernetes 的一部分 (這次刪除被作為 v1.20 發(fā)行版本的一部分宣布)。你可以閱讀檢查 Dockershim 棄用是否會(huì)影響你 以了解此刪除可能會(huì)如何影響你。要了解如何使用 dockershim 進(jìn)行遷移,請(qǐng)參閱從 dockershim 遷移。

#配置yum源
cd/etc/yum.repos.d;mkdirbak;mvCentOS-Linux-*bak/
#centos7
wget-O/etc/yum.repos.d/CentOS-Base.repohttp://mirrors.aliyun.com/repo/Centos-7.repo
#centos8
wget-O/etc/yum.repos.d/CentOS-Base.repohttp://mirrors.aliyun.com/repo/Centos-8.repo

#安裝yum-config-manager配置工具
yum-yinstallyum-utils
#設(shè)置yum源
yum-config-manager--add-repohttp://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安裝docker-ce版本
yuminstall-ydocker-ce
#啟動(dòng)
systemctlstartdocker
#開(kāi)機(jī)自啟
systemctlenabledocker
#查看版本號(hào)
docker--version
#查看版本具體信息
dockerversion

#Docker鏡像源設(shè)置
#修改文件/etc/docker/daemon.json,沒(méi)有這個(gè)文件就創(chuàng)建
#添加以下內(nèi)容后,重啟docker服務(wù):
cat>/etc/docker/daemon.json<

【溫馨提示】dockerd 實(shí)際真實(shí)調(diào)用的還是 containerd 的 api 接口,containerd 是 dockerd 和 runC 之間的一個(gè)中間交流組件。所以啟動(dòng) docker 服務(wù)的時(shí)候,也會(huì)啟動(dòng) containerd 服務(wù)的。

3)配置 k8s yum 源(所有節(jié)點(diǎn))

cat>/etc/yum.repos.d/kubernetes.repo<

4)將 sandbox_image 鏡像源設(shè)置為阿里云 google_containers 鏡像源(所有節(jié)點(diǎn))

#導(dǎo)出默認(rèn)配置,config.toml這個(gè)文件默認(rèn)是不存在的
containerdconfigdefault>/etc/containerd/config.toml
grepsandbox_image/etc/containerd/config.toml
sed-i"s#k8s.gcr.io/pause#registry.aliyuncs.com/google_containers/pause#g"/etc/containerd/config.toml
grepsandbox_image/etc/containerd/config.toml
413acb5c-247b-11ed-ba43-dac502259ad0.png

5)配置 containerd cgroup 驅(qū)動(dòng)程序 systemd(所有節(jié)點(diǎn))

kubernets 自v 1.24.0 后,就不再使用 docker.shim,替換采用 containerd 作為容器運(yùn)行時(shí)端點(diǎn)。因此需要安裝 containerd(在 docker 的基礎(chǔ)下安裝),上面安裝 docker 的時(shí)候就自動(dòng)安裝了 containerd 了。這里的 docker 只是作為客戶端而已。容器引擎還是 containerd。

sed-i's#SystemdCgroup=false#SystemdCgroup=true#g'/etc/containerd/config.toml
#應(yīng)用所有更改后,重新啟動(dòng)containerd
systemctlrestartcontainerd

6)開(kāi)始安裝 kubeadm,kubelet 和 kubectl(master 節(jié)點(diǎn))

#不指定版本就是最新版本,當(dāng)前最新版就是1.24.1
yuminstall-ykubelet-1.24.1kubeadm-1.24.1kubectl-1.24.1--disableexcludes=kubernetes
# disableexcludes=kubernetes:禁掉除了這個(gè)kubernetes之外的別的倉(cāng)庫(kù)
#設(shè)置為開(kāi)機(jī)自啟并現(xiàn)在立刻啟動(dòng)服務(wù)--now:立刻啟動(dòng)服務(wù)
systemctlenable--nowkubelet

#查看狀態(tài),這里需要等待一段時(shí)間再查看服務(wù)狀態(tài),啟動(dòng)會(huì)有點(diǎn)慢
systemctlstatuskubelet
41508514-247b-11ed-ba43-dac502259ad0.png

查看日志,發(fā)現(xiàn)有報(bào)錯(cuò),報(bào)錯(cuò)如下:

kubelet.service: Main process exited, code=exited, status=1/FAILURE kubelet.service: Failed with result 'exit-code'.

417f485e-247b-11ed-ba43-dac502259ad0.png

【解釋】重新安裝(或第一次安裝)k8s,未經(jīng)過(guò) kubeadm init 或者 kubeadm join 后,kubelet 會(huì)不斷重啟,這個(gè)是正?,F(xiàn)象……,執(zhí)行 init 或 join 后問(wèn)題會(huì)自動(dòng)解決,對(duì)此官網(wǎng)有如下描述,也就是此時(shí)不用理會(huì) kubelet.service。

查看版本

kubectlversion
yuminfokubeadm
4191a6ac-247b-11ed-ba43-dac502259ad0.png

7)使用 kubeadm 初始化集群(master 節(jié)點(diǎn))

最好提前把鏡像下載好,這樣安裝快

dockerpullregistry.aliyuncs.com/google_containers/kube-apiserver:v1.24.1
dockerpullregistry.aliyuncs.com/google_containers/kube-controller-manager:v1.24.1
dockerpullregistry.aliyuncs.com/google_containers/kube-scheduler:v1.24.1
dockerpullregistry.aliyuncs.com/google_containers/kube-proxy:v1.24.1
dockerpullregistry.aliyuncs.com/google_containers/pause:3.7
dockerpullregistry.aliyuncs.com/google_containers/etcd:3.5.3-0
dockerpullregistry.aliyuncs.com/google_containers/coredns:v1.8.6

集群初始化

kubeadminit
--apiserver-advertise-address=192.168.0.113
--image-repositoryregistry.aliyuncs.com/google_containers
--control-plane-endpoint=cluster-endpoint
--kubernetes-versionv1.24.1
--service-cidr=10.1.0.0/16
--pod-network-cidr=10.244.0.0/16
--v=5
#–image-repository string:這個(gè)用于指定從什么位置來(lái)拉取鏡像(1.13版本才有的),默認(rèn)值是k8s.gcr.io,我們將其指定為國(guó)內(nèi)鏡像地址:registry.aliyuncs.com/google_containers
#–kubernetes-version string:指定kubenets版本號(hào),默認(rèn)值是stable-1,會(huì)導(dǎo)致從https://dl.k8s.io/release/stable-1.txt下載最新的版本號(hào),我們可以將其指定為固定版本(v1.22.1)來(lái)跳過(guò)網(wǎng)絡(luò)請(qǐng)求。
#–apiserver-advertise-address 指明用 Master 的哪個(gè) interface 與 Cluster 的其他節(jié)點(diǎn)通信。如果 Master 有多個(gè) interface,建議明確指定,如果不指定,kubeadm 會(huì)自動(dòng)選擇有默認(rèn)網(wǎng)關(guān)的 interface。這里的ip為master節(jié)點(diǎn)ip,記得更換。
#–pod-network-cidr 指定 Pod 網(wǎng)絡(luò)的范圍。Kubernetes 支持多種網(wǎng)絡(luò)方案,而且不同網(wǎng)絡(luò)方案對(duì)–pod-network-cidr有自己的要求,這里設(shè)置為10.244.0.0/16 是因?yàn)槲覀儗⑹褂?flannel 網(wǎng)絡(luò)方案,必須設(shè)置成這個(gè) CIDR。
#--control-plane-endpoint  cluster-endpoint 是映射到該 IP 的自定義 DNS 名稱,這里配置hosts映射:192.168.0.113  cluster-endpoint。這將允許你將--control-plane-endpoint=cluster-endpoint 傳遞給 kubeadm init,并將相同的 DNS 名稱傳遞給 kubeadm join。稍后你可以修改 cluster-endpoint 以指向高可用性方案中的負(fù)載均衡器的地址。

【溫馨提示】kubeadm 不支持將沒(méi)有 --control-plane-endpoint 參數(shù)的單個(gè)控制平面集群轉(zhuǎn)換為高可用性集群。

重置再初始化

kubeadmreset
rm-fr~/.kube//etc/kubernetes/*var/lib/etcd/*
kubeadminit
--apiserver-advertise-address=192.168.0.113
--image-repositoryregistry.aliyuncs.com/google_containers
--control-plane-endpoint=cluster-endpoint
--kubernetes-versionv1.24.1
--service-cidr=10.1.0.0/16
--pod-network-cidr=10.244.0.0/16
--v=5
#–image-repository string:這個(gè)用于指定從什么位置來(lái)拉取鏡像(1.13版本才有的),默認(rèn)值是k8s.gcr.io,我們將其指定為國(guó)內(nèi)鏡像地址:registry.aliyuncs.com/google_containers
#–kubernetes-version string:指定kubenets版本號(hào),默認(rèn)值是stable-1,會(huì)導(dǎo)致從https://dl.k8s.io/release/stable-1.txt下載最新的版本號(hào),我們可以將其指定為固定版本(v1.22.1)來(lái)跳過(guò)網(wǎng)絡(luò)請(qǐng)求。
#–apiserver-advertise-address 指明用 Master 的哪個(gè) interface 與 Cluster 的其他節(jié)點(diǎn)通信。如果 Master 有多個(gè) interface,建議明確指定,如果不指定,kubeadm 會(huì)自動(dòng)選擇有默認(rèn)網(wǎng)關(guān)的 interface。這里的ip為master節(jié)點(diǎn)ip,記得更換。
#–pod-network-cidr 指定 Pod 網(wǎng)絡(luò)的范圍。Kubernetes 支持多種網(wǎng)絡(luò)方案,而且不同網(wǎng)絡(luò)方案對(duì)–pod-network-cidr有自己的要求,這里設(shè)置為10.244.0.0/16 是因?yàn)槲覀儗⑹褂?flannel 網(wǎng)絡(luò)方案,必須設(shè)置成這個(gè) CIDR。
#--control-plane-endpoint  cluster-endpoint 是映射到該 IP 的自定義 DNS 名稱,這里配置hosts映射:192.168.0.113  cluster-endpoint。這將允許你將--control-plane-endpoint=cluster-endpoint 傳遞給 kubeadm init,并將相同的 DNS 名稱傳遞給 kubeadm join。稍后你可以修改 cluster-endpoint 以指向高可用性方案中的負(fù)載均衡器的地址。

配置環(huán)境變量

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

#臨時(shí)生效(退出當(dāng)前窗口重連環(huán)境變量失效)
exportKUBECONFIG=/etc/kubernetes/admin.conf
#永久生效(推薦)
echo"exportKUBECONFIG=/etc/kubernetes/admin.conf">>~/.bash_profile
source~/.bash_profile

41bb5a74-247b-11ed-ba43-dac502259ad0.png

發(fā)現(xiàn)節(jié)點(diǎn)還是有問(wèn)題,查看日志 /var/log/messages

"Container runtime network not ready" networkReady="NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized"

41cf6f28-247b-11ed-ba43-dac502259ad0.png
接下來(lái)就是安裝 Pod 網(wǎng)絡(luò)插件

8)安裝 Pod 網(wǎng)絡(luò)插件(CNI:Container Network Interface)(master)

你必須部署一個(gè)基于 Pod 網(wǎng)絡(luò)插件的 容器網(wǎng)絡(luò)接口 (CNI),以便你的 Pod 可以相互通信。

#最好提前下載鏡像(所有節(jié)點(diǎn))
dockerpullquay.io/coreos/flannel:v0.14.0
kubectlapply-fhttps://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

如果上面安裝失敗,則下載我百度里的,離線安裝

鏈接:https://pan.baidu.com/s/1HB9xuO3bssAW7v5HzpXkeQ
提取碼:8888

再查看 node 節(jié)點(diǎn),就已經(jīng)正常了
42027080-247b-11ed-ba43-dac502259ad0.png

9)node 節(jié)點(diǎn)加入 k8s 集群

先安裝 kubelet

yuminstall-ykubeletkubeadmkubectl--disableexcludes=kubernetes
#設(shè)置為開(kāi)機(jī)自啟并現(xiàn)在立刻啟動(dòng)服務(wù)--now:立刻啟動(dòng)服務(wù)
systemctlenable--nowkubelet
systemctlstatuskubelet

如果沒(méi)有令牌,可以通過(guò)在控制平面節(jié)點(diǎn)上運(yùn)行以下命令來(lái)獲取令牌:

kubeadmtokenlist

默認(rèn)情況下,令牌會(huì)在24小時(shí)后過(guò)期。如果要在當(dāng)前令牌過(guò)期后將節(jié)點(diǎn)加入集群, 則可以通過(guò)在控制平面節(jié)點(diǎn)上運(yùn)行以下命令來(lái)創(chuàng)建新令牌:

kubeadmtokencreate
#再查看
kubeadmtokenlist

如果你沒(méi)有 –discovery-token-ca-cert-hash 的值,則可以通過(guò)在控制平面節(jié)點(diǎn)上執(zhí)行以下命令鏈來(lái)獲取它:

opensslx509-pubkey-in/etc/kubernetes/pki/ca.crt|opensslrsa-pubin-outformder2>/dev/null|openssldgst-sha256-hex|sed's/^.*//'

如果執(zhí)行 kubeadm init 時(shí)沒(méi)有記錄下加入集群的命令,可以通過(guò)以下命令重新創(chuàng)建(推薦)一般不用上面的分別獲取 token 和 ca-cert-hash 方式,執(zhí)行以下命令一氣呵成:

kubeadmtokencreate--print-join-command

這里需要等待一段時(shí)間,再查看節(jié)點(diǎn)節(jié)點(diǎn)狀態(tài),因?yàn)樾枰惭b kube-proxy 和 flannel。

kubectlgetpods-A
kubectlgetnodes
42107cd4-247b-11ed-ba43-dac502259ad0.png

10)配置 IPVS

【問(wèn)題】集群內(nèi)無(wú)法 ping 通 ClusterIP(或 ServiceName)

1、加載 ip_vs 相關(guān)內(nèi)核模塊

modprobe--ip_vs
modprobe--ip_vs_sh
modprobe--ip_vs_rr
modprobe--ip_vs_wrr

所有節(jié)點(diǎn)驗(yàn)證開(kāi)啟了 ipvs:

lsmod|grepip_vs

2、安裝 ipvsadm 工具

yuminstallipsetipvsadm-y

3、編輯 kube-proxy 配置文件,mode 修改成 ipvs

kubectleditconfigmap-nkube-systemkube-proxy
422319e8-247b-11ed-ba43-dac502259ad0.png

4、重啟 kube-proxy

#先查看
kubectlgetpod-nkube-system|grepkube-proxy
#再delete讓它自拉起
kubectlgetpod-nkube-system|grepkube-proxy|awk'{system("kubectldeletepod"$1"-nkube-system")}'
#再查看
kubectlgetpod-nkube-system|grepkube-proxy
42320520-247b-11ed-ba43-dac502259ad0.png

5、查看 ipvs 轉(zhuǎn)發(fā)規(guī)則

ipvsadm-Ln
424171e0-247b-11ed-ba43-dac502259ad0.png

11)集群高可用配置

配置高可用(HA)Kubernetes 集群實(shí)現(xiàn)的兩種方案:

使用堆疊(stacked)控制平面節(jié)點(diǎn),其中 etcd 節(jié)點(diǎn)與控制平面節(jié)點(diǎn)共存(本章使用),架構(gòu)圖如下:

424da08c-247b-11ed-ba43-dac502259ad0.png

使用外部 etcd 節(jié)點(diǎn),其中 etcd 在與控制平面不同的節(jié)點(diǎn)上運(yùn)行,架構(gòu)圖如下:

425f2dac-247b-11ed-ba43-dac502259ad0.png

這里新增一臺(tái)機(jī)器作為另外一個(gè) master 節(jié)點(diǎn):192.168.0.116 配置跟上面 master 節(jié)點(diǎn)一樣。只是不需要最后一步初始化了。

1、修改主機(jī)名和配置 hosts

所有節(jié)點(diǎn)都統(tǒng)一如下配置:

#在192.168.0.113執(zhí)行
hostnamectlset-hostnamek8s-master-168-0-113
#在192.168.0.114執(zhí)行
hostnamectlset-hostnamek8s-node1-168-0-114
#在192.168.0.115執(zhí)行
hostnamectlset-hostnamek8s-node2-168-0-115
#在192.168.0.116執(zhí)行
hostnamectlset-hostnamek8s-master2-168-0-116

配置 hosts

cat>>/etc/hosts<

2、配置 ssh 互信

#直接一直回車(chē)就行
ssh-keygen

ssh-copy-id-i~/.ssh/id_rsa.pubroot@k8s-master-168-0-113
ssh-copy-id-i~/.ssh/id_rsa.pubroot@k8s-node1-168-0-114
ssh-copy-id-i~/.ssh/id_rsa.pubroot@k8s-node2-168-0-115
ssh-copy-id-i~/.ssh/id_rsa.pubroot@k8s-master2-168-0-116

3、時(shí)間同步

yuminstallchrony-y
systemctlstartchronyd
systemctlenablechronyd
chronycsources

7、關(guān)閉防火墻

systemctlstopfirewalld
systemctldisablefirewalld

4、關(guān)閉 swap

#臨時(shí)關(guān)閉;關(guān)閉swap主要是為了性能考慮
swapoff-a
#可以通過(guò)這個(gè)命令查看swap是否關(guān)閉了
free
#永久關(guān)閉
sed-ri's/.*swap.*/#&/'/etc/fstab

5、禁用 SELinux

#臨時(shí)關(guān)閉
setenforce0
#永久禁用
sed-i's/^SELINUX=enforcing$/SELINUX=disabled/'/etc/selinux/config

6、允許 iptables 檢查橋接流量(可選,所有節(jié)點(diǎn))

若要顯式加載此模塊,請(qǐng)運(yùn)行 sudo modprobe br_netfilter,通過(guò)運(yùn)行 lsmod | grep br_netfilter 來(lái)驗(yàn)證 br_netfilter 模塊是否已加載,

sudomodprobebr_netfilter
lsmod|grepbr_netfilter

為了讓 Linux 節(jié)點(diǎn)的 iptables 能夠正確查看橋接流量,請(qǐng)確認(rèn) sysctl 配置中的 net.bridge.bridge-nf-call-iptables 設(shè)置為 1。例如:

cat<

7、安裝容器 docker(所有節(jié)點(diǎn))

提示:v1.24 之前的 Kubernetes 版本包括與 Docker Engine 的直接集成,使用名為 dockershim 的組件。這種特殊的直接整合不再是 Kubernetes 的一部分 (這次刪除被作為 v1.20 發(fā)行版本的一部分宣布)。你可以閱讀檢查 Dockershim 棄用是否會(huì)影響你 以了解此刪除可能會(huì)如何影響你。要了解如何使用 dockershim 進(jìn)行遷移,請(qǐng)參閱從 dockershim 遷移。

#配置yum源
cd/etc/yum.repos.d;mkdirbak;mvCentOS-Linux-*bak/
#centos7
wget-O/etc/yum.repos.d/CentOS-Base.repohttp://mirrors.aliyun.com/repo/Centos-7.repo
#centos8
wget-O/etc/yum.repos.d/CentOS-Base.repohttp://mirrors.aliyun.com/repo/Centos-8.repo

#安裝yum-config-manager配置工具
yum-yinstallyum-utils
#設(shè)置yum源
yum-config-manager--add-repohttp://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安裝docker-ce版本
yuminstall-ydocker-ce
#啟動(dòng)
systemctlstartdocker
#開(kāi)機(jī)自啟
systemctlenabledocker
#查看版本號(hào)
docker--version
#查看版本具體信息
dockerversion

#Docker鏡像源設(shè)置
#修改文件/etc/docker/daemon.json,沒(méi)有這個(gè)文件就創(chuàng)建
#添加以下內(nèi)容后,重啟docker服務(wù):
cat>/etc/docker/daemon.json<

【溫馨提示】dockerd 實(shí)際真實(shí)調(diào)用的還是 containerd 的 api 接口,containerd 是 dockerd 和 runC 之間的一個(gè)中間交流組件。所以啟動(dòng) docker 服務(wù)的時(shí)候,也會(huì)啟動(dòng) containerd 服務(wù)的。

8、配置 k8s yum 源(所有節(jié)點(diǎn))

cat>/etc/yum.repos.d/kubernetes.repo<

9、將 sandbox_image 鏡像源設(shè)置為阿里云 google_containers 鏡像源(所有節(jié)點(diǎn))

#導(dǎo)出默認(rèn)配置,config.toml這個(gè)文件默認(rèn)是不存在的
containerdconfigdefault>/etc/containerd/config.toml
grepsandbox_image/etc/containerd/config.toml
sed-i"s#k8s.gcr.io/pause#registry.aliyuncs.com/google_containers/pause#g"/etc/containerd/config.toml
grepsandbox_image/etc/containerd/config.toml
413acb5c-247b-11ed-ba43-dac502259ad0.png

10、配置 containerd cgroup 驅(qū)動(dòng)程序 systemd

kubernets 自v 1.24.0 后,就不再使用 docker.shim,替換采用 containerd 作為容器運(yùn)行時(shí)端點(diǎn)。因此需要安裝 containerd(在 docker 的基礎(chǔ)下安裝),上面安裝 docker 的時(shí)候就自動(dòng)安裝了 containerd 了。這里的 docker 只是作為客戶端而已。容器引擎還是 containerd。

sed-i's#SystemdCgroup=false#SystemdCgroup=true#g'/etc/containerd/config.toml
#應(yīng)用所有更改后,重新啟動(dòng)containerd
systemctlrestartcontainerd

11、開(kāi)始安裝 kubeadm,kubelet 和 kubectl(master 節(jié)點(diǎn))

#不指定版本就是最新版本,當(dāng)前最新版就是1.24.1
yuminstall-ykubelet-1.24.1kubeadm-1.24.1kubectl-1.24.1--disableexcludes=kubernetes
# disableexcludes=kubernetes:禁掉除了這個(gè)kubernetes之外的別的倉(cāng)庫(kù)
#設(shè)置為開(kāi)機(jī)自啟并現(xiàn)在立刻啟動(dòng)服務(wù)--now:立刻啟動(dòng)服務(wù)
systemctlenable--nowkubelet

#查看狀態(tài),這里需要等待一段時(shí)間再查看服務(wù)狀態(tài),啟動(dòng)會(huì)有點(diǎn)慢
systemctlstatuskubelet

#查看版本

kubectlversion
yuminfokubeadm

12、加入 k8s 集群

#證如果過(guò)期了,可以使用下面命令生成新證書(shū)上傳,這里會(huì)打印出certificatekey,后面會(huì)用到
kubeadminitphaseupload-certs--upload-certs
#你還可以在【init】期間指定自定義的--certificate-key,以后可以由 join 使用。要生成這樣的密鑰,可以使用以下命令(這里不執(zhí)行,就用上面那個(gè)自命令就可以了):
kubeadmcertscertificate-key

kubeadmtokencreate--print-join-command

kubeadmjoincluster-endpoint:6443--tokenwswrfw.fc81au4yvy6ovmhh--discovery-token-ca-cert-hashsha256:43a3924c25104d4393462105639f6a02b8ce284728775ef9f9c30eed8e0abc0f--control-plane--certificate-key8d2709697403b74e35d05a420bd2c19fd8c11914eb45f2ff22937b245bed5b68

#--control-plane 標(biāo)志通知 kubeadm join 創(chuàng)建一個(gè)新的控制平面。加入master必須加這個(gè)標(biāo)記
#--certificate-key ... 將導(dǎo)致從集群中的 kubeadm-certs Secret 下載控制平面證書(shū)并使用給定的密鑰進(jìn)行解密。這里的值就是上面這個(gè)命令(kubeadm init phase upload-certs --upload-certs)打印出的key。

427c7a74-247b-11ed-ba43-dac502259ad0.png
根據(jù)提示執(zhí)行如下命令:

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

查看

kubectlgetnodes
kubectlgetpods-A-owide

4290080a-247b-11ed-ba43-dac502259ad0.png
雖然現(xiàn)在已經(jīng)有兩個(gè) master 了,但是對(duì)外還是只能有一個(gè)入口的,所以還得要一個(gè)負(fù)載均衡器,如果一個(gè) master 掛了,會(huì)自動(dòng)切到另外一個(gè) master 節(jié)點(diǎn)。

12)部署 Nginx+Keepalived 高可用負(fù)載均衡器

42a884ca-247b-11ed-ba43-dac502259ad0.png

1、安裝 Nginx 和 Keepalived

#在兩個(gè)master節(jié)點(diǎn)上執(zhí)行
yuminstallnginxkeepalived-y

2、Nginx 配置

在兩個(gè) master 節(jié)點(diǎn)配置

cat>/etc/nginx/nginx.conf<

【溫馨提示】如果只保證高可用,不配置 k8s-apiserver 負(fù)載均衡的話,可以不裝 nginx,但是最好還是配置一下 k8s-apiserver 負(fù)載均衡。

3、Keepalived 配置(master)

cat>/etc/keepalived/keepalived.conf<

vrrp_script:指定檢查 nginx 工作狀態(tài)腳本(根據(jù) nginx 狀態(tài)判斷是否故障轉(zhuǎn)移)

virtual_ipaddress:虛擬 IP(VIP)

檢查 nginx 狀態(tài)腳本:

cat>/etc/keepalived/check_nginx.sh<

4、Keepalived 配置(backup)

cat>/etc/keepalived/keepalived.conf<

檢查 nginx 狀態(tài)腳本:

cat>/etc/keepalived/check_nginx.sh<

5、啟動(dòng)并設(shè)置開(kāi)機(jī)啟動(dòng)

systemctldaemon-reload
systemctlrestartnginx&&systemctlenablenginx&&systemctlstatusnginx
systemctlrestartkeepalived&&systemctlenablekeepalived&&systemctlstatuskeepalived

查看 VIP

ipa
42b3e7a2-247b-11ed-ba43-dac502259ad0.png

6、修改 hosts(所有節(jié)點(diǎn))

將 cluster-endpoint 之前執(zhí)行的 ip 修改執(zhí)行現(xiàn)在的 VIP

192.168.0.113k8s-master-168-0-113
192.168.0.114k8s-node1-168-0-114
192.168.0.115k8s-node2-168-0-115
192.168.0.116k8s-master2-168-0-116
192.168.0.120cluster-endpoint

7、測(cè)試驗(yàn)證

查看版本(負(fù)載均衡測(cè)試驗(yàn)證)

curl-khttps://cluster-endpoint:16443/version

42ca7ce2-247b-11ed-ba43-dac502259ad0.png
高可用測(cè)試驗(yàn)證,將 k8s-master-168-0-113 節(jié)點(diǎn)關(guān)機(jī)

shutdown-hnow
curl-khttps://cluster-endpoint:16443/version
kubectlgetnodes-A
kubectlgetpods-A

【溫馨提示】堆疊集群存在耦合失敗的風(fēng)險(xiǎn)。如果一個(gè)節(jié)點(diǎn)發(fā)生故障,則 etcd 成員和控制平面實(shí)例都將丟失, 并且冗余會(huì)受到影響。你可以通過(guò)添加更多控制平面節(jié)點(diǎn)來(lái)降低此風(fēng)險(xiǎn)。

三、k8s 管理平臺(tái) dashboard 環(huán)境部署

1)dashboard 部署

GitHub 地址:https://github.com/kubernetes/dashboard

kubectlapply-fhttps://raw.githubusercontent.com/kubernetes/dashboard/v2.6.0/aio/deploy/recommended.yaml
kubectlgetpods-nkubernetes-dashboard

但是這個(gè)只能內(nèi)部訪問(wèn),所以要外部訪問(wèn),要么部署 ingress,要么就是設(shè)置 service NodePort 類型。這里選擇 service 暴露端口。

wgethttps://raw.githubusercontent.com/kubernetes/dashboard/v2.6.0/aio/deploy/recommended.yaml

修改后的內(nèi)容如下:

#Copyright2017TheKubernetesAuthors.
#
#LicensedundertheApacheLicense,Version2.0(the"License");
#youmaynotusethisfileexceptincompliancewiththeLicense.
#YoumayobtainacopyoftheLicenseat
#
#http://www.apache.org/licenses/LICENSE-2.0
#
#Unlessrequiredbyapplicablelaworagreedtoinwriting,software
#distributedundertheLicenseisdistributedonan"ASIS"BASIS,
#WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.
#SeetheLicenseforthespecificlanguagegoverningpermissionsand
#limitationsundertheLicense.

apiVersion:v1
kind:Namespace
metadata:
name:kubernetes-dashboard

---

apiVersion:v1
kind:ServiceAccount
metadata:
labels:
k8s-app:kubernetes-dashboard
name:kubernetes-dashboard
namespace:kubernetes-dashboard

---

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:31443
selector:
k8s-app:kubernetes-dashboard

---

apiVersion:v1
kind:Secret
metadata:
labels:
k8s-app:kubernetes-dashboard
name:kubernetes-dashboard-certs
namespace:kubernetes-dashboard
type:Opaque

---

apiVersion:v1
kind:Secret
metadata:
labels:
k8s-app:kubernetes-dashboard
name:kubernetes-dashboard-csrf
namespace:kubernetes-dashboard
type:Opaque
data:
csrf:""

---

apiVersion:v1
kind:Secret
metadata:
labels:
k8s-app:kubernetes-dashboard
name:kubernetes-dashboard-key-holder
namespace:kubernetes-dashboard
type:Opaque

---

kind:ConfigMap
apiVersion:v1
metadata:
labels:
k8s-app:kubernetes-dashboard
name:kubernetes-dashboard-settings
namespace:kubernetes-dashboard

---

kind:Role
apiVersion:rbac.authorization.k8s.io/v1
metadata:
labels:
k8s-app:kubernetes-dashboard
name:kubernetes-dashboard
namespace:kubernetes-dashboard
rules:
#AllowDashboardtoget,updateanddeleteDashboardexclusivesecrets.
-apiGroups:[""]
resources:["secrets"]
resourceNames:["kubernetes-dashboard-key-holder","kubernetes-dashboard-certs","kubernetes-dashboard-csrf"]
verbs:["get","update","delete"]
#AllowDashboardtogetandupdate'kubernetes-dashboard-settings'configmap.
-apiGroups:[""]
resources:["configmaps"]
resourceNames:["kubernetes-dashboard-settings"]
verbs:["get","update"]
#AllowDashboardtogetmetrics.
-apiGroups:[""]
resources:["services"]
resourceNames:["heapster","dashboard-metrics-scraper"]
verbs:["proxy"]
-apiGroups:[""]
resources:["services/proxy"]
resourceNames:["heapster","http","https","dashboard-metrics-scraper","http:dashboard-metrics-scraper"]
verbs:["get"]

---

kind:ClusterRole
apiVersion:rbac.authorization.k8s.io/v1
metadata:
labels:
k8s-app:kubernetes-dashboard
name:kubernetes-dashboard
rules:
#AllowMetricsScrapertogetmetricsfromtheMetricsserver
-apiGroups:["metrics.k8s.io"]
resources:["pods","nodes"]
verbs:["get","list","watch"]

---

apiVersion:rbac.authorization.k8s.io/v1
kind:RoleBinding
metadata:
labels:
k8s-app:kubernetes-dashboard
name:kubernetes-dashboard
namespace:kubernetes-dashboard
roleRef:
apiGroup:rbac.authorization.k8s.io
kind:Role
name:kubernetes-dashboard
subjects:
-kind:ServiceAccount
name:kubernetes-dashboard
namespace:kubernetes-dashboard

---

apiVersion:rbac.authorization.k8s.io/v1
kind:ClusterRoleBinding
metadata:
name:kubernetes-dashboard
roleRef:
apiGroup:rbac.authorization.k8s.io
kind:ClusterRole
name:kubernetes-dashboard
subjects:
-kind:ServiceAccount
name:kubernetes-dashboard
namespace:kubernetes-dashboard

---

kind:Deployment
apiVersion:apps/v1
metadata:
labels:
k8s-app:kubernetes-dashboard
name:kubernetes-dashboard
namespace:kubernetes-dashboard
spec:
replicas:1
revisionHistoryLimit:10
selector:
matchLabels:
k8s-app:kubernetes-dashboard
template:
metadata:
labels:
k8s-app:kubernetes-dashboard
spec:
securityContext:
seccompProfile:
type:RuntimeDefault
containers:
-name:kubernetes-dashboard
image:kubernetesui/dashboard:v2.6.0
imagePullPolicy:Always
ports:
-containerPort:8443
protocol:TCP
args:
---auto-generate-certificates
---namespace=kubernetes-dashboard
#UncommentthefollowinglinetomanuallyspecifyKubernetesAPIserverHost
#Ifnotspecified,DashboardwillattempttoautodiscovertheAPIserverandconnect
#toit.Uncommentonlyifthedefaultdoesnotwork.
#---apiserver-host=http://my-address:port
volumeMounts:
-name:kubernetes-dashboard-certs
mountPath:/certs
#Createon-diskvolumetostoreexeclogs
-mountPath:/tmp
name:tmp-volume
livenessProbe:
httpGet:
scheme:HTTPS
path:/
port:8443
initialDelaySeconds:30
timeoutSeconds:30
securityContext:
allowPrivilegeEscalation:false
readOnlyRootFilesystem:true
runAsUser:1001
runAsGroup:2001
volumes:
-name:kubernetes-dashboard-certs
secret:
secretName:kubernetes-dashboard-certs
-name:tmp-volume
emptyDir:{}
serviceAccountName:kubernetes-dashboard
nodeSelector:
"kubernetes.io/os":linux
#CommentthefollowingtolerationsifDashboardmustnotbedeployedonmaster
tolerations:
-key:node-role.kubernetes.io/master
effect:NoSchedule

---

kind:Service
apiVersion:v1
metadata:
labels:
k8s-app:dashboard-metrics-scraper
name:dashboard-metrics-scraper
namespace:kubernetes-dashboard
spec:
ports:
-port:8000
targetPort:8000
selector:
k8s-app:dashboard-metrics-scraper

---

kind:Deployment
apiVersion:apps/v1
metadata:
labels:
k8s-app:dashboard-metrics-scraper
name:dashboard-metrics-scraper
namespace:kubernetes-dashboard
spec:
replicas:1
revisionHistoryLimit:10
selector:
matchLabels:
k8s-app:dashboard-metrics-scraper
template:
metadata:
labels:
k8s-app:dashboard-metrics-scraper
spec:
securityContext:
seccompProfile:
type:RuntimeDefault
containers:
-name:dashboard-metrics-scraper
image:kubernetesui/metrics-scraper:v1.0.8
ports:
-containerPort:8000
protocol:TCP
livenessProbe:
httpGet:
scheme:HTTP
path:/
port:8000
initialDelaySeconds:30
timeoutSeconds:30
volumeMounts:
-mountPath:/tmp
name:tmp-volume
securityContext:
allowPrivilegeEscalation:false
readOnlyRootFilesystem:true
runAsUser:1001
runAsGroup:2001
serviceAccountName:kubernetes-dashboard
nodeSelector:
"kubernetes.io/os":linux
#CommentthefollowingtolerationsifDashboardmustnotbedeployedonmaster
tolerations:
-key:node-role.kubernetes.io/master
effect:NoSchedule
volumes:
-name:tmp-volume
emptyDir:{}

42d8e890-247b-11ed-ba43-dac502259ad0.png
重新部署

kubectldelete-frecommended.yaml
kubectlapply-frecommended.yaml
kubectlgetsvc,pods-nkubernetes-dashboard
42e240d4-247b-11ed-ba43-dac502259ad0.png

2)創(chuàng)建登錄用戶

cat>ServiceAccount.yaml<

創(chuàng)建并獲取登錄 token

kubectl-nkubernetes-dashboardcreatetokenadmin-user

3)配置 hosts 登錄 dashboard web

192.168.0.120cluster-endpoint

登錄:https://cluster-endpoint:31443
42f30b08-247b-11ed-ba43-dac502259ad0.png

輸入上面創(chuàng)建的 token 登錄
43113d9e-247b-11ed-ba43-dac502259ad0.png

四、k8s 鏡像倉(cāng)庫(kù) harbor 環(huán)境部署

GitHub 地址:https://github.com/helm/helm/releases
這使用 helm 安裝,所以得先安裝 helm

1)安裝 helm

mkdir-p/opt/k8s/helm&&cd/opt/k8s/helm
wgethttps://get.helm.sh/helm-v3.9.0-rc.1-linux-amd64.tar.gz
tar-xfhelm-v3.9.0-rc.1-linux-amd64.tar.gz
ln-s/opt/k8s/helm/linux-amd64/helm/usr/bin/helm
helmversion
helmhelp

2)配置 hosts

192.168.0.120myharbor.com

3)創(chuàng)建 stl 證書(shū)

mkdir/opt/k8s/helm/stl&&cd/opt/k8s/helm/stl
#生成CA證書(shū)私鑰
opensslgenrsa-outca.key4096
#生成CA證書(shū)
opensslreq-x509-new-nodes-sha512-days3650
-subj"/C=CN/ST=Guangdong/L=Shenzhen/O=harbor/OU=harbor/CN=myharbor.com"
-keyca.key
-outca.crt
#創(chuàng)建域名證書(shū),生成私鑰
opensslgenrsa-outmyharbor.com.key4096
#生成證書(shū)簽名請(qǐng)求CSR
opensslreq-sha512-new
-subj"/C=CN/ST=Guangdong/L=Shenzhen/O=harbor/OU=harbor/CN=myharbor.com"
-keymyharbor.com.key
-outmyharbor.com.csr
#生成x509v3擴(kuò)展
cat>v3.ext<<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage?=?digitalSignature,?nonRepudiation,?keyEncipherment,?dataEncipherment
extendedKeyUsage?=?serverAuth
subjectAltName?=?@alt_names

[alt_names]
DNS.1=myharbor.com
DNS.2=*.myharbor.com
DNS.3=hostname
EOF
#創(chuàng)建?Harbor?訪問(wèn)證書(shū)
openssl?x509?-req?-sha512?-days?3650?
????-extfile?v3.ext?
????-CA?ca.crt?-CAkey?ca.key?-CAcreateserial?
????-in?myharbor.com.csr?
????-out?myharbor.com.crt

4)安裝 ingress

ingress 官方網(wǎng)站:https://kubernetes.github.io/ingress-nginx/
ingress 倉(cāng)庫(kù)地址:https://github.com/kubernetes/ingress-nginx
部署文檔:https://kubernetes.github.io/ingress-nginx/deploy/

1、通過(guò) helm 部署

helmupgrade--installingress-nginxingress-nginx
--repohttps://kubernetes.github.io/ingress-nginx
--namespaceingress-nginx--create-namespace

2、通過(guò) YAML 文件安裝(本章使用這個(gè)方式安裝 ingress)

kubectlapply-fhttps://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/cloud/deploy.yaml

如果下載鏡像失敗,可以用以下方式修改鏡像地址再安裝

#可以先把鏡像下載,再安裝
dockerpullregistry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.2.0
dockerpullregistry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1

wgethttps://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/cloud/deploy.yaml
#修改鏡像地址
sed-i's@k8s.gcr.io/ingress-nginx/controller:v1.2.0(.*)@registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.2.0@'deploy.yaml
sed-i's@k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1(.*)$@registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1@'deploy.yaml

###還需要修改兩地方
#1、kind:類型修改成DaemonSet,replicas:注銷(xiāo)掉,因?yàn)镈aemonSet模式會(huì)每個(gè)節(jié)點(diǎn)運(yùn)行一個(gè)pod
#2、在添加一條:hostnetwork:true
#3、把LoadBalancer修改成NodePort
#4、在--validating-webhook-key下面添加---watch-ingress-without-class=true
#5、設(shè)置master節(jié)點(diǎn)可調(diào)度
kubectltaintnodesk8s-master-168-0-113node-role.kubernetes.io/control-plane:NoSchedule-
kubectltaintnodesk8s-master2-168-0-116node-role.kubernetes.io/control-plane:NoSchedule-

kubectlapply-fdeploy.yaml
4323e1b0-247b-11ed-ba43-dac502259ad0.png

5)安裝 nfs

1、所有節(jié)點(diǎn)安裝 nfs

yum-yinstallnfs-utilsrpcbind

2、在 master 節(jié)點(diǎn)創(chuàng)建共享目錄并授權(quán)

mkdir/opt/nfsdata
#授權(quán)共享目錄
chmod666/opt/nfsdata

3、配置 exports 文件

cat>/etc/exports<

exportfs 命令

常用選項(xiàng)
-a 全部掛載或者全部卸載
-r 重新掛載
-u 卸載某一個(gè)目錄
-v 顯示共享目錄 以下操作在服務(wù)端上

4、啟動(dòng) rpc 和 nfs(客戶端只需要啟動(dòng) rpc 服務(wù))(注意順序)

systemctlstartrpcbind
systemctlstartnfs-server
systemctlenablerpcbind
systemctlenablenfs-server

查看

showmount-e
#VIP
showmount-e192.168.0.120

-e 顯示 NFS 服務(wù)器的共享列表
-a 顯示本機(jī)掛載的文件資源的情況 NFS 資源的情況
-v 顯示版本號(hào)

5、客戶端

#安裝
yum-yinstallnfs-utilsrpcbind
#啟動(dòng)rpc服務(wù)
systemctlstartrpcbind
systemctlenablerpcbind
#創(chuàng)建掛載目錄
mkdir/mnt/nfsdata
#掛載
echo"192.168.0.120:/opt/nfsdata/mnt/nfsdatanfsdefaults01">>/etc/fstab
mount-a

6、rsync 數(shù)據(jù)同步

【1】rsync 安裝

#兩端都得安裝
yum-yinstallrsync

【2】配置

在/etc/rsyncd.conf 中添加

cat>/etc/rsyncd.conf<

配置 rsyncd_users.db

cat>/etc/rsyncd_users.db<

【3】rsyncd.conf 常用參數(shù)詳解

rsyncd.conf 參數(shù)

rsyncd.conf 參數(shù) 參數(shù)說(shuō)明
uid=root rsync 使用的用戶。
gid=root rsync 使用的用戶組(用戶所在的組)
use chroot=no 如果為 true,daemon 會(huì)在客戶端傳輸文件前“chroot to the path”。這是一種安全配置,因?yàn)槲覀兇蠖鄶?shù)都在內(nèi)網(wǎng),所以不配也沒(méi)關(guān)系
max connections=200 設(shè)置最大連接數(shù),默認(rèn) 0,意思無(wú)限制,負(fù)值為關(guān)閉這個(gè)模塊
timeout=400 默認(rèn)為 0,表示 no timeout,建議 300-600(5-10 分鐘)
pid file rsync daemon 啟動(dòng)后將其進(jìn)程 pid 寫(xiě)入此文件。如果這個(gè)文件存在,rsync 不會(huì)覆蓋該文件,而是會(huì)終止
lock file 指定 lock 文件用來(lái)支持“max connections”參數(shù),使得總連接數(shù)不會(huì)超過(guò)限制
log file 不設(shè)或者設(shè)置錯(cuò)誤,rsync 會(huì)使用 rsyslog 輸出相關(guān)日志信息
ignore errors 忽略 I/O 錯(cuò)誤
read only=false 指定客戶端是否可以上傳文件,默認(rèn)對(duì)所有模塊為 true
list=false 是否允許客戶端可以查看可用模塊列表,默認(rèn)為可以
hosts allow 指定可以聯(lián)系的客戶端主機(jī)名或和 ip 地址或地址段,默認(rèn)情況沒(méi)有此參數(shù),即都可以連接
hosts deny 指定不可以聯(lián)系的客戶端主機(jī)名或 ip 地址或地址段,默認(rèn)情況沒(méi)有此參數(shù),即都可以連接
auth users 指定以空格或逗號(hào)分隔的用戶可以使用哪些模塊,用戶不需要在本地系統(tǒng)中存在。默認(rèn)為所有用戶無(wú)密碼訪問(wèn)
secrets file 指定用戶名和密碼存放的文件,格式;用戶名;密碼,密碼不超過(guò) 8 位
[backup] 這里就是模塊名稱,需用中括號(hào)擴(kuò)起來(lái),起名稱沒(méi)有特殊要求,但最好是有意義的名稱,便于以后維護(hù)
path 這個(gè)模塊中,daemon 使用的文件系統(tǒng)或目錄,目錄的權(quán)限要注意和配置文件中的權(quán)限一致,否則會(huì)遇到讀寫(xiě)的問(wèn)題

【4】rsync 常用命令參數(shù)詳解

rsync--help

rsync[選項(xiàng)]原始位置目標(biāo)位置

常用選項(xiàng)說(shuō)明
-r遞歸模式,包含目錄及子目錄中的所有文件
-l對(duì)于符號(hào)鏈接文件仍然復(fù)制為符號(hào)鏈接文件
-v顯示同步過(guò)程的詳細(xì)信息
-z在傳輸文件時(shí)進(jìn)行壓縮goD
-p保留文件的權(quán)限標(biāo)記
-a歸檔模式,遞歸并保留對(duì)象屬性,等同于-rlpt
-t保留文件的時(shí)間標(biāo)記
-g保留文件的屬組標(biāo)記(僅超級(jí)用戶使用)
-o保留文件的屬主標(biāo)記(僅超級(jí)用戶使用)
-H保留硬鏈接文件
-A保留ACL屬性信息
-D保留設(shè)備文件及其他特殊文件
--delete刪除目標(biāo)位置有而原始位置沒(méi)有的文件
--checksum根據(jù)對(duì)象的校驗(yàn)和來(lái)決定是否跳過(guò)文件

【5】啟動(dòng)服務(wù)(數(shù)據(jù)源機(jī)器)

#rsync監(jiān)聽(tīng)端口:873
#rsync運(yùn)行模式:C/S
rsync--daemon--config=/etc/rsyncd.conf
netstat-tnlp|grep:873

【6】執(zhí)行命令同步數(shù)據(jù)

#在目的機(jī)器上執(zhí)行
#rsync-avz用戶名@源主機(jī)地址/源目錄目的目錄
rsync-avzroot@192.168.0.113:/opt/nfsdata/*/opt/nfsdata/

【7】crontab 定時(shí)同步

#配置crontab,每五分鐘同步一次,這種方式不好
*/5****rsync-avzroot@192.168.0.113:/opt/nfsdata/*/opt/nfsdata/

【溫馨提示】crontab 定時(shí)同步數(shù)據(jù)不太好,可以使用rsync+inotify做數(shù)據(jù)實(shí)時(shí)同步,這里篇幅有點(diǎn)長(zhǎng)了,先不講,如果后面有時(shí)間會(huì)出一篇單獨(dú)文章來(lái)講。

6)創(chuàng)建 nfs provisioner 和持久化存儲(chǔ) SC

【溫馨提示】這里跟我之前的文章有點(diǎn)不同,之前的方式也不適用新版本。

GitHub 地址:https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner

helm 部署 nfs-subdir-external-provisioner

1、添加 helm 倉(cāng)庫(kù)

helmrepoaddnfs-subdir-external-provisionerhttps://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/

2、helm 安裝 nfs provisioner

【溫馨提示】默認(rèn)鏡像是無(wú)法訪問(wèn)的,這里使用 dockerhub 搜索到的鏡像willdockerhub/nfs-subdir-external-provisioner:v4.0.2,還有就是 StorageClass 不分命名空間,所有在所有命名空間下都可以使用。

helminstallnfs-subdir-external-provisionernfs-subdir-external-provisioner/nfs-subdir-external-provisioner
--namespace=nfs-provisioner
--create-namespace
--setimage.repository=willdockerhub/nfs-subdir-external-provisioner
--setimage.tag=v4.0.2
--setreplicaCount=2
--setstorageClass.name=nfs-client
--setstorageClass.defaultClass=true
--setnfs.server=192.168.0.120
--setnfs.path=/opt/nfsdata

【溫馨提示】上面 nfs.server 設(shè)置為 VIP,可實(shí)現(xiàn)高可用。

3、查看

kubectlgetpods,deploy,sc-nnfs-provisioner
43341530-247b-11ed-ba43-dac502259ad0.png

7)部署 Harbor(Https 方式)

1、創(chuàng)建 Namespace

kubectlcreatensharbor

2、創(chuàng)建證書(shū)秘鑰

kubectlcreatesecrettlsmyharbor.com--keymyharbor.com.key--certmyharbor.com.crt-nharbor
kubectlgetsecretmyharbor.com-nharbor

3、添加 Chart 庫(kù)

helmrepoaddharborhttps://helm.goharbor.io

4、通過(guò) helm 安裝 harbor

helminstallmyharbor--namespaceharborharbor/harbor
--setexpose.ingress.hosts.core=myharbor.com
--setexpose.ingress.hosts.notary=notary.myharbor.com
--set-stringexpose.ingress.annotations.'nginx.org/client-max-body-size'="1024m"
--setexpose.tls.secretName=myharbor.com
--setpersistence.persistentVolumeClaim.registry.storageClass=nfs-client
--setpersistence.persistentVolumeClaim.jobservice.storageClass=nfs-client
--setpersistence.persistentVolumeClaim.database.storageClass=nfs-client
--setpersistence.persistentVolumeClaim.redis.storageClass=nfs-client
--setpersistence.persistentVolumeClaim.trivy.storageClass=nfs-client
--setpersistence.persistentVolumeClaim.chartmuseum.storageClass=nfs-client
--setpersistence.enabled=true
--setexternalURL=https://myharbor.com
--setharborAdminPassword=Harbor12345

這里稍等一段時(shí)間在查看資源狀態(tài)

kubectlgetingress,svc,pods,pvc-nharbor
43493776-247b-11ed-ba43-dac502259ad0.png

5、ingress 沒(méi)有 ADDRESS 問(wèn)題解決

【分析】,發(fā)現(xiàn)"error: endpoints “default-http-backend” not found"

cat<default-http-backend.yaml
---

apiVersion:apps/v1
kind:Deployment
metadata:
name:default-http-backend
labels:
app:default-http-backend
namespace:harbor
spec:
replicas:1
selector:
matchLabels:
app:default-http-backend
template:
metadata:
labels:
app:default-http-backend
spec:
terminationGracePeriodSeconds:60
containers:
-name:default-http-backend
#Anyimageispermissibleaslongas:
#1.Itservesa404pageat/
#2.Itserves200ona/healthzendpoint
image:registry.cn-hangzhou.aliyuncs.com/google_containers/defaultbackend:1.4
#image:gcr.io/google_containers/defaultbackend:1.4
livenessProbe:
httpGet:
path:/healthz
port:8080
scheme:HTTP
initialDelaySeconds:30
timeoutSeconds:5
ports:
-containerPort:8080
resources:
limits:
cpu:10m
memory:20Mi
requests:
cpu:10m
memory:20Mi
---

apiVersion:v1
kind:Service
metadata:
name:default-http-backend
namespace:harbor
labels:
app:default-http-backend
spec:
ports:
-port:80
targetPort:8080
selector:
app:default-http-backend
EOF
kubectlapply-fdefault-http-backend.yaml

6、卸載重新部署

#卸載
helmuninstallmyharbor-nharbor
kubectlgetpvc-nharbor|awk'NR!=1{print$1}'|xargskubectldeletepvc-nharbor

#部署
helminstallmyharbor--namespaceharborharbor/harbor
--setexpose.ingress.hosts.core=myharbor.com
--setexpose.ingress.hosts.notary=notary.myharbor.com
--set-stringexpose.ingress.annotations.'nginx.org/client-max-body-size'="1024m"
--setexpose.tls.secretName=myharbor.com
--setpersistence.persistentVolumeClaim.registry.storageClass=nfs-client
--setpersistence.persistentVolumeClaim.jobservice.storageClass=nfs-client
--setpersistence.persistentVolumeClaim.database.storageClass=nfs-client
--setpersistence.persistentVolumeClaim.redis.storageClass=nfs-client
--setpersistence.persistentVolumeClaim.trivy.storageClass=nfs-client
--setpersistence.persistentVolumeClaim.chartmuseum.storageClass=nfs-client
--setpersistence.enabled=true
--setexternalURL=https://myharbor.com
--setharborAdminPassword=Harbor12345
435925b4-247b-11ed-ba43-dac502259ad0.png

5、訪問(wèn) harbor

https://myharbor.com
賬號(hào)/密碼:admin/Harbor12345
436b8fba-247b-11ed-ba43-dac502259ad0.png

6、harbor 常見(jiàn)操作

【1】創(chuàng)建項(xiàng)目 bigdata

437b6c32-247b-11ed-ba43-dac502259ad0.png

【2】配置私有倉(cāng)庫(kù)

在文件/etc/docker/daemon.json添加如下內(nèi)容:

"insecure-registries":["https://myharbor.com"]

重啟 docker

systemctlrestartdocker

【3】服務(wù)器上登錄 harbor

dockerloginhttps://myharbor.com
#賬號(hào)/密碼:admin/Harbor12345
438cb956-247b-11ed-ba43-dac502259ad0.png

【4】打標(biāo)簽并把鏡像上傳到 harbor

dockertagrancher/pause:3.6myharbor.com/bigdata/pause:3.6
dockerpushmyharbor.com/bigdata/pause:3.6

7、修改 containerd 配置

以前使用 docker-engine 的時(shí)候,只需要修改/etc/docker/daemon.json 就行,但是新版的 k8s 已經(jīng)使用 containerd 了,所以這里需要做相關(guān)配置,要不然 containerd 會(huì)失敗。證書(shū)(ca.crt)可以在頁(yè)面上下載:
43a349aa-247b-11ed-ba43-dac502259ad0.png
創(chuàng)建域名目錄

mkdir/etc/containerd/myharbor.com
cpca.crt/etc/containerd/myharbor.com/

配置文件:/etc/containerd/config.toml

[plugins."io.containerd.grpc.v1.cri".registry]
config_path=""

[plugins."io.containerd.grpc.v1.cri".registry.auths]

[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.configs."myharbor.com".tls]
ca_file="/etc/containerd/myharbor.com/ca.crt"
[plugins."io.containerd.grpc.v1.cri".registry.configs."myharbor.com".auth]
username="admin"
password="Harbor12345"

[plugins."io.containerd.grpc.v1.cri".registry.headers]

[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."myharbor.com"]
endpoint=["https://myharbor.com"]

43b9254a-247b-11ed-ba43-dac502259ad0.png
重啟 containerd

#重新加載配置
systemctldaemon-reload
#重啟containerd
systemctlrestartcontainerd

簡(jiǎn)單使用

#把docker換成crictl就行,命令都差不多
crictlpullmyharbor.com/bigdata/mysql:5.7.38

執(zhí)行 crictl 報(bào)如下錯(cuò)誤的解決辦法

WARN[0000]imageconnectusingdefaultendpoints:[unix:///var/run/dockershim.sockunix:///run/containerd/containerd.sockunix:///run/crio/crio.sockunix:///var/run/cri-dockerd.sock].Asthedefaultsettingsarenowdeprecated,youshouldsettheendpointinstead.
ERRO[0000]unabletodetermineimageAPIversion:rpcerror:code=Unavailabledesc=connectionerror:desc="transport:Errorwhiledialingdialunix/var/run/dockershim.sock:connect:nosuchfileordirectory"

這個(gè)報(bào)錯(cuò)是 docker 的報(bào)錯(cuò),這里沒(méi)使用,所以這個(gè)錯(cuò)誤不影響使用,但是還是解決好點(diǎn),解決方法如下:

cat</etc/crictl.yaml
runtime-endpoint:unix:///run/containerd/containerd.sock
image-endpoint:unix:///run/containerd/containerd.sock
timeout:10
debug:false
EOF

再次拉取鏡像

crictlpullmyharbor.com/bigdata/mysql:5.7.38
44154672-247b-11ed-ba43-dac502259ad0.png

Kubernetes(k8s)最新版最完整版基礎(chǔ)環(huán)境部署+master 高可用實(shí)現(xiàn)詳細(xì)步驟就到這里了,有疑問(wèn)的小伙伴歡迎給我留言哦~

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 驅(qū)動(dòng)程序
    +關(guān)注

    關(guān)注

    19

    文章

    837

    瀏覽量

    48080
  • 阿里云
    +關(guān)注

    關(guān)注

    3

    文章

    963

    瀏覽量

    43102
  • Docker
    +關(guān)注

    關(guān)注

    0

    文章

    473

    瀏覽量

    11867

原文標(biāo)題:詳解 K8S 高可用部署,超詳細(xì)!

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    全面提升,阿里云Docker/Kubernetes(K8S) 日志解決方案與選型對(duì)比

    簡(jiǎn)單、輕量、高性價(jià)比的部署與運(yùn)維方法;而k8s在Docker之上,更進(jìn)一步提供了對(duì)管理基礎(chǔ)設(shè)施的抽象,形成了真正意義上的一站式部署與運(yùn)維方案。k8s提供了強(qiáng)有力工作調(diào)度、水平擴(kuò)展、健康
    發(fā)表于 02-28 12:49

    全面提升,阿里云Docker/Kubernetes(K8S) 日志解決方案與選型對(duì)比

    簡(jiǎn)單、輕量、高性價(jià)比的部署與運(yùn)維方法;而k8s在Docker之上,更進(jìn)一步提供了對(duì)管理基礎(chǔ)設(shè)施的抽象,形成了真正意義上的一站式部署與運(yùn)維方案。k8s提供了強(qiáng)有力工作調(diào)度、水平擴(kuò)展、健康
    發(fā)表于 02-28 12:50

    搭建K8s環(huán)境平臺(tái)的步驟

    1 搭建K8s環(huán)境平臺(tái)規(guī)劃1.1 單master集群1.2 多master集群
    發(fā)表于 11-04 06:03

    OpenStack與K8s結(jié)合的兩種方案的詳細(xì)介紹和比較

    OpenStack與K8S結(jié)合主要有兩種方案。一是K8S部署在OpenStack平臺(tái)之上,二是K8S和OpenStack組件集成。
    的頭像 發(fā)表于 10-14 09:38 ?2.7w次閱讀

    Docker不香嗎為什么還要用K8s

    Docker 雖好用,但面對(duì)強(qiáng)大的集群,成千上萬(wàn)的容器,突然感覺(jué)不香了。 這時(shí)候就需要我們的主角 Kubernetes 上場(chǎng)了,先來(lái)了解一下 K8s 的基本概念,后面再介紹實(shí)踐,由淺入深步步為營(yíng)
    的頭像 發(fā)表于 06-02 11:56 ?3450次閱讀

    簡(jiǎn)單說(shuō)明k8s和Docker之間的關(guān)系

    這篇文章主要介紹了k8s和Docker關(guān)系簡(jiǎn)單說(shuō)明,本文利用圖文講解的很透徹,有需要的同學(xué)可以研究下 最近項(xiàng)目用到kubernetes(以下簡(jiǎn)稱k8s,ks之間有
    的頭像 發(fā)表于 06-24 15:48 ?3426次閱讀

    mysql部署k8s上的實(shí)現(xiàn)方案

    的 RDBMS (Relational Database Management System,關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)) 應(yīng)用軟件之一。這里主要講 mysql 部署k8s 上,mysql 部署
    的頭像 發(fā)表于 09-26 10:39 ?2528次閱讀

    k8s是什么意思?kubeadm部署k8s集群(k8s部署)|PetaExpres

    ),Kubernetes提供了應(yīng)用部署,規(guī)劃,更新,維護(hù)的一種機(jī)制。 在Kubernetes中,我們可以創(chuàng)建多個(gè)容器,每個(gè)容器里面運(yùn)行一個(gè)應(yīng)用實(shí)例,然后通過(guò)內(nèi)置的負(fù)載均衡策略,實(shí)現(xiàn)對(duì)這一組應(yīng)用實(shí)例的管理、發(fā)現(xiàn)、訪問(wèn),而這些細(xì)節(jié)都不需要運(yùn)維人員去進(jìn)行復(fù)雜的手工配置和處理。
    發(fā)表于 07-19 13:14 ?1121次閱讀

    什么是K3sK8s?K3sK8s有什么區(qū)別?

    Kubernetes,通常縮寫(xiě)為 K8s,是領(lǐng)先的容器編排工具。該開(kāi)源項(xiàng)目最初由 Google 開(kāi)發(fā),幫助塑造了現(xiàn)代編排的定義。該系統(tǒng)包括了部署和運(yùn)行容器化系統(tǒng)所需的一切。
    的頭像 發(fā)表于 08-03 10:53 ?7603次閱讀

    K8S落地實(shí)踐經(jīng)驗(yàn)分享

    k8s 即 Kubernetes,是一個(gè)開(kāi)源的容器編排引擎,用來(lái)對(duì)容器化應(yīng)用進(jìn)行自動(dòng)化部署、 擴(kuò)縮和管理。
    的頭像 發(fā)表于 01-02 11:45 ?1190次閱讀
    <b class='flag-5'>K8S</b>落地實(shí)踐經(jīng)驗(yàn)分享

    K8S學(xué)習(xí)教程(二):在 PetaExpress KubeSphere容器平臺(tái)部署可用 Redis 集群

    并且需要手動(dòng)重啟節(jié)點(diǎn),相較之下,使用 PetaExpress 提供的 Kubernetes(k8s) 服務(wù) 進(jìn)行 Redis 集群的部署,則展現(xiàn)出了顯著的優(yōu)勢(shì): 1、安裝便捷:使用鏡像或者 yaml 配置文件即可一件安裝,極大地簡(jiǎn)化了安裝流程 2、縮擴(kuò)容方便:在 擴(kuò)容 、
    的頭像 發(fā)表于 07-03 15:30 ?784次閱讀
    <b class='flag-5'>K8S</b>學(xué)習(xí)教程(二):在 PetaExpress KubeSphere容器平臺(tái)<b class='flag-5'>部署</b><b class='flag-5'>高</b><b class='flag-5'>可用</b> Redis 集群

    k8s云原生開(kāi)發(fā)要求

    Kubernetes(K8s)云原生開(kāi)發(fā)對(duì)硬件有一定要求。CPU方面,建議至少配備2個(gè)邏輯核心,高性能CPU更佳。內(nèi)存至少4GB,但8GB或更高更推薦。存儲(chǔ)需至少20-30GB可用空間,SSD提升
    的頭像 發(fā)表于 10-24 10:03 ?234次閱讀
    <b class='flag-5'>k8s</b>云原生開(kāi)發(fā)要求

    k8s可以部署私有云嗎?私有云部署全攻略

    Kubernetes(簡(jiǎn)稱K8S)可以部署私有云。Kubernetes是一個(gè)開(kāi)源的容器編排引擎,能夠自動(dòng)化容器的部署、擴(kuò)展和管理,使得應(yīng)用可以在各種環(huán)境中高效運(yùn)行。通過(guò)使用Kubern
    的頭像 發(fā)表于 10-25 09:32 ?179次閱讀

    混合云部署k8s集群方法有哪些?

    混合云部署k8s集群方法是首先需在本地與公有云分別建立K8s集群,并確保網(wǎng)絡(luò)連接。接著,配置kubeconfig文件連接兩集群,并安裝云服務(wù)插件以實(shí)現(xiàn)資源互通。然后,編寫(xiě)Deploym
    的頭像 發(fā)表于 11-07 09:37 ?154次閱讀

    k8s和docker區(qū)別對(duì)比,哪個(gè)更強(qiáng)?

    部署、擴(kuò)展、管理和應(yīng)用生命周期管理能力,可實(shí)現(xiàn)可用性和自動(dòng)伸縮,兩者常結(jié)合使用以優(yōu)化容器化和應(yīng)用管理。UU云小編將對(duì)k8s和docker區(qū)
    的頭像 發(fā)表于 12-11 13:55 ?117次閱讀