从零开始搭建高可用的k8s集群
一、环境准备
使用Hyper-V虚拟机功能搭建三台Centos虚拟机系统,配置好静态IP,分别为k8s-node1(192.168.0.8),k8s-node2(192.168.0.9),k8s-node3(192.168.0.10)。系统安装成功后配置root远程登录功能,以便使用ssh客户端工具链接。
初始化系统设置:
◉分配固定IP :设置虚拟机固定IP的方式比较多,本方案采用设置虚拟的MAC地址为静态ID,然后在路由器中为MAC分配固定IP。
◉开启SSH远程登录:运行命令" yum install openssh-server "安装ssh服务端工具,安装完成后运行命令" systemctl enable sshd.service "设置开启自启动, 运行命令" vim /etc/ssh/sshd_config "编辑配置文件,设置如下:
◉修改IPV6为IPV4:centos默认使用ipv6的方式,我们需要修改为ipv4模式来实现ssh客户端的远程连接,具体方法是 cd到 /etc/sysconfig/network-scripts目录下,vim 编辑 ifcfg-eth1 文件,如图,设置IPV6INIT=no,ONBOOT=yes。
◉安装docker环境:完成以上步骤后,重启电脑即可使用ssh工具连接,复制命令" curl -sSL https://get.daocloud.io/docker | sh " 安装dockers环境。
◉设置docker开机自启:运行命令" systemctl enable docker " 将docker加入开机启动项。
◉配置docker镜像加速器:国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,此处以配置阿里云镜像加速器为例,登录https://cr.console.aliyun.com/,选择容器镜像服务-镜像工具-镜像加速器,如图所示,通过在/etc/docker/daemon.json文件中配置registry-mirrors属性来实现该功能:
◉设置防火墙规则:设置防火墙规则的目的是为了确保集群中的机器能够相互通信,本次集群直接使用命令" systemctl disable firewalld "关闭防火墙。
◉设置 /proc/sys/net/bridge目录下bridge-nf-call-iptables和bridge-nf-call-ip6tables文件的内容为1,确保的 Linux 节点的 iptables 正确查看桥接流量。
◉关闭Linux系统的交换分区:为了保证kubelet的正常运行,必须禁用swap交换分区。window平台上称为虚拟内存。在物理内存不够用时,操作系统会从物理内存中把部分暂时不被使用的数据转移到交换分区,从而为当前运行的程序留出足够的物理内存。运行命令" free -m "结果证明已经开启了交换分区,修改/etc/fstab文件,注释掉加载swap分区的这行记录,重启Linux系统即可。
二、安装K8S集群
完成以上步骤后,就可以进行k8s组件的安装了,我们需要三个必须的组件kubeadm、kubelet 和 kubectl,把他们安装到每台集群的机器上。其中kubeadm是引导我们创建集群的命令;kubelet 是集群中的所有机器上运行的组件,并执行诸如启动 pod 和容器之类的操作;kubectl是与集群对话的命令行工具。读者请注意,kubeadm不会为你安装或管理kubelet和kubectl,
因此你需要确保它们与control plane之间版本的匹配,如果不这样做,则存在版本偏差的风险,这可能导致意外的错误行为。
安装步骤:
1、配置k8s下载地址信息(配置为阿里云镜像,国外镜像很难下载成功),运行如下命令。
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF
2、运行如下命令安装三个组件。
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
3、设置kubelet的开机自启动:启动后kubelet会每隔几秒启动一次来探测kubeadm的命令。
systemctl enable kubelet && systemctl start kubelet
4、提前准备k8s集群必须的组件:在后续的kubeadm init命令中,他需要下载一些必须镜像,这些镜像可以通过 " kubeadm config images list "命令来查看,如图:
但是这些镜像默认是从国外源,在国内无法下载,因此有必要在此之前先使用国内源下载好这些镜像,此处使用阿里云镜像地址下载:
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.23.6
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.23.6
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.23.6
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.23.6
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.1-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
根据上面的命令把镜像都下载完成后,进行镜像复制,调用 " docker tag oldimages newimages "命令复制出满足kubeadm init的标准镜像,代码如下:
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.23.6 k8s.gcr.io/kube-apiserver:v1.23.6
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.23.6 k8s.gcr.io/kube-proxy:v1.23.6
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.23.6 k8s.gcr.io/kube-controller-manager:v1.23.6
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.23.6 k8s.gcr.io/kube-scheduler:v1.23.6
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6 k8s.gcr.io/coredns/coredns:v1.8.6
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.1-0 k8s.gcr.io/etcd:3.5.1-0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 k8s.gcr.io/pause:3.6
执行完成所有复制命令后,docker images查看镜像,发现需要的镜像已准备好,列表如下:
5、使用kubeadm来引导我们创建集群。首先运行 " kubeadm init [arg]"命令,会进行一系列预检查以确保机器已准备好运行 Kubernetes。这些预检查会显示警告并在错误时退出(遇到错误时需要根据具体输出日志解决错误)。然后下载并安装集群控制平面组件。 kubeadm init 包含一些指定参数,其参数说明下:
--apiserver-advertise-address string 设置 apiserver 绑定的 IP.
--apiserver-bind-port int32 设置apiserver 监听的端口. (默认 6443)
--control-plane-endpoint string 设置控制平面的端点(matser控制节点的IP或域名)
--apiserver-cert-extra-sans strings api证书中指定额外的Subject Alternative Names (SANs) 可以是IP 也可以是DNS名称。 证书是和SAN绑定的。
--cert-dir string 证书存放的目录 (默认 "/etc/kubernetes/pki")
--certificate-key string kubeadm-cert secret 中 用于加密 control-plane 证书的key
--config string kubeadm 配置文件的路径.
--cri-socket string CRI socket 文件路径,如果为空 kubeadm 将自动发现相关的socket文件; 只有当机器中存在多个 CRI socket 或者 存在非标准 CRI socket 时才指定.
--dry-run 测试,并不真正执行;输出运行后的结果.
--feature-gates string 指定启用哪些额外的feature 使用 key=value 对的形式。
--help -h 帮助文档
--ignore-preflight-errors strings 忽略前置检查错误,被忽略的错误将被显示为警告. 例子: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks.
--image-repository string 选择拉取 control plane images 的镜像repo (default "k8s.gcr.io") ,国内一般无法直接从k8s.gcr.io获取,需要改为国内的代理地址
--kubernetes-version string 选择K8S版本. (default "stable-1")
--node-name string 指定node的名称,默认使用 node 的 hostname.
--pod-network-cidr string 指定 pod 的网络, control plane 会自动将 网络发布到其他节点的node,让其上启动的容器使用此网络
--service-cidr string 指定service 的IP 范围. (default "10.96.0.0/12"),不能与机器的IP段有重叠
--service-dns-domain string 指定 service 的 dns 后缀, e.g. "myorg.internal". (default "cluster.local")
--skip-certificate-key-print 不打印 control-plane 用于加密证书的key.
--skip-phases strings 跳过指定的阶段(phase)
--skip-token-print 不打印 kubeadm init 生成的 default bootstrap token
--token string 指定 node 和control plane 之间,简历双向认证的token ,格式为 [a-z0-9]{6}\.[a-z0-9]{16} - e.g. abcdef.0123456789abcdef
--token-ttl duration token 自动删除的时间间隔。 (e.g. 1s, 2m, 3h). 如果设置为 '0', token 永不过期 (default 24h0m0s)
--upload-certs 上传 control-plane 证书到 kubeadm-certs Secret.
本方案我们使用如下命令参数来初始化主控节点:
kubeadm init \
--apiserver-advertise-address=192.168.0.10 \
--control-plane-endpoint=192.168.0.10 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.168.0.0/16
执行以上命令,init 预检查到我的机器CUP和内存不满足性能要求,提示如下:此时需要关闭虚拟机,重新调整CPU核心数和内存大小。
继续运行命令,发现提示 " It seems like the kubelet isn't running or healthy. ",的错误,表示kubelet未能正常运行,通过查看kubelet的运行日志发现报错如下:
意思是因为kubelet cgroup驱动程序“systemd”与docker cgroup驱动程序“cgroupfs”不同,所以我们需要调整为相同。调整方式为修改docker cgroup的驱动程序为systemd(官方推荐用systemd),编辑/etc/docker/daemon.json文件,修改或增加 "exec-opts":["native.cgroupdriver=systemd"] 代码:
{
"registry-mirrors": ["https://yyipnm7g.mirror.aliyuncs.com"],
"exec-opts":["native.cgroupdriver=systemd"]
}
重启机器再次运行init命令(如果运行失败,提示某些端口被占用和某些文件已经存在,需要使用" kubeadm reset "重置后再运行)后,这可能会需要几分钟来完成组件的安装,安装成功后应该看到类似如下的输出:
屏幕输出中提示:
◉你的Kubernetes控制飞机已成功初始化。
◉要开始使用群集,您需要以普通用户身份运行以下操作:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
或者如果你是root用户,可以运行:
export KUBECONFIG=/etc/kubernetes/admin.conf
◉您应该在集群上部署一个pod网络,使用下列选项之一运行kubectl apply -f [podnetwork].yaml:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
选项提供了一个地址,这个地址包含了很多的网络插件,如图:
此处本人使用Calico插件,点击选项可能无法访问网址,无法下载其对应的yaml文件。使用如下命令下载yaml文件:
curl https://docs.projectcalico.org/manifests/calico.yaml -O
如果无法直接在Linux中下载,可以直接访问https://docs.projectcalico.org/manifests/calico.yaml下载后上传到主机。然后再使用命令:
kubectl apply -f calico.yaml
创建POD网络,如图所示,表示POD网络创建完成:
等待一段时间使用 " kubectl get nodes "查看节点状态,节点将由NotReady-->Ready,如图:
◉通过在每个节点上复制证书颁发机构和服务帐户密钥,然后以root用户身份运行以下操作,可以加入任意数量的控制平面节点:
kubeadm join 192.168.0.10:6443 --token zh274u.866t6kyo6cpxv40f \
--discovery-token-ca-cert-hash sha256:c87e21c58a669984cd9ae2bd46ba34976584d88948b2445a378b9b6b734641c8 \
--control-plane
◉通过root用户身份在每个节点上运行以下操作,可以加入任意数量的工作节点:
kubeadm join 192.168.0.10:6443 --token zh274u.866t6kyo6cpxv40f \
--discovery-token-ca-cert-hash sha256:c87e21c58a669984cd9ae2bd46ba34976584d88948b2445a378b9b6b734641c8
根据这些提示完成提示操作后,集群环境就搭建完成了,init成功后的这些提示建议保存,方便后续增加主节点和工作节点。最终查看集群状态结果如下:
三、在集群中部署应用
待续。。
从零开始搭建高可用的k8s集群的更多相关文章
- K8S 使用Kubeadm搭建高可用Kubernetes(K8S)集群 - 证书有效期100年
1.概述 Kubenetes集群的控制平面节点(即Master节点)由数据库服务(Etcd)+其他组件服务(Apiserver.Controller-manager.Scheduler...)组成. ...
- keepalived工作原理和配置说明 腾讯云VPC内通过keepalived搭建高可用主备集群
keepalived工作原理和配置说明 腾讯云VPC内通过keepalived搭建高可用主备集群 内网路由都用mac地址 一个mac地址绑定多个ip一个网卡只能一个mac地址,而且mac地址无法改,但 ...
- kubernetes教程第一章-kubeadm高可用安装k8s集群
目录 Kubeadm高可用安装k8s集群 kubeadm高可用安装1.18基本说明 k8s高可用架构解析 kubeadm基本环境配置 kubeadm基本组件安装 kubeadm集群初始化 高可用Mas ...
- 高可用的K8S集群部署方案
涉及到的内容 LVS HAProxy Harbor etcd Kubernetes (Master Worker) 整体拓补图 以上是最小生产可用的整体拓补图(相关节点根据需要进行增加,但不能减少) ...
- Kubernetes全栈架构师(Kubeadm高可用安装k8s集群)--学习笔记
目录 k8s高可用架构解析 Kubeadm基本环境配置 Kubeadm系统及内核升级 Kubeadm基本组件安装 Kubeadm高可用组件安装 Kubeadm集群初始化 高可用Master及Token ...
- Kubernetes实战指南(三十四): 高可用安装K8s集群1.20.x
@ 目录 1. 安装说明 2. 节点规划 3. 基本配置 4. 内核配置 5. 基本组件安装 6. 高可用组件安装 7. 集群初始化 8. 高可用Master 9. 添加Node节点 10. Cali ...
- Kubernetes全栈架构师(二进制高可用安装k8s集群部署篇)--学习笔记
目录 二进制高可用基本配置 二进制系统和内核升级 二进制基本组件安装 二进制生成证书详解 二进制高可用及etcd配置 二进制K8s组件配置 二进制使用Bootstrapping自动颁发证书 二进制No ...
- Kubernetes全栈架构师(二进制高可用安装k8s集群扩展篇)--学习笔记
目录 二进制Metrics&Dashboard安装 二进制高可用集群可用性验证 生产环境k8s集群关键性配置 Bootstrapping: Kubelet启动过程 Bootstrapping: ...
- 手动搭建高可用的kubernetes 集群
之前按照和我一步步部署 kubernetes 集群的步骤一步一步的成功的使用二进制的方式安装了kubernetes集群,在该文档的基础上重新部署了最新的v1.8.2版本,实现了kube-apiserv ...
随机推荐
- Spring容器 从XML 文件中读取bean的定义,并实例化bean?
解释Spring框架中bean的生命周期. Spring根据bean的定义填充所有的属性. 如果bean实现了BeanNameAware 接口,Spring 传递bean 的ID 到 setBeanN ...
- Java 中如何将字符串转换为整数?
String s="123"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法:i=Integer.valueOf(s).intValue();
- 什么是 AQS ?
AQS 是 AbustactQueuedSynchronizer 的简称,它是一个 Java 提高的底层同步工具类,用一个 int 类型的变量表示同步状态,并提供了一系列的 CAS 操作来管理这个同步 ...
- spring 支持哪些 ORM 框架 ?
Hibernate iBatis JPA JDO OJB
- [转载] Link prefetch
本来想翻译的但是有人翻译了,还是转过来吧.原文<HTML5 Link Prefetching>,译文<使用HTML5的页面资源预加载(Link prefetch)功能加速你的页面加载 ...
- Canvas 与 SVG
什么是SVG? 引用w3c的一段话就是: SVG 指可伸缩矢量图形 (Scalable Vector Graphics) SVG 用来定义用于网络的基于矢量的图形 SVG 使用 XML 格式定义图形 ...
- pushbutton 移动端弹出列表选择框
pushbutton 移动端弹出列表选择框 移动端从下往上推动画效果端弹出列表选择框,适应所有主流移动端机型,支持Node引入,require引入;如有用得不爽可以随时提意见,谢谢. demo地址: ...
- 简单vue项目脚手架
简单vue项目脚手架 github地址 使用技术栈 webpack(^2.6.1) webpack-dev-server(^2.4.5) vue(^2.3.3) vuex(^2.3.1) vue-ro ...
- snippet,让你编码效率翻倍
为什么谈到Snippet 今天下午在用vscode做小程序的时候,发现很不方便,因为商店里提供的代码片段极为有限,而且平时几乎每天都需要用到代码片段,所以就在思考他们是怎么做到给别人提供代码的,我可以 ...
- c++语法拾遗,一些细节与特性
写了2年多的C+STL的acmer,在学习<C++ primer>时总结的一些少见的语法特性与细节.总体还是和题目说的一样这是一篇 c++ 拾遗. 1 变量和基本类型 1.1 基本类型 1 ...