保姆级 Kubernetes 1.24 高可用集群部署中文指南

作者:liugp

出处:https://www.cnblogs.com/liugp/p/16357445.html一、前言二、基础环境部署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)配置 IPVS11)集群高可用配置12)部署 Nginx+Keepalived 高可用负载均衡器三、k8s 管理平台 dashboard 环境部署1)dashboard 部署2)创建登录用户3)配置 hosts 登录 dashboard web四、k8s 镜像仓库 harbor 环境部署1)安装 helm2)配置 hosts3)创建 stl 证书4)安装 ingress5)安装 nfs6)创建 nfs provisioner 和持久化存储 SC7)部署 Harbor(Https 方式)

一、前言

官网:https://kubernetes.io/官方文档:https://kubernetes.io/zh-cn/docs/home/

二、基础环境部署

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<<EOF 192.168.0.113k8s-master-168-0-113 192.168.0.114k8s-node1-168-0-114 192.168.0.115k8s-node2-168-0-115 EOF

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-ris/.*swap.*/#&//etc/fstab

6、禁用 SELinux

#临时关闭 setenforce0 #永久禁用 sed-is/^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<<EOF|sudotee/etc/modules-load.d/k8s.conf overlay br_netfilter EOF sudomodprobeoverlay sudomodprobebr_netfilter #设置所需的sysctl参数,参数在重新启动后保持不变 cat<<EOF|sudotee/etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 net.ipv4.ip_forward=1 EOF #应用sysctl参数而不重新启动 sudosysctl–system

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<<EOF { “registry-mirrors”:[“http://hub-mirror.c.163.com”] } EOF #加载 systemctlreloaddocker #查看 systemctlstatusdockercontainerd

【温馨提示】dockerd 实际真实调用的还是 containerd 的 api 接口,containerd 是 dockerd 和 runC 之间的一个中间交流组件。所以启动 docker 服务的时候,也会启动 containerd 服务的。

3)配置 k8s yum 源(所有节点)

cat>/etc/yum.repos.d/kubernetes.repo<<EOF [k8s] name=k8s enabled=1 gpgcheck=0 baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ EOF

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-is#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|seds/^.*//

如果执行 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<<EOF 192.168.0.113k8s-master-168-0-113cluster-endpoint 192.168.0.114k8s-node1-168-0-114 192.168.0.115k8s-node2-168-0-115 192.168.0.116k8s-master2-168-0-116 EOF

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-ris/.*swap.*/#&//etc/fstab

5、禁用 SELinux

#临时关闭 setenforce0 #永久禁用 sed-is/^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<<EOF|sudotee/etc/modules-load.d/k8s.conf overlay br_netfilter EOF sudomodprobeoverlay sudomodprobebr_netfilter #设置所需的sysctl参数,参数在重新启动后保持不变 cat<<EOF|sudotee/etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 net.ipv4.ip_forward=1 EOF #应用sysctl参数而不重新启动 sudosysctl–system

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<<EOF { “registry-mirrors”:[“http://hub-mirror.c.163.com”] } EOF #加载 systemctlreloaddocker #查看 systemctlstatusdockercontainerd

【温馨提示】dockerd 实际真实调用的还是 containerd 的 api 接口,containerd 是 dockerd 和 runC 之间的一个中间交流组件。所以启动 docker 服务的时候,也会启动 containerd 服务的。8、配置 k8s yum 源(所有节点)

cat>/etc/yum.repos.d/kubernetes.repo<<EOF [k8s] name=k8s enabled=1 gpgcheck=0 baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ EOF

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 驱动程序 systemdkubernets 自v 1.24.0 后,就不再使用 docker.shim,替换采用 containerd 作为容器运行时端点。因此需要安装 containerd(在 docker 的基础下安装),上面安装 docker 的时候就自动安装了 containerd 了。这里的 docker 只是作为客户端而已。容器引擎还是 containerd。

sed-is#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” usernginx; worker_processesauto; error_log/var/log/nginx/error.log; pid/run/nginx.pid; include/usr/share/nginx/modules/*.conf; events{ worker_connections1024; } #四层负载均衡,为两台Masterapiserver组件提供负载均衡 stream{ log_formatmain$remote_addr$upstream_addr-[$time_local]$status$upstream_bytes_sent; access_log/var/log/nginx/k8s-access.logmain; upstreamk8s-apiserver{ #MasterAPISERVERIP:PORT server192.168.0.113:6443; #Master2APISERVERIP:PORT server192.168.0.116:6443; } server{ listen16443; proxy_passk8s-apiserver; } } http{ log_formatmain$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.logmain; sendfileon; tcp_nopushon; tcp_nodelayon; keepalive_timeout65; types_hash_max_size2048; include/etc/nginx/mime.types; default_typeapplication/octet-stream; server{ listen80default_server; server_name_; location/{ } } } EOF

【温馨提示】如果只保证高可用,不配置 k8s-apiserver 负载均衡的话,可以不装 nginx,但是最好还是配置一下 k8s-apiserver 负载均衡。3、Keepalived 配置(master)

cat>/etc/keepalived/keepalived.conf<<EOF global_defs{ notification_email{ acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_fromfage@qq.com smtp_server127.0.0.1 smtp_connect_timeout30 router_idNGINX_MASTER } vrrp_scriptcheck_nginx{ script”/etc/keepalived/check_nginx.sh” } vrrp_instanceVI_1{ stateMASTER interfaceens33 virtual_router_id51#VRRP路由ID实例,每个实例是唯一的 priority100#优先级,备服务器设置90 advert_int1#指定VRRP心跳包通告间隔时间,默认1秒 authentication{ auth_typePASS auth_pass1111 } #虚拟IP virtual_ipaddress{ 192.168.0.120/24 } track_script{ check_nginx } } EOF

vrrp_script:指定检查 nginx 工作状态脚本(根据 nginx 状态判断是否故障转移)virtual_ipaddress:虚拟 IP(VIP)

检查 nginx 状态脚本:

cat>/etc/keepalived/check_nginx.sh<<“EOF” #!/bin/bash count=$(ps-ef|grepnginx|egrep-cv”grep|$$”) if[“$count”-eq0];then exit1 else exit0 fi EOF chmod+x/etc/keepalived/check_nginx.sh

4、Keepalived 配置(backup)

cat>/etc/keepalived/keepalived.conf<<EOF global_defs{ notification_email{ acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_fromfage@qq.com smtp_server127.0.0.1 smtp_connect_timeout30 router_idNGINX_BACKUP } vrrp_scriptcheck_nginx{ script”/etc/keepalived/check_nginx.sh” } vrrp_instanceVI_1{ stateBACKUP interfaceens33 virtual_router_id51#VRRP路由ID实例,每个实例是唯一的 priority90 advert_int1 authentication{ auth_typePASS auth_pass1111 } virtual_ipaddress{ 192.168.0.120/24 } track_script{ check_nginx } } EOF

检查 nginx 状态脚本:

cat>/etc/keepalived/check_nginx.sh<<“EOF” #!/bin/bash count=$(ps-ef|grepnginx|egrep-cv”grep|$$”) if[“$count”-eq0];then exit1 else exit0 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”] #AllowDashboardtogetandupdatekubernetes-dashboard-settingsconfigmap. -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:heapster:”,”https:heapster:”,”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<<EOF apiVersion:v1 kind:ServiceAccount metadata: name:admin-user namespace:kubernetes-dashboard — apiVersion:rbac.authorization.k8s.io/v1 kind:ClusterRoleBinding metadata: name:admin-user roleRef: apiGroup:rbac.authorization.k8s.io kind:ClusterRole name:cluster-admin subjects: -kind:ServiceAccount name:admin-user namespace:kubernetes-dashboard EOF kubectlapply-fServiceAccount.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 安装,所以得先安装 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)创建 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访问证书 opensslx509-req-sha512-days3650\ -extfilev3.ext\ -CAca.crt-CAkeyca.key-CAcreateserial\ -inmyharbor.com.csr\ -outmyharbor.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-is@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-is@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<<EOF /opt/nfsdata*(rw,no_root_squash,no_all_squash,sync) EOF #配置生效 exportfs-r

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<<EOF uid=root gid=root #禁锢在源目录 usechroot=yes #监听地址 address=192.168.0.113 #监听地址tcp/udp873,可通过cat/etc/services|greprsync查看 port873 #日志文件位置 logfile=/var/log/rsyncd.log #存放进程ID的文件位置 pidfile=/var/run/rsyncd.pid #允许访问的客户机地址 hostsallow=192.168.0.0/16 #共享模块名称 [nfsdata] #源目录的实际路径 path=/opt/nfsdata comment=DocumentRootofwww.kgc.com #指定客户端是否可以上传文件,默认对所有模块为true readonly=yes #同步时不再压缩的文件类型 dontcompress=*.gz*.bz2*.tgz*.zip*.rar*.z #授权账户,多个账号以空格分隔,不加则为匿名,不依赖系统账号 authusers=backuper #存放账户信息的数据文件 secretsfile=/etc/rsyncd_users.db EOF

配置 rsyncd_users.db

cat>/etc/rsyncd_users.db<<EOF backuper:123456 EOF #官方要求,最好只是赋权600! chmod600/etc/rsyncd_users.db【3】rsyncd.conf 常用参数详解

rsyncd.conf 参数

【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<<EOF>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|awkNR!=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/Harbor12345

6、harbor 常见操作

【1】创建项目 bigdata

【2】配置私有仓库

在文件/etc/docker/daemon.json添加如下内容:

“insecure-registries”:[“https://myharbor.com”]

重启 docker

systemctlrestartdocker【3】服务器上登录 harbordockerloginhttps://myharbor.com #账号/密码:admin/Harbor12345

【4】打标签并把镜像上传到 harbordockertagrancher/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<<EOF>/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 高可用实现详细步骤就到这里了,有疑问的小伙伴欢迎给我留言哦~

本文转载自:「进击的云原生」,原文:https://url.hi-linux.com/92c2s,版权归原作者所有。

免责声明:本文内容来源于网络,所载内容仅供参考。转载仅为学习和交流之目的,如无意中侵犯您的合法权益,请及时联系Docker中文社区!

    THE END
    喜欢就支持一下吧
    点赞5 分享
    评论 抢沙发
    头像
    欢迎您留下宝贵的见解!
    提交
    头像

    昵称

    取消
    昵称表情代码图片

      暂无评论内容