K8s集群搭建-Kubeadm方式搭建集群【1.23.0版本】

news2024/11/20 15:32:55

文章目录

    • 一、初始化准备
    • 二、安装kubeadm
    • 三、初始化Master集群
    • 四、将新的Node节点加入集群
    • 五、部署CNI网络插件
    • 六、其他配置

Kubernetes1.24(包括1.24)之后不在兼容docker,如果有需要兼容docker的需求,则安装一个 cri-docker的插件,本文使用的是kubernetes1.23版本。

一、初始化准备

1、关闭防火墙
Centos7 默认启动了防火墙,而Kubernetes的Master与Node节点之间会存在大量的网络通信,安全的做是在防火墙上配置各个组件需要相互通信的端口如下表:

组件默认端口
API Service8080(http非安全端口)、6443(https安全端口)
Controller Manager10252
Scheduler10251
kubelet10250、10255(只读端口)
etcd2379(供客户端访问)、2380(供etcd集群内部节点之间访问)
集群DNS服务53(tcp/udp)

不止这些,需要用到其他组件,就需要开放组件的端口号,列如CNI网络插件calico需要179端口、镜像私服需要5000端口,根据所需集群组件在防火墙上面放开对应端口策略。
在安全的网络环境下,可以简单的将Firewalls服务关掉:

systemctl stop firewalld
systemctl disable firewalld 
sed  -i -r 's/SELINUX=[ep].*/SELINUX=disabled/g' /etc/selinux/config

2、配置时间同步保证集群内时间保持一致

yum -y install ntpdate
ntpdate ntp1.aliyun.com

3、禁用swap交换分区

sed -i -r '/swap/ s/^/#/' /etc/fstab
swapoff --all

4、修改Linux内核参数,添加网桥过滤器和地址转发功能

cat >> /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

sysctl -p

# 加载网桥过滤器模块
modprobe br_netfilter
# 验证是否生效
lsmod | grep br_netfilter

5、配置ipvs功能
在Kubernetes中Service有两种代理模型,分别是iptable和IPVS,两者对比IPVS的性能高,如果想要使用IPVS模型,需要手动载人IPVS模块

yum -y install ipset ipvsadm

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4  
EOF

chmod +x /etc/sysconfig/modules/ipvs.modules 
# 执行脚本
/etc/sysconfig/modules/ipvs.modules

# 验证ipvs模块
lsmod | grep -e ip_vs -e nf_conntrack_ipv4

6、安装docker组件

curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum makecache

# yum-utils软件用于提供yum-config-manager程序
yum install -y yum-utils

# 使用yum-config-manager创建docker存储库(阿里)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 查看当前镜像源中支持的docker版本
yum list docker-ce --showduplicates

# 安装特定版docker-ce,安装时需要使用--setopt=obsoletes=0参数指定版本,否则yum会自动安装高版本
yum -y install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7

Docker默认使用的Cgroup Driver为默认文件驱动,而k8s默认使用的文件驱动为systemd,k8s要求驱动类型必须要一致,所以需要将docker文件驱动改成systemd

mkdir /etc/docker
cat <<EOF > /etc/docker/daemon.json
{
  "registry-mirrors": ["https://aoewjvel.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

# 启动docker程序及开机自启
systemctl enable docker --now

7、域名解析

cat  >> /etc/hosts << EOF
16.32.15.200 master
16.32.15.201 node1
16.32.15.202 node2
EOF

在指定主机上面修改主机名

hostnamectl set-hostname master && bash
hostnamectl set-hostname node1 && bash
hostnamectl set-hostname node2 && bash

二、安装kubeadm

配置国内yum源,一键安装 kubeadm、kubelet、kubectl

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
EOF

yum -y install --setopt=obsoletes=0 kubeadm-1.23.0 kubelet-1.23.0 kubectl-1.23.0

kubeadm将使用kubelet服务以容器方式部署kubernetes的主要服务,所以需要先启动kubelet服务

systemctl enable kubelet.service --now

三、初始化Master集群

kubeadm init \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.23.0 \
--pod-network-cidr=192.168.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=16.32.15.200 \
--ignore-preflight-errors=all
  • –image-repository:指定国内阿里云的镜像源

  • –kubernetes-version:指定k8s版本号

  • –pod-network-cidr: pod网段

  • –service-cidr: service网段

  • –apiserver-advertise-address: apiserver地址

  • –ignore-preflight-errors:忽略检查的一些错误

如果初始化正常则会输出日志:

[init] Using Kubernetes version: v1.23.0
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local localhost.localdomain] and IPs [10.96.0.1 16.32.15.200]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [localhost localhost.localdomain] and IPs [16.32.15.200 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [localhost localhost.localdomain] and IPs [16.32.15.200 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
[control-plane] Creating static Pod manifest for "kube-scheduler"
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[apiclient] All control plane components are healthy after 6.502504 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config-1.23" in namespace kube-system with the configuration for the kubelets in the cluster
NOTE: The "kubelet-config-1.23" naming of the kubelet ConfigMap is deprecated. Once the UnversionedKubeletConfigMap feature gate graduates to Beta the default name will become just "kubelet-config". Kubeadm upgrade will handle this transition transparently.
[upload-certs] Skipping phase. Please see --upload-certs
[mark-control-plane] Marking the node localhost.localdomain as control-plane by adding the labels: [node-role.kubernetes.io/master(deprecated) node-role.kubernetes.io/control-plane node.kubernetes.io/exclude-from-external-load-balancers]
[mark-control-plane] Marking the node localhost.localdomain as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule]
[bootstrap-token] Using token: de4oak.y15qhm3uqgzimflo
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to get nodes
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 16.32.15.200:6443 --token de4oak.y15qhm3uqgzimflo \
        --discovery-token-ca-cert-hash sha256:0f54086e09849ec84de3f3790b0c042d4a21f4cee54f57775e82ec0fe5e3d14c 

由于kubernetes默认使用CA证书,所以需要为kubectl配置证书才可以访问到Master

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

配置完成证书后,我们就可以使用kubectl命令行工具对集群进行访问和操作了,如下是查看 kube-system 命名空间下的ConfigMap列表

kubectl -n kube-system get configmap
NAME                                 DATA   AGE
coredns                              1      13m
extension-apiserver-authentication   6      13m
kube-proxy                           2      13m
kube-root-ca.crt                     1      13m
kubeadm-config                       1      13m
kubelet-config-1.23                  1      13m

需要留意一下保留token 用于添加节点到k8s集群中

kubeadm join 16.32.15.200:6443 --token de4oak.y15qhm3uqgzimflo \
        --discovery-token-ca-cert-hash sha256:0f54086e09849ec84de3f3790b0c042d4a21f4cee54f57775e82ec0fe5e3d14c 
    
# 如果忘记可以使用 'kubeadm token list'查看
kubeadm token list

四、将新的Node节点加入集群

在node节点上安装kubeadm、kubelet命令,无需安装kubectl

yum -y install --setopt=obsoletes=0 kubeadm-1.23.0 kubelet-1.23.0

systemctl start kubelet
systemctl enable kubelet

使用kubeadm join命令加入集群,直接复制Master节点初始化输出token值即可

kubeadm join 16.32.15.200:6443 --token de4oak.y15qhm3uqgzimflo \
        --discovery-token-ca-cert-hash sha256:0f54086e09849ec84de3f3790b0c042d4a21f4cee54f57775e82ec0fe5e3d14c 

Node成功加入集群后可以通过 kubectl get nodes 命令确认新的节点是否已加入

kubectl get nodes
NAME                    STATUS     ROLES                  AGE   VERSION
localhost.localdomain   NotReady   control-plane,master   90m   v1.23.0
node1                   NotReady   <none>                 59m   v1.23.0
node2                   NotReady   <none>                 30m   v1.23.0

五、部署CNI网络插件

对于CNI网络插件可以有很多选择,比如Calico CNI:
calico.yaml下载地址
calico.yaml 下载好之后需要修改 CALICO_IPV4POOL_CIDR 值为初始化容器时 --pod-network-cidr向的网段,如下:

kubectl apply -f calico.yaml

# 查看网络Pod是否创建成功
kubectl get pods -n kube-system

如果下载慢 可以手动执行一下 这个需要在所有节点执行

# 获取要pull的镜像
grep image calico.yaml

docker pull calico/cni:v3.15.1
docker pull calico/pod2daemon-flexvol:v3.15.1
docker pull calico/node:v3.15.1
docker pull calico/kube-controllers:v3.15.1

查看节点状态为 Ready就绪

kubectl get nodes
NAME     STATUS   ROLES                  AGE     VERSION
master   Ready    control-plane,master   3m48s   v1.23.0
node1    Ready    <none>                 3m26s   v1.23.0
node2    Ready    <none>                 3m19s   v1.23.0

六、其他配置

1、token证书默认24小时 过期需要生成新的证书

kubeadm token create --print-join-command

2、集群初始化失败 重新初始化

kubeadm reset

3、calico组件始终未就绪 手动pull一下

# 获取要pull的镜像
grep image calico.yaml

docker pull calico/cni:v3.15.1
docker pull calico/pod2daemon-flexvol:v3.15.1
docker pull calico/node:v3.15.1
docker pull calico/kube-controllers:v3.15.1

4、自动补全功能

yum install -y bash-completion 
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
echo "source <(kubectl completion bash)" >> /etc/profile
source /etc/profile

5、设置master节点可调度,去除污点

kubectl taint nodes --all node-role.kubernetes.io/master-
kubectl taint nodes master node-role.kubernetes.io/control-plane:NoSchedule-

查看污点

kubectl describe nodes master |grep Taints

打标签

kubectl label nodes master node-role.kubernetes.io/worker=    # 添加master节点worker
kubectl label nodes master node-role.kubernetes.io/master-    # 删除master节点master

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/444347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【技巧】如何在微信与企业微信端实现自动化ChatGPT智能机器人服务?(WorkTool)

场景描述 对于使用企业微信办公协作的公司/团体/组织等&#xff0c;在工作的时候&#xff0c;经常需要通过群机器人的方式&#xff0c;回答群内成员的问题。 基于此&#xff0c;一些企业想要将ChatGPT的智能对话能力与企业微信群机器人的回复能力结合&#xff0c;在企业微信群…

VMware Site Recovery Manager 8.7 (for vSphere 8 U1) - 数据中心灾难恢复 (DR)

请访问原文链接&#xff1a;https://sysin.org/blog/vmware-srm-8/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Site Recovery Manager 8.7 | 18 APR 2023 | Build 21590800 什么是 Site Recovery Manager (SRM)&#xff1…

【网络安全】CVE漏洞分析以及复现

漏洞详情 Shiro 在路径控制的时候&#xff0c;未能对传入的 url 编码进行 decode 解码&#xff0c;导致攻击者可以绕过过滤器&#xff0c;访问被过滤的路径。 漏洞影响版本 Shiro 1.0.0-incubating 对应 Maven Repo 里面也有 【一一帮助安全学习&#xff0c;所有资源获取一…

GrapeCity Documents for Imaging

GrapeCity Documents for Imaging 现在可以使用高斯模糊效果在整个输入图像或部分图像上基于高斯函数创建模糊。 在GcBitmap类中添加了IsBlackAndWhite和IsGrayscale。这些方法可以更快地检查图像是由黑白像素组成还是仅由灰度组成。 IsBlackAndWhite方法检查所有图像像素是不透…

回炉重造八--系统启动和内核管理

系统启动和内核管理 1、系统启动 1.1 centos7启动的过程 UEFI或BIOS初始化&#xff0c;运行post开机自检选择启动的设备&#xff08;USB、硬盘、本地光盘&#xff09;引导装载程序&#xff0c;centos7是给grub2加载装载程序的配置文件&#xff1a; /etc/grub.d/ /etc/default…

使用 Amazon Step Functions 和 Amazon Athena 实现简易大数据编排

很多公司都在亚马逊云上围绕 Amazon S3 实现了自己的数据湖。数据湖的建设涉及到数据摄入、清洗、转换&#xff0c;以及呈现等多个步骤&#xff0c;还需要对这些步骤进行编排&#xff0c;这对很多人手不足或者初识数据湖的团队形成了挑战。 在本篇文章中&#xff0c;我将介绍一…

可以一口气读完的算法书

算法&#xff01;Algorithms&#xff01; 咳咳&#xff01;很多人一听到这个词&#xff0c;估计脑袋就要炸了&#xff1a;一定又是复杂极了的东西&#xff0c;看来此书必定翻不过第一节&#xff0c;就要睡着了。 没错&#xff0c;很多算法书虽然写得很精妙&#xff0c;但凭我…

【OpenLayers】VUE+OpenLayers+ElementUI加载WMS地图服务

【OpenLayers】VUEOpenLayersElementUI加载WMS地图服务 准备工作安装vue创建vue项目安装OpenLayers安装ElementUI加载wms地图服务 准备工作 需要安装好nodejs&#xff0c;nodejs下载地址&#xff0c;下载对应的版本向导式安装即可。 安装完成后&#xff0c;控制台输入node -v…

OAID解密场景和对应策略,淘宝订单解密接口,淘宝订单明文接口

OAID解密场景和对应策略 场景编码 场景名称 返回的隐私字段 1001 顺丰电子面单发货 消费者手机号&#xff0c;姓名&#xff0c;详细地址 1002 4通一达电子面单发货 消费者手机号&#xff0c;姓名&#xff0c;详细地址 1003 EMS电子面单发货 消费者手机号&#xff0c…

Eclipse基本使用、数据类型、运算符

Eclipse基本使用 创建JAVA项目 1.打开新建项目窗口&#xff08;File --> New --> Project&#xff09; 2.在New Project窗口中选择Java Project创建项目 3.在New Java Project对话框 Project name&#xff1a;项目名称 Project Layout项目布局&#xff1a;Create sepa…

初识Node

Node.js是什么 Node.js是一个基于Chrome V8引擎的[JavaScript运行环境]。 Node.js使用了一个事件驱动、非阻塞式I/O 的模型。 Node.js 可以做什么 Nodejs作为一个JavaScript的运行环境&#xff0c;仅仅提供了基础的功能和API。然而&#xff0c;基于Node.js 提供的这些基础能…

【SCI征稿】SPRINGER旗下CCF1区计算机工程类SCI, 网格计算、储层计算、机器学习相关领域均可~

一、期刊简介&#xff1a; 1区计算机工程类SCI&EI (CCF) 【期刊概况】SPRINGER出版社&#xff0c;IF:4.0-5.0, JCR1/2区, 中科院2区&#xff1b; 【终审周期】走期刊部系统&#xff0c;3个月左右录用&#xff1b; 【检索情况】SCI&EI双检&#xff1b; 【数据库收录…

Revit墙问题:系统自带幕墙偏移解决和墙翻模操作

一、关于Revit绘制默认幕墙会自动产生偏移问题的解决办法! 很多人在安装完Revit后绘制系统自带的幕墙会产生偏移! 首先我们要了解偏移产生的根源&#xff1a; 1、绘制的时候在偏移量里设置了偏移值! 2、幕墙嵌板族设置了偏移&#xff1a;这种问题一般分种情况&#xff1a; A&am…

Linux编译器 gcc与g++

Linux编译器 gcc/g工具 目录 Linux编译器 gcc/g工具1、程序的诞生2、gcc工具2.1 预处理2.2 编译2.3 汇编2.4 链接2.5 运行2.6 总结 3、静态链接与动态链接3.1 静态链接3.2 动态链接3.3 Linux下库的命名 1、程序的诞生 程序的编译过程&#xff1a; 1、预处理&#xff08;头文件包…

算法导论 | 算法在计算中的作用

第一章 | 算法在计算中的作用 笔记 什么是算法&#xff1f; 算法就是任何良定义的计算过程&#xff0c;该过程取某个值或值的集合作为输入并产生某个值或值的集合作为输出不正确的算法只要其错误率可控有时可能是有用的算法的说明的唯一要求是这个说明必须精确描述所要遵循的…

datax 从oracle迁移到es中

任务启动时刻 : 2023-04-20 19:34:56 任务结束时刻 : 2023-04-20 19:56:22 任务总计耗时 : 1285s 任务平均流量 : 5.07MB/s 记录写入速度 : …

离散型制造企业如何选择MES系统

随着MES系统越来越被企业所重视&#xff0c;并并被运用到很多不同行业的制造业中。 MES对于制造企业来说&#xff0c;其所需要的要求是各不相同的&#xff0c;比如离散型制造企业&#xff0c;该如何去选择MES系统呢&#xff1f; 什么是离散型制造企业&#xff1f; 离散型制造企…

nn.init.xavier_uniform_()的作用:根据均匀分布生成Tensor

官网解释如下&#xff1a; Signature: nn.init.xavier_uniform_(tensor: torch.Tensor, gain: float 1.0) -> torch.Tensor Docstring: Fills the input Tensor with values according to the method described in Understanding the difficulty of training deep feedforw…

PHP语言开发的医院不良事件上报系统源码,前后端分离,仓储模式

医院安全&#xff08;不良&#xff09;事件上报系统源码 系统定义&#xff1a; 规范医院安全&#xff08;不良&#xff09;事件的主动报告&#xff0c;增强风险防范意识&#xff0c;及时发现医院不良事件和安全隐患&#xff0c;将获取的医院安全信息进行分析反馈&#xff0c;…

STM32开发(十五)STM32F103 片内资源 —— 通用定时器 PWN 无源蜂鸣器 详解

文章目录 一、基础知识点二、开发环境三、STM32CubeMX相关配置四、Vscode代码讲解五、结果演示 一、基础知识点 本实验通过STM32F103 的通用定时器 PWN功能&#xff0c;实现对无源蜂鸣器控制。 本实验内容知识点&#xff1a; 1、通用定时器 PWN 详解 2、有源蜂鸣器和无源蜂鸣器…