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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

k8s基礎環(huán)境部署+master高可用實現步驟

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 作者:馬哥Linux運維 ? 2022-08-26 10:46 ? 次閱讀

一、前言

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

1)前期準備(所有節(jié)點)

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

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

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

5)配置 containerd cgroup 驅動程序 systemd(所有節(jié)點)

6)開始安裝 kubeadm,kubelet 和 kubectl(master 節(jié)點)

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

8)安裝 Pod 網絡插件(CNI:Container Network Interface)(master)

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

10)配置 IPVS

11)集群高可用配置

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

三、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 方式)

一、前言

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

1)前期準備(所有節(jié)點)

1、修改主機名和配置 hosts

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

#在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、關閉防火墻

systemctlstopfirewalld
systemctldisablefirewalld

5、關閉 swap

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

6、禁用 SELinux

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

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

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

sudomodprobebr_netfilter
lsmod|grepbr_netfilter

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

cat<

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

提示:v1.24 之前的 Kubernetes 版本包括與 Docker Engine 的直接集成,使用名為 dockershim 的組件。這種特殊的直接整合不再是 Kubernetes 的一部分 (這次刪除被作為 v1.20 發(fā)行版本的一部分宣布)。你可以閱讀檢查 Dockershim 棄用是否會影響你 以了解此刪除可能會如何影響你。要了解如何使用 dockershim 進行遷移,請參閱從 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
#設置yum源
yum-config-manager--add-repohttp://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安裝docker-ce版本
yuminstall-ydocker-ce
#啟動
systemctlstartdocker
#開機自啟
systemctlenabledocker
#查看版本號
docker--version
#查看版本具體信息
dockerversion

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

【溫馨提示】dockerd 實際真實調用的還是 containerd 的 api 接口,containerd 是 dockerd 和 runC 之間的一個中間交流組件。所以啟動 docker 服務的時候,也會啟動 containerd 服務的。

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

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

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

#導出默認配置,config.toml這個文件默認是不存在的
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 驅動程序 systemd(所有節(jié)點)

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

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

6)開始安裝 kubeadm,kubelet 和 kubectl(master 節(jié)點)

#不指定版本就是最新版本,當前最新版就是1.24.1
yuminstall-ykubelet-1.24.1kubeadm-1.24.1kubectl-1.24.1--disableexcludes=kubernetes
# disableexcludes=kubernetes:禁掉除了這個kubernetes之外的別的倉庫
#設置為開機自啟并現在立刻啟動服務--now:立刻啟動服務
systemctlenable--nowkubelet

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

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

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

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

【解釋】重新安裝(或第一次安裝)k8s,未經過 kubeadm init 或者 kubeadm join 后,kubelet 會不斷重啟,這個是正?,F象……,執(zhí)行 init 或 join 后問題會自動解決,對此官網有如下描述,也就是此時不用理會 kubelet.service。

查看版本

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

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

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

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版本才有的),默認值是k8s.gcr.io,我們將其指定為國內鏡像地址:registry.aliyuncs.com/google_containers
#–kubernetes-version string:指定kubenets版本號,默認值是stable-1,會導致從https://dl.k8s.io/release/stable-1.txt下載最新的版本號,我們可以將其指定為固定版本(v1.22.1)來跳過網絡請求。
#–apiserver-advertise-address 指明用 Master 的哪個 interface 與 Cluster 的其他節(jié)點通信。如果 Master 有多個 interface,建議明確指定,如果不指定,kubeadm 會自動選擇有默認網關的 interface。這里的ip為master節(jié)點ip,記得更換。
#–pod-network-cidr 指定 Pod 網絡的范圍。Kubernetes 支持多種網絡方案,而且不同網絡方案對–pod-network-cidr有自己的要求,這里設置為10.244.0.0/16 是因為我們將使用 flannel 網絡方案,必須設置成這個 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 以指向高可用性方案中的負載均衡器的地址。

【溫馨提示】kubeadm 不支持將沒有 --control-plane-endpoint 參數的單個控制平面集群轉換為高可用性集群。

重置再初始化

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版本才有的),默認值是k8s.gcr.io,我們將其指定為國內鏡像地址:registry.aliyuncs.com/google_containers
#–kubernetes-version string:指定kubenets版本號,默認值是stable-1,會導致從https://dl.k8s.io/release/stable-1.txt下載最新的版本號,我們可以將其指定為固定版本(v1.22.1)來跳過網絡請求。
#–apiserver-advertise-address 指明用 Master 的哪個 interface 與 Cluster 的其他節(jié)點通信。如果 Master 有多個 interface,建議明確指定,如果不指定,kubeadm 會自動選擇有默認網關的 interface。這里的ip為master節(jié)點ip,記得更換。
#–pod-network-cidr 指定 Pod 網絡的范圍。Kubernetes 支持多種網絡方案,而且不同網絡方案對–pod-network-cidr有自己的要求,這里設置為10.244.0.0/16 是因為我們將使用 flannel 網絡方案,必須設置成這個 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 以指向高可用性方案中的負載均衡器的地址。

配置環(huán)境變量

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

#臨時生效(退出當前窗口重連環(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ā)現節(jié)點還是有問題,查看日志 /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 網絡插件

8)安裝 Pod 網絡插件(CNI:Container Network Interface)(master)

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

#最好提前下載鏡像(所有節(jié)點)
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é)點,就已經正常了
42027080-247b-11ed-ba43-dac502259ad0.png

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

先安裝 kubelet

yuminstall-ykubeletkubeadmkubectl--disableexcludes=kubernetes
#設置為開機自啟并現在立刻啟動服務--now:立刻啟動服務
systemctlenable--nowkubelet
systemctlstatuskubelet

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

kubeadmtokenlist

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

kubeadmtokencreate
#再查看
kubeadmtokenlist

如果你沒有 –discovery-token-ca-cert-hash 的值,則可以通過在控制平面節(jié)點上執(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é)點節(jié)點狀態(tài),因為需要安裝 kube-proxy 和 flannel。

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

10)配置 IPVS

【問題】集群內無法 ping 通 ClusterIP(或 ServiceName)

1、加載 ip_vs 相關內核模塊

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

所有節(jié)點驗證開啟了 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 轉發(fā)規(guī)則

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

11)集群高可用配置

配置高可用(HA)Kubernetes 集群實現的兩種方案:

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

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

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

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

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

1、修改主機名和配置 hosts

所有節(jié)點都統一如下配置:

#在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、關閉防火墻

systemctlstopfirewalld
systemctldisablefirewalld

4、關閉 swap

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

5、禁用 SELinux

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

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

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

sudomodprobebr_netfilter
lsmod|grepbr_netfilter

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

cat<

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

提示:v1.24 之前的 Kubernetes 版本包括與 Docker Engine 的直接集成,使用名為 dockershim 的組件。這種特殊的直接整合不再是 Kubernetes 的一部分 (這次刪除被作為 v1.20 發(fā)行版本的一部分宣布)。你可以閱讀檢查 Dockershim 棄用是否會影響你 以了解此刪除可能會如何影響你。要了解如何使用 dockershim 進行遷移,請參閱從 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
#設置yum源
yum-config-manager--add-repohttp://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安裝docker-ce版本
yuminstall-ydocker-ce
#啟動
systemctlstartdocker
#開機自啟
systemctlenabledocker
#查看版本號
docker--version
#查看版本具體信息
dockerversion

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

【溫馨提示】dockerd 實際真實調用的還是 containerd 的 api 接口,containerd 是 dockerd 和 runC 之間的一個中間交流組件。所以啟動 docker 服務的時候,也會啟動 containerd 服務的。

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

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

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

#導出默認配置,config.toml這個文件默認是不存在的
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 驅動程序 systemd

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

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

11、開始安裝 kubeadm,kubelet 和 kubectl(master 節(jié)點)

#不指定版本就是最新版本,當前最新版就是1.24.1
yuminstall-ykubelet-1.24.1kubeadm-1.24.1kubectl-1.24.1--disableexcludes=kubernetes
# disableexcludes=kubernetes:禁掉除了這個kubernetes之外的別的倉庫
#設置為開機自啟并現在立刻啟動服務--now:立刻啟動服務
systemctlenable--nowkubelet

#查看狀態(tài),這里需要等待一段時間再查看服務狀態(tài),啟動會有點慢
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 標志通知 kubeadm join 創(chuàng)建一個新的控制平面。加入master必須加這個標記
#--certificate-key ... 將導致從集群中的 kubeadm-certs Secret 下載控制平面證書并使用給定的密鑰進行解密。這里的值就是上面這個命令(kubeadm init phase upload-certs --upload-certs)打印出的key。

427c7a74-247b-11ed-ba43-dac502259ad0.png
根據提示執(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
雖然現在已經有兩個 master 了,但是對外還是只能有一個入口的,所以還得要一個負載均衡器,如果一個 master 掛了,會自動切到另外一個 master 節(jié)點。

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

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

1、安裝 Nginx 和 Keepalived

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

2、Nginx 配置

在兩個 master 節(jié)點配置

cat>/etc/nginx/nginx.conf<

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

3、Keepalived 配置(master)

cat>/etc/keepalived/keepalived.conf<

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

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、啟動并設置開機啟動

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

查看 VIP

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

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

將 cluster-endpoint 之前執(zhí)行的 ip 修改執(zhí)行現在的 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、測試驗證

查看版本(負載均衡測試驗證)

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

42ca7ce2-247b-11ed-ba43-dac502259ad0.png
高可用測試驗證,將 k8s-master-168-0-113 節(jié)點關機

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

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

三、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

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

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

修改后的內容如下:

#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擴展
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 官方網站: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:注銷掉,因為DaemonSet模式會每個節(jié)點運行一個pod
#2、在添加一條:hostnetwork:true
#3、把LoadBalancer修改成NodePort
#4、在--validating-webhook-key下面添加---watch-ingress-without-class=true
#5、設置master節(jié)點可調度
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é)點安裝 nfs

yum-yinstallnfs-utilsrpcbind

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

mkdir/opt/nfsdata
#授權共享目錄
chmod666/opt/nfsdata

3、配置 exports 文件

cat>/etc/exports<

exportfs 命令

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

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

systemctlstartrpcbind
systemctlstartnfs-server
systemctlenablerpcbind
systemctlenablenfs-server

查看

showmount-e
#VIP
showmount-e192.168.0.120

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

5、客戶端

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

6、rsync 數據同步

【1】rsync 安裝

#兩端都得安裝
yum-yinstallrsync

【2】配置

在/etc/rsyncd.conf 中添加

cat>/etc/rsyncd.conf<

配置 rsyncd_users.db

cat>/etc/rsyncd_users.db<

【3】rsyncd.conf 常用參數詳解

rsyncd.conf 參數

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

【4】rsync 常用命令參數詳解

rsync--help

rsync[選項]原始位置目標位置

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

【5】啟動服務(數據源機器)

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

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

#在目的機器上執(zhí)行
#rsync-avz用戶名@源主機地址/源目錄目的目錄
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 定時同步數據不太好,可以使用rsync+inotify做數據實時同步,這里篇幅有點長了,先不講,如果后面有時間會出一篇單獨文章來講。

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

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

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

【溫馨提示】默認鏡像是無法訪問的,這里使用 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 設置為 VIP,可實現高可用。

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ā)現"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添加如下內容:

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

重啟 docker

systemctlrestartdocker

【3】服務器上登錄 harbor

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

【4】打標簽并把鏡像上傳到 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 已經使用 containerd 了,所以這里需要做相關配置,要不然 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 的報錯,這里沒使用,所以這個錯誤不影響使用,但是還是解決好點,解決方法如下:

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)最新版最完整版基礎環(huán)境部署+master 高可用實現詳細步驟就到這里了,有疑問的小伙伴歡迎給我留言哦~

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

    關注

    19

    文章

    798

    瀏覽量

    47775
  • 阿里云
    +關注

    關注

    3

    文章

    922

    瀏覽量

    42779
  • Docker
    +關注

    關注

    0

    文章

    446

    瀏覽量

    11738

原文標題:詳解 K8S 高可用部署,超詳細!

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

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

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

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

    簡單、輕量、高性價比的部署與運維方法;而k8s在Docker之上,更進一步提供了對管理基礎設施的抽象,形成了真正意義上的一站式部署與運維方案。k8s提供了強有力工作調度、水平擴展、健康
    發(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結合的兩種方案的詳細介紹和比較

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

    Docker不香嗎為什么還要用K8s

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

    簡單說明k8s和Docker之間的關系

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

    K8S集群服務訪問失敗怎么辦 K8S故障處理集錦

    問題1:K8S集群服務訪問失??? ? ? 原因分析:證書不能被識別,其原因為:自定義證書,過期等。 解決方法:更新證書即可。 問題2:K8S集群服務訪問失??? curl: (7) Failed
    的頭像 發(fā)表于 09-01 11:11 ?1.5w次閱讀
    <b class='flag-5'>K8S</b>集群服務訪問失敗怎么辦 <b class='flag-5'>K8S</b>故障處理集錦

    K8S(kubernetes)學習指南

    K8S(kubernetes)學習指南
    發(fā)表于 06-29 14:14 ?0次下載

    mysql部署k8s上的實現方案

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

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

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

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

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

    k8s生態(tài)鏈包含哪些技術

    1. Apache APISIX Ingress 定義 ? 在 K8s 生態(tài)中,Ingress 作為表示 K8s 流量入口的一種資源,想要讓其生效,就需要有一個 Ingress Controller
    的頭像 發(fā)表于 08-07 10:56 ?1029次閱讀
    <b class='flag-5'>k8s</b>生態(tài)鏈包含哪些技術

    k8s架構篇:服務部署模式是如何變遷的

    kubernetes,簡稱 K8s,是用 8 代替中間 8 個字符 “ubernete” 而成的縮寫,是一個開源的,用于管理云平臺中多個主機上的容器化的應用,Kubernetes 的目標是讓
    的頭像 發(fā)表于 10-15 15:39 ?559次閱讀
    <b class='flag-5'>k8s</b>架構篇:服務<b class='flag-5'>部署</b>模式是如何變遷的

    K8S落地實踐經驗分享

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

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

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