使用Kubeadm进行Kubernetes集群部署

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 本文记录了使用Kubeadm进行Kubernetes集群部署的过程。

使用Kubeadm进行Kubernetes集群部署

1. 系统配置

虚拟机版本:VMware Workstation Pro 17

虚拟机镜像版本:CentOS Linux release 7.9.2009 (Core)

Docker版本:ce-20.10.11

Kubernetes版本:1.18.0

2. 部署方式
  • Kubeadm

使用Kubeadm可以通过Master节点的init和工作节点的join快速构建集群,但是由于包装程度较高,所以不方便进行更底层的配置,细节屏蔽了很多,出现问题排查起来比较困难。

  • 二进制包

在官网下载相关部件的二进制包,然后手动进行每个部件的配置和部署。虽然比较复杂,但是这种方法可控性上较好。可以在尝试了Kubeadm的部署后再尝试二进制包的部署。

3. 部署过程

3.1 Linux 配置

集群包括一台主机和两台节点机,需要三台机器的SSH互通并且可以连接到外网。

tip:使用Xshell软件的“发送键入到所有会话”能够方便地同时在三台机器上进行配置。

# 关闭防火墙
systemctl stop firewalld # 临时关闭
systemctl disable firewalld # 永久关闭

# 关闭selinux
setenforce 0 # 临时关闭
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久关闭

# 关闭swap分区
swapoff -a # 临时关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久关闭

# 给机器设置主机名,三台机器需要各自设置
hostnamectl set-hostname <your-host-name>

# 添加hosts文件
cat >> /etc/hosts << EOF
ip1 k8s-master
ip2 k8s-node1
ip3 k8s-node2

# 将桥接的IPv4流量传递到iptables链进行处理
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system # 使配置生效

# 时间同步
yum install -y ntpdate # 软件安装
ntpdate time.windows.com # 时间同步

3.2 Kubernetes 安装过程

K8s默认使用Docker作为容器组件,所以需要安装Docker:

# 获取Docker镜像仓库yum源
yum install -y wget
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

# 避免版本不兼容问题,这里安装Kubernetes官方验证的最新版本v20.10
# 版本兼容很重要,如果docker和kubernetes部件都默认安装最新稳定版,会出现版本不兼容导致Master节点无法初始化的问题,单独降低docker或Kubernetes的版本也不足够,最好查询某两个版本的兼容性。
yum install -y docker-ce-20.10.11
# 启动Docker
systemctl start docker
# 设置开机自启动
systemctl enable docker

安装好Docker之后,配置Docker的镜像下载加速,这里使用了阿里云的镜像加速:

mkdir -p /etc/docker
# <code> 可以登录自己的阿里云镜像服务查看(免费)
tee /etc/docker/daemon.json <<- 'EOF'
{
  "registry-mirrors": ["https://<code>.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"] # k8s推荐使用的Linux管理部件,默认是cgroupfs
}
EOF
# 重新加载
systemctl daemon-reload
systemctl restart docker

安装kubeadm、kubelet和kubectl组件:

# 添加kubernetes的yum源
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

# 安装kubeadm、kubelet、kubectl
# 这里选择1.18.0版本,避免新版本不兼容问题
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
# 自启动kubelet服务
systemctl enable kubelet

【Master节点执行】初始化

kubeadm init \
--apiserver-advertise-address=<ip> \ # 主机ip
--image-repository registry.aliyuncs.com/google_containers \ # 阿里云镜像仓库地址
--kubernetes-version v1.18.0 \ # k8s版本
--service-cidr=10.96.0.0/12 \ # 不可被分配给容器或pod的虚拟ip范围(默认)
--pod-network-cidr=10.244.0.0/16 # 可以被分配给pod的虚拟ip范围(默认)
--ignore-preflight-errors=all # 忽略预检错误

初始化命令完成之后会出现类似的下面的语句,需要保存,后面会用到:

kubeadm join <ip>:<port> --token xi80xq.xxxx \
    --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxad8534909xxxxxxxxf39xxxxxxxx63fbee95bdcxxxxxxxxxxxx

使用 kubectl 工具查看节点:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 此时主机的状态是"NotReady"
kubectl get nodes

【Node 节点执行】加入集群

# 将刚刚保存的"kubeadm join xxx"输入即可

在master查看节点可以看到新加入了node:

kubectl get nodes
NAME             STATUS     ROLES    AGE     VERSION
k8s-master-new   NotReady   master   7m21s   v1.18.0
k8s-node1        NotReady   <none>   21s     v1.18.0
k8s-node2        NotReady   <none>   22s     v1.18.0

部署 CNI 网络插件

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml # 部署完之后由于需要初始化,所以节点短时间内会处于NotReady的状态,准备完成之后节点会转换为Ready状态

可以尝试拉取 nginx 镜像到 pod 中运行:

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort # NodePort表示对外暴露接口

# 查看相关信息
kubectl get pod
kubectl get svc # 可以看到对外暴露的接口
kubectl get deployment

最后可以在浏览器中输入 master.ip:port 查看Nginx界面。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
5天前
|
Kubernetes 监控 负载均衡
深入云原生:Kubernetes 集群部署与管理实践
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其弹性、可扩展性成为企业IT架构的首选。本文将引导你了解如何部署和管理一个Kubernetes集群,包括环境准备、安装步骤和日常维护技巧。我们将通过实际代码示例,探索云原生世界的秘密,并分享如何高效运用这一技术以适应快速变化的业务需求。
23 1
|
1月前
|
Kubernetes Linux 开发工具
centos7通过kubeadm安装k8s 1.27.1版本
centos7通过kubeadm安装k8s 1.27.1版本
|
2月前
|
Kubernetes 网络虚拟化 Docker
K8S镜像下载报错解决方案(使用阿里云镜像去下载kubeadm需要的镜像文件)
文章提供了一个解决方案,用于在无法直接访问Google镜像仓库的情况下,通过使用阿里云镜像来下载kubeadm所需的Kubernetes镜像。
278 4
K8S镜像下载报错解决方案(使用阿里云镜像去下载kubeadm需要的镜像文件)
|
2月前
|
Kubernetes 负载均衡 监控
深入云原生技术:Kubernetes集群部署与管理
【9月更文挑战第17天】在数字化转型的浪潮中,云原生技术以其灵活性和可扩展性成为企业新宠。本文将引导读者探索云原生的核心组件——Kubernetes,通过实际案例分析其部署与管理流程,旨在帮助技术从业者和企业决策者理解如何利用Kubernetes提升应用的可用性和性能。从基础概念到操作实践,我们将一同见证云原生技术的变革力量。
|
1月前
|
Kubernetes 应用服务中间件 Linux
多Master节点的k8s集群部署
多Master节点的k8s集群部署
|
2月前
|
Kubernetes 监控 Cloud Native
云原生入门:Kubernetes 集群部署与管理
【8月更文挑战第38天】在数字化浪潮中,云原生技术如同翱翔的雄鹰,引领着企业飞向灵活高效的未来。本文将带你一探究竟,从Kubernetes的基础概念到实际操作,深入浅出地介绍如何在云端构建和管理你的容器化应用。我们将一步步搭建起一个小型的Kubernetes集群,并通过代码示例和图解,让你轻松掌握云原生世界的钥匙。让我们一起开启这趟技术之旅,探索云原生的秘密花园,找到那把打开创新之门的金钥匙。
|
2月前
|
Kubernetes Ubuntu 网络安全
Ubuntu基于kubeadm快速部署K8S实战
关于如何在Ubuntu系统上使用kubeadm工具快速部署Kubernetes集群的详细实战指南。
176 2
|
2月前
|
Kubernetes 负载均衡 应用服务中间件
kubeadm快速构建K8S1.28.1高可用集群
关于如何使用kubeadm快速构建Kubernetes 1.28.1高可用集群的详细教程。
125 2
|
22天前
|
JSON Kubernetes 容灾
ACK One应用分发上线:高效管理多集群应用
ACK One应用分发上线,主要介绍了新能力的使用场景
|
23天前
|
Kubernetes 持续交付 开发工具
ACK One GitOps:ApplicationSet UI简化多集群GitOps应用管理
ACK One GitOps新发布了多集群应用控制台,支持管理Argo CD ApplicationSet,提升大规模应用和集群的多集群GitOps应用分发管理体验。