• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Kubeadm高可用部署K8S 1.24版本---保姆级详细

武飞扬头像
CN-FuWei
帮助1

目录

一、前言

二、基础环境部署

1)前期准备(所有节点)

1、修改主机名和配置 hosts

2、配置 ssh 互信

3、时间同步

4、关闭防火墙

5、关闭 swap

6、禁用 SELinux

7、允许 iptables 检查桥接流量(可选,所有节点)

2)安装容器 docker(所有节点)

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

4)将 sandbox_image 镜像源设置为阿里云 谷歌_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

1、加载 ip_vs 相关内核模块

2、安装 ipvsadm 工具

3、编辑 kube-proxy 配置文件,mode 修改成 ipvs

4、重启 kube-proxy

5、查看 ipvs 转发规则

11)集群高可用配置

1、修改主机名和配置 hosts

2、配置 ssh 互信

3、时间同步

4、关闭防火墙

5、关闭 swap

6、禁用 SELinux

7、允许 iptables 检查桥接流量(可选,所有节点)

8、安装容器 docker(所有节点)

9、配置 k8s yum 源(所有节点)

10、将 sandbox_image 镜像源设置为阿里云 谷歌_containers 镜像源(所有节点)

11、配置 containerd cgroup 驱动程序 systemd

12、开始安装 kubeadm,kubelet 和 kubectl(master 节点)

13、加入 k8s 集群

12)部署 Nginx Keepalived 高可用负载均衡器

1、安装 Nginx 和 Keepalived

2、Nginx 配置

3、Keepalived 配置(master)

4、Keepalived 配置(backup)

5、启动并设置开机启动

6、修改 hosts(所有节点)

7、测试验证

三、k8s 管理平台 dashboard 环境部署

1)dashboard 部署

2)创建登录用户

3)配置 hosts 登录 dashboard web

四、k8s 镜像仓库 harbor 环境部署

1)安装 helm

2)配置 hosts

3)创建 stl 证书

4)安装 ingress

1、通过 helm 部署

2、通过 YAML 文件安装(本章使用这个方式安装 ingress)

5)安装 nfs

1、所有节点安装 nfs

2、在 master 节点创建共享目录并授权

3、配置 exports 文件

4、启动 rpc 和 nfs(客户端只需要启动 rpc 服务)(注意顺序)

5、客户端

6、rsync 数据同步

6)创建 nfs provisioner 和持久化存储 SC

1、添加 helm 仓库

2、helm 安装 nfs provisioner

3、查看

7)部署 Harbor(Https 方式)

1、创建 Namespace

2、创建证书秘钥

3、添加 Chart 库

4、通过 helm 安装 harbor

5、ingress 没有 ADDRESS 问题解决

6、卸载重新部署

7、访问 harbor

8、harbor 常见操作

9、修改 containerd 配置


一、前言

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

二、基础环境部署

1)前期准备(所有节点)

1、修改主机名和配置 hosts

先部署 1master 和 2node 节点,后面再加一个 master 节点

  1.  
    # 在192.168.0.113执行
  2.  
    hostnamectl set-hostname k8s-master-168-0-113
  3.  
    # 在192.168.0.114执行
  4.  
    hostnamectl set-hostname k8s-node1-168-0-114
  5.  
    # 在192.168.0.115执行
  6.  
    hostnamectl set-hostname k8s-node2-168-0-115

配置 hosts

  1.  
    cat >> /etc/hosts<<EOF
  2.  
    192.168.0.113 k8s-master-168-0-113
  3.  
    192.168.0.114 k8s-node1-168-0-114
  4.  
    192.168.0.115 k8s-node2-168-0-115
  5.  
    EOF

2、配置 ssh 互信

  1.  
    # 直接一直回车就行
  2.  
    ssh-keygen
  3.  
     
  4.  
    ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-master-168-0-113
  5.  
    ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-node1-168-0-114
  6.  
    ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-node2-168-0-115

3、时间同步

  1.  
    yum install chrony -y
  2.  
    systemctl start chronyd
  3.  
    systemctl enable chronyd
  4.  
    chronyc sources

4、关闭防火墙

  1.  
    systemctl stop firewalld
  2.  
    systemctl disable firewalld

5、关闭 swap

  1.  
    # 临时关闭;关闭swap主要是为了性能考虑
  2.  
    swapoff -a
  3.  
    # 可以通过这个命令查看swap是否关闭了
  4.  
    free
  5.  
    # 永久关闭
  6.  
    sed -ri 's/.*swap.*/#&/' /etc/fstab

6、禁用 SELinux

  1.  
    # 临时关闭
  2.  
    setenforce 0
  3.  
    # 永久禁用
  4.  
    sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

7、允许 iptables 检查桥接流量(可选,所有节点)

若要显式加载此模块,请运行 sudo modprobe br_netfilter,通过运行 lsmod | grep br_netfilter 来验证 br_netfilter 模块是否已加载,

  1.  
    sudo modprobe br_netfilter
  2.  
    lsmod | grep br_netfilter

为了让 Linux 节点的 iptables 能够正确查看桥接流量,请确认 sysctl 配置中的 net.bridge.bridge-nf-call-iptables 设置为 1。例如:

  1.  
    cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
  2.  
    overlay
  3.  
    br_netfilter
  4.  
    EOF
  5.  
     
  6.  
    sudo modprobe overlay
  7.  
    sudo modprobe br_netfilter
  8.  
     
  9.  
    # 设置所需的 sysctl 参数,参数在重新启动后保持不变
  10.  
    cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
  11.  
    net.bridge.bridge-nf-call-iptables = 1
  12.  
    net.bridge.bridge-nf-call-ip6tables = 1
  13.  
    net.ipv4.ip_forward = 1
  14.  
    EOF
  15.  
     
  16.  
    # 应用 sysctl 参数而不重新启动
  17.  
    sudo sysctl --system
学新通

2)安装容器 docker(所有节点)

提示:v1.24 之前的 Kubernetes 版本包括与 Docker Engine 的直接集成,使用名为 dockershim 的组件。这种特殊的直接整合不再是 Kubernetes 的一部分 (这次删除被作为 v1.20 发行版本的一部分宣布)。你可以阅读检查 Dockershim 弃用是否会影响你 以了解此删除可能会如何影响你。要了解如何使用 dockershim 进行迁移,请参阅从 dockershim 迁移。

  1.  
    # 配置yum源
  2.  
    cd /etc/yum.repos.d ; mkdir bak; mv CentOS-Linux-* bak/
  3.  
    # centos7
  4.  
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  5.  
    # centos8
  6.  
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
  7.  
     
  8.  
    # 安装yum-config-manager配置工具
  9.  
    yum -y install yum-utils
  10.  
    # 设置yum源
  11.  
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  12.  
    # 安装docker-ce版本
  13.  
    yum install -y docker-ce
  14.  
    # 启动
  15.  
    systemctl start docker
  16.  
    # 开机自启
  17.  
    systemctl enable docker
  18.  
    # 查看版本号
  19.  
    docker --version
  20.  
    # 查看版本具体信息
  21.  
    docker version
  22.  
     
  23.  
    # Docker镜像源设置
  24.  
    # 修改文件 /etc/docker/daemon.json,没有这个文件就创建
  25.  
    # 添加以下内容后,重启docker服务:
  26.  
    cat >/etc/docker/daemon.json<<EOF
  27.  
    {
  28.  
    "registry-mirrors": ["http://hub-mirror.c.163.com"]
  29.  
    }
  30.  
    EOF
  31.  
    # 加载
  32.  
    systemctl reload docker
  33.  
     
  34.  
    # 查看
  35.  
    systemctl status docker containerd
学新通

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

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

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

4)将 sandbox_image 镜像源设置为阿里云 谷歌_containers 镜像源(所有节点)

  1.  
    # 导出默认配置,config.toml这个文件默认是不存在的
  2.  
    containerd config default > /etc/containerd/config.toml
  3.  
    grep sandbox_image /etc/containerd/config.toml
  4.  
    sed -i "s#k8s.gcr.io/pause#registry.aliyuncs.com/谷歌_containers/pause#g" /etc/containerd/config.toml
  5.  
    grep sandbox_image /etc/containerd/config.toml

学新通

5)配置 containerd cgroup 驱动程序 systemd(所有节点)

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

  1.  
    sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml
  2.  
    # 应用所有更改后,重新启动containerd
  3.  
    systemctl restart containerd

6)开始安装 kubeadm,kubelet 和 kubectl(master 节点)

  1.  
    # 不指定版本就是最新版本,当前最新版就是1.24.1
  2.  
    yum install -y kubelet-1.24.1 kubeadm-1.24.1 kubectl-1.24.1 --disableexcludes=kubernetes
  3.  
    # disableexcludes=kubernetes:禁掉除了这个kubernetes之外的别的仓库
  4.  
    # 设置为开机自启并现在立刻启动服务 --now:立刻启动服务
  5.  
    systemctl enable --now kubelet
  6.  
     
  7.  
    # 查看状态,这里需要等待一段时间再查看服务状态,启动会有点慢
  8.  
    systemctl status kubelet

学新通

查看日志,发现有报错,报错如下:

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。

查看版本

  1.  
    kubectl version
  2.  
    yum info kubeadm

学新通

7)使用 kubeadm 初始化集群(master 节点)

最好提前把镜像下载好,这样安装快

  1.  
    docker pull registry.aliyuncs.com/谷歌_containers/kube-apiserver:v1.24.1
  2.  
    docker pull registry.aliyuncs.com/谷歌_containers/kube-controller-manager:v1.24.1
  3.  
    docker pull registry.aliyuncs.com/谷歌_containers/kube-scheduler:v1.24.1
  4.  
    docker pull registry.aliyuncs.com/谷歌_containers/kube-proxy:v1.24.1
  5.  
    docker pull registry.aliyuncs.com/谷歌_containers/pause:3.7
  6.  
    docker pull registry.aliyuncs.com/谷歌_containers/etcd:3.5.3-0
  7.  
    docker pull registry.aliyuncs.com/谷歌_containers/coredns:v1.8.6

集群初始化

  1.  
    kubeadm init \
  2.  
    --apiserver-advertise-address=192.168.0.113 \
  3.  
    --image-repository registry.aliyuncs.com/谷歌_containers \
  4.  
    --control-plane-endpoint=cluster-endpoint \
  5.  
    --kubernetes-version v1.24.1 \
  6.  
    --service-cidr=10.1.0.0/16 \
  7.  
    --pod-network-cidr=10.244.0.0/16 \
  8.  
    --v=5
  9.  
    # –image-repository string: 这个用于指定从什么位置来拉取镜像(1.13版本才有的),默认值是k8s.gcr.io,我们将其指定为国内镜像地址:registry.aliyuncs.com/谷歌_containers
  10.  
    # –kubernetes-version string: 指定kubenets版本号,默认值是stable-1,会导致从https://dl.k8s.io/release/stable-1.txt下载最新的版本号,我们可以将其指定为固定版本(v1.22.1)来跳过网络请求。
  11.  
    # –apiserver-advertise-address 指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。这里的ip为master节点ip,记得更换。
  12.  
    # –pod-network-cidr 指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 –pod-network-cidr有自己的要求,这里设置为10.244.0.0/16 是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR。
  13.  
    # --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 参数的单个控制平面集群转换为高可用性集群。

重置再初始化

  1.  
    kubeadm reset
  2.  
    rm -fr ~/.kube/ /etc/kubernetes/* var/lib/etcd/*
  3.  
    kubeadm init \
  4.  
    --apiserver-advertise-address=192.168.0.113 \
  5.  
    --image-repository registry.aliyuncs.com/谷歌_containers \
  6.  
    --control-plane-endpoint=cluster-endpoint \
  7.  
    --kubernetes-version v1.24.1 \
  8.  
    --service-cidr=10.1.0.0/16 \
  9.  
    --pod-network-cidr=10.244.0.0/16 \
  10.  
    --v=5
  11.  
    # –image-repository string: 这个用于指定从什么位置来拉取镜像(1.13版本才有的),默认值是k8s.gcr.io,我们将其指定为国内镜像地址:registry.aliyuncs.com/谷歌_containers
  12.  
    # –kubernetes-version string: 指定kubenets版本号,默认值是stable-1,会导致从https://dl.k8s.io/release/stable-1.txt下载最新的版本号,我们可以将其指定为固定版本(v1.22.1)来跳过网络请求。
  13.  
    # –apiserver-advertise-address 指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。这里的ip为master节点ip,记得更换。
  14.  
    # –pod-network-cidr 指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 –pod-network-cidr有自己的要求,这里设置为10.244.0.0/16 是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR。
  15.  
    # --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 以指向高可用性方案中的负载均衡器的地址。
学新通

配置环境变量

  1.  
    mkdir -p $HOME/.kube
  2.  
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  3.  
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
  4.  
     
  5.  
    # 临时生效(退出当前窗口重连环境变量失效)
  6.  
    export KUBECONFIG=/etc/kubernetes/admin.conf
  7.  
    # 永久生效(推荐)
  8.  
    echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
  9.  
    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 可以相互通信。

  1.  
    # 最好提前下载镜像(所有节点)
  2.  
    docker pull quay.io/coreos/flannel:v0.14.0
  3.  
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

如果上面安装失败,则下载我百度里的,离线安装

链接:https://pan.百度.com/s/1HB9xuO3bssAW7v5HzpXkeQ
提取码:8888

再查看 node 节点,就已经正常了

学新通

9)node 节点加入 k8s 集群

先安装 kubelet

  1.  
    yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
  2.  
    # 设置为开机自启并现在立刻启动服务 --now:立刻启动服务
  3.  
    systemctl enable --now kubelet
  4.  
    systemctl status kubelet

如果没有令牌,可以通过在控制平面节点上运行以下命令来获取令牌:

kubeadm token list

默认情况下,令牌会在24小时后过期。如果要在当前令牌过期后将节点加入集群, 则可以通过在控制平面节点上运行以下命令来创建新令牌:

  1.  
    kubeadm token create
  2.  
    # 再查看
  3.  
    kubeadm token list

如果你没有 –discovery-token-ca-cert-hash 的值,则可以通过在控制平面节点上执行以下命令链来获取它:

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

如果执行 kubeadm init 时没有记录下加入集群的命令,可以通过以下命令重新创建(推荐)一般不用上面的分别获取 token 和 ca-cert-hash 方式,执行以下命令一气呵成:

kubeadm token create --print-join-command

这里需要等待一段时间,再查看节点节点状态,因为需要安装 kube-proxy 和 flannel。

  1.  
    kubectl get pods -A
  2.  
    kubectl get nodes

学新通

10)配置 IPVS

【问题】集群内无法 ping 通 ClusterIP(或 ServiceName)

1、加载 ip_vs 相关内核模块

  1.  
    modprobe -- ip_vs
  2.  
    modprobe -- ip_vs_sh
  3.  
    modprobe -- ip_vs_rr
  4.  
    modprobe -- ip_vs_wrr

所有节点验证开启了 ipvs:

lsmod |grep ip_vs

2、安装 ipvsadm 工具

yum install ipset ipvsadm -y

3、编辑 kube-proxy 配置文件,mode 修改成 ipvs

kubectl edit  configmap -n kube-system  kube-proxy

学新通

4、重启 kube-proxy

  1.  
    # 先查看
  2.  
    kubectl get pod -n kube-system | grep kube-proxy
  3.  
    # 再delete让它自拉起
  4.  
    kubectl get pod -n kube-system | grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'
  5.  
    # 再查看
  6.  
    kubectl get pod -n kube-system | grep kube-proxy

学新通

5、查看 ipvs 转发规则

ipvsadm -Ln

学新通

11)集群高可用配置

配置高可用(HA)Kubernetes 集群实现的两种方案:

  • 使用堆叠(stacked)控制平面节点,其中 etcd 节点与控制平面节点共存(本章使用),架构图如下:

学新通

  • 使用外部 etcd 节点,其中 etcd 在与控制平面不同的节点上运行,架构图如下:

学新通

这里新增一台机器作为另外一个 master 节点:192.168.0.116 配置跟上面 master 节点一样。只是不需要最后一步初始化了。

1、修改主机名和配置 hosts

所有节点都统一如下配置:

  1.  
    # 在192.168.0.113执行
  2.  
    hostnamectl set-hostname k8s-master-168-0-113
  3.  
    # 在192.168.0.114执行
  4.  
    hostnamectl set-hostname k8s-node1-168-0-114
  5.  
    # 在192.168.0.115执行
  6.  
    hostnamectl set-hostname k8s-node2-168-0-115
  7.  
    # 在192.168.0.116执行
  8.  
    hostnamectl set-hostname k8s-master2-168-0-116

配置 hosts

  1.  
    cat >> /etc/hosts<<EOF
  2.  
    192.168.0.113 k8s-master-168-0-113 cluster-endpoint
  3.  
    192.168.0.114 k8s-node1-168-0-114
  4.  
    192.168.0.115 k8s-node2-168-0-115
  5.  
    192.168.0.116 k8s-master2-168-0-116
  6.  
    EOF

2、配置 ssh 互信

  1.  
    # 直接一直回车就行
  2.  
    ssh-keygen
  3.  
     
  4.  
    ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-master-168-0-113
  5.  
    ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-node1-168-0-114
  6.  
    ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-node2-168-0-115
  7.  
    ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-master2-168-0-116

3、时间同步

  1.  
    yum install chrony -y
  2.  
    systemctl start chronyd
  3.  
    systemctl enable chronyd
  4.  
    chronyc sources

4、关闭防火墙

  1.  
    systemctl stop firewalld
  2.  
    systemctl disable firewalld

5、关闭 swap

  1.  
    # 临时关闭;关闭swap主要是为了性能考虑
  2.  
    swapoff -a
  3.  
    # 可以通过这个命令查看swap是否关闭了
  4.  
    free
  5.  
    # 永久关闭
  6.  
    sed -ri 's/.*swap.*/#&/' /etc/fstab

6、禁用 SELinux

  1.  
    # 临时关闭
  2.  
    setenforce 0
  3.  
    # 永久禁用
  4.  
    sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

7、允许 iptables 检查桥接流量(可选,所有节点)

若要显式加载此模块,请运行 sudo modprobe br_netfilter通过运行 lsmod | grep br_netfilter 来验证 br_netfilter 模块是否已加载,

  1.  
    sudo modprobe br_netfilter
  2.  
    lsmod | grep br_netfilter

为了让 Linux 节点的 iptables 能够正确查看桥接流量,请确认 sysctl 配置中的 net.bridge.bridge-nf-call-iptables 设置为 1。例如:

  1.  
    cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
  2.  
    overlay
  3.  
    br_netfilter
  4.  
    EOF
  5.  
     
  6.  
    sudo modprobe overlay
  7.  
    sudo modprobe br_netfilter
  8.  
     
  9.  
    # 设置所需的 sysctl 参数,参数在重新启动后保持不变
  10.  
    cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
  11.  
    net.bridge.bridge-nf-call-iptables = 1
  12.  
    net.bridge.bridge-nf-call-ip6tables = 1
  13.  
    net.ipv4.ip_forward = 1
  14.  
    EOF
  15.  
     
  16.  
    # 应用 sysctl 参数而不重新启动
  17.  
    sudo sysctl --system
学新通

8、安装容器 docker(所有节点)

提示:v1.24 之前的 Kubernetes 版本包括与 Docker Engine 的直接集成,使用名为 dockershim 的组件。这种特殊的直接整合不再是 Kubernetes 的一部分 (这次删除被作为 v1.20 发行版本的一部分宣布)。你可以阅读检查 Dockershim 弃用是否会影响你 以了解此删除可能会如何影响你。要了解如何使用 dockershim 进行迁移,请参阅从 dockershim 迁移。

  1.  
    # 配置yum源
  2.  
    cd /etc/yum.repos.d ; mkdir bak; mv CentOS-Linux-* bak/
  3.  
    # centos7
  4.  
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  5.  
    # centos8
  6.  
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
  7.  
     
  8.  
    # 安装yum-config-manager配置工具
  9.  
    yum -y install yum-utils
  10.  
    # 设置yum源
  11.  
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  12.  
    # 安装docker-ce版本
  13.  
    yum install -y docker-ce
  14.  
    # 启动
  15.  
    systemctl start docker
  16.  
    # 开机自启
  17.  
    systemctl enable docker
  18.  
    # 查看版本号
  19.  
    docker --version
  20.  
    # 查看版本具体信息
  21.  
    docker version
  22.  
     
  23.  
    # Docker镜像源设置
  24.  
    # 修改文件 /etc/docker/daemon.json,没有这个文件就创建
  25.  
    # 添加以下内容后,重启docker服务:
  26.  
    cat >/etc/docker/daemon.json<<EOF
  27.  
    {
  28.  
    "registry-mirrors": ["http://hub-mirror.c.163.com"]
  29.  
    }
  30.  
    EOF
  31.  
    # 加载
  32.  
    systemctl reload docker
  33.  
     
  34.  
    # 查看
  35.  
    systemctl status docker containerd
学新通

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

9、配置 k8s yum 源(所有节点)

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

10、将 sandbox_image 镜像源设置为阿里云 谷歌_containers 镜像源(所有节点)

  1.  
    # 导出默认配置,config.toml这个文件默认是不存在的
  2.  
    containerd config default > /etc/containerd/config.toml
  3.  
    grep sandbox_image /etc/containerd/config.toml
  4.  
    sed -i "s#k8s.gcr.io/pause#registry.aliyuncs.com/谷歌_containers/pause#g" /etc/containerd/config.toml
  5.  
    grep sandbox_image /etc/containerd/config.toml

学新通

11、配置 containerd cgroup 驱动程序 systemd

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

  1.  
    sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml
  2.  
    # 应用所有更改后,重新启动containerd
  3.  
    systemctl restart containerd

12、开始安装 kubeadm,kubelet 和 kubectl(master 节点)

  1.  
    # 不指定版本就是最新版本,当前最新版就是1.24.1
  2.  
    yum install -y kubelet-1.24.1 kubeadm-1.24.1 kubectl-1.24.1 --disableexcludes=kubernetes
  3.  
    # disableexcludes=kubernetes:禁掉除了这个kubernetes之外的别的仓库
  4.  
    # 设置为开机自启并现在立刻启动服务 --now:立刻启动服务
  5.  
    systemctl enable --now kubelet
  6.  
     
  7.  
    # 查看状态,这里需要等待一段时间再查看服务状态,启动会有点慢
  8.  
    systemctl status kubelet
  9.  
     
  10.  
    # 查看版本
  11.  
     
  12.  
    kubectl version
  13.  
    yum info kubeadm

13、加入 k8s 集群

  1.  
    # 证如果过期了,可以使用下面命令生成新证书上传,这里会打印出certificate key,后面会用到
  2.  
    kubeadm init phase upload-certs --upload-certs
  3.  
    # 你还可以在 【init】期间指定自定义的 --certificate-key,以后可以由 join 使用。 要生成这样的密钥,可以使用以下命令(这里不执行,就用上面那个自命令就可以了):
  4.  
    kubeadm certs certificate-key
  5.  
     
  6.  
    kubeadm token create --print-join-command
  7.  
     
  8.  
    kubeadm join cluster-endpoint:6443 --token wswrfw.fc81au4yvy6ovmhh --discovery-token-ca-cert-hash sha256:43a3924c25104d4393462105639f6a02b8ce284728775ef9f9c30eed8e0abc0f --control-plane --certificate-key 8d2709697403b74e35d05a420bd2c19fd8c11914eb45f2ff22937b245bed5b68
  9.  
     
  10.  
    # --control-plane 标志通知 kubeadm join 创建一个新的控制平面。加入master必须加这个标记
  11.  
    # --certificate-key ... 将导致从集群中的 kubeadm-certs Secret 下载控制平面证书并使用给定的密钥进行解密。这里的值就是上面这个命令(kubeadm init phase upload-certs --upload-certs)打印出的key

学新通

根据提示执行如下命令:

  1.  
    mkdir -p $HOME/.kube
  2.  
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  3.  
    sudo chown $(id -u):$(id -g) $HOME/.kube/config

查看

  1.  
    kubectl get nodes
  2.  
    kubectl get pods -A -owide

学新通

虽然现在已经有两个 master 了,但是对外还是只能有一个入口的,所以还得要一个负载均衡器,如果一个 master 挂了,会自动切到另外一个 master 节点。

12)部署 Nginx Keepalived 高可用负载均衡器

学新通

1、安装 Nginx 和 Keepalived

  1.  
    # 在两个master节点上执行
  2.  
    yum install nginx keepalived -y

2、Nginx 配置

在两个 master 节点配置

  1.  
    cat > /etc/nginx/nginx.conf << "EOF"
  2.  
    user nginx;
  3.  
    worker_processes auto;
  4.  
    error_log /var/log/nginx/error.log;
  5.  
    pid /run/nginx.pid;
  6.  
    include /usr/share/nginx/modules/*.conf;
  7.  
    events {
  8.  
    worker_connections 1024;
  9.  
    }
  10.  
    # 四层负载均衡,为两台Master apiserver组件提供负载均衡
  11.  
    stream {
  12.  
    log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
  13.  
    access_log /var/log/nginx/k8s-access.log main;
  14.  
    upstream k8s-apiserver {
  15.  
    # Master APISERVER IP:PORT
  16.  
    server 192.168.0.113:6443;
  17.  
    # Master2 APISERVER IP:PORT
  18.  
    server 192.168.0.116:6443;
  19.  
    }
  20.  
    server {
  21.  
    listen 16443;
  22.  
    proxy_pass k8s-apiserver;
  23.  
    }
  24.  
    }
  25.  
     
  26.  
    http {
  27.  
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  28.  
    '$status $body_bytes_sent "$http_referer" '
  29.  
    '"$http_user_agent" "$http_x_forwarded_for"';
  30.  
    access_log /var/log/nginx/access.log main;
  31.  
    sendfile on;
  32.  
    tcp_nopush on;
  33.  
    tcp_nodelay on;
  34.  
    keepalive_timeout 65;
  35.  
    types_hash_max_size 2048;
  36.  
    include /etc/nginx/mime.types;
  37.  
    default_type application/octet-stream;
  38.  
    server {
  39.  
    listen 80 default_server;
  40.  
    server_name _;
  41.  
     
  42.  
    location / {
  43.  
    }
  44.  
    }
  45.  
    }
  46.  
    EOF
学新通

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

3、Keepalived 配置(master)

  1.  
    cat > /etc/keepalived/keepalived.conf << EOF
  2.  
    global_defs {
  3.  
    notification_email {
  4.  
    acassen@firewall.loc
  5.  
    failover@firewall.loc
  6.  
    sysadmin@firewall.loc
  7.  
    }
  8.  
    notification_email_from fage@qq.com
  9.  
    smtp_server 127.0.0.1
  10.  
    smtp_connect_timeout 30
  11.  
    router_id NGINX_MASTER
  12.  
    }
  13.  
    vrrp_script check_nginx {
  14.  
    script "/etc/keepalived/check_nginx.sh"
  15.  
    }
  16.  
    vrrp_instance VI_1 {
  17.  
    state MASTER
  18.  
    interface ens33
  19.  
    virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的
  20.  
    priority 100 # 优先级,备服务器设置 90
  21.  
    advert_int 1 # 指定VRRP 心跳包通告间隔时间,默认1
  22.  
    authentication {
  23.  
    auth_type PASS
  24.  
    auth_pass 1111
  25.  
    }
  26.  
    # 虚拟IP
  27.  
    virtual_ipaddress {
  28.  
    192.168.0.120/24
  29.  
    }
  30.  
    track_script {
  31.  
    check_nginx
  32.  
    }
  33.  
    }
  34.  
    EOF
学新通
  • vrrp_script指定检查 nginx 工作状态脚本(根据 nginx 状态判断是否故障转移)

  • virtual_ipaddress虚拟 IP(VIP)

检查 nginx 状态脚本:

  1.  
    cat > /etc/keepalived/check_nginx.sh << "EOF"
  2.  
    #!/bin/bash
  3.  
    count=$(ps -ef |grep nginx |egrep -cv "grep|$$")
  4.  
     
  5.  
    if [ "$count" -eq 0 ];then
  6.  
    exit 1
  7.  
    else
  8.  
    exit 0
  9.  
    fi
  10.  
    EOF
  11.  
    chmod x /etc/keepalived/check_nginx.sh

4、Keepalived 配置(backup)

  1.  
    cat > /etc/keepalived/keepalived.conf << EOF
  2.  
    global_defs {
  3.  
    notification_email {
  4.  
    acassen@firewall.loc
  5.  
    failover@firewall.loc
  6.  
    sysadmin@firewall.loc
  7.  
    }
  8.  
    notification_email_from fage@qq.com
  9.  
    smtp_server 127.0.0.1
  10.  
    smtp_connect_timeout 30
  11.  
    router_id NGINX_BACKUP
  12.  
    }
  13.  
    vrrp_script check_nginx {
  14.  
    script "/etc/keepalived/check_nginx.sh"
  15.  
    }
  16.  
    vrrp_instance VI_1 {
  17.  
    state BACKUP
  18.  
    interface ens33
  19.  
    virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的
  20.  
    priority 90
  21.  
    advert_int 1
  22.  
    authentication {
  23.  
    auth_type PASS
  24.  
    auth_pass 1111
  25.  
    }
  26.  
    virtual_ipaddress {
  27.  
    192.168.0.120/24
  28.  
    }
  29.  
    track_script {
  30.  
    check_nginx
  31.  
    }
  32.  
    }
  33.  
    EOF
学新通

检查 nginx 状态脚本:

  1.  
    cat > /etc/keepalived/check_nginx.sh << "EOF"
  2.  
    #!/bin/bash
  3.  
    count=$(ps -ef |grep nginx |egrep -cv "grep|$$")
  4.  
     
  5.  
    if [ "$count" -eq 0 ];then
  6.  
    exit 1
  7.  
    else
  8.  
    exit 0
  9.  
    fi
  10.  
    EOF
  11.  
    chmod x /etc/keepalived/check_nginx.sh

5、启动并设置开机启动

  1.  
    systemctl daemon-reload
  2.  
    systemctl restart nginx && systemctl enable nginx && systemctl status nginx
  3.  
    systemctl restart keepalived && systemctl enable keepalived && systemctl status keepalived

查看 VIP

ip a

学新通

6、修改 hosts(所有节点)

将 cluster-endpoint 之前执行的 ip 修改执行现在的 VIP

  1.  
    192.168.0.113 k8s-master-168-0-113
  2.  
    192.168.0.114 k8s-node1-168-0-114
  3.  
    192.168.0.115 k8s-node2-168-0-115
  4.  
    192.168.0.116 k8s-master2-168-0-116
  5.  
    192.168.0.120 cluster-endpoint

7、测试验证

查看版本(负载均衡测试验证)

curl -k https://cluster-endpoint:16443/version

学新通

高可用测试验证,将 k8s-master-168-0-113 节点关机

  1.  
    shutdown -h now
  2.  
    curl -k https://cluster-endpoint:16443/version
  3.  
    kubectl get nodes -A
  4.  
    kubectl get pods -A

【温馨提示】堆叠集群存在耦合失败的风险。如果一个节点发生故障,则 etcd 成员和控制平面实例都将丢失, 并且冗余会受到影响。你可以通过添加更多控制平面节点来降低此风险。

三、k8s 管理平台 dashboard 环境部署

1)dashboard 部署

GitHub 地址:https://github.com/kubernetes/dashboard

  1.  
    kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.0/aio/deploy/recommended.yaml
  2.  
    kubectl get pods -n kubernetes-dashboard

但是这个只能内部访问,所以要外部访问,要么部署 ingress,要么就是设置 service NodePort 类型。这里选择 service 暴露端口。

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

修改后的内容如下:

  1.  
    # Copyright 2017 The Kubernetes Authors.
  2.  
    #
  3.  
    # Licensed under the Apache License, Version 2.0 (the "License");
  4.  
    # you may not use this file except in compliance with the License.
  5.  
    # You may obtain a copy of the License at
  6.  
    #
  7.  
    # http://www.apache.org/licenses/LICENSE-2.0
  8.  
    #
  9.  
    # Unless required by applicable law or agreed to in writing, software
  10.  
    # distributed under the License is distributed on an "AS IS" BASIS,
  11.  
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12.  
    # See the License for the specific language governing permissions and
  13.  
    # limitations under the License.
  14.  
     
  15.  
    apiVersion: v1
  16.  
    kind: Namespace
  17.  
    metadata:
  18.  
    name: kubernetes-dashboard
  19.  
     
  20.  
    ---
  21.  
     
  22.  
    apiVersion: v1
  23.  
    kind: ServiceAccount
  24.  
    metadata:
  25.  
    labels:
  26.  
    k8s-app: kubernetes-dashboard
  27.  
    name: kubernetes-dashboard
  28.  
    namespace: kubernetes-dashboard
  29.  
     
  30.  
    ---
  31.  
     
  32.  
    kind: Service
  33.  
    apiVersion: v1
  34.  
    metadata:
  35.  
    labels:
  36.  
    k8s-app: kubernetes-dashboard
  37.  
    name: kubernetes-dashboard
  38.  
    namespace: kubernetes-dashboard
  39.  
    spec:
  40.  
    type: NodePort
  41.  
    ports:
  42.  
    - port: 443
  43.  
    targetPort: 8443
  44.  
    nodePort: 31443
  45.  
    selector:
  46.  
    k8s-app: kubernetes-dashboard
  47.  
     
  48.  
    ---
  49.  
     
  50.  
    apiVersion: v1
  51.  
    kind: Secret
  52.  
    metadata:
  53.  
    labels:
  54.  
    k8s-app: kubernetes-dashboard
  55.  
    name: kubernetes-dashboard-certs
  56.  
    namespace: kubernetes-dashboard
  57.  
    type: Opaque
  58.  
     
  59.  
    ---
  60.  
     
  61.  
    apiVersion: v1
  62.  
    kind: Secret
  63.  
    metadata:
  64.  
    labels:
  65.  
    k8s-app: kubernetes-dashboard
  66.  
    name: kubernetes-dashboard-csrf
  67.  
    namespace: kubernetes-dashboard
  68.  
    type: Opaque
  69.  
    data:
  70.  
    csrf: ""
  71.  
     
  72.  
    ---
  73.  
     
  74.  
    apiVersion: v1
  75.  
    kind: Secret
  76.  
    metadata:
  77.  
    labels:
  78.  
    k8s-app: kubernetes-dashboard
  79.  
    name: kubernetes-dashboard-key-holder
  80.  
    namespace: kubernetes-dashboard
  81.  
    type: Opaque
  82.  
     
  83.  
    ---
  84.  
     
  85.  
    kind: ConfigMap
  86.  
    apiVersion: v1
  87.  
    metadata:
  88.  
    labels:
  89.  
    k8s-app: kubernetes-dashboard
  90.  
    name: kubernetes-dashboard-settings
  91.  
    namespace: kubernetes-dashboard
  92.  
     
  93.  
    ---
  94.  
     
  95.  
    kind: Role
  96.  
    apiVersion: rbac.authorization.k8s.io/v1
  97.  
    metadata:
  98.  
    labels:
  99.  
    k8s-app: kubernetes-dashboard
  100.  
    name: kubernetes-dashboard
  101.  
    namespace: kubernetes-dashboard
  102.  
    rules:
  103.  
    # Allow Dashboard to get, update and delete Dashboard exclusive secrets.
  104.  
    - apiGroups: [""]
  105.  
    resources: ["secrets"]
  106.  
    resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs", "kubernetes-dashboard-csrf"]
  107.  
    verbs: ["get", "update", "delete"]
  108.  
    # Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.
  109.  
    - apiGroups: [""]
  110.  
    resources: ["configmaps"]
  111.  
    resourceNames: ["kubernetes-dashboard-settings"]
  112.  
    verbs: ["get", "update"]
  113.  
    # Allow Dashboard to get metrics.
  114.  
    - apiGroups: [""]
  115.  
    resources: ["services"]
  116.  
    resourceNames: ["heapster", "dashboard-metrics-scraper"]
  117.  
    verbs: ["proxy"]
  118.  
    - apiGroups: [""]
  119.  
    resources: ["services/proxy"]
  120.  
    resourceNames: ["heapster", "http:heapster:", "https:heapster:", "dashboard-metrics-scraper", "http:dashboard-metrics-scraper"]
  121.  
    verbs: ["get"]
  122.  
     
  123.  
    ---
  124.  
     
  125.  
    kind: ClusterRole
  126.  
    apiVersion: rbac.authorization.k8s.io/v1
  127.  
    metadata:
  128.  
    labels:
  129.  
    k8s-app: kubernetes-dashboard
  130.  
    name: kubernetes-dashboard
  131.  
    rules:
  132.  
    # Allow Metrics Scraper to get metrics from the Metrics server
  133.  
    - apiGroups: ["metrics.k8s.io"]
  134.  
    resources: ["pods", "nodes"]
  135.  
    verbs: ["get", "list", "watch"]
  136.  
     
  137.  
    ---
  138.  
     
  139.  
    apiVersion: rbac.authorization.k8s.io/v1
  140.  
    kind: RoleBinding
  141.  
    metadata:
  142.  
    labels:
  143.  
    k8s-app: kubernetes-dashboard
  144.  
    name: kubernetes-dashboard
  145.  
    namespace: kubernetes-dashboard
  146.  
    roleRef:
  147.  
    apiGroup: rbac.authorization.k8s.io
  148.  
    kind: Role
  149.  
    name: kubernetes-dashboard
  150.  
    subjects:
  151.  
    - kind: ServiceAccount
  152.  
    name: kubernetes-dashboard
  153.  
    namespace: kubernetes-dashboard
  154.  
     
  155.  
    ---
  156.  
     
  157.  
    apiVersion: rbac.authorization.k8s.io/v1
  158.  
    kind: ClusterRoleBinding
  159.  
    metadata:
  160.  
    name: kubernetes-dashboard
  161.  
    roleRef:
  162.  
    apiGroup: rbac.authorization.k8s.io
  163.  
    kind: ClusterRole
  164.  
    name: kubernetes-dashboard
  165.  
    subjects:
  166.  
    - kind: ServiceAccount
  167.  
    name: kubernetes-dashboard
  168.  
    namespace: kubernetes-dashboard
  169.  
     
  170.  
    ---
  171.  
     
  172.  
    kind: Deployment
  173.  
    apiVersion: apps/v1
  174.  
    metadata:
  175.  
    labels:
  176.  
    k8s-app: kubernetes-dashboard
  177.  
    name: kubernetes-dashboard
  178.  
    namespace: kubernetes-dashboard
  179.  
    spec:
  180.  
    replicas: 1
  181.  
    revisionHistoryLimit: 10
  182.  
    selector:
  183.  
    matchLabels:
  184.  
    k8s-app: kubernetes-dashboard
  185.  
    template:
  186.  
    metadata:
  187.  
    labels:
  188.  
    k8s-app: kubernetes-dashboard
  189.  
    spec:
  190.  
    securityContext:
  191.  
    seccompProfile:
  192.  
    type: RuntimeDefault
  193.  
    containers:
  194.  
    - name: kubernetes-dashboard
  195.  
    image: kubernetesui/dashboard:v2.6.0
  196.  
    imagePullPolicy: Always
  197.  
    ports:
  198.  
    - containerPort: 8443
  199.  
    protocol: TCP
  200.  
    args:
  201.  
    - --auto-generate-certificates
  202.  
    - --namespace=kubernetes-dashboard
  203.  
    # Uncomment the following line to manually specify Kubernetes API server Host
  204.  
    # If not specified, Dashboard will attempt to auto discover the API server and connect
  205.  
    # to it. Uncomment only if the default does not work.
  206.  
    # - --apiserver-host=http://my-address:port
  207.  
    volumeMounts:
  208.  
    - name: kubernetes-dashboard-certs
  209.  
    mountPath: /certs
  210.  
    # Create on-disk volume to store exec logs
  211.  
    - mountPath: /tmp
  212.  
    name: tmp-volume
  213.  
    livenessProbe:
  214.  
    httpGet:
  215.  
    scheme: HTTPS
  216.  
    path: /
  217.  
    port: 8443
  218.  
    initialDelaySeconds: 30
  219.  
    timeoutSeconds: 30
  220.  
    securityContext:
  221.  
    allowPrivilegeEscalation: false
  222.  
    readOnlyRootFilesystem: true
  223.  
    runAsUser: 1001
  224.  
    runAsGroup: 2001
  225.  
    volumes:
  226.  
    - name: kubernetes-dashboard-certs
  227.  
    secret:
  228.  
    secretName: kubernetes-dashboard-certs
  229.  
    - name: tmp-volume
  230.  
    emptyDir: {}
  231.  
    serviceAccountName: kubernetes-dashboard
  232.  
    nodeSelector:
  233.  
    "kubernetes.io/os": linux
  234.  
    # Comment the following tolerations if Dashboard must not be deployed on master
  235.  
    tolerations:
  236.  
    - key: node-role.kubernetes.io/master
  237.  
    effect: NoSchedule
  238.  
     
  239.  
    ---
  240.  
     
  241.  
    kind: Service
  242.  
    apiVersion: v1
  243.  
    metadata:
  244.  
    labels:
  245.  
    k8s-app: dashboard-metrics-scraper
  246.  
    name: dashboard-metrics-scraper
  247.  
    namespace: kubernetes-dashboard
  248.  
    spec:
  249.  
    ports:
  250.  
    - port: 8000
  251.  
    targetPort: 8000
  252.  
    selector:
  253.  
    k8s-app: dashboard-metrics-scraper
  254.  
     
  255.  
    ---
  256.  
     
  257.  
    kind: Deployment
  258.  
    apiVersion: apps/v1
  259.  
    metadata:
  260.  
    labels:
  261.  
    k8s-app: dashboard-metrics-scraper
  262.  
    name: dashboard-metrics-scraper
  263.  
    namespace: kubernetes-dashboard
  264.  
    spec:
  265.  
    replicas: 1
  266.  
    revisionHistoryLimit: 10
  267.  
    selector:
  268.  
    matchLabels:
  269.  
    k8s-app: dashboard-metrics-scraper
  270.  
    template:
  271.  
    metadata:
  272.  
    labels:
  273.  
    k8s-app: dashboard-metrics-scraper
  274.  
    spec:
  275.  
    securityContext:
  276.  
    seccompProfile:
  277.  
    type: RuntimeDefault
  278.  
    containers:
  279.  
    - name: dashboard-metrics-scraper
  280.  
    image: kubernetesui/metrics-scraper:v1.0.8
  281.  
    ports:
  282.  
    - containerPort: 8000
  283.  
    protocol: TCP
  284.  
    livenessProbe:
  285.  
    httpGet:
  286.  
    scheme: HTTP
  287.  
    path: /
  288.  
    port: 8000
  289.  
    initialDelaySeconds: 30
  290.  
    timeoutSeconds: 30
  291.  
    volumeMounts:
  292.  
    - mountPath: /tmp
  293.  
    name: tmp-volume
  294.  
    securityContext:
  295.  
    allowPrivilegeEscalation: false
  296.  
    readOnlyRootFilesystem: true
  297.  
    runAsUser: 1001
  298.  
    runAsGroup: 2001
  299.  
    serviceAccountName: kubernetes-dashboard
  300.  
    nodeSelector:
  301.  
    "kubernetes.io/os": linux
  302.  
    # Comment the following tolerations if Dashboard must not be deployed on master
  303.  
    tolerations:
  304.  
    - key: node-role.kubernetes.io/master
  305.  
    effect: NoSchedule
  306.  
    volumes:
  307.  
    - name: tmp-volume
  308.  
    emptyDir: {}
学新通

学新通

重新部署

  1.  
    kubectl delete -f recommended.yaml
  2.  
    kubectl apply -f recommended.yaml
  3.  
    kubectl get svc,pods -n kubernetes-dashboard

学新通

2)创建登录用户

  1.  
    cat >ServiceAccount.yaml<<EOF
  2.  
    apiVersion: v1
  3.  
    kind: ServiceAccount
  4.  
    metadata:
  5.  
    name: admin-user
  6.  
    namespace: kubernetes-dashboard
  7.  
    ---
  8.  
    apiVersion: rbac.authorization.k8s.io/v1
  9.  
    kind: ClusterRoleBinding
  10.  
    metadata:
  11.  
    name: admin-user
  12.  
    roleRef:
  13.  
    apiGroup: rbac.authorization.k8s.io
  14.  
    kind: ClusterRole
  15.  
    name: cluster-admin
  16.  
    subjects:
  17.  
    - kind: ServiceAccount
  18.  
    name: admin-user
  19.  
    namespace: kubernetes-dashboard
  20.  
    EOF
  21.  
    kubectl apply -f ServiceAccount.yaml
学新通

创建并获取登录 token

kubectl -n kubernetes-dashboard create token admin-user

3)配置 hosts 登录 dashboard web

192.168.0.120 cluster-endpoint

登录:https://cluster-endpoint:31443

学新通

输入上面创建的 token 登录

学新通

四、k8s 镜像仓库 harbor 环境部署

GitHub 地址:https://github.com/helm/helm/releases
这使用 helm 安装,所以得先安装 helm

1)安装 helm

  1.  
    mkdir -p /opt/k8s/helm && cd /opt/k8s/helm
  2.  
    wget https://get.helm.sh/helm-v3.9.0-rc.1-linux-amd64.tar.gz
  3.  
    tar -xf helm-v3.9.0-rc.1-linux-amd64.tar.gz
  4.  
    ln -s /opt/k8s/helm/linux-amd64/helm /usr/bin/helm
  5.  
    helm version
  6.  
    helm help

2)配置 hosts

192.168.0.120 myharbor.com

3)创建 stl 证书

  1.  
    mkdir /opt/k8s/helm/stl && cd /opt/k8s/helm/stl
  2.  
    # 生成 CA 证书私钥
  3.  
    openssl genrsa -out ca.key 4096
  4.  
    # 生成 CA 证书
  5.  
    openssl req -x509 -new -nodes -sha512 -days 3650 \
  6.  
    -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=harbor/OU=harbor/CN=myharbor.com" \
  7.  
    -key ca.key \
  8.  
    -out ca.crt
  9.  
    # 创建域名证书,生成私钥
  10.  
    openssl genrsa -out myharbor.com.key 4096
  11.  
    # 生成证书签名请求 CSR
  12.  
    openssl req -sha512 -new \
  13.  
    -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=harbor/OU=harbor/CN=myharbor.com" \
  14.  
    -key myharbor.com.key \
  15.  
    -out myharbor.com.csr
  16.  
    # 生成 x509 v3 扩展
  17.  
    cat > v3.ext <<-EOF
  18.  
    authorityKeyIdentifier=keyid,issuer
  19.  
    basicConstraints=CA:FALSE
  20.  
    keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
  21.  
    extendedKeyUsage = serverAuth
  22.  
    subjectAltName = @alt_names
  23.  
     
  24.  
    [alt_names]
  25.  
    DNS.1=myharbor.com
  26.  
    DNS.2=*.myharbor.com
  27.  
    DNS.3=hostname
  28.  
    EOF
  29.  
    #创建 Harbor 访问证书
  30.  
    openssl x509 -req -sha512 -days 3650 \
  31.  
    -extfile v3.ext \
  32.  
    -CA ca.crt -CAkey ca.key -CAcreateserial \
  33.  
    -in myharbor.com.csr \
  34.  
    -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 部署

  1.  
    helm upgrade --install ingress-nginx ingress-nginx \
  2.  
    --repo https://kubernetes.github.io/ingress-nginx \
  3.  
    --namespace ingress-nginx --create-namespace

2、通过 YAML 文件安装(本章使用这个方式安装 ingress)

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/cloud/deploy.yaml

如果下载镜像失败,可以用以下方式修改镜像地址再安装

  1.  
    # 可以先把镜像下载,再安装
  2.  
    docker pull registry.cn-hangzhou.aliyuncs.com/谷歌_containers/nginx-ingress-controller:v1.2.0
  3.  
    docker pull registry.cn-hangzhou.aliyuncs.com/谷歌_containers/kube-webhook-certgen:v1.1.1
  4.  
     
  5.  
    wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/cloud/deploy.yaml
  6.  
    # 修改镜像地址
  7.  
    sed -i 's@k8s.gcr.io/ingress-nginx/controller:v1.2.0\(.*\)@registry.cn-hangzhou.aliyuncs.com/谷歌_containers/nginx-ingress-controller:v1.2.0@' deploy.yaml
  8.  
    sed -i 's@k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1\(.*\)$@registry.cn-hangzhou.aliyuncs.com/谷歌_containers/kube-webhook-certgen:v1.1.1@' deploy.yaml
  9.  
     
  10.  
    ###还需要修改两地方
  11.  
    #1、kind: 类型修改成DaemonSet,replicas: 注销掉,因为DaemonSet模式会每个节点运行一个pod
  12.  
    #2、在添加一条:hostnetwork:true
  13.  
    #3、把LoadBalancer修改成NodePort
  14.  
    #4、在--validating-webhook-key下面添加- --watch-ingress-without-class=true
  15.  
    #5、设置master节点可调度
  16.  
    kubectl taint nodes k8s-master-168-0-113 node-role.kubernetes.io/control-plane:NoSchedule-
  17.  
    kubectl taint nodes k8s-master2-168-0-116 node-role.kubernetes.io/control-plane:NoSchedule-
  18.  
     
  19.  
    kubectl apply -f deploy.yaml
学新通

学新通

5)安装 nfs

1、所有节点安装 nfs

yum -y install  nfs-utils rpcbind

2、在 master 节点创建共享目录并授权

  1.  
     
  2.  
    mkdir /opt/nfsdata
  3.  
    # 授权共享目录
  4.  
    chmod 666 /opt/nfsdata

3、配置 exports 文件

  1.  
    cat > /etc/exports<<EOF
  2.  
    /opt/nfsdata *(rw,no_root_squash,no_all_squash,sync)
  3.  
    EOF
  4.  
    # 配置生效
  5.  
    exportfs -r

exportfs 命令

常用选项
-a 全部挂载或者全部卸载
-r 重新挂载
-u 卸载某一个目录
-v 显示共享目录 以下操作在服务端上

4、启动 rpc 和 nfs(客户端只需要启动 rpc 服务)(注意顺序)

  1.  
    systemctl start rpcbind
  2.  
    systemctl start nfs-server
  3.  
    systemctl enable rpcbind
  4.  
    systemctl enable nfs-server

查看

  1.  
    showmount -e
  2.  
    # VIP
  3.  
    showmount -e 192.168.0.120

-e 显示 NFS 服务器的共享列表
-a 显示本机挂载的文件资源的情况 NFS 资源的情况
-v 显示版本号

5、客户端

  1.  
    # 安装
  2.  
    yum -y install nfs-utils rpcbind
  3.  
    # 启动rpc服务
  4.  
    systemctl start rpcbind
  5.  
    systemctl enable rpcbind
  6.  
    # 创建挂载目录
  7.  
    mkdir /mnt/nfsdata
  8.  
    # 挂载
  9.  
    echo "192.168.0.120:/opt/nfsdata /mnt/nfsdata nfs defaults 0 1">> /etc/fstab
  10.  
    mount -a

6、rsync 数据同步

【1】rsync 安装

  1.  
    # 两端都得安装
  2.  
    yum -y install rsync

【2】配置

在/etc/rsyncd.conf 中添加

  1.  
    cat >/etc/rsyncd.conf<<EOF
  2.  
    uid = root
  3.  
    gid = root
  4.  
    #禁锢在源目录
  5.  
    use chroot = yes
  6.  
    #监听地址
  7.  
    address = 192.168.0.113
  8.  
    #监听地址tcp/udp 873,可通过cat /etc/services | grep rsync查看
  9.  
    port 873
  10.  
    #日志文件位置
  11.  
    log file = /var/log/rsyncd.log
  12.  
    #存放进程 ID 的文件位置
  13.  
    pid file = /var/run/rsyncd.pid
  14.  
    #允许访问的客户机地址
  15.  
    hosts allow = 192.168.0.0/16
  16.  
    #共享模块名称
  17.  
    [nfsdata]
  18.  
    #源目录的实际路径
  19.  
    path = /opt/nfsdata
  20.  
    comment = Document Root of www.kgc.com
  21.  
    #指定客户端是否可以上传文件,默认对所有模块为 true
  22.  
    read only = yes
  23.  
    #同步时不再压缩的文件类型
  24.  
    dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z
  25.  
    #授权账户,多个账号以空格分隔,不加则为匿名,不依赖系统账号
  26.  
    auth users = backuper
  27.  
    #存放账户信息的数据文件
  28.  
    secrets file = /etc/rsyncd_users.db
  29.  
    EOF
学新通

配置 rsyncd_users.db

  1.  
    cat >/etc/rsyncd_users.db<<EOF
  2.  
    backuper:123456
  3.  
    EOF
  4.  
    #官方要求,最好只是赋权600!
  5.  
    chmod 600 /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 常用命令参数详解

  1.  
    rsync --help
  2.  
     
  3.  
    rsync [选项] 原始位置 目标位置
  4.  
     
  5.  
    常用选项 说明
  6.  
    -r 递归模式,包含目录及子目录中的所有文件
  7.  
    -l 对于符号链接文件仍然复制为符号链接文件
  8.  
    -v 显示同步过程的详细信息
  9.  
    -z 在传输文件时进行压缩goD
  10.  
    -p 保留文件的权限标记
  11.  
    -a 归档模式,递归并保留对象属性,等同于-rlpt
  12.  
    -t 保留文件的时间标记
  13.  
    -g 保留文件的属组标记(仅超级用户使用)
  14.  
    -o 保留文件的属主标记(仅超级用户使用)
  15.  
    -H 保留硬链接文件
  16.  
    -A 保留ACL属性信息
  17.  
    -D 保留设备文件及其他特殊文件
  18.  
    --delete 删除目标位置有而原始位置没有的文件
  19.  
    --checksum 根据对象的校验和来决定是否跳过文件
学新通

【5】启动服务(数据源机器)

  1.  
    #rsync监听端口:873
  2.  
    #rsync运行模式:C/S
  3.  
    rsync --daemon --config=/etc/rsyncd.conf
  4.  
    netstat -tnlp|grep :873

【6】执行命令同步数据

  1.  
    # 在目的机器上执行
  2.  
    # rsync -avz 用户名@源主机地址/源目录 目的目录
  3.  
    rsync -avz root@192.168.0.113:/opt/nfsdata/* /opt/nfsdata/

【7】crontab 定时同步

  1.  
    # 配置crontab, 每五分钟同步一次,这种方式不好
  2.  
    */5 * * * * rsync -avz root@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 仓库

helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/

2、helm 安装 nfs provisioner

【温馨提示】默认镜像是无法访问的,这里使用 dockerhub 搜索到的镜像willdockerhub/nfs-subdir-external-provisioner:v4.0.2,还有就是 StorageClass 不分命名空间,所有命名空间下都可以使用。

  1.  
    helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
  2.  
    --namespace=nfs-provisioner \
  3.  
    --create-namespace \
  4.  
    --set image.repository=willdockerhub/nfs-subdir-external-provisioner \
  5.  
    --set image.tag=v4.0.2 \
  6.  
    --set replicaCount=2 \
  7.  
    --set storageClass.name=nfs-client \
  8.  
    --set storageClass.defaultClass=true \
  9.  
    --set nfs.server=192.168.0.120 \
  10.  
    --set nfs.path=/opt/nfsdata

【温馨提示】上面 nfs.server 设置为 VIP,可实现高可用。

3、查看

kubectl get pods,deploy,sc -n nfs-provisioner

学新通

7)部署 Harbor(Https 方式)

1、创建 Namespace

kubectl create ns harbor

2、创建证书秘钥

  1.  
    kubectl create secret tls myharbor.com --key myharbor.com.key --cert myharbor.com.crt -n harbor
  2.  
    kubectl get secret myharbor.com -n harbor

3、添加 Chart 库

helm repo add harbor https://helm.goharbor.io

4、通过 helm 安装 harbor

  1.  
    helm install myharbor --namespace harbor harbor/harbor \
  2.  
    --set expose.ingress.hosts.core=myharbor.com \
  3.  
    --set expose.ingress.hosts.notary=notary.myharbor.com \
  4.  
    --set-string expose.ingress.annotations.'nginx\.org/client-max-body-size'="1024m" \
  5.  
    --set expose.tls.secretName=myharbor.com \
  6.  
    --set persistence.persistentVolumeClaim.registry.storageClass=nfs-client \
  7.  
    --set persistence.persistentVolumeClaim.jobservice.storageClass=nfs-client \
  8.  
    --set persistence.persistentVolumeClaim.database.storageClass=nfs-client \
  9.  
    --set persistence.persistentVolumeClaim.redis.storageClass=nfs-client \
  10.  
    --set persistence.persistentVolumeClaim.trivy.storageClass=nfs-client \
  11.  
    --set persistence.persistentVolumeClaim.chartmuseum.storageClass=nfs-client \
  12.  
    --set persistence.enabled=true \
  13.  
    --set externalURL=https://myharbor.com \
  14.  
    --set harborAdminPassword=Harbor12345

这里稍等一段时间在查看资源状态

kubectl get ingress,svc,pods,pvc -n harbor

学新通

5、ingress 没有 ADDRESS 问题解决

【分析】:发现"error: endpoints “default-http-backend” not found"

  1.  
    cat << EOF > default-http-backend.yaml
  2.  
    ---
  3.  
     
  4.  
    apiVersion: apps/v1
  5.  
    kind: Deployment
  6.  
    metadata:
  7.  
    name: default-http-backend
  8.  
    labels:
  9.  
    app: default-http-backend
  10.  
    namespace: harbor
  11.  
    spec:
  12.  
    replicas: 1
  13.  
    selector:
  14.  
    matchLabels:
  15.  
    app: default-http-backend
  16.  
    template:
  17.  
    metadata:
  18.  
    labels:
  19.  
    app: default-http-backend
  20.  
    spec:
  21.  
    terminationGracePeriodSeconds: 60
  22.  
    containers:
  23.  
    - name: default-http-backend
  24.  
    # Any image is permissible as long as:
  25.  
    # 1. It serves a 404 page at /
  26.  
    # 2. It serves 200 on a /healthz endpoint
  27.  
    image: registry.cn-hangzhou.aliyuncs.com/谷歌_containers/defaultbackend:1.4
  28.  
    # image: gcr.io/谷歌_containers/defaultbackend:1.4
  29.  
    livenessProbe:
  30.  
    httpGet:
  31.  
    path: /healthz
  32.  
    port: 8080
  33.  
    scheme: HTTP
  34.  
    initialDelaySeconds: 30
  35.  
    timeoutSeconds: 5
  36.  
    ports:
  37.  
    - containerPort: 8080
  38.  
    resources:
  39.  
    limits:
  40.  
    cpu: 10m
  41.  
    memory: 20Mi
  42.  
    requests:
  43.  
    cpu: 10m
  44.  
    memory: 20Mi
  45.  
    ---
  46.  
     
  47.  
    apiVersion: v1
  48.  
    kind: Service
  49.  
    metadata:
  50.  
    name: default-http-backend
  51.  
    namespace: harbor
  52.  
    labels:
  53.  
    app: default-http-backend
  54.  
    spec:
  55.  
    ports:
  56.  
    - port: 80
  57.  
    targetPort: 8080
  58.  
    selector:
  59.  
    app: default-http-backend
  60.  
    EOF
  61.  
    kubectl apply -f default-http-backend.yaml
学新通

6、卸载重新部署

  1.  
    # 卸载
  2.  
    helm uninstall myharbor -n harbor
  3.  
    kubectl get pvc -n harbor| awk 'NR!=1{print $1}' | xargs kubectl delete pvc -n harbor
  4.  
     
  5.  
    # 部署
  6.  
    helm install myharbor --namespace harbor harbor/harbor \
  7.  
    --set expose.ingress.hosts.core=myharbor.com \
  8.  
    --set expose.ingress.hosts.notary=notary.myharbor.com \
  9.  
    --set-string expose.ingress.annotations.'nginx\.org/client-max-body-size'="1024m" \
  10.  
    --set expose.tls.secretName=myharbor.com \
  11.  
    --set persistence.persistentVolumeClaim.registry.storageClass=nfs-client \
  12.  
    --set persistence.persistentVolumeClaim.jobservice.storageClass=nfs-client \
  13.  
    --set persistence.persistentVolumeClaim.database.storageClass=nfs-client \
  14.  
    --set persistence.persistentVolumeClaim.redis.storageClass=nfs-client \
  15.  
    --set persistence.persistentVolumeClaim.trivy.storageClass=nfs-client \
  16.  
    --set persistence.persistentVolumeClaim.chartmuseum.storageClass=nfs-client \
  17.  
    --set persistence.enabled=true \
  18.  
    --set externalURL=https://myharbor.com \
  19.  
    --set harborAdminPassword=Harbor12345
学新通

学新通

7、访问 harbor

https://myharbor.com
账号/密码:admin/Harbor12345

学新通

8、harbor 常见操作

【1】创建项目 bigdata

学新通

【2】配置私有仓库

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

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

重启 docker

  1.  
    systemctl daemon-reload
  2.  
    systemctl restart docker

【3】服务器上登录 harbor

  1.  
    docker login https://myharbor.com
  2.  
    #账号/密码:admin/Harbor12345

学新通

【4】打标签并把镜像上传到 harbor

  1.  
    docker tag rancher/pause:3.6 myharbor.com/bigdata/pause:3.6
  2.  
    docker push myharbor.com/bigdata/pause:3.6

9、修改 containerd 配置

以前使用 docker-engine 的时候,只需要修改/etc/docker/daemon.json 就行,但是新版的 k8s 已经使用 containerd 了,所以这里需要做相关配置,要不然 containerd 会失败。证书(ca.crt)可以在页面上下载:

学新通

创建域名目录

  1.  
    mkdir /etc/containerd/myharbor.com
  2.  
    cp ca.crt /etc/containerd/myharbor.com/

配置文件:/etc/containerd/config.toml

  1.  
    [plugins."io.containerd.grpc.v1.cri".registry]
  2.  
    config_path = ""
  3.  
     
  4.  
    [plugins."io.containerd.grpc.v1.cri".registry.auths]
  5.  
     
  6.  
    [plugins."io.containerd.grpc.v1.cri".registry.configs]
  7.  
    [plugins."io.containerd.grpc.v1.cri".registry.configs."myharbor.com".tls]
  8.  
    ca_file = "/etc/containerd/myharbor.com/ca.crt"
  9.  
    [plugins."io.containerd.grpc.v1.cri".registry.configs."myharbor.com".auth]
  10.  
    username = "admin"
  11.  
    password = "Harbor12345"
  12.  
     
  13.  
    [plugins."io.containerd.grpc.v1.cri".registry.headers]
  14.  
     
  15.  
    [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
  16.  
    [plugins."io.containerd.grpc.v1.cri".registry.mirrors."myharbor.com"]
  17.  
    endpoint = ["https://myharbor.com"]
学新通

学新通

重启 containerd

  1.  
    #重新加载配置
  2.  
    systemctl daemon-reload
  3.  
    #重启containerd
  4.  
    systemctl restart containerd

简单使用

  1.  
    # 把docker换成crictl 就行,命令都差不多
  2.  
    crictl pull myharbor.com/bigdata/mysql:5.7.38

执行 crictl 报如下错误的解决办法

  1.  
    WARN[0000] image connect using default endpoints: [unix:///var/run/dockershim.sock unix:///run/containerd/containerd.sock unix:///run/crio/crio.sock unix:///var/run/cri-dockerd.sock]. As the default settings are now deprecated, you should set the endpoint instead.
  2.  
    ERRO[0000] unable to determine image API version: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial unix /var/run/dockershim.sock: connect: no such file or directory"

这个报错是 docker 的报错,这里没使用,所以这个错误不影响使用,但是还是解决好点,解决方法如下:

  1.  
    cat <<EOF> /etc/crictl.yaml
  2.  
    runtime-endpoint: unix:///run/containerd/containerd.sock
  3.  
    image-endpoint: unix:///run/containerd/containerd.sock
  4.  
    timeout: 10
  5.  
    debug: false
  6.  
    EOF

再次拉取镜像

crictl pull myharbor.com/bigdata/mysql:5.7.38

学新通

Kubernetes(k8s)最新版最完整版基础环境部署 master 高可用实现详细步骤就到这里了!

后期会继续更新云原生最新版本的功能特性,请大家多多关注!

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhghbibf
系列文章
更多 icon
同类精品
更多 icon
继续加载