centos7.5部署高可用k8s(三) ---- 外置etcd集群

2023-05-16

前面的高可用集群的etcd是与control plane部署在同一个节点上的,两者会相互影响,etcd还有一种部署方式是与control plane分离部署,提供更高的稳定性。

这里部署一个3节点的etcd集群,然后使用外置的etcd集群创建k8s集群。

节点IP备注
etcd0110.0.0.16etcd01节点
etcd0210.0.0.17etcd02节点
etcd0310.0.0.18etcd03节点

 

 

 

 

 

部署前准备

在所有节点上执行如下操作

1.关闭防火墙,selinux和交换分区,配置内核参数

关闭防火墙

[root@etcd01 ~]# systemctl stop firewalld && systemctl disable firewalld

关闭selinux

[root@etcd01 ~]# vi /etc/selinux/config

SELINUX=disabled

[root@etcd01 ~]# setenforce 0

关闭交换分区

[root@etcd01 ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab

[root@etcd01 ~]# swapoff -a

配置内核参数

[root@etcd01 ~]#  echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables

2.安装docker和kubadm kubelet工具

配置docker和k8s的yum源

[root@etcd01 ~]#  [root@k8s-master yum.repos.d]# cd /etc/yum.repos.d && wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

[root@etcd01 ~]# vim /etc/yum.repos.d/kubernetes.repo

[kubernetes]

name=Kubernetes Repo

baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/

gpgcheck=0

enabled=1

安装docker

[root@etcd01 ~]# yum install docker-ce-18.09.0-3.el7 -y

安装kubeadm和kubelet

[root@etcd01 ~]# yum install -y kubelet-1.15.2   kubeadm-1.15.2 

3.启动docker和kubelet

启动docker,这里需要修改docker的cgroups为systemd与kubelet的一致。

[root@etcd01 ~]# vi /etc/docker/daemon.json

{
  "exec-opts": ["native.cgroupdriver=systemd"]
}

[root@etcd01 ~]# systemctl enable docker && systemctl start docker 

启动kubelet

注意:使用默认的配置文件kubelet服务启动会报错,这里使用新的service文件覆盖默认的service文件。

[root@etcd01 ~]# cat << EOF > /etc/systemd/system/kubelet.service.d/20-etcd-service-manager.conf
[Service]
ExecStart=
#  Replace "systemd" with the cgroup driver of your container runtime. The default value in the kubelet is "cgroupfs".
ExecStart=/usr/bin/kubelet --address=127.0.0.1 --pod-manifest-path=/etc/kubernetes/manifests --cgroup-driver=systemd
Restart=always
EOF

[root@etcd01 ~]# systemctl daemon-reload
[root@etcd01 ~]# systemctl start kubelet

4.导入etcd相关的镜像文件。

链接:https://pan.baidu.com/s/1iivHCMBDzKV7X4q36VNxVg

提取码:k00i

[root@etcd01 ~]# find . -name "*.tar" |xargs -n1 docker load -i

配置部署etcd集群

这里生成证书的思路为在etcd01节点上为所有节点生成节点对应的证书,然后将生成的证书复制到各个节点。

1.生成各个节点的etcd配置文件

各个IP变量化,方便后面使用

[root@etcd01 ~]# export HOST0=10.0.0.16
[root@etcd01 ~]# export HOST1=10.0.0.17
[root@etcd01 ~]# export HOST2=10.0.0.18

给各个节点生成etcd配置文件kubeadmcfg.yaml

[root@etcd01 ~]# mkdir -p /tmp/${HOST0}/ /tmp/${HOST1}/ /tmp/${HOST2}/

[root@etcd01 ~]# ETCDHOSTS=(${HOST0} ${HOST1} ${HOST2})
[root@etcd01 ~]# NAMES=("infra0" "infra1" "infra2")

[root@etcd01 ~]# for i in "${!ETCDHOSTS[@]}"; do
HOST=${ETCDHOSTS[$i]}
NAME=${NAMES[$i]}
cat << EOF > /tmp/${HOST}/kubeadmcfg.yaml
apiVersion: "kubeadm.k8s.io/v1beta2"
kind: ClusterConfiguration
etcd:
    local:
        serverCertSANs:
        - "${HOST}"
        peerCertSANs:
        - "${HOST}"
        extraArgs:
            initial-cluster: ${NAMES[0]}=https://${ETCDHOSTS[0]}:2380,${NAMES[1]}=https://${ETCDHOSTS[1]}:2380,${NAMES[2]}=https://${ETCDHOSTS[2]}:2380
            initial-cluster-state: new
            name: ${NAME}
            listen-peer-urls: https://${HOST}:2380
            listen-client-urls: https://${HOST}:2379
            advertise-client-urls: https://${HOST}:2379
            initial-advertise-peer-urls: https://${HOST}:2380
EOF
done

执行完上面的命令后,etcd01节点会生成3个etcd配置文件

/tmp/10.0.0.16/kubeadmcfg.yaml

/tmp/10.0.0.17/kubeadmcfg.yaml

/tmp/10.0.0.18/kubeadmcfg.yaml

2.生成CA根证书

[root@etcd01 ~]# kubeadm init phase certs etcd-ca

这会在/etc/kubernetes/pki/etcd目录下生成两个CA证书文件:

/etc/kubernetes/pki/etcd/ca.crt
/etc/kubernetes/pki/etcd/ca.key

3.为各个节点生成etcd相关的证书

为etcd03生成证书

[root@etcd01 ~]# kubeadm init phase certs etcd-server --config=/tmp/${HOST2}/kubeadmcfg.yaml
[root@etcd01 ~]# kubeadm init phase certs etcd-peer --config=/tmp/${HOST2}/kubeadmcfg.yaml
[root@etcd01 ~]# kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST2}/kubeadmcfg.yaml
[root@etcd01 ~]# kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST2}/kubeadmcfg.yaml
[root@etcd01 ~]# cp -R /etc/kubernetes/pki /tmp/${HOST2}/
# 清理CA根证书之外的证书,为下一个节点生成证书准备
[root@etcd01 ~]# find /etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -delete

为etcd02生成证书

[root@etcd01 ~]# kubeadm init phase certs etcd-server --config=/tmp/${HOST1}/kubeadmcfg.yaml
[root@etcd01 ~]# kubeadm init phase certs etcd-peer --config=/tmp/${HOST1}/kubeadmcfg.yaml
[root@etcd01 ~]# kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST1}/kubeadmcfg.yaml
[root@etcd01 ~]# kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST1}/kubeadmcfg.yaml
[root@etcd01 ~]# cp -R /etc/kubernetes/pki /tmp/${HOST1}/
[root@etcd01 ~]# find /etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -delete

为etcd01生成证书

[root@etcd01 ~]# kubeadm init phase certs etcd-server --config=/tmp/${HOST0}/kubeadmcfg.yaml
[root@etcd01 ~]# kubeadm init phase certs etcd-peer --config=/tmp/${HOST0}/kubeadmcfg.yaml
[root@etcd01 ~]# kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST0}/kubeadmcfg.yaml
[root@etcd01 ~]# kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST0}/kubeadmcfg.yaml
# No need to move the certs because they are for HOST0

# clean up certs that should not be copied off this host
[root@etcd01 ~]# find /tmp/${HOST2} -name ca.key -type f -delete
[root@etcd01 ~]#find /tmp/${HOST1} -name ca.key -type f -delete

3.将/tmp/${HOST1}/ /tmp/${HOST2}/下的分别复制到etcd02节点和etcd03节点

复制etcd配置文件和证书到etcd02

 [root@etcd01 ~]# scp -r /tmp/10.0.0.17/* root@10.0.0.17:~

 [root@etcd02 ~]#  cd ~
 [root@etcd02 ~]#  chown -R root:root pki
 [root@etcd02 ~]#  mv pki /etc/kubernetes/

复制etcd配置文件和证书到etcd03

 [root@etcd01 ~]# scp -r /tmp/10.0.0.18/* root@10.0.0.18:~

 [root@etcd03 ~]#  cd ~
 [root@etcd03 ~]#  chown -R root:root pki
 [root@etcd03 ~]#  mv pki /etc/kubernetes/

4.在各个节点上生成etcd的manifests配置文件

 [root@etcd01 ~]# kubeadm init phase etcd local --config=/tmp/10.0.0.16/kubeadmcfg.yaml
 [root@etcd02 ~]# kubeadm init phase etcd local --config=/root/kubeadmcfg.yaml
 [root@etcd03 ~]# kubeadm init phase etcd local --config=/root/kubeadmcfg.yaml

这会在每个节点的/etc/kubernetes/manifests目录下生成一个etcd.yaml文件,kubelet会读取这个manifests配置文件,生成etcd的static pod。

等待片刻,可以看到各个节点上运行两个容器,etcd和pause容器。这里由于墙的原因,需要事先导入etcd和pause镜像。

5.检测etcd集群状态

 [root@etcd01 ~]# docker run --rm -it \
--net host \
-v /etc/kubernetes:/etc/kubernetes quay.io/coreos/etcd:v3.2.24 etcdctl \
--cert-file /etc/kubernetes/pki/etcd/peer.crt \
--key-file /etc/kubernetes/pki/etcd/peer.key \
--ca-file /etc/kubernetes/pki/etcd/ca.crt \
--endpoints https://10.0.0.16:2379 cluster-health

可以看到三个节点都运行正常。

 

部署k8s集群

部署外置etcd集群的k8s集群与前述的堆叠的k8s集群基本一样,唯一的区别就是在master01节点上初始化集群有点不同,这里记录下在master01节点上初始化集群的步骤

1.将任意一台etcd节点的CA根证书和apiserver-etcd-client证书复制到master01节点上,对于master01节点来说,使用任意一台etcd节点的证书都可以正常连接etcd集群。这里使用etcd01的证书。

scp证书到master01

 [root@etcd01 ~]# scp /etc/kubernetes/pki/apiserver-etcd-client.crt root@master01:/etc/kubernetes/pki/

 [root@etcd01 ~]# scp /etc/kubernetes/pki/apiserver-etcd-client.key root@master01:/etc/kubernetes/pki/

 [root@etcd01 ~]# scp /etc/kubernetes/pki/etcd/ca.crt root@master01:/etc/kubernetes/pki/etcd/

2.配置集群初始化文件,与前述的堆叠的不同点在于etcd的配置参数(红色标注部分)

[root@k8s-master01 ~]# vi kubeadm-config.yaml

apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 10.0.0.11
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: k8s-master01
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: "10.0.0.10:6444"
controllerManager: {}
dns:
  type: CoreDNS
etcd:
    external:
        endpoints:
        - https://10.0.0.16:2379
        - https://10.0.0.17:2379
        - https://10.0.0.18:2379
        caFile: /etc/kubernetes/pki/etcd/ca.crt
        certFile: /etc/kubernetes/pki/apiserver-etcd-client.crt
        keyFile: /etc/kubernetes/pki/apiserver-etcd-client.key

imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.15.2
networking:
  dnsDomain: cluster.local
  podSubnet: "10.244.0.0/16"
  serviceSubnet: 10.96.0.0/12
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
  SupportIPVSProxyMode: true
mode: ipvs
 

3.初始化集群

[root@k8s-master01 ~]#  kubeadm init --config=kubeadm-config.yaml --upload-certs

这里初始化的时候master01会将访问etcd的证书也上传,其他master节点加入时会自动下载证书。

后续的操作与堆叠的也是相同的,这里就不多赘述了。

参考:https://v1-15.docs.kubernetes.io/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm/

https://v1-15.docs.kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

centos7.5部署高可用k8s(三) ---- 外置etcd集群 的相关文章

随机推荐

  • 小熊派 FreeRTOS+SPI+DMA 驱动 TFT-LCD

    一 文章前言 入手了一块小熊派开发板 xff0c 看到他板子上搭载了一块 TFT LCD 编写编写驱动代码来使用 TFT xff0c 该 TFT 通过 ST7789 驱动芯片进行驱动 xff0c 本文通过 CubeMX 软件配置硬件 SPI
  • 【双系统】Win10/Win11 引导 Ubuntu

    文章目录 纲要注意写在最前1 Win 分区2 Ubuntu刻盘3 安装 Ubuntu4 配置引导 纲要 本文主要介绍了如何在已安装 Win10 Win11 前提下安装 Ubuntu 双系统 xff0c 并利用 Win10 Win11 的 M
  • 2.6 常见关系数据库产品

    常见关系数据库产品 1 Oracle 应用广泛 功能强大 xff0c 分布式数据库系统 关系 对象 型数据库 2 MySQL 快捷 可靠 开源 免费 与PHP组成经典的LAMP组合 3 SQLServer 针对不同用户群体的五个特殊的版本
  • 结构体定义寄存器方法(很流行哦)

    ARM寄存器数量之多 xff0c 叹为观止 xff01 幸运的是 xff0c 它都是以模块分布 xff0c 再依托C语言的模块化编程 xff0c 用户就没有必要记忆那么多的寄存器名称了 xff01 拿LPC1114来说 xff0c 单片机内
  • 代码函数调用关系图

    代码函数调用关系 Graphviz 43 CodeViz http www linuxidc com Linux 2015 01 111501 htmCallgraph xff1a 静态分析 C 程序函数调用关系图cflow 43 grap
  • Python元组(tuple),字符串,读取文件。

    目录 tuple xff1a tuple格式 xff1a tuple和列表的区别 xff1a 查询类型小方法 xff1a string 字符串 xff1a 字符串格式 xff1a 三种格式的区别 xff1a 1 单引号 xff0c 双引号换
  • 各种课程教学安排

  • 驱动测试时出现can't open 的一种情况

    提前声明 xff1a 本程序是使用class device create函数导致的错误 xff0c 如果不是使用该函数不要对号入座 xff0c 谢谢 在今天编写完驱动程序 xff0c 然后使用测试程序测试时 xff0c 却出现了can 39
  • Ubuntu 20.04上安装ROS

    文章目录 前言一 Ubuntu 20 041添加ROS源2更新软件源3配置及更换最佳软件源4安装ROS5初始化rosdep6设置环境变量7安装rosinstall8验证是否安装成功 总结 前言 在虚拟机VMware上安装了Ubuntu 20
  • 头文件只能放变量的声明但是不能放定义

    一般的做法都是在头文件 h 中声明变量 xff0c 然后在源文件 c 中定义变量 如果在头文件中定义变量 xff0c 这个变量就有了实体 xff0c 如果a c和b c一起引用了头文件head h xff0c 就等于同时创建了两个同样名字的
  • 使用策略模式优化大量if...else代码

    一 场景 假如我们有一个订单业务 xff0c 根据会员的类型不同 xff0c 使用if else判断 xff0c 然后去执行不同的业务操作 xff0c 伪代码如下 xff1a span class token keyword public
  • 操作系统笔记

    1 操作系统的特性 xff1a 并发性 共享性 异步性和虚拟性 2 特权指令与非特权指令 xff1a xff08 1 xff09 特权指令 只能在管态才能执行的指令为特权指令 这些指令一般只有操作系统才能执行 xff0c 而一般用户程序不能
  • 【计算机网络原理】根据IP地址和子网掩码计算网络地址

    背景 最近做计算机网络原理真题 xff0c 根据ip地址和子网掩码计算网络地址的过程总结一下 计算步骤 1 将IP地址 xff0c 子网掩码转换为二进制 2 之后将两个二进制进行与运算 xff0c 再将结果转为十进制 与 xff1a 相应二
  • C++学习笔记命名冲突和命名空间介绍

    C 43 43 命名冲突和命名空间介绍 假设您是第一次开车去朋友家 xff0c 给您的地址是 Mill City 的 245 Front Street 到达米尔城后 xff0c 您拿出地图 xff0c 却发现米尔城实际上有两条不同的前街 x
  • Docker的网络模式和如何跨主机通信(转载链接)

    https blog csdn net smooth00 article details 82842234 utm medium 61 distribute pc relevant t0 none task blog BlogCommend
  • java面试题2

    编程题 xff1a 1 xff0e 现在输入n个数字 xff0c 以逗号 xff0c 分开 xff1b 然后可选择升或者降序排序 xff1b 按提交键就在另一页面显示 按什么 排序 xff0c 结果为 xff0c xff0c 提供reset
  • 总线带宽 - 计算

    计算步骤 xff1a 1个时钟周期 61 1 总线时钟频率 xff1b 总线传输周期 61 1个时钟周期 总线周期包含时钟周期个数 xff1b 总线带宽 61 每个总线周期传送的数据 总线传输周期 xff1b 单位转化 xff1a 1MHz
  • centos7.5部署高可用k8s(一) ---- 部署LB负载均衡haproxy+keepalived

    在centos7 5系统部署一个k8s高可用集群 k8s版本采用v1 15 2 docker版本18 09 根据官方的文档 xff0c 部署集群前首先要部署负载均衡器 xff0c 这里简要记录下LB负载均衡器的部署过程 环境说明 节点IP备
  • centos7.5部署高可用k8s(二) ---- 部署k8s v1.15.2

    部署好LB以后 xff0c 接下来就正式开始部署k8s 部署前准备 1 各个节点设置注解名和域名解析 xff0c 包括两个haproxy节点 root 64 k8s master01 hostnamectl set hostname k8s
  • centos7.5部署高可用k8s(三) ---- 外置etcd集群

    前面的高可用集群的etcd是与control plane部署在同一个节点上的 xff0c 两者会相互影响 xff0c etcd还有一种部署方式是与control plane分离部署 xff0c 提供更高的稳定性 这里部署一个3节点的etcd