一、前言
二、基礎環境部署
1)前期準備(所有節點)
2)安裝容器 docker(所有節點)
3)配置 k8s yum 源(所有節點)
4)將 sandbox_image 鏡像源設置為阿里云 google_containers 鏡像源(所有節點)
5)配置 containerd cgroup 驅動程序 systemd(所有節點)
6)開始安裝 kubeadm,kubelet 和 kubectl(master 節點)
7)使用 kubeadm 初始化集群(master 節點)
8)安裝 Pod 網絡插件(CNI:Container Network Interface)(master)
9)node 節點加入 k8s 集群
10)配置 IPVS
11)集群高可用配置
12)部署 Nginx+Keepalived 高可用負載均衡器
三、k8s 管理平臺 dashboard 環境部署
1)dashboard 部署
2)創建登錄用戶
3)配置 hosts 登錄 dashboard web
四、k8s 鏡像倉庫 harbor 環境部署
1)安裝 helm
2)配置 hosts
3)創建 stl 證書
4)安裝 ingress
5)安裝 nfs
6)創建 nfs provisioner 和持久化存儲 SC
7)部署 Harbor(Https 方式)
一、前言
二、基礎環境部署
1)前期準備(所有節點)
1、修改主機名和配置 hosts
先部署 1master 和 2node 節點,后面再加一個 master 節點
#在192.168.0.113執行 hostnamectlset-hostnamek8s-master-168-0-113 #在192.168.0.114執行 hostnamectlset-hostnamek8s-node1-168-0-114 #在192.168.0.115執行 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 檢查橋接流量(可選,所有節點)
若要顯式加載此模塊,請運行 sudo modprobe br_netfilter,通過運行 lsmod | grep br_netfilter 來驗證 br_netfilter 模塊是否已加載,
sudomodprobebr_netfilter lsmod|grepbr_netfilter
為了讓 Linux 節點的 iptables 能夠正確查看橋接流量,請確認 sysctl 配置中的 net.bridge.bridge-nf-call-iptables 設置為 1。例如:
cat<
2)安裝容器 docker(所有節點)
提示:v1.24 之前的 Kubernetes 版本包括與 Docker Engine 的直接集成,使用名為 dockershim 的組件。這種特殊的直接整合不再是 Kubernetes 的一部分 (這次刪除被作為 v1.20 發行版本的一部分宣布)。你可以閱讀檢查 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,沒有這個文件就創建 #添加以下內容后,重啟docker服務: cat>/etc/docker/daemon.json<
【溫馨提示】dockerd 實際真實調用的還是 containerd 的 api 接口,containerd 是 dockerd 和 runC 之間的一個中間交流組件。所以啟動 docker 服務的時候,也會啟動 containerd 服務的。
3)配置 k8s yum 源(所有節點)
cat>/etc/yum.repos.d/kubernetes.repo<
4)將 sandbox_image 鏡像源設置為阿里云 google_containers 鏡像源(所有節點)
#導出默認配置,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
5)配置 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
6)開始安裝 kubeadm,kubelet 和 kubectl(master 節點)
#不指定版本就是最新版本,當前最新版就是1.24.1 yuminstall-ykubelet-1.24.1kubeadm-1.24.1kubectl-1.24.1--disableexcludes=kubernetes # disableexcludes=kubernetes:禁掉除了這個kubernetes之外的別的倉庫 #設置為開機自啟并現在立刻啟動服務--now:立刻啟動服務 systemctlenable--nowkubelet #查看狀態,這里需要等待一段時間再查看服務狀態,啟動會有點慢 systemctlstatuskubelet
查看日志,發現有報錯,報錯如下:
kubelet.service: Main process exited, code=exited, status=1/FAILURE kubelet.service: Failed with result 'exit-code'.
【解釋】重新安裝(或第一次安裝)k8s,未經過 kubeadm init 或者 kubeadm join 后,kubelet 會不斷重啟,這個是正常現象……,執行 init 或 join 后問題會自動解決,對此官網有如下描述,也就是此時不用理會 kubelet.service。
查看版本
kubectlversion yuminfokubeadm
7)使用 kubeadm 初始化集群(master 節點)
最好提前把鏡像下載好,這樣安裝快
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 的其他節點通信。如果 Master 有多個 interface,建議明確指定,如果不指定,kubeadm 會自動選擇有默認網關的 interface。這里的ip為master節點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 的其他節點通信。如果 Master 有多個 interface,建議明確指定,如果不指定,kubeadm 會自動選擇有默認網關的 interface。這里的ip為master節點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 以指向高可用性方案中的負載均衡器的地址。
配置環境變量
mkdir-p$HOME/.kube sudocp-i/etc/kubernetes/admin.conf$HOME/.kube/config sudochown$(id-u):$(id-g)$HOME/.kube/config #臨時生效(退出當前窗口重連環境變量失效) exportKUBECONFIG=/etc/kubernetes/admin.conf #永久生效(推薦) echo"exportKUBECONFIG=/etc/kubernetes/admin.conf">>~/.bash_profile source~/.bash_profile
發現節點還是有問題,查看日志 /var/log/messages
"Container runtime network not ready" networkReady="NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized"
接下來就是安裝 Pod 網絡插件8)安裝 Pod 網絡插件(CNI:Container Network Interface)(master)
你必須部署一個基于 Pod 網絡插件的 容器網絡接口 (CNI),以便你的 Pod 可以相互通信。
#最好提前下載鏡像(所有節點) 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 節點,就已經正常了
9)node 節點加入 k8s 集群
先安裝 kubelet
yuminstall-ykubeletkubeadmkubectl--disableexcludes=kubernetes #設置為開機自啟并現在立刻啟動服務--now:立刻啟動服務 systemctlenable--nowkubelet systemctlstatuskubelet
如果沒有令牌,可以通過在控制平面節點上運行以下命令來獲取令牌:
kubeadmtokenlist
默認情況下,令牌會在24小時后過期。如果要在當前令牌過期后將節點加入集群, 則可以通過在控制平面節點上運行以下命令來創建新令牌:
kubeadmtokencreate #再查看 kubeadmtokenlist
如果你沒有 –discovery-token-ca-cert-hash 的值,則可以通過在控制平面節點上執行以下命令鏈來獲取它:
opensslx509-pubkey-in/etc/kubernetes/pki/ca.crt|opensslrsa-pubin-outformder2>/dev/null|openssldgst-sha256-hex|sed's/^.*//'
如果執行 kubeadm init 時沒有記錄下加入集群的命令,可以通過以下命令重新創建(推薦)一般不用上面的分別獲取 token 和 ca-cert-hash 方式,執行以下命令一氣呵成:
kubeadmtokencreate--print-join-command
這里需要等待一段時間,再查看節點節點狀態,因為需要安裝 kube-proxy 和 flannel。
kubectlgetpods-A kubectlgetnodes
10)配置 IPVS
【問題】集群內無法 ping 通 ClusterIP(或 ServiceName)
1、加載 ip_vs 相關內核模塊
modprobe--ip_vs modprobe--ip_vs_sh modprobe--ip_vs_rr modprobe--ip_vs_wrr
所有節點驗證開啟了 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 轉發規則
ipvsadm-Ln
11)集群高可用配置
配置高可用(HA)Kubernetes 集群實現的兩種方案:
使用堆疊(stacked)控制平面節點,其中 etcd 節點與控制平面節點共存(本章使用),架構圖如下:
使用外部 etcd 節點,其中 etcd 在與控制平面不同的節點上運行,架構圖如下:
這里新增一臺機器作為另外一個 master 節點:192.168.0.116 配置跟上面 master 節點一樣。只是不需要最后一步初始化了。
1、修改主機名和配置 hosts
所有節點都統一如下配置:
#在192.168.0.113執行 hostnamectlset-hostnamek8s-master-168-0-113 #在192.168.0.114執行 hostnamectlset-hostnamek8s-node1-168-0-114 #在192.168.0.115執行 hostnamectlset-hostnamek8s-node2-168-0-115 #在192.168.0.116執行 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 檢查橋接流量(可選,所有節點)
若要顯式加載此模塊,請運行 sudo modprobe br_netfilter,通過運行 lsmod | grep br_netfilter 來驗證 br_netfilter 模塊是否已加載,
sudomodprobebr_netfilter lsmod|grepbr_netfilter
為了讓 Linux 節點的 iptables 能夠正確查看橋接流量,請確認 sysctl 配置中的 net.bridge.bridge-nf-call-iptables 設置為 1。例如:
cat<
7、安裝容器 docker(所有節點)
提示:v1.24 之前的 Kubernetes 版本包括與 Docker Engine 的直接集成,使用名為 dockershim 的組件。這種特殊的直接整合不再是 Kubernetes 的一部分 (這次刪除被作為 v1.20 發行版本的一部分宣布)。你可以閱讀檢查 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,沒有這個文件就創建 #添加以下內容后,重啟docker服務: cat>/etc/docker/daemon.json<
【溫馨提示】dockerd 實際真實調用的還是 containerd 的 api 接口,containerd 是 dockerd 和 runC 之間的一個中間交流組件。所以啟動 docker 服務的時候,也會啟動 containerd 服務的。
8、配置 k8s yum 源(所有節點)
cat>/etc/yum.repos.d/kubernetes.repo<
9、將 sandbox_image 鏡像源設置為阿里云 google_containers 鏡像源(所有節點)
#導出默認配置,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
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 節點)
#不指定版本就是最新版本,當前最新版就是1.24.1 yuminstall-ykubelet-1.24.1kubeadm-1.24.1kubectl-1.24.1--disableexcludes=kubernetes # disableexcludes=kubernetes:禁掉除了這個kubernetes之外的別的倉庫 #設置為開機自啟并現在立刻啟動服務--now:立刻啟動服務 systemctlenable--nowkubelet #查看狀態,這里需要等待一段時間再查看服務狀態,啟動會有點慢 systemctlstatuskubelet #查看版本 kubectlversion yuminfokubeadm
12、加入 k8s 集群
#證如果過期了,可以使用下面命令生成新證書上傳,這里會打印出certificatekey,后面會用到 kubeadminitphaseupload-certs--upload-certs #你還可以在【init】期間指定自定義的--certificate-key,以后可以由 join 使用。要生成這樣的密鑰,可以使用以下命令(這里不執行,就用上面那個自命令就可以了): 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 創建一個新的控制平面。加入master必須加這個標記 #--certificate-key ... 將導致從集群中的 kubeadm-certs Secret 下載控制平面證書并使用給定的密鑰進行解密。這里的值就是上面這個命令(kubeadm init phase upload-certs --upload-certs)打印出的key。
根據提示執行如下命令:
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
雖然現在已經有兩個 master 了,但是對外還是只能有一個入口的,所以還得要一個負載均衡器,如果一個 master 掛了,會自動切到另外一個 master 節點。12)部署 Nginx+Keepalived 高可用負載均衡器
1、安裝 Nginx 和 Keepalived
#在兩個master節點上執行 yuminstallnginxkeepalived-y
2、Nginx 配置
在兩個 master 節點配置
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; } #?四層負載均衡,為兩臺Master?apiserver組件提供負載均衡 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 負載均衡的話,可以不裝 nginx,但是最好還是配置一下 k8s-apiserver 負載均衡。
3、Keepalived 配置(master)
cat>/etc/keepalived/keepalived.conf<
vrrp_script:指定檢查 nginx 工作狀態腳本(根據 nginx 狀態判斷是否故障轉移)
virtual_ipaddress:虛擬 IP(VIP)
檢查 nginx 狀態腳本:
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 狀態腳本:
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、啟動并設置開機啟動
systemctldaemon-reload systemctlrestartnginx&&systemctlenablenginx&&systemctlstatusnginx systemctlrestartkeepalived&&systemctlenablekeepalived&&systemctlstatuskeepalived
查看 VIP
ipa
6、修改 hosts(所有節點)
將 cluster-endpoint 之前執行的 ip 修改執行現在的 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
高可用測試驗證,將 k8s-master-168-0-113 節點關機
shutdown-hnow curl-khttps://cluster-endpoint:16443/version kubectlgetnodes-A kubectlgetpods-A
【溫馨提示】堆疊集群存在耦合失敗的風險。如果一個節點發生故障,則 etcd 成員和控制平面實例都將丟失, 并且冗余會受到影響。你可以通過添加更多控制平面節點來降低此風險。
三、k8s 管理平臺 dashboard 環境部署
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:{}
重新部署
kubectldelete-frecommended.yaml kubectlapply-frecommended.yaml kubectlgetsvc,pods-nkubernetes-dashboard
2)創建登錄用戶
cat>ServiceAccount.yaml<
創建并獲取登錄 token
kubectl-nkubernetes-dashboardcreatetokenadmin-user
3)配置 hosts 登錄 dashboard web
192.168.0.120cluster-endpoint
登錄:https://cluster-endpoint:31443
輸入上面創建的 token 登錄
四、k8s 鏡像倉庫 harbor 環境部署
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)創建 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 #創建域名證書,生成私鑰 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 #創建?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模式會每個節點運行一個pod #2、在添加一條:hostnetwork:true #3、把LoadBalancer修改成NodePort #4、在--validating-webhook-key下面添加---watch-ingress-without-class=true #5、設置master節點可調度 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、所有節點安裝 nfs
yum-yinstallnfs-utilsrpcbind
2、在 master 節點創建共享目錄并授權
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 #創建掛載目錄 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監聽端口:873 #rsync運行模式:C/S rsync--daemon--config=/etc/rsyncd.conf netstat-tnlp|grep:873
【6】執行命令同步數據
#在目的機器上執行 #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)創建 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
7)部署 Harbor(Https 方式)
1、創建 Namespace
kubectlcreatensharbor
2、創建證書秘鑰
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
這里稍等一段時間在查看資源狀態
kubectlgetingress,svc,pods,pvc-nharbor
5、ingress 沒有 ADDRESS 問題解決
【分析】,發現"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、訪問 harbor
https://myharbor.com
賬號/密碼:admin/Harbor123456、harbor 常見操作
【1】創建項目 bigdata
【2】配置私有倉庫
在文件/etc/docker/daemon.json添加如下內容:
"insecure-registries":["https://myharbor.com"]
重啟 docker
systemctlrestartdocker
【3】服務器上登錄 harbor
dockerloginhttps://myharbor.com #賬號/密碼:admin/Harbor12345
【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)可以在頁面上下載:
創建域名目錄
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
簡單使用
#把docker換成crictl就行,命令都差不多 crictlpullmyharbor.com/bigdata/mysql:5.7.38
執行 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
Kubernetes(k8s)最新版最完整版基礎環境部署+master 高可用實現詳細步驟就到這里了,有疑問的小伙伴歡迎給我留言哦~
審核編輯:彭靜
-
驅動程序
+關注
關注
19文章
826瀏覽量
47959 -
阿里云
+關注
關注
3文章
940瀏覽量
42966 -
Docker
+關注
關注
0文章
454瀏覽量
11815
原文標題:詳解 K8S 高可用部署,超詳細!
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論