深入掌握K8S集群部署:手把手教你实现v1.23.6版本高可用集群搭建教程(上篇)

更新:11-02 民间故事 我要投稿 纠错 投诉

本篇文章给大家谈谈深入掌握K8S集群部署:手把手教你实现v1.23.6版本高可用集群搭建教程(上篇),以及对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

[图片上传失败.(image-1b0721-1652954316553)]

本章目录:0x00 前言简介

0x01 环境准备

主持人策划

软件版本

网络规划

0x02 安装部署1、基础主机环境准备及配置

2.负载均衡管理工具安装及内核加载

3、高可用HAproxy和Keepalived软件安装与配置

4.配置、部署etcd集群以及etcd证书颁发

5.Containerd运行时安装部署

温馨提醒: 由于练习太长,所以分为两节发表。

0x00 前言简述

描述: 在我的博客和之前的文章中,我讲解了Kubernetes 相关集群环境的搭建。随着K8S及其相关组件的迭代,与读者目前接触到的版本有所不同,因此在当前【2022年4月26日,10:08:29】时间节点,博主使用了ubuntu 20.04、haproxy、keepalive、 containerd、etcd、kubeadm、kubectl等相关工具插件[最新或稳定版本]构建高可用的kubernetes集群。这里不再提及k8s。相关基础知识的介绍,如果您是刚接触的童鞋,请访问以下【博客文章】(https://blog.weiyigeek.top/tags/k8s/)或【Bilibili专栏】(https://www.bilibili.com/read/readlist/rl520875?spm_id_from=333.999.0.0) 按顺序学习。

简述Kubernetes(以下简称k8s)是Google开源的容器编排引擎(2014年6月)。它是使用Go语言开发的。支持云平台多主机上的自动化部署、大规模扩展、容器化。申请管理。其目标是让容器化应用的部署更加简单高效,提供资源调度、部署管理、服务发现、扩缩容、状态监控、维护等一整套功能,力争成为自动化部署、自动扩展和跨主机集群。一个运行应用容器的平台,支持一系列CNCF毕业项目,包括Containerd、calico等。

0x01 环境准备

主机规划

Host Address Host Name Host Configuration Host Role Software Component 10.10.107.223master-2234C/4G/Control Node 10.10.107.224master-2244C/4G Control Node 10.10.107.225master-2254C/8G Control Node 10.10.107.226node-14C /2G 工作节点10.10.107.227node-24C/2G 工作节点10.10.107.222weiyigeek.cluster.k8s 虚拟VIP 虚拟网卡地址温馨提醒: 这里使用的是Ubuntu 20.04 操作系统。该系统已经过安全加固和内核优化,以满足2.0 级要求[SecOpsDev/Ubuntu-InitializeSecurity.sh at master · WeiyiGeek/SecOpsDev (github.com)]。如果您的Linux环境没有进行相应的配置,可能会与读者的环境略有不同。如果需要(windows服务器、Ubuntu、For CentOS)安全加固,请参考以下加固脚本进行加固。请给它一颗疯狂的星星。

加固脚本地址:【https://github.com/WeiyiGeek/SecOpsDev/blob/master/OS-操作系统/Linux/Ubuntu/Ubuntu-InitializeSecurity.sh]

软件版本

操作系统Ubuntu 20.04 LTS - 5.4.0-107-通用TLS证书签发cfssl - v1.6.1

cfssl-certinfo-v1.6.1

cfssljson-v1.6.1

高可用软件ipvsadm-1:1.31-1

haproxy-2.0.13-2

keepalived-1:2.0.19-2

ETCD数据库etcd - v3.5.4容器运行时containerd.io - 1.6.4Kuberneteskubeadm - v1.23.6

kube-apiserver-v1.23.6

kube-controller-manager-v1.23.6

kubectl-v1.23.6

kubelet-v1.23.6

kube-proxy-v1.23.6

kube-scheduler-v1.23.6

网络插件辅助软件calico-v3.22

coredns-v1.9.1

kubernetes-dashboard-v2.5.1

k9s-v0.25.18

网络规划

Subnet 子网网段备注nodeSubnet10.10.107.0/24C1ServiceSubnet10.96.0.0/16C2PodSubnet10.128.0.0/16C3 温馨提醒:我已经将上述环境下使用的相关软件和插件打包给大家下载,大家可以访问以下链接(访问密码请访问WeiyiGeek公众号回复【k8s binary】获取)。

下载地址:http://share.weiyigeek.top/f/36158960-578443238-a1a5fa(访问密码:点击访问WeyiGeek公众号回复【k8s二进制】)

[图片上传失败.(image-8424b3-1652954316553)]

/kubernetes-cluster-binary-install# 树. calico calico-v3.22.yaml 证书 admin-csr.json apiserver-csr.json ca-config.json ca-csr.json cfssl cfssl-certinfo cfssljson 控制器管理器-csr.json etcd -csr.json kube-scheduler-csr.json proxy-csr.json Scheduler-csr.json containerd.io config.toml coredns coredns.yaml coredns.yaml.sed deploy.sh cri-containerd-cni-1.6.4-linux-amd64.tar.gz etcd-v3. 5.4-linux-amd64.tar.gz k9s kubernetes-dashboard kubernetes-dashboard.yaml rbac-dashboard-admin.yaml kubernetes-server-linux-amd64. tar.gz nginx.yaml0x02 安装部署

1.基础主机环境准备配置

步骤01.【所有主机】主机名设置按照上述主机规划进行设置。

# 例如在10.10.107.223主机上运行。 hostnamectl set-hostname master-223# 例如在10.10.107.227主机上运行。 hostnamectl set-hostname node-2 步骤02.【所有主机】对规划的主机名和IP地址进行硬解析。

sudo tee -a /etc/hosts"EOF"10.10.107.223 master-22310.10.107.224 master-22410.10.107.225 master-22510.10.107.226 node-110.10.107.227 node-210.10.107.222 weiyigeek.cluster 。 k8sEOF 步骤03.验证每个节点上的IP、MAC地址和product_uuid的唯一性,确保它们能够正常通信。

#使用命令ip link 或ifconfig -a 获取网络接口的MAC 地址ifconfig -a #使用命令查看product_uuid并验证sudo cat /sys/class/dmi/id/product_uuid 步骤04.【所有主机】系统时间同步和时区设置

date -Rsudo ntpdate ntp.aliyun.comsudo timedatectl set-timezone Asia/Shanghai# or# sudo dpkg-reconfigure tzdatasudo timedatectl set-local-rtc 0timedatectl 步骤05. [所有主机]禁用系统交换分区

swapoff -a sed -i "s|^/swap.img|#/swap.ing|g" /etc/fstab# 验证交换分区是否被禁用free | grep "Swap:" 步骤07.【所有主机】系统内核参数调整

# 禁用交换分区egrep -q "^(#)?vm.swappiness.*" /etc/sysctl.conf sed -ri "s|^(#)?vm.swappiness.*|vm.swappiness=0|g" /etc/sysctl.conf || echo "vm.swappiness=0" /etc/sysctl.conf# 允许转发egrep -q "^(#)?net.ipv4.ip_forward.*" /etc/sysctl.conf sed - ri "s|^(#) ?net.ipv4.ip_forward.*|net.ipv4.ip_forward=1|g" /etc/sysctl.conf || echo "net.ipv4.ip_forward=1" /etc/sysctl. conf# - 允许iptables 检查网桥流量egrep -q "^(#)?net.bridge.bridge-nf-call-iptables.*" /etc/sysctl.conf sed -ri "s|^(#)?net 。 bridge.bridge-nf-call-iptables.*|net.bridge.bridge-nf-call-iptables=1|g" /etc/sysctl.conf || echo "net.bridge.bridge-nf-call-iptables=1" /etc/sysctl.confegrep -q "^(#)?net.bridge.bridge-nf-call-ip6tables.*" /etc/sysctl.conf sed -ri "s|^(#)?net.bridge .bridge-nf-call-ip6tables.*|net.bridge.bridge-nf-call-ip6tables=1|g" /etc/sysctl.conf || echo "net.bridge.bridge-nf-call-ip6tables=1 " /etc/sysctl.conf 步骤07. [所有主机] 禁用系统防火墙

ufwdisablesystemctldisableufwsystemctlstopufw 步骤08.【master-225主机】使用master-225主机的公钥登录其他主机,无需账户密码(可选),方便各主机上的文件上传和下载。

# 生成ed25519 格式的公钥sh-keygen -t ed25519# 例如使用该密钥在master-225 主机上登录master-223(其他主机同理) ssh-copy-id -p 20211 weiyigeek@10.10 .107.223 # /usr/bin/ssh-copy-id: INFO: 要安装的密钥来源: "/root/.ssh/id_ed25519.pub" # 是否确定要继续连接(是/否/[指纹])? yes # 输入yes # weiyigeek@10.10.107.223s password: # 输入主机密码# 添加的密钥数量: 1 # 现在尝试登录计算机,with: "ssh -p "20211" "weiyigeek@10.10.107.223"" # 并检查以确保只添加了您想要的密钥。 ssh-copy-id -p 20211 weiyigeek@10.10.107.224ssh-copy-id -p 20211 weiyigeek@10.10.107.226ssh-copy-id - p 20211 weiyigeek@10.10.107.2272。负载均衡管理工具安装及内核加载

步骤01.安装ipvs模块和负载均衡相关依赖。

# 查看可用版本sudo apt-cache madison ipvsadm # ipvsadm | 1:1.31-1 | http://mirrors.aliyun.com/ubuntu focus/main amd64 Packages # 安装sudo apt -y install ipvsadm ipset sysstat conntrack # 锁定版本apt-mark Hold ipvsadm # ipvsadm 设置为保留。步骤02.将模块加载到内核中(开机时自动设置-需要重新启动机器才能生效)

tee /etc/modules-load.d/k8s.conf"EOF"#netfilterbr_netfilter#containerdoverlay#nf_conntracknf_conntrack#ipvsip_vsip_vs_lcip_vs_lblcip_vs_lblcrip_vs_rrip_vs_wrrip_vs_ship_vs_dhip_vs_foip_vs_nqip_vs_sedip_v _ftpip_tablesip_setipt_setipt_rpfilteript_REJECTipipxt_setEOF 步骤03. 手动将模块加载到内核中

mkdir -vp /etc/modules.d/tee /etc/modules.d/k8s.modules"EOF"#!/bin/bash# netfilter 模块允许iptables 检查网桥流量modprobe -- br_netfilter# containerdmodprobe -- overlay# nf_conntrackmodprobe - - nf_conntrack# ipvsmodprobe -- ip_vsmodprobe -- ip_vs_lcmodprobe -- ip_vs_lblcmodprobe -- ip_vs_lblcrmodprobe -- ip_vs_rrmodprobe -- ip_vs_wrrmodprobe -- ip_vs_shmodprobe -- ip_vs_dhmodprobe -- ip_vs_fo modprobe -- ip_vs_nqmodprobe -- ip_vs_sedmodprobe -- ip_vs_ftpmodprobe -- ip_tablesmodprobe -- ip_setmodprobe -- ipt_setmodprobe -- ipt_rpfiltermodprobe -- ipt_REJECTmodprobe -- ipipmodprobe -- xt_setEOFchmod 755 /etc/modules.d/k8s.modules bash /etc/modules.d/k8s.modules grep -e ip_vs -e nf_conntrack # ip_vs_sh 16384 0 # ip_vs_wrr 16384 0 # ip_vs_rr 16384 0 # ip_vs 155648 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr # nf_conntrack 139264 1 s # nf_defrag_ipv6 24576 2 nf_conntrack,ip_vs # nf_defrag_ipv4 16384 1 nf_conntrack # libcrc32c 16384 5 nf_conntrack ,btrfs,xfs,raid456,ip_vssysctl --系统温馨提醒: 内核中4.19及以上版本需要使用nf_conntrack模块,4.18以下版本需要使用nf_conntrack_ipv4模块。

3.高可用HAproxy与Keepalived软件安装配置

描述: 由于是测试学习环境,所以这里我没有专门准备两台HA服务器,而是直接使用了master节点机。如果是正式环境,建议独立。

步骤01.【主节点机】安装并下载haproxy(HA代理健康检测)和keepalived(虚拟路由协议-主-从)。

# 查看可用版本sudo apt-cache madison haproxy keepalived # haproxy | 2.0.13-2ubuntu0.5 | http://mirrors.aliyun.com/ubuntu focus-security/main amd64 软件包1:2.0.19-2ubuntu0.2 | http://mirrors.aliyun .com/ubuntu focus-updates/main amd64 Packages# 安装sudo apt -y install haproxy keepalived# 锁定版本apt-mark Hold haproxy keepalived Step 02. 【主节点机】配置HAProxy,配置目录为/etc/haproxy/,所有节点配置一致。

sudo cp /etc/haproxy/haproxy.cfg{,bak}tee /etc/haproxy/haproxy.cfg"EOF"全局用户haproxy 组haproxy maxconn 2000 守护进程日志/dev/log local0 log /dev/log local1 err chroot/var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin hide-fd Listeners stats timeout 30s # 默认SSL 材料位置ca-base /etc/ssl/certs crt-base /etc/ssl/private #请参阅: https://ssl-config.mozilla.org/#server=haproxyserver-version=2.0.3config=intermediate ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES2 56 - GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM -SHA384 ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256 ssl- default -bind-options ssl-min-ver TLSv1.2 no-tls-ticketsdefaults 日志全局模式http 选项httplog 选项dontlognull 超时连接5000 超时客户端50000 超时服务器50000 超时http-request 15s 超时http-keep-alive 15s # errorfile 400 /etc/haproxy/errors/400.http # 错误文件403 /etc/haproxy/errors/403.http # 错误文件408 /etc/haproxy/errors/408.http # 错误文件500 /etc/haproxy/errors/500.http #错误文件502 /etc/haproxy/errors/502.http # 错误文件503 /etc/haproxy/errors/503.http # 错误文件504 /etc/haproxy/errors/504.http# 注意: 管理HAproxy(可选)# 前端监视器- in#bind *:33305#mode http#option httplog#monitor-uri /monitor#注意:是基于四层代理的,1644 3是VIP的ApiServer控制面端口,而且由于是和master在一起的节点,无法使用6443 端口。frontend k8s -master bind 0.0.0.0:16443 bind 127.0.0.1:16443 mode tcp option tcplog tcp-request Inspect-delay 5s default_backend k8s-mas

ter# 注意: Master 节点的默认 Apiserver 是6443端口backend k8s-master mode tcp option tcplog option tcp-check balance roundrobin default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100 server master-223 10.10.107.223:6443 check server master-224 10.10.107.224:6443 check server master-225 10.10.107.225:6443 checkEOF步骤 03.【Master节点机器】进行 置KeepAlived 配置 ,其配置目录为/etc/haproxy/ # 创建配置目录,分别在各个master节点执行。mkdir -vp /etc/keepalived# __ROLE__ 角色: MASTER 或者 BACKUP# __NETINTERFACE__ 宿主机物理网卡名称 例如我的ens32# __IP__ 宿主机物理IP地址# __VIP__ 虚拟VIP地址sudo tee /etc/keepalived/keepalived.conf<<"EOF"! Configuration File for keepalivedglobal_defs { router_id LVS_DEVELscript_user root enable_script_security}vrrp_script chk_apiserver { script "/etc/keepalived/check_apiserver.sh" interval 5 weight -5 fall 2 rise 1}vrrp_instance VI_1 { state __ROLE__ interface __NETINTERFACE__ mcast_src_ip __IP__ virtual_router_id 51 priority 101 advert_int 2 authentication { auth_type PASS auth_pass K8SHA_KA_AUTH } virtual_ipaddress { __VIP__ } # HA 健康检查 # track_script { # chk_apiserver # }}EOF# 此处 master-225 性能较好所以配置为Master (master-225 主机上执行)# master-225 10.10.107.225 =>MASTERsed -i -e "s#__ROLE__#MASTER#g" -e "s#__NETINTERFACE__#ens32#g" -e "s#__IP__#10.10.107.225#g" -e "s#__VIP__#10.10.107.222#g" /etc/keepalived/keepalived.conf # master-224 10.10.107.224 =>BACKUP (master-224 主机上执行)sed -i -e "s#__ROLE__#BACKUP#g" -e "s#__NETINTERFACE__#ens32#g" -e "s#__IP__#10.10.107.224#g" -e "s#__VIP__#10.10.107.222#g" /etc/keepalived/keepalived.conf # master-223 10.10.107.223 =>BACKUP (master-223 主机上执行)sed -i -e "s#__ROLE__#BACKUP#g" -e "s#__NETINTERFACE__#ens32#g" -e "s#__IP__#10.10.107.223#g" -e "s#__VIP__#10.10.107.222#g" /etc/keepalived/keepalived.conf温馨提示: 注意上述的健康检查是关闭注释了的,你需要将K8S集群建立完成后再开启。 track_script { chk_apiserver}步骤 04.【Master节点机器】进行配置 KeepAlived 健康检查文件。 sudo tee /etc/keepalived/check_apiserver.sh<<"EOF"#!/bin/basherr=0for k in $(seq 1 3)do check_code=$(pgrep haproxy) if [[ $check_code == "" ]]; then err=$(expr $err + 1) sleep 1 continue else err=0 break fidoneif [[ $err != "0" ]]; then echo "systemctl stop keepalived" /usr/bin/systemctl stop keepalived exit 1else exit 0fiEOFsudo chmod +x /etc/keepalived/check_apiserver.sh步骤 05.【Master节点机器】启动 haproxy 、keepalived 相关服务及测试VIP漂移。 # 重载 Systemd 设置 haproxy 、keepalived 开机自启以及立即启动sudo systemctl daemon-reloadsudo systemctl enable --now haproxy && sudo systemctl enable --now keepalived# Synchronizing state of haproxy.service with SysV service script with /lib/systemd/systemd-sysv-install.# Executing: /lib/systemd/systemd-sysv-install enable haproxy# Synchronizing state of keepalived.service with SysV service script with /lib/systemd/systemd-sysv-install.# Executing: /lib/systemd/systemd-sysv-install enable keepalived# 在 master-223 主机中发现vip地址在其主机上。root@master-223:~$ ip addr # 2: ens32:mtu 1500 qdisc fq_codel state UP group default qlen 1000 # link/ether 00:0c:29:00:0f:8f brd ff:ff:ff:ff:ff:ff # inet 10.10.107.223/24 brd 10.10.107.255 scope global ens32 # valid_lft forever preferred_lft forever # inet 10.10.107.222/32 scope global ens32 # valid_lft forever preferred_lft forever# 其它两台主机上通信验证。root@master-224:~$ ping 10.10.107.222root@master-225:~$ ping 10.10.107.222# 手动验证VIP漂移,我们将该服务器上keepalived停止掉。root@master-223:~$ pgrep haproxy # 6320 # 6321root@master-223:~$ /usr/bin/systemctl stop keepalived# 此时,发现VIP已经飘到master-225主机中root@master-225:~$ ip addr show ens32 # 2: ens32:mtu 1500 qdisc fq_codel state UP group default qlen 1000 # link/ether 00:0c:29:93:28:61 brd ff:ff:ff:ff:ff:ff # inet 10.10.107.225/24 brd 10.10.107.255 scope global ens32 # valid_lft forever preferred_lft forever # inet 10.10.107.222/32 scope global ens32 # valid_lft forever preferred_lft forever至此,HAProxy 与 Keepalived 配置就告一段落了,下面将学习 ETCD 集群配置与证书签发。

4.配置部署etcd集群与etcd证书签发

描述: 创建一个高可用的ETCD集群,此处我们在【master-225】机器中操作。 步骤 01.【master-225】创建一个配置与相关文件存放的目录, 以及下载获取cfssl工具进行CA证书制作与签发(cfssl工具往期文章参考地址:https://blog.weiyigeek.top/2019/10-21-12.html#3-CFSSL-生成 )。 # 工作目录创建mkdir -vp /app/k8s-init-work && cd /app/k8s-init-work# cfssl 最新下载地址: https://github.com/cloudflare/cfssl/releases# cfssl 相关工具拉取 (如果拉取较慢,建议使用某雷下载,然后上传到服务器里)curl -L https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssl_1.6.1_linux_amd64 -o /usr/local/bin/cfsslcurl -L https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssljson_1.6.1_linux_amd64 -o /usr/local/bin/cfssljsoncurl -L https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssl-certinfo_1.6.1_linux_amd64 -o /usr/local/bin/cfssl-certinfo# 赋予执行权限chmod +x /usr/local/bin/cfssl*/app# cfssl version# Version: 1.2.0# Revision: dev# Runtime: go1.6温馨提示: cfssl : CFSSL 命令行工具 cfssljson : 用于从cfssl程序中获取JSON输出并将证书、密钥、证书签名请求文件CSR和Bundle写入到文件中, 步骤 02.利用上述 cfssl 工具创建 CA 证书。 # - CA 证书签名请求配置文件fssl print-defaults csr >ca-csr.jsontee ca-csr.json<<"EOF"{ "CN": "kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "ChongQing", "ST": "ChongQing", "O": "k8s", "OU": "System" } ], "ca": { "expiry": "87600h" }}EOF# 关键参数解析:CN: Common Name,浏览器使用该字段验证网站是否合法,一般写的是域名,非常重要。浏览器使用该字段验证网站是否合法key:生成证书的算法hosts:表示哪些主机名(域名)或者IP可以使用此csr申请的证书,为空或者""表示所有的都可以使用(本例中没有`"hosts": [""]`字段)names:常见属性设置 * C: Country, 国家 * ST: State,州或者是省份 * L: Locality Name,地区,城市 * O: Organization Name,组织名称,公司名称(在k8s中常用于指定Group,进行RBAC绑定) * OU: Organization Unit Name,组织单位名称,公司部门# - CA 证书策略配置文件cfssl print-defaults config >ca-config.jsontee ca-config.json<<"EOF"{ "signing": { "default": { "expiry": "87600h" }, "profiles": { "kubernetes": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] }, "etcd": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } }}EOF# 关键参数解析:default 默认策略,指定了证书的默认有效期是10年(87600h)profile 自定义策略配置 * kubernetes:表示该配置(profile)的用途是为kubernetes生成证书及相关的校验工作 * signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE * server auth:表示可以该CA 对 server 提供的证书进行验证 * client auth:表示可以用该 CA 对 client 提供的证书进行验证 * expiry:也表示过期时间,如果不写以default中的为准# - 执行cfssl gencert 命令生成CA证书# 利用CA证书签名请求配置文件 ca-csr.json 生成CA证书和CA私钥和CSR(证书签名请求):cfssl gencert -initca ca-csr.json | cfssljson -bare ca # 2022/04/27 16:49:37 [INFO] generating a new CA key and certificate from CSR # 2022/04/27 16:49:37 [INFO] generate received request # 2022/04/27 16:49:37 [INFO] received CSR # 2022/04/27 16:49:37 [INFO] generating key: rsa-2048 # 2022/04/27 16:49:37 [INFO] encoded CSR # 2022/04/27 16:49:37 [INFO] signed certificate with serial number 245643466964695827922023924375276493244980966303$ ls # ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem$ openssl x509 -in ca.pem -text -noout | grep "Not" # Not Before: Apr 27 08:45:00 2022 GMT # Not After : Apr 24 08:45:00 2032 GMT温馨提示: 如果将 expiry 设置为87600h 表示证书过期时间为十年。 步骤 03.配置ETCD证书相关文件以及生成其证书, # etcd 证书请求文件tee etcd-csr.json<<"EOF"{ "CN": "etcd", "hosts": [ "127.0.0.1", "10.10.107.223", "10.10.107.224", "10.10.107.225", "etcd1", "etcd2", "etcd3" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "ChongQing", "ST": "ChongQing", "O": "etcd", "OU": "System" } ]}EOF# 利用ca证书签发生成etcd证书cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=etcd etcd-csr.json | cfssljson -bare etcd$ ls etcd*etcd.csr etcd-csr.json etcd-key.pem etcd.pem$ openssl x509 -in etcd.pem -text -noout | grep "X509v3 Subject Alternative Name" -A 1 # X509v3 Subject Alternative Name: # DNS:etcd1, DNS:etcd2, DNS:etcd3, IP Address:127.0.0.1, IP Address:10.10.107.223, IP Address:10.10.107.224, IP Address:10.10.107.225步骤 04.【所有Master节点主机】下载部署ETCD集群, 首先我们需要下载etcd软件包, 可以 Github release 找到最新版本的etcd下载路径(https://github.com/etcd-io/etcd/releases/)。 # 下载wget -L https://github.com/etcd-io/etcd/releases/download/v3.5.4/etcd-v3.5.4-linux-amd64.tar.gztar -zxvf etcd-v3.5.4-linux-amd64.tar.gzcp -a etcd* /usr/local/bin/# 版本 etcd --version # etcd Version: 3.5.4 # Git SHA: 08407ff76 # Go Version: go1.16.15 # Go OS/Arch: linux/amd64# 复制到其它master主机上scp -P 20211 ./etcd-v3.5.4-linux-amd64.tar.gz weiyigeek@master-223:~scp -P 20211 ./etcd-v3.5.4-linux-amd64.tar.gz weiyigeek@master-224:~# 分别在master-223与master-224执行, 解压到 /usr/local/ 目录同样复制二进制文件到 /usr/local/bin/tar -zxvf /home/weiyigeek/etcd-v3.5.4-linux-amd64.tar.gz -C /usr/local/cp -a /usr/local/etcd-v3.5.4-linux-amd64/etcd* /usr/local/bin/温馨提示: etcd 官网地址 (https://etcd.io/)

步骤 05.创建etcd集群所需的配置文件。 # 证书准备mkdir -vp /etc/etcd/pki/cp *.pem /etc/etcd/pki/ls /etc/etcd/pki/ # ca-key.pem ca.pem etcd-key.pem etcd.pem# 上传到~家目录,并需要将其复制到 /etc/etcd/pki/ 目录中scp -P 20211 *.pem weiyigeek@master-224:~scp -P 20211 *.pem weiyigeek@master-223:~ # ****************** [ 安全登陆 (Security Login) ] ***************** # Authorized only. All activity will be monitored and reported.By Security Center. # ca-key.pem 100% 1675 3.5MB/s 00:00 # ca.pem 100% 1375 5.2MB/s 00:00 # etcd-key.pem 100% 1679 7.0MB/s 00:00 # etcd.pem 100% 1399 5.8MB/s 00:00# master-225 执行tee /etc/etcd/etcd.conf<<"EOF"# [成员配置]# member 名称ETCD_NAME=etcd1# 存储数据的目录(注意需要建立)ETCD_DATA_DIR="/var/lib/etcd/data"# 用于监听客户端etcdctl或者curl连接ETCD_LISTEN_CLIENT_URLS="https://10.10.107.225:2379,https://127.0.0.1:2379"# 用于监听集群中其它member的连接ETCD_LISTEN_PEER_URLS="https://10.10.107.225:2380"# [证书配置]# ETCD_CERT_FILE=/etc/etcd/pki/etcd.pem# ETCD_KEY_FILE=/etc/etcd/pki/etcd-key.pem# ETCD_TRUSTED_CA_FILE=/etc/kubernetes/pki/ca.pem# ETCD_CLIENT_CERT_AUTH=true# ETCD_PEER_CLIENT_CERT_AUTH=true# ETCD_PEER_CERT_FILE=/etc/etcd/pki/etcd.pem# ETCD_PEER_KEY_FILE=/etc/etcd/pki/etcd-key.pem# ETCD_PEER_TRUSTED_CA_FILE=/etc/kubernetes/pki/ca.pem# [集群配置]# 本机地址用于通知客户端,客户端通过此IPs与集群通信;ETCD_ADVERTISE_CLIENT_URLS="https://10.10.107.225:2379"# 本机地址用于通知集群member与member通信ETCD_INITIAL_ADVERTISE_PEER_URLS="https://10.10.107.225:2380"# 描述集群中所有节点的信息,本member根据此信息去联系其他memberETCD_INITIAL_CLUSTER="etcd1=https://10.10.107.225:2380,etcd2=https://10.10.107.224:2380,etcd3=https://10.10.107.223:2380"# 集群状态新建集群时候设置为new,若是想加入某个已经存在的集群设置为existingETCD_INITIAL_CLUSTER_STATE=newEOF# master-224 执行tee /etc/etcd/etcd.conf<<"EOF"# [成员配置]# member 名称ETCD_NAME=etcd2# 存储数据的目录(注意需要建立)ETCD_DATA_DIR="/var/lib/etcd/data"# 用于监听客户端etcdctl或者curl连接ETCD_LISTEN_CLIENT_URLS="https://10.10.107.224:2379,https://127.0.0.1:2379"# 用于监听集群中其它member的连接ETCD_LISTEN_PEER_URLS="https://10.10.107.224:2380"# [集群配置]# 本机地址用于通知客户端,客户端通过此IPs与集群通信;ETCD_ADVERTISE_CLIENT_URLS="https://10.10.107.224:2379"# 本机地址用于通知集群member与member通信ETCD_INITIAL_ADVERTISE_PEER_URLS="https://10.10.107.224:2380"# 描述集群中所有节点的信息,本member根据此信息去联系其他memberETCD_INITIAL_CLUSTER="etcd1=https://10.10.107.225:2380,etcd2=https://10.10.107.224:2380,etcd3=https://10.10.107.223:2380"# 集群状态新建集群时候设置为new,若是想加入某个已经存在的集群设置为existingETCD_INITIAL_CLUSTER_STATE=newEOF# master-223 执行tee /etc/etcd/etcd.conf<<"EOF"# [成员配置]# member 名称ETCD_NAME=etcd3# 存储数据的目录(注意需要建立)ETCD_DATA_DIR="/var/lib/etcd/data"# 用于监听客户端etcdctl或者curl连接ETCD_LISTEN_CLIENT_URLS="https://10.10.107.223:2379,https://127.0.0.1:2379"# 用于监听集群中其它member的连接ETCD_LISTEN_PEER_URLS="https://10.10.107.223:2380"# [集群配置]# 本机地址用于通知客户端,客户端通过此IPs与集群通信;ETCD_ADVERTISE_CLIENT_URLS="https://10.10.107.223:2379"# 本机地址用于通知集群member与member通信ETCD_INITIAL_ADVERTISE_PEER_URLS="https://10.10.107.223:2380"# 描述集群中所有节点的信息,本member根据此信息去联系其他memberETCD_INITIAL_CLUSTER="etcd1=https://10.10.107.225:2380,etcd2=https://10.10.107.224:2380,etcd3=https://10.10.107.223:2380"# 集群状态新建集群时候设置为new,若是想加入某个已经存在的集群设置为existingETCD_INITIAL_CLUSTER_STATE=newEOF步骤 06.【所有Master节点主机】创建配置 etcd 的 systemd 管理配置文件,并启动其服务。 mkdir -vp /var/lib/etcd/cat >/usr/lib/systemd/system/etcd.service<步骤 07.【所有Master节点主机】查看各个master节点的etcd集群服务是否正常及其健康状态。 # 服务查看systemctl status etcd.service# 利用 etcdctl 工具查看集群成员信息export ETCDCTL_API=3etcdctl --endpoints=https://10.10.107.225:2379,https://10.10.107.224:2379,https://10.10.107.223:2379 --cacert="/etc/etcd/pki/ca.pem" --cert="/etc/etcd/pki/etcd.pem" --key="/etc/etcd/pki/etcd-key.pem" --write-out=table member list # +------------------+---------+-------+----------------------------+----------------------------+------------+ # | ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER | # +------------------+---------+-------+----------------------------+----------------------------+------------+ # | 144934d02ad45ec7 | started | etcd3 | https://10.10.107.223:2380 | https://10.10.107.223:2379 | false | # | 2480d95a2df867a4 | started | etcd2 | https://10.10.107.224:2380 | https://10.10.107.224:2379 | false | # | 2e8fddd3366a3d88 | started | etcd1 | https://10.10.107.225:2380 | https://10.10.107.225:2379 | false | # +------------------+---------+-------+----------------------------+----------------------------+------------+# 集群节点信息etcdctl --endpoints=https://10.10.107.225:2379,https://10.10.107.224:2379,https://10.10.107.223:2379 --cacert="/etc/etcd/pki/ca.pem" --cert="/etc/etcd/pki/etcd.pem" --key="/etc/etcd/pki/etcd-key.pem" --write-out=table endpoint status # +----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ # | ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS | # +----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ # | https://10.10.107.225:2379 | 2e8fddd3366a3d88 | 3.5.4 | 20 kB | false | false | 3 | 12 | 12 | | # | https://10.10.107.224:2379 | 2480d95a2df867a4 | 3.5.4 | 20 kB | true | false | 3 | 12 | 12 | | # | https://10.10.107.223:2379 | 144934d02ad45ec7 | 3.5.4 | 20 kB | false | false | 3 | 12 | 12 | | # +----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+# 集群节点健康状态etcdctl --endpoints=https://10.10.107.225:2379,https://10.10.107.224:2379,https://10.10.107.223:2379 --cacert="/etc/etcd/pki/ca.pem" --cert="/etc/etcd/pki/etcd.pem" --key="/etc/etcd/pki/etcd-key.pem" --write-out=table endpoint health # +----------------------------+--------+-------------+-------+ # | ENDPOINT | HEALTH | TOOK | ERROR | # +----------------------------+--------+-------------+-------+ # | https://10.10.107.225:2379 | true | 9.151813ms | | # | https://10.10.107.224:2379 | true | 10.965914ms | | # | https://10.10.107.223:2379 | true | 11.165228ms | | # +----------------------------+--------+-------------+-------+# 集群节点性能测试etcdctl --endpoints=https://10.10.107.225:2379,https://10.10.107.224:2379,https://10.10.107.223:2379 --cacert="/etc/etcd/pki/ca.pem" --cert="/etc/etcd/pki/etcd.pem" --key="/etc/etcd/pki/etcd-key.pem" --write-out=tableendpoint check perf# 59 / 60 Boooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooom ! 98.33%PASS: Throughput is 148 writes/s# Slowest request took too long: 1.344053s# Stddev too high: 0.143059s# FAIL

5.Containerd 运行时安装部署

步骤 01.【所有节点】在各主机中安装二进制版本的 containerd.io 运行时服务,Kubernertes 通过 CRI 插件来连接 containerd 服务中, 控制容器的生命周期。 # 从 Github 中下载最新的版本的 cri-containerd-cni wget -L https://github.com/containerd/containerd/releases/download/v1.6.4/cri-containerd-cni-1.6.4-linux-amd64.tar.gz# 解压到当前cri-containerd-cni目录中。mkdir -vp cri-containerd-cnitar -zxvf cri-containerd-cni-1.6.4-linux-amd64.tar.gz -C cri-containerd-cni步骤 02.查看其文件以及配置文件路径信息。 $ tree ./cri-containerd-cni/.├── etc│ ├── cni│ │ └── net.d│ │ └── 10-containerd-net.conflist│ ├── crictl.yaml│ └── systemd│ └── system│ └── containerd.service├── opt│ ├── cni│ │ └── bin│ │ ├── bandwidth│ │ ├── bridge│ │ ├── dhcp│ │ ├── firewall│ │ ├── host-device│ │ ├── host-local│ │ ├── ipvlan│ │ ├── loopback│ │ ├── macvlan│ │ ├── portmap│ │ ├── ptp│ │ ├── sbr│ │ ├── static│ │ ├── tuning│ │ ├── vlan│ │ └── vrf│ └── containerd│ └── cluster│ ├── gce│ │ ├── cloud-init│ │ │ ├── master.yaml│ │ │ └── node.yaml│ │ ├── cni.template│ │ ├── configure.sh│ │ └── env│ └── version└── usr └── local ├── bin │ ├── containerd │ ├── containerd-shim │ ├── containerd-shim-runc-v1 │ ├── containerd-shim-runc-v2 │ ├── containerd-stress │ ├── crictl │ ├── critest │ ├── ctd-decoder │ └── ctr └── sbin └── runc# 然后在所有节点上复制到上述文件夹到对应目录中cd ./cri-containerd-cni/cp -r etc/ /cp -r opt/ /cp -r usr/ /步骤 03.【所有节点】进行containerd 配置创建并修改 config.toml . mkdir -vp /etc/containerd# 默认配置生成containerd config default >/etc/containerd/config.tomlls /etc/containerd/config.toml # /etc/containerd/config.toml# pause 镜像源sed -i "s#k8s.gcr.io/pause#registry.cn-hangzhou.aliyuncs.com/google_containers/pause#g" /etc/containerd/config.toml# 使用 SystemdCgroupsed -i "s#SystemdCgroup = false#SystemdCgroup = true#g" /etc/containerd/config.toml# docker.io mirrorsed -i "/registry.mirrors]/a [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]" /etc/containerd/config.tomlsed -i "/registry.mirrors."docker.io"]/a endpoint = ["https://xlx9erfu.mirror.aliyuncs.com","https://docker.mirrors.ustc.edu.cn"]" /etc/containerd/config.toml# gcr.io mirrorsed -i "/registry.mirrors]/a [plugins."io.containerd.grpc.v1.cri".registry.mirrors."gcr.io"]" /etc/containerd/config.tomlsed -i "/registry.mirrors."gcr.io"]/a endpoint = ["https://gcr.mirrors.ustc.edu.cn"]" /etc/containerd/config.toml# k8s.gcr.io mirrorsed -i "/registry.mirrors]/a [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]" /etc/containerd/config.tomlsed -i "/registry.mirrors."k8s.gcr.io"]/a endpoint = ["https://gcr.mirrors.ustc.edu.cn/google-containers/","https://registry.cn-hangzhou.aliyuncs.com/google_containers/"]" /etc/containerd/config.toml# quay.io mirrorsed -i "/registry.mirrors]/a [plugins."io.containerd.grpc.v1.cri".registry.mirrors."quay.io"]" /etc/containerd/config.tomlsed -i "/registry.mirrors."quay.io"]/a endpoint = ["https://quay.mirrors.ustc.edu.cn"]" /etc/containerd/config.toml步骤 04.客户端工具 runtime 与 镜像 端点配置: # 手动设置临时生效# crictl config runtime-endpoint /run/containerd/containerd.sock# /run/containerd/containerd.sock # 配置文件设置永久生效cat【master#weiyigeek.top】或者个人公众号【WeiyiGeek】联系我。 更多文章来源于【WeiyiGeek Blog 个人博客 - 为了能到远方,脚下的每一步都不能少】 个人主页: 【https://weiyigeek.top】 博客地址: 【https://blog.weiyigeek.top】 专栏书写不易,如果您觉得这个专栏还不错的,请给这篇专栏【点个赞、投个币、收个藏、关个注,转个发,留个言】(人间六大情),这将对我的肯定,谢谢!。echo "【点个赞】,动动你那粗壮的拇指或者芊芊玉手,亲!"printf("%s", "【投个币】,万水千山总是情,投个硬币行不行,亲!")fmt.Printf("【收个藏】,阅后即焚不吃灰,亲!")console.info("【转个发】,让更多的志同道合的朋友一起学习交流,亲!")System.out.println("【关个注】,后续浏览查看不迷路哟,亲!")cout<< "【留个言】,文章写得好不好、有没有错误,一定要留言哟,亲! "<< endl;往期相关文章记一次在k8s集群搭建的Harbor私有仓库无法提供服务之镜像迁移恢复实践 K9s之Kubernetes集群管理交互工具实践 K9s之Kuberntes集群管理交互工具实践 3.Containerd容器运行时的配置浅析与知识扩充实践 4.如何使用nerdctl工具并配合Containerd容器运行时来替代Docker容器环境WeiyiGeekAlways keep a beginner"s mind, don"t forget the beginner"s mind. Blog :【https://weiyigeek.top】 174篇原创内容

好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!

用户评论

墨城烟柳

太棒了!终于有动手实践教程了,我的k8s基础稍微薄弱一点。

    有16位网友表示赞同!

桃洛憬

一直想着学一套高可用的 Kubernetes 集群环境,这个教程太及时了!

    有11位网友表示赞同!

孤者何惧

v1.23.6 版本的 K8S 很好用吗?有没有升级需要注意的地方?

    有9位网友表示赞同!

景忧丶枫涩帘淞幕雨

二进制部署方式确实比较直接,可以快速起来!希望教程详细介绍一下步骤。

    有6位网友表示赞同!

白恍

手把手教学一直是最实用的一种学习方式,期待后续详解。

    有16位网友表示赞同!

绳情

我之前看了一些 Kubernetes 的配置文档,感觉还是有点懵,这个教程应该更容易理解。

    有16位网友表示赞同!

落花忆梦

部署 K8S 集群确实比较复杂,需要一定的 Linux 基础知识吧?

    有9位网友表示赞同!

凉笙墨染

平时学习 Kubernetes 都是跟着博客看,一个真实的实践教程很有用!

    有19位网友表示赞同!

人心叵测i

希望这个教程能够详细解释集群高可用性的实现机制。

    有8位网友表示赞同!

杰克

之前一直担心学习 Kubernetes 会比较困难,这个手把手教程应该能帮助我入门。

    有9位网友表示赞同!

揉乱头发

学习完这个教程我可以自己搭建一个 K8S 集群来实践吗?

    有11位网友表示赞同!

抚笙

部署过程中的常见问题有哪些?希望教程能够提供解决方法。

    有19位网友表示赞同!

你tm的滚

Kubernetes 高可用性很重要,这个教程值得我好好关注!

    有18位网友表示赞同!

玩味

我已经开始学习 Kubernetes 了,这个教程可以帮我巩固我的学习成果。

    有9位网友表示赞同!

﹏櫻之舞﹏

期待后续的实践步骤讲解,希望能一步一步地跟着做出来!

    有15位网友表示赞同!

暮光薄凉

我觉得掌握 K8S 操作技巧对以后的工作非常有帮助!

    有14位网友表示赞同!

命里缺他

感谢作者分享这套手把手教学教程!期待深入了解Kubernetes.

    有5位网友表示赞同!

你瞒我瞒

这个教程能让我更好地理解 Kubernetes 的部署工作流程。

    有9位网友表示赞同!

你的眸中有星辰

学习完这个教程,我相信我可以自信地搭建一个 K8S 集群了!

    有12位网友表示赞同!

【深入掌握K8S集群部署:手把手教你实现v1.23.6版本高可用集群搭建教程(上篇)】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:那些书名被低估的佳作:一读开头便难以自拔,阅读体验堪称上乘 下一篇:要有光读书会 · 呆子4/60——《干法》深度解析