【云原生】搭建k8s高可用集群—更新于2023.04(下)

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 【云原生】搭建k8s高可用集群—更新于2023.04(下)

3. 所有节点安装Docker/kubeadm/kubelet


所有节点安装Docker/kubeadm/kubelet ,Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。

  • 安装之前确保没有其他dockers版本,如果有,需要删除干净后再安装,卸载方式可以参考这篇文章卸载docker。
  1. 安装Docker,所有master+node都要安装
# 下载docker的yum源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo 
# 安装docker,找上一步的yum源去安装
yum -y install docker-ce-18.06.1.ce-3.el7 
# 开机自启动并且启动docker
systemctl enable docker && systemctl start docker 
# 查看docker状态
systemctl status docker
# 查看docker版本
docker --version


# 设置docker拉取镜像的加速器
cat > /etc/docker/daemon.json << EOF 
{
 "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"] 
}
EOF
# 重启docker
systemctl daemon-reload
systemctl restart docker
  1. 添加阿里云yum源,所有节点(master+node)
cat >/etc/yum.repos.d/docker.repo<<EOF
[docker-ce-edge]
name=Docker CE Edge - \$basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/\$basearch/edge
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
EOF


# 重启docker
systemctl restart docker
  1. 添加kubernetes软件源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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
EOF


  1. 安装kubeadm,kubectl,kubelet
    由于版本更新频繁,这里指定版本号部署:
# 安装kubelet、kubeadm、kubectl,同时指定版本
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
# 启动并设置开机启动
systemctl start kubelet
systemctl enable kubelet


4. 部署Kubernetes Master


4.1 创建kubreadm配置文件

在具有vip的master上进行初始化操作,这里为master1

# 创建文件夹
mkdir /usr/local/kubernetes/manifests -p
# 到manifests目录
cd /usr/local/kubernetes/manifests/
# 新建yaml文件
vim kubeadm-config.yaml


下面内容修改IP 后复制进去

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: 192.168.2.200    #本机ip
  bindPort: 6443              #apiserver集群端口号
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: k8s-master1           #本机hostname
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  certSANs:
  - k8s-master1
  - k8s-master2
  - k8s-master3
  - 192.168.2.200  # master1 ip
  - 192.168.2.201  # master2 ip
  - 192.168.2.204  # master3 ip
  - 192.168.2.203     # 虚拟vip keepalive出来的ip
  - 127.0.0.1
  extraArgs:
    authorization-mode: Node,RBAC
  timeoutForControlPlane: 2m0s      # 注册时间2分钟
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes      # 集群名字
controlPlaneEndpoint: "192.168.2.203:16443"              # 虚拟ip + haproxy绑定的端口号
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.18.0               # 集群版本,需要与kubeadm版本一致
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16                 # pod 内网ip网段
  serviceSubnet: 10.96.0.0/12               # svc 内网ip网段
scheduler: {}


这里补充一个自动生成kubeadm-config.yaml文件的命令,生成模板后需要修改。kubeadm config print init-defaults > kubeadm-config.yaml.


4.2 在master1节点执行
kubeadm init --config kubeadm-config.yaml


执行完成后,就会在拉取镜像【需要等待…】


初始化节点

如果上面的yaml文件已经执行过一次,再次执行就会报错,这时,就需要将集群初始化后才能执行。


步骤:

# 1. 还原由 kubeadm init 或 kubeadm join 所做的更改
kubeadm reset -f
# 2. 删除相关文件
rm -rf /etc/kubernetes/*
rm -rf /var/lib/etcd/*


然后再次执行yaml文件即可。

按照执行出的结果提示配置环境变量,使用kubectl工具

# 执行下方命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 查看节点
kubectl get nodes
# 查看集群健康状态
kubectl get cs
# 查看pod
kubectl get pods -n kube-system


5fdcbaefdebd4c2cbbe221e8bd38aacd.png

a4fd409345764edd9ad98d27af92b2f0.png

由于没有安装网络插件,所以会有pending状态,无妨,继续往下执行就好了。

按照提示保存以下内容,一会要使用

kubeadm join k8s-vip:16443 --token ivcq40.a1bb605g6df4xhdw \
    --discovery-token-ca-cert-hash sha256:b65dcb57a2934439562ae138f552942600296edc04cdefb7da93031cf23c9a08 \
    --control-plane


–control-plane : 只有在添加master节点的时候才有


5. 安装集群网络

从官方地址获取到flannel的yaml,在master1上执行

# 创建文件夹
mkdir flannel
cd flannel
# 下载yaml文件
wget -c https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml


安装flannel网络,执行完apply之后需要等待一会,pending状态才会变成running。

kubectl apply -f kube-flannel.yml


检查,都已经running,且master已经ready。

kubectl get pods -n kube-system

b848ffe532ed4e8eb598fc1712c80f5a.png

2239cd7ff40d45d7b352eebcdc9adae6.png

6. master节点加入Kubernetes集群


6.1 复制密钥及相关文件

从master1复制密钥及相关文件到master2、master3

# master1中执行,修改IP,分别改为master2/3的IP执行2遍
ssh root@192.168.2.201 mkdir -p /etc/kubernetes/pki/etcd   # 修改IP;master2\master3的IP,用master1连接master2\master3;输入密码
# 复制相应的文件到master2/master3
scp /etc/kubernetes/admin.conf root@192.168.2.201:/etc/kubernetes
scp /etc/kubernetes/pki/{ca.*,sa.*,front-proxy-ca.*} root@192.168.2.201:/etc/kubernetes/pki
scp /etc/kubernetes/pki/etcd/ca.* root@192.168.2.201:/etc/kubernetes/pki/etcd


6.2 master2和master3加入到集群

在master2、master3上执行在master1上init后输出的join命令,需要带上参数–control-plane表示把master控制节点加入集群。

# master2&master上依次执行
kubeadm join k8s-vip:16443 --token ivcq40.a1bb605g6df4xhdw \
    --discovery-token-ca-cert-hash sha256:b65dcb57a2934439562ae138f552942600296edc04cdefb7da93031cf23c9a08 \
    --control-plane


按照提示执行输出的3行命令

29fa8dbad76240f7a962e2c7398fcfc7.png

在master1上检查状态

kubectl get nodes
kubectl get pods --all-namespaces


9cc5a56ae3e64f90b7081f3adb9652aa.png


7. node节点加入Kubernetes集群


向集群添加新节点,执行在kubeadm init输出的kubeadm join命令,不加参数–control-plane

# 在node1上执行
kubeadm join k8s-vip:16443 --token ivcq40.a1bb605g6df4xhdw \
    --discovery-token-ca-cert-hash sha256:b65dcb57a2934439562ae138f552942600296edc04cdefb7da93031cf23c9a08


提示:

#token是有时间期限的,如果过期了,执行如下命令获取后再执行。
kubectl create token --print-join-command
#补充一个生成certificate-key的命令
kubeadm init phase upload-certs --upload-certs

报错解决,没有错误继续往下

执行命令后,报错no such host,如下:

3df303ba01f94460a3bd7a474229f3a7.png

这时候,需要将node1节点里的hosts表里的内容保持与master节点一致,再次执行就可以了。

aee2b18165854142bf681d55eaa67675.png

1dc03f2e6c7e4714b5225b473a998aff.png

集群网络重新安装,因为添加了新的node节点

# 在master1节点上执行
 kubectl apply -f flannel/kube-flannel.yml


检查状态

kubectl get nodes
kubectl get pods --all-namespaces


8. 测试kubernetes集群

在Kubernetes集群中创建一个pod,验证是否正常运行:

# 创建nginx deployment
kubectl create deployment nginx --image=nginx
# 暴露端口
kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort
# 查看状态
kubectl get pod,svc

f106b1660cd24b728fd8afb0ace40081.png

然后通过任何一个master或node节点或者虚拟IP加上端口号,都能够访问nginx页面;如果想要通过域名访问服务,可以参考这篇文章。注意一定要在master节点上添加污点容忍,不然无法通过虚拟IP 对应域名进行访问。这里要用第二种方式部署ingress-controller。

82b10c92dba34fb09ad2f2c8f753e94f.png

9. 模拟

我们现在有3个master节点,1个node节点,经过上述测试,发现集群可以正常访问nginx服务,因为三台master在正常运行,我们现在模拟挂掉一台master,让另外2台master正常运行,看一下会有什么效果:

1、首先,先查看集群是否正常,执行kubectl get nodes命令,发现各个节点都处于ready状态

076c0c87d86043e6b1a11f71c0bf9823.png

2、我们现在把master3这台服务器关掉,再看集群状态,关掉一会之后,发现master3节点状态变成了NotReady。

0342b3f68c104fbe8a61ad664f1c436b.png

我们再使用其他节点的IP加上端口号访问nginx试一下,发现可以正常访问;如果使用master3节点的IP加端口号就无法访问nginx,是因为master3服务器已经关闭。

828320dc0e214d96854de26f5af96495.png

3、到现在为止,我们有2台正在运行的master,现在我们再关闭一台master,把master2也关掉,只留一台master,试一下会怎么样?

关闭前的状态:

dcfc3e4e11d24bc1b976875b8b2bbe97.png

关闭后再次执行kubectl get nodes命令,发现报错了,显示无法连接到服务器。

cb0e79cc929047b88910d3e9cd7b9f0b.png

虽然这时候在访问nginx还是可以正常访问,但是此时的集群已经坏掉了。

所以,如果有3个master节点,必须要保证2个正常运行;如果有5个master,必须保证3个正常运行。假设有N个master节点,必须保证有(N+1)/2个节点正常运行,才能保证集群正常。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
9天前
|
存储 Kubernetes 负载均衡
CentOS 7.9二进制部署K8S 1.28.3+集群实战
本文详细介绍了在CentOS 7.9上通过二进制方式部署Kubernetes 1.28.3+集群的全过程,包括环境准备、组件安装、证书生成、高可用配置以及网络插件部署等关键步骤。
72 3
CentOS 7.9二进制部署K8S 1.28.3+集群实战
|
9天前
|
Kubernetes 负载均衡 前端开发
二进制部署Kubernetes 1.23.15版本高可用集群实战
使用二进制文件部署Kubernetes 1.23.15版本高可用集群的详细教程,涵盖了从环境准备到网络插件部署的完整流程。
18 2
二进制部署Kubernetes 1.23.15版本高可用集群实战
|
7天前
|
Kubernetes 监控 Cloud Native
Cluster Optimizer:一款云原生集群优化平台
**Cluster Optimizer** 是一款云原生集群优化平台,旨在通过自动化和智能化工具帮助企业降低云成本,解决云原生架构中的成本管理难题。面对资源闲置、配置不当和缺乏自动化优化机制等挑战,Cluster Optimizer能够深入分析云资源、应用和用户行为,精准识别优化机会,并给出具体建议,涵盖节点组、节点、GPU 节点、磁盘、持久卷和应用等多个维度。通过优化实例类型、自动扩缩容和资源分配,帮助企业降低成本、提升性能和效率。[点击此处](https://www.wiseinf.com.cn/docs/setup/) 免费安装和试用 **Cluster Optimizer 社区版**。
67 9
|
5天前
|
Kubernetes 监控 Cloud Native
云原生入门:Kubernetes 集群部署与管理
【8月更文挑战第38天】在数字化浪潮中,云原生技术如同翱翔的雄鹰,引领着企业飞向灵活高效的未来。本文将带你一探究竟,从Kubernetes的基础概念到实际操作,深入浅出地介绍如何在云端构建和管理你的容器化应用。我们将一步步搭建起一个小型的Kubernetes集群,并通过代码示例和图解,让你轻松掌握云原生世界的钥匙。让我们一起开启这趟技术之旅,探索云原生的秘密花园,找到那把打开创新之门的金钥匙。
|
8天前
|
存储 Kubernetes 测试技术
k8s使用pvc,pv,sc关联ceph集群
文章介绍了如何在Kubernetes中使用PersistentVolumeClaim (PVC)、PersistentVolume (PV) 和StorageClass (SC) 来关联Ceph集群,包括创建Ceph镜像、配置访问密钥、删除默认存储类、编写和应用资源清单、创建资源以及进行访问测试的步骤。同时,还提供了如何使用RBD动态存储类来关联Ceph集群的指南。
24 7
|
8天前
|
存储 Kubernetes 数据安全/隐私保护
k8s对接ceph集群的分布式文件系统CephFS
文章介绍了如何在Kubernetes集群中使用CephFS作为持久化存储,包括通过secretFile和secretRef两种方式进行认证和配置。
19 5
|
9天前
|
Kubernetes 负载均衡 应用服务中间件
kubeadm快速构建K8S1.28.1高可用集群
关于如何使用kubeadm快速构建Kubernetes 1.28.1高可用集群的详细教程。
25 2
|
9天前
|
Kubernetes Linux API
CentOS 7.6使用kubeadm部署k8s 1.17.2测试集群实战篇
该博客文章详细介绍了在CentOS 7.6操作系统上使用kubeadm工具部署kubernetes 1.17.2版本的测试集群的过程,包括主机环境准备、安装Docker、配置kubelet、初始化集群、添加节点、部署网络插件以及配置k8s node节点管理api server服务器。
37 0
CentOS 7.6使用kubeadm部署k8s 1.17.2测试集群实战篇
|
4天前
|
运维 Cloud Native 云计算
云原生之旅:从容器化到微服务架构的演进之路
在数字化浪潮中,云原生技术如同星辰大海中的灯塔,为航船指引方向。本文将带你穿梭于云计算的世界,探索从容器化技术到微服务架构的变革旅程。我们将一窥云原生如何助力企业灵活应对快速变化的市场需求,以及在这一过程中,开发者和运维人员是如何成为时代变革的弄潮儿。让我们一同启航,驶向云原生的广阔天地。
|
1天前
|
运维 Cloud Native 云计算
云原生之旅:从容器化到微服务架构
【9月更文挑战第9天】在数字化转型的浪潮中,云原生技术成为推动企业IT革新的关键力量。本文将通过浅显易懂的语言和生动的比喻,带领读者探索云原生的核心概念、关键技术及实践路径,揭示如何在云计算时代构建灵活、高效、可靠的应用系统。你将了解到,正如甘地所言“你必须成为你希望在世界上看到的改变”,在云原生的世界里,每一位开发者和技术决策者都扮演着塑造未来的角色。