Kubernetes集群安装步骤

news2024/11/15 7:57:55

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除

一、安装要求

在开始之前,部署Kubernetes集群集群需要满足以下几个条件:

  • 一台多多台机器,操作系统CentOS.x-86_x64
  • 硬件配置:2GB或更多RAM,2个CPU或更多,硬盘30G以上、
  • 集群中所有机器之间网络互通
  • 可以访问外网,需要拉取镜像
  • 禁止swap分区

二、软件环境

  • CentOS 7
  • Docker:20+
  • k8s:1.23.6

三、安装步骤

1、准备环境

角色IP地址组件
k8s-master192.168.1.10docker、kubectl、kubeadm、kubelet
k8s-node1192.168.1.11docker、kubectl、kubeadm、kubelet
k8s-node2192.168.1.12docker、kubectl、kubeadm、kubelet

2、初始操作

  • 检查操作环境的版本

 [root@k8s-master ~]# cat /etc/redhat-release 
 CentOS Linux release 7.9.2009 (Core)
  • 主机名解析

为了方便集群之间的直接调用,配置主机名解析,企业中推荐使用内部DNS服务器

 # 根据规划在三台主机分别设置好主机名
 # hostnamectl set-hostname <hostname>
 ​
 [root@k8s-master ~]# vim /etc/hosts
 192.168.1.10 k8s-master
 192.168.1.11 k8s-node1
 192.168.1.12 k8s-node2
  • 时间同步

Kubernetes要求集群中的节点时间必须精确一致,这里使用chronyd服务从网络同步时间;企业中建议配置内部的会见同步服务器

 [root@master ~]# systemctl start chronyd
 [root@master ~]# systemctl enable chronyd
 [root@master ~]# date
  • 禁用iptables和firewalld服务

Kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则

 # 1 关闭firewalld服务
 [root@master ~]# systemctl stop firewalld
 [root@master ~]# systemctl disable firewalld

 # 2 关闭iptables服务
 [root@master ~]# systemctl stop iptables
 [root@master ~]# systemctl disable iptables
  • 禁用selinux

SELinux是linux系统中的一个安全服务,如果不关闭它,它会在集群中产生各种各样的问题

 # 修改SELINUX的值为disable
 [root@master ~]# vim /etc/selinux/config
 ...
 SELINUX=disabled
 ...
 # 注意:修改完后需要重启,重启完后,可使用getenforce查看
 [root@k8s-master ~]# getenforce
 Disabled
 ---------------------------------------------------
 # 另一种方法:下面两条命令分别设置永久与临时关闭SELinux:
 [root@master ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久
 [root@master ~]# setenforce 0  # 临时
  • 关闭swap分区

swap分区指的是虚拟内存分区,它的作用是物理内容使用完后,之后将磁盘空间虚拟成内存来使用。启用swap设备会对系统的性能产生非常负面的影响,因此Kubernetes要求每个节点都要禁用swap设备,若因某些原因不能关闭swap分区,就要在安装过程通过明确的参数进行配置说明

 # 注释掉swap分区一行
 [root@master ~]# vim /etc/fstab
 # /dev/mapper/centos-swap   swap    defaults     0  0
 ​
 -----------------------------------------------------
 # swapoff -a  # 临时
 # sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久
  • 修改Linux的内核参数

 # 修改Linux的内核采纳数,添加网桥过滤和地址转发功能
 # 编辑/etc/sysctl.d/kubernetes.conf文件,添加如下:
 [root@master ~]# vim /etc/sysctl.d/kubernetes.conf
 net.bridge.bridge-nf-call-ip6tables = 1
 net.bridge.bridge-nf-call-iptables = 1
 net.ipv4.ip_forward=1
 ​
 [root@master ~]# sysctl -w net.ipv4.ip_forward=1
 ​
 ​
 # 重新加载配置
 [root@master ~]# sysctl -p
 ​
 # 加载网桥过滤模块
 [root@master ~]# modprobe br_netfilter
 # 查看网桥过滤模块是否加载成功
 [root@master ~]# lsmod | grep br_netfilter
  • 配置ipvs功能

在Kubernetes中Service有几种工作模型:一种是基于Iptables的,一种是基于ipvs的;ipvs的性能明显要高一些,但如果需要使用它,需要手动载入ipvs模块:

 # 1、安装ipset和ipvsdm
 [root@master ~]# yum install ipset ipvsadm -y
 # 2、添加需要加载的模块写入脚本文件
 [root@master ~]# cat <<EOF> /etc/sysconfig/modules/ipvs.modules
 #!/bin/bash
 modprobe -- ip_vs
 modprobe -- ip_vs_rr
 modprobe -- ip_vs_wrr
 modprobe -- ip_vs_sh
 modprobe -- nf_conntrack_ipv4
 EOF
 # 2、为脚本添加执行权限
 [root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
 # 4.执行脚本文件
 [root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules
 # 5.查看对应的模块是否加载成功
 [root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4

3、安装基础软件(所有节点)

  • 安装Docker

 # 1、切换镜像源
 [root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
 ​
 # 2、查看当前镜像源中支持的docker版本
 [root@master ~]# yum list docker-ce --showduplicates
 ​
 # 3、安装特定版本的docker-ce
 # 必须制定--setopt=obsoletes=0,否则yum会自动安装更高版本
 [root@master ~]# yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
 ​
 # 4、添加一个配置文件
 #Docker 在默认情况下使用Vgroup Driver为cgroupfs,而Kubernetes推荐使用systemd来替代cgroupfs
 [root@master ~]# mkdir /etc/docker
 [root@master ~]# vim /etc/docker/daemon.json
 {
 "exec-opts": ["native.cgroupdriver=systemd"],
 "registry-mirrors": [
         "https://do.nark.eu.org",
         "https://dc.j8.work",
         "https://docker.m.daocloud.io",
         "https://dockerproxy.com",
         "https://docker.mirrors.ustc.edu.cn",
         "https://docker.nju.edu.cn"
     ]
 }
 ​
 # 5、启动dokcer并加入开机自启项中
 [root@master ~]# systemctl restart docker
 [root@master ~]# systemctl enable docker
  • 添加阿里云yum源

由于kubernetes的镜像在国外,速度比较慢,这里切换成国内的镜像源

 # 1、添加k8syum配置
 [root@master ~]# vim /etc/yum.repod.d/kubernetes.repo
 [kubernetes]
 name=Kubernetes
 baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
 enabled=1
 gpgchech=0
 repo_gpgcheck=0
 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
             http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  • 安装Kubeadm、kubelet、kubectl

 [root@master ~]# yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
 ​
 # 配置kubelet的cgroup
 [root@master ~]# vim /etc/sysconfig/kubelet
 KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
 KUBE_PROXY_MODE="ipvs"
 ​
 # 设置kubelet开机自启
 [root@master ~]# systemctl enable kubelet

4、部署Kubernetes Master

以下操作在master节点上进行:

  • 准备集群镜像

在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看:

 [root@master ~]# kubeadm config images list
 # 下载镜像
 # 此镜像kubernetes的仓库中,由于网络原因,无法连接,下面提供了一种替换方案
 [root@master ~]# vim /prepare-k8s.sh
 images=(
     kube-apiserver:v1.23.6
     kube-controller-manager:v1.23.6
     kube-scheduler:v1.23.6
     kube-proxy:v1.23.6
     pause:3.2
     etcd:3.5.0
     coredns:1.8.0
 )
 ​
 for imageName in ${images[@]};do
     docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
     docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
     docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName 
 done
  • 集群初始化

 # 创建集群
 [root@master ~]# kubeadm init \
       --apiserver-advertise-address=192.168.1.10 \
       --image-repository registry.aliyuncs.com/google_containers \
       --kubernetes-version v1.23.6 \
       --service-cidr=10.96.0.0/12 \
       --pod-network-cidr=10.244.0.0/16
 # 创建必要文件
 [root@master ~]# mkdir -p $HOME/.kube
 [root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
 [root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
 # 出现master节点则成功
 [root@master ~]# kubectl get nodes

5、加入Kubernetes Node

以下操作在node节点上操作:

  • 在k8s-master控制台初始化成功后复制join命令

 [root@k8s-node1 ~]# kubeadm join 192.168.113.120:6443 --token w34ha2.66if2c8nwmeat9o7 --discovery-token-ca-cert-hash sha256:20e2227554f8883811c01edd850f0cf2f396589d32b57b9984de3353a7389477
  • 如果初始的token不小心清空,可通过以下命令获取或重新申请:

 # token过期则重新申请
 [root@master ~]# kubeadm token create
 ​
 # token没有过期则通过如下命令获取:
 [root@master ~]# kubeadm token list
  • 获取 --discovery-token-ca-cert-hash值:

 [root@master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
 openssl dgst -sha256 -hex | sed 's/^.* //'

获取到值后需要在前面拼接上 sha256 使用

6、部署CNI网络插件

下载 calico 配置文件,可能会网络超时:

 [root@k8s-master ~]# cd ./opt
 [root@k8s-master opt]# mkdir k8s
 [root@k8s-master opt]# cd k8s/
 [root@k8s-master k8s]# wget https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml
   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                  Dload  Upload   Total   Spent    Left  Speed
 100    83  100    83    0     0    136      0 --:--:-- --:--:-- --:--:--   136
 [root@k8s-master k8s]# ls
 calico.yaml

修改 calico.yaml 文件中的 CALICO_IPV4POOL_CIDR 配置,修改为与初始化的 cidr 相同:

删除镜像 docker.io/ 前缀,避免下载过慢导致失败

 [root@k8s-master k8s]# grep imgae calico.yaml
 [root@k8s-master k8s]# sed -i 's#docker.io/##g' calico.yaml
 # 建议分别在三个节点中pull下所需镜像
 ​
 [root@k8s-master k8s]# kubectl apply -f calico.yml
 ​
 -----------------检查排错---------------------------
 # 查看节点情况
 [root@k8s-master k8s]# kubectl get pods -n kube-system
 # 查看详细信息
 [root@k8s-master k8s]# kubectl describe po <xxx> -n kube-system

7、测试Kubernetes集群

 # 创建部署
 [root@k8s-master ~]# kubectl create deployment nginx --image=nginx
 ​
 # 暴露端口
 [root@k8s-master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
 ​
 # 查看 pod 以及服务信息
 [root@k8s-master ~]# kubectl get pod,svc
 NAME                         READY   STATUS              RESTARTS   AGE
 pod/nginx-85b98978db-4gclp   0/1     ContainerCreating   0          24s
 ​
 NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
 service/kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        5h15m
 service/nginx        NodePort    10.101.177.187   <none>        80:32754/TCP   12s
 ​
 # 访问
 [root@k8s-master ~]# curl 192.168.1.10:32754
 <!DOCTYPE html>
 <html>
 <head>
 <title>Welcome to nginx!</title>
 ...

致谢

在此,我要对所有为知识共享做出贡献的个人和机构表示最深切的感谢。同时也感谢每一位花时间阅读这篇文章的读者,如果文章中有任何错误,欢迎留言指正。 

学习永无止境,让我们共同进步!!

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

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

相关文章

分布式锁、Lua脚本、redisson、运行lua脚本优化代码

20240721 一、分布式锁1. 什么是分布式锁2. 分布式锁的实现3. 基于redis的分布式锁4 总结 二、对于lua脚本可以保证事务&#xff0c;要么成功要么失败。1. 在redis中调用lua脚本 三、Redisson1 步骤2. Redisson的总结3. 几种分布式锁的区别 三、优化我们的秒杀1. 我们在创建优惠…

Mybatis-Plus代码生成器配置方法

Mybatis-Plus网址&#xff1a;https://baomidou.com/pages/779a6e/#%E4%BD%BF%E7%94%A8 第一步&#xff1a;引入依赖 <!-- 代码生成器 --> <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId>…

IFIX6.5变量创建进阶-标签组用法

IFIX6.5变量创建进阶-标签组用法 普通变量创建 https://blog.csdn.net/hmxm6/article/details/140507111 OPC数据连接 项目介绍和应用场景 在实际项目中可能有好几个相同标签变量属于一类的 比如现在有三台风机&#xff0c;都有启动停止风量的三个数据 数据库里面需要创…

EI成稿丨明年上检索

基于xxxx嵌入式系统的无线传感网络路由优化算法研究基于网络安全xxxx全球互联网经济发展趋势分析基于深度学习的大数据xxxxx基于全IP物联网网络xxxxx安全管理中的优化研究xxxxx农业可持续发展评价及升级路径研究xxxxx分层轮廓数字化转型风险评估与防范策略基于Kano模型与xxxxx公…

防火墙--内容安全

目录 概述 IAE引擎流程 DPI深度包检测 基于特征字的检测技术 基于应用网关的检测技术 基于行为模式的检测技术 DFI深度流检测 基于数据流进行识别检测的技术 DPI和DFI对比 IDS&#xff08;入侵检测&#xff09; IPS&#xff08;入侵防御&#xff09; 优势 入侵检测…

使用百度语音技术实现文字转语音

使用百度语音技术实现文字转语音 SpringBootVue前后端分离项目 调用api接口需要使用AK和SK生成AccessToken,生成getAccessToken的接口有跨域限制,所以统一的由后端处理了 部分参数在控制台->语音技术->在线调试里面能找到 Controller RestController RequestMapping(&q…

测试——Junit

内容大纲: 常用的五个注解 测试用例顺序指定 参数化 测试套件 断言 1. 常用的五个注解 1.1 Test 通常情况下,我们输入要写在main方法下,此时我想直接输出: Test void Test01(){System.out.println("第一个测试用例"); } 1.2 BeforeAll AfterAll BeforeALL在Tes…

Unity: TextMeshPro生成中文字体(附3.5k,7k,2w常用字集)

免费常用3千5&#xff0c;7千字&#xff0c;2万字中文字体包 1.选择Window/TextMeshPro/Font Asset Creator 注&#xff1a;准备字体&#xff1a;从字体库或其他来源获取中文字体文件&#xff0c;通常为.ttf、.otf或.ttc格式。最简单的方式是从Windows系统文件的Font文件夹里…

NV Switch 深度解析与性能剖析

NV Switch 深度解析与性能剖析 在当今高性能计算领域&#xff0c;英伟达&#xff08;NVIDIA&#xff09;的GPU技术犹如璀璨明星般闪耀。随着人工智能和机器学习技术的迅猛发展&#xff0c;对计算能力的需求不断攀升&#xff0c;实现GPU间的高效互联互通变得至关重要。正因如此&…

C# 实现跨进程条件变量

C# 进程通信系列 第一章 共享内存 第二章 条件变量&#xff08;本章&#xff09; 第三章 消息队列 文章目录 C# 进程通信系列前言一、关键实现1、用到的主要对象2、初始化区分创建和打开3、变量放到共享内存4、等待和释放逻辑 二、完整代码三、使用示例1、同步控制2、跨进程控…

通义千问大模型API调用示例

通义千问是由阿里云自主研发的大语言模型&#xff0c;用于理解和分析用户输入的自然语言。 模型概览 模型名称模型简介模型输入/输出限制qwen-turbo通义千问超大规模语言模型&#xff0c;支持中文、英文等不同语言输入模型支持8k tokens上下文&#xff0c;为了保证正常的使用…

Python数据可视化------动态柱状图

一、基础柱状图 # 基础柱状图 # 导包 from pyecharts.charts import Bar from pyecharts.options import *# 构建柱状图 bar Bar() # 添加数据&#xff08;列表&#xff09; x_list ["张三", "李四", "王五", "赵六"] y_list [50,…

vue引用js html页面 vue引用js动态效果

要引用的index.html页面&#xff1a;&#xff08;资源来自网络&#xff09;在pubilc下建一个static文件放入js文件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>数字翻转</title><meta con…

基于SpringBoot+Vue的校园志愿者管理系统(带1w+文档)

基于SpringBootVue的校园志愿者管理系统(带1w文档) 基于SpringBootVue的校园志愿者管理系统(带1w文档) 本次设计任务是要设计一个校园志愿者管理系统&#xff0c;通过这个系统能够满足管理员和志愿者的校园志愿者信息管理功能。系统的主要功能包括首页、个人中心、志愿者管理、…

多线程应用

并发与并行 计算机操作系统对于并发性和并行性的概念给出的定义是&#xff1a; 并行性是指两个或多个事件在同一时刻发生&#xff1b; 并发性是指两个或多个事件在同一时间段内发生。 并发是指多个任务(线程)都请求运行&#xff0c;如果系统只有一个CPU,CPU只能按受一个任务&…

java学习--断点调试

可进入调用的方法里看源码

C2W2.Assignment.Parts-of-Speech Tagging (POS).Part1

理论课&#xff1a;C2W2.Part-of-Speech (POS) Tagging and Hidden Markov Models 文章目录 0 Data Sources1 POS Tagging1.1 TrainingTransition countsEmission countsTag countsExercise 01 1.2 TestingExercise 02 理论课&#xff1a; C2W2.Part-of-Speech (POS) Tagging…

创建自己的 app: html网页直接打包成app;在线网页打包app工具fusionapp、pake

1、html网页直接打包成app 主要通过hbuilderx框架工具来进行打包 https://www.dcloud.io/hbuilderx.html 参考&#xff1a; https://www.bilibili.com/video/BV1XG411r7QZ/ https://www.bilibili.com/video/BV1ZJ411W7Na 1&#xff09;网页制作 这里做的工具是TodoList 页面&a…

数据结构——栈的实现(java实现)与相应的oj题

文章目录 一 栈栈的概念:栈的实现&#xff1a;栈的数组实现默认构造方法压栈获取栈元素的个数出栈获取栈顶元素判断当前栈是否为空 java提供的Stack类Stack实现的接口&#xff1a; LinkedList也可以当Stack使用虚拟机栈&#xff0c;栈帧&#xff0c;栈的三个概念 二 栈的一些算…

Android 11 HAL层集成FFMPEG

1.集成目录&#xff1a; android/vendor/noch/common/external/NoboMediaCodec 2.文件夹目录 3. Android.mk实现 # Copyright #LOCAL_PATH : $(call my-dir)SF_COMMON_MK : $(LOCAL_PATH)/common.mkinclude $(call first-makefiles-under,$(LOCAL_PATH))4.common.mk实现 # #…