一、前言
二、基礎(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
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
查看日志,發(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'.
【解釋】重新安裝(或第一次安裝)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
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
發(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"
接下來(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)正常了
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
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
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
5、查看 ipvs 轉(zhuǎn)發(fā)規(guī)則
ipvsadm-Ln
11)集群高可用配置
配置高可用(HA)Kubernetes 集群實(shí)現(xiàn)的兩種方案:
使用堆疊(stacked)控制平面節(jié)點(diǎn),其中 etcd 節(jié)點(diǎn)與控制平面節(jié)點(diǎn)共存(本章使用),架構(gòu)圖如下:
使用外部 etcd 節(jié)點(diǎn),其中 etcd 在與控制平面不同的節(jié)點(diǎn)上運(yùn)行,架構(gòu)圖如下:
這里新增一臺(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
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。
根據(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
雖然現(xiàn)在已經(jīng)有兩個(gè) master 了,但是對(duì)外還是只能有一個(gè)入口的,所以還得要一個(gè)負(fù)載均衡器,如果一個(gè) master 掛了,會(huì)自動(dòng)切到另外一個(gè) master 節(jié)點(diǎn)。12)部署 Nginx+Keepalived 高可用負(fù)載均衡器
1、安裝 Nginx 和 Keepalived
#在兩個(gè)master節(jié)點(diǎn)上執(zhí)行 yuminstallnginxkeepalived-y
2、Nginx 配置
在兩個(gè) master 節(jié)點(diǎn)配置
cat>/etc/nginx/nginx.conf<"EOF" user?nginx; worker_processes?auto; error_log?/var/log/nginx/error.log; pid?/run/nginx.pid; include?/usr/share/nginx/modules/*.conf; events?{ ????worker_connections?1024; } #?四層負(fù)載均衡,為兩臺(tái)Master?apiserver組件提供負(fù)載均衡 stream?{ ????log_format??main??'$remote_addr?$upstream_addr?-?[$time_local]?$status?$upstream_bytes_sent'; ????access_log??/var/log/nginx/k8s-access.log??main; ????upstream?k8s-apiserver?{ ????#?Master?APISERVER?IP:PORT ???????server?192.168.0.113:6443; ????#?Master2?APISERVER?IP:PORT ???????server?192.168.0.116:6443; ????} ????server?{ ???????listen?16443; ???????proxy_pass?k8s-apiserver; ????} } http?{ ????log_format??main??'$remote_addr?-?$remote_user?[$time_local]?"$request"?' ??????????????????????'$status?$body_bytes_sent?"$http_referer"?' ??????????????????????'"$http_user_agent"?"$http_x_forwarded_for"'; ????access_log??/var/log/nginx/access.log??main; ????sendfile????????????on; ????tcp_nopush??????????on; ????tcp_nodelay?????????on; ????keepalive_timeout???65; ????types_hash_max_size?2048; ????include?????????????/etc/nginx/mime.types; ????default_type????????application/octet-stream; ????server?{ ????????listen???????80?default_server; ????????server_name??_; ????????location?/?{ ????????} ????} } EOF
【溫馨提示】如果只保證高可用,不配置 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<"EOF" #!/bin/bash count=$(ps?-ef?|grep?nginx?|egrep?-cv?"grep|$$") if?[?"$count"?-eq?0?];then ????exit?1 else ????exit?0 fi EOF chmod?+x?/etc/keepalived/check_nginx.sh
4、Keepalived 配置(backup)
cat>/etc/keepalived/keepalived.conf<
檢查 nginx 狀態(tài)腳本:
cat>/etc/keepalived/check_nginx.sh<"EOF" #!/bin/bash count=$(ps?-ef?|grep?nginx?|egrep?-cv?"grep|$$") if?[?"$count"?-eq?0?];then ????exit?1 else ????exit?0 fi EOF chmod?+x?/etc/keepalived/check_nginx.sh
5、啟動(dòng)并設(shè)置開(kāi)機(jī)啟動(dòng)
systemctldaemon-reload systemctlrestartnginx&&systemctlenablenginx&&systemctlstatusnginx systemctlrestartkeepalived&&systemctlenablekeepalived&&systemctlstatuskeepalived
查看 VIP
ipa
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
高可用測(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:{}
重新部署
kubectldelete-frecommended.yaml kubectlapply-frecommended.yaml kubectlgetsvc,pods-nkubernetes-dashboard
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
輸入上面創(chuàng)建的 token 登錄
四、k8s 鏡像倉(cāng)庫(kù) harbor 環(huán)境部署
GitHub 地址:https://github.com/helm/helm/releases
這使用 helm 安裝,所以得先安裝 helm1)安裝 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
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
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
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
5、訪問(wèn) harbor
https://myharbor.com
賬號(hào)/密碼:admin/Harbor123456、harbor 常見(jiàn)操作
【1】創(chuàng)建項(xiàng)目 bigdata
【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
【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è)面上下載:
創(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"]
重啟 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
Kubernetes(k8s)最新版最完整版基礎(chǔ)環(huán)境部署+master 高可用實(shí)現(xiàn)詳細(xì)步驟就到這里了,有疑問(wèn)的小伙伴歡迎給我留言哦~
審核編輯:彭靜
-
驅(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)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論