色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

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

馬哥Linux運(yùn)維 ? 來源:馬哥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ū)動程序 systemd(所有節(jié)點(diǎn))

6)開始安裝 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 管理平臺 dashboard 環(huán)境部署

1)dashboard 部署

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

3)配置 hosts 登錄 dashboard web

四、k8s 鏡像倉庫 harbor 環(huán)境部署

1)安裝 helm

2)配置 hosts

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

4)安裝 ingress

5)安裝 nfs

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

7)部署 Harbor(Https 方式)

一、前言

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

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

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

先部署 1master 和 2node 節(jié)點(diǎn),后面再加一個 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 互信

#直接一直回車就行
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、時間同步

yuminstallchrony-y
systemctlstartchronyd
systemctlenablechronyd
chronycsources

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

systemctlstopfirewalld
systemctldisablefirewalld

5、關(guān)閉 swap

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

6、禁用 SELinux

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

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

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

sudomodprobebr_netfilter
lsmod|grepbr_netfilter

為了讓 Linux 節(jié)點(diǎn)的 iptables 能夠正確查看橋接流量,請確認(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 棄用是否會影響你 以了解此刪除可能會如何影響你。要了解如何使用 dockershim 進(jìn)行遷移,請參閱從 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
#啟動
systemctlstartdocker
#開機(jī)自啟
systemctlenabledocker
#查看版本號
docker--version
#查看版本具體信息
dockerversion

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

【溫馨提示】dockerd 實(shí)際真實(shí)調(diào)用的還是 containerd 的 api 接口,containerd 是 dockerd 和 runC 之間的一個中間交流組件。所以啟動 docker 服務(wù)的時候,也會啟動 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這個文件默認(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ū)動程序 systemd(所有節(jié)點(diǎn))

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

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

6)開始安裝 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:禁掉除了這個kubernetes之外的別的倉庫
#設(shè)置為開機(jī)自啟并現(xiàn)在立刻啟動服務(wù)--now:立刻啟動服務(wù)
systemctlenable--nowkubelet

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

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

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)過 kubeadm init 或者 kubeadm join 后,kubelet 會不斷重啟,這個是正常現(xiàn)象……,執(zhí)行 init 或 join 后問題會自動解決,對此官網(wǎng)有如下描述,也就是此時不用理會 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:這個用于指定從什么位置來拉取鏡像(1.13版本才有的),默認(rèn)值是k8s.gcr.io,我們將其指定為國內(nèi)鏡像地址:registry.aliyuncs.com/google_containers
#–kubernetes-version string:指定kubenets版本號,默認(rèn)值是stable-1,會導(dǎo)致從https://dl.k8s.io/release/stable-1.txt下載最新的版本號,我們可以將其指定為固定版本(v1.22.1)來跳過網(wǎng)絡(luò)請求。
#–apiserver-advertise-address 指明用 Master 的哪個 interface 與 Cluster 的其他節(jié)點(diǎn)通信。如果 Master 有多個 interface,建議明確指定,如果不指定,kubeadm 會自動選擇有默認(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ò)方案對–pod-network-cidr有自己的要求,這里設(shè)置為10.244.0.0/16 是因?yàn)槲覀儗⑹褂?flannel 網(wǎng)絡(luò)方案,必須設(shè)置成這個 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 不支持將沒有 --control-plane-endpoint 參數(shù)的單個控制平面集群轉(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:這個用于指定從什么位置來拉取鏡像(1.13版本才有的),默認(rèn)值是k8s.gcr.io,我們將其指定為國內(nèi)鏡像地址:registry.aliyuncs.com/google_containers
#–kubernetes-version string:指定kubenets版本號,默認(rèn)值是stable-1,會導(dǎo)致從https://dl.k8s.io/release/stable-1.txt下載最新的版本號,我們可以將其指定為固定版本(v1.22.1)來跳過網(wǎng)絡(luò)請求。
#–apiserver-advertise-address 指明用 Master 的哪個 interface 與 Cluster 的其他節(jié)點(diǎn)通信。如果 Master 有多個 interface,建議明確指定,如果不指定,kubeadm 會自動選擇有默認(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ò)方案對–pod-network-cidr有自己的要求,這里設(shè)置為10.244.0.0/16 是因?yàn)槲覀儗⑹褂?flannel 網(wǎng)絡(luò)方案,必須設(shè)置成這個 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

#臨時生效(退出當(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)還是有問題,查看日志 /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
接下來就是安裝 Pod 網(wǎng)絡(luò)插件

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

你必須部署一個基于 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è)置為開機(jī)自啟并現(xiàn)在立刻啟動服務(wù)--now:立刻啟動服務(wù)
systemctlenable--nowkubelet
systemctlstatuskubelet

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

kubeadmtokenlist

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

kubeadmtokencreate
#再查看
kubeadmtokenlist

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

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

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

kubeadmtokencreate--print-join-command

這里需要等待一段時間,再查看節(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

【問題】集群內(nèi)無法 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)證開啟了 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

這里新增一臺機(jī)器作為另外一個 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 互信

#直接一直回車就行
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、時間同步

yuminstallchrony-y
systemctlstartchronyd
systemctlenablechronyd
chronycsources

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

systemctlstopfirewalld
systemctldisablefirewalld

4、關(guān)閉 swap

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

5、禁用 SELinux

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

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

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

sudomodprobebr_netfilter
lsmod|grepbr_netfilter

為了讓 Linux 節(jié)點(diǎn)的 iptables 能夠正確查看橋接流量,請確認(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 棄用是否會影響你 以了解此刪除可能會如何影響你。要了解如何使用 dockershim 進(jìn)行遷移,請參閱從 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
#啟動
systemctlstartdocker
#開機(jī)自啟
systemctlenabledocker
#查看版本號
docker--version
#查看版本具體信息
dockerversion

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

【溫馨提示】dockerd 實(shí)際真實(shí)調(diào)用的還是 containerd 的 api 接口,containerd 是 dockerd 和 runC 之間的一個中間交流組件。所以啟動 docker 服務(wù)的時候,也會啟動 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這個文件默認(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ū)動程序 systemd

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

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

11、開始安裝 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:禁掉除了這個kubernetes之外的別的倉庫
#設(shè)置為開機(jī)自啟并現(xiàn)在立刻啟動服務(wù)--now:立刻啟動服務(wù)
systemctlenable--nowkubelet

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

#查看版本

kubectlversion
yuminfokubeadm

12、加入 k8s 集群

#證如果過期了,可以使用下面命令生成新證書上傳,這里會打印出certificatekey,后面會用到
kubeadminitphaseupload-certs--upload-certs
#你還可以在【init】期間指定自定義的--certificate-key,以后可以由 join 使用。要生成這樣的密鑰,可以使用以下命令(這里不執(zhí)行,就用上面那個自命令就可以了):
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)建一個新的控制平面。加入master必須加這個標(biāo)記
#--certificate-key ... 將導(dǎo)致從集群中的 kubeadm-certs Secret 下載控制平面證書并使用給定的密鑰進(jìn)行解密。這里的值就是上面這個命令(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)有兩個 master 了,但是對外還是只能有一個入口的,所以還得要一個負(fù)載均衡器,如果一個 master 掛了,會自動切到另外一個 master 節(jié)點(diǎn)。

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

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

1、安裝 Nginx 和 Keepalived

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

2、Nginx 配置

在兩個 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、啟動并設(shè)置開機(jī)啟動

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、測試驗(yàn)證

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

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

42ca7ce2-247b-11ed-ba43-dac502259ad0.png
高可用測試驗(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)險。如果一個節(jié)點(diǎn)發(fā)生故障,則 etcd 成員和控制平面實(shí)例都將丟失, 并且冗余會受到影響。你可以通過添加更多控制平面節(jié)點(diǎn)來降低此風(fēng)險。

三、k8s 管理平臺 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

但是這個只能內(nèi)部訪問,所以要外部訪問,要么部署 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 鏡像倉庫 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 證書

mkdir/opt/k8s/helm/stl&&cd/opt/k8s/helm/stl
#生成CA證書私鑰
opensslgenrsa-outca.key4096
#生成CA證書
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)建域名證書,生成私鑰
opensslgenrsa-outmyharbor.com.key4096
#生成證書簽名請求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?訪問證書
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 倉庫地址:https://github.com/kubernetes/ingress-nginx
部署文檔:https://kubernetes.github.io/ingress-nginx/deploy/

1、通過 helm 部署

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

2、通過 YAML 文件安裝(本章使用這個方式安裝 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:注銷掉,因?yàn)镈aemonSet模式會每個節(jié)點(diǎn)運(yùn)行一個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 命令

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

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

systemctlstartrpcbind
systemctlstartnfs-server
systemctlenablerpcbind
systemctlenablenfs-server

查看

showmount-e
#VIP
showmount-e192.168.0.120

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

5、客戶端

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

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

rsync--help

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

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

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

#rsync監(jiān)聽端口: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 定時同步

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

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

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

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

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

helm 部署 nfs-subdir-external-provisioner

1、添加 helm 倉庫

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

2、helm 安裝 nfs provisioner

【溫馨提示】默認(rè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)建證書秘鑰

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

3、添加 Chart 庫

helmrepoaddharborhttps://helm.goharbor.io

4、通過 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

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

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

5、ingress 沒有 ADDRESS 問題解決

【分析】,發(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、訪問 harbor

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

6、harbor 常見操作

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

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

【2】配置私有倉庫

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

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

重啟 docker

systemctlrestartdocker

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

dockerloginhttps://myharbor.com
#賬號/密碼: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 的時候,只需要修改/etc/docker/daemon.json 就行,但是新版的 k8s 已經(jīng)使用 containerd 了,所以這里需要做相關(guān)配置,要不然 containerd 會失敗。證書(ca.crt)可以在頁面上下載:
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

簡單使用

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

執(zhí)行 crictl 報如下錯誤的解決辦法

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"

這個報錯是 docker 的報錯,這里沒使用,所以這個錯誤不影響使用,但是還是解決好點(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ì)步驟就到這里了,有疑問的小伙伴歡迎給我留言哦~

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

    關(guān)注

    19

    文章

    848

    瀏覽量

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

    關(guān)注

    3

    文章

    971

    瀏覽量

    43190
  • Docker
    +關(guān)注

    關(guān)注

    0

    文章

    492

    瀏覽量

    11923

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

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

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

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

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

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

    Docker不香嗎為什么還要用K8s

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    部署、擴(kuò)展、管理和應(yīng)用生命周期管理能力,可實(shí)現(xiàn)可用性和自動伸縮,兩者常結(jié)合使用以優(yōu)化容器化和應(yīng)用管理。UU云小編將對k8s和docker區(qū)
    的頭像 發(fā)表于 12-11 13:55 ?163次閱讀
    主站蜘蛛池模板: 亚久久伊人精品青青草原2020 | 午夜AV亚洲一码二中文字幕青青 | 手机看片国产日韩欧美 | 久久99国产精品二区不卡 | 十八禁啪啦啪漫画 | 囯产精品一区二区三区线 | 毛篇片在线观看 | 久久a在线视频观看 | 欧美人与动牲交A精品 | 伊人久久大香线蕉综合网站 | 国产中文欧美日韩在线 | 真实的强视频免费网站 | 强行撕开衣服捏胸黄文 | 亚洲第一伊人 | 免费一级特黄欧美大片久久网 | 久久不射电影网 | 一本色道久久综合亚洲AV蜜桃 | 少妇被阴内射XXXB少妇BB | 亚洲高清国产拍精品动图 | 国产区精品综合在线 | YELLOW免费观看完整视频 | 永久免费的污视频网站 | 日日摸夜夜添无码AVA片 | 亚洲成年人免费网站 | 日韩人妻无码精品久久中文字幕 | 国产精品亚洲精品影院 | 久久综合视频网站 | 芒果影院网站在线观看 | 久草免费视频在线观看 | 国产在线高清视频无码不卡 | 国产99视频精品免费播放 | 男人一进一出桶女人视频 | 羞羞影院午夜男女爽爽影院网站 | 网友自拍成人在线视频 | 456亚洲人成在线播放网站 | 国色精品VA在线观看免费视频 | 国产亚洲精品精品国产亚洲综合 | 嫩草影院一区 | 国产MD视频一区二区三区 | 香艳69xxxxx有声小说 | avtt天堂网Av无码 |