K8s学习(一)从零开始搭建kubernetes集群环境(虚拟机/kubeadm方式)

news2024/11/15 15:50:10

文章目录

  • 1 Kubernetes简介(k8s)
    • 2 安装实战
    • 2.1 主机安装并初始化
    • 2.2 安装docker
    • 2.3 安装Kubernetes组件
    • 2.4 准备集群镜像
    • 2.5 集群初始化
      • 2.6 安装flannel网络插件
  • 3 部署nginx 测试
    • 3.1 创建一个nginx服务
    • 3.2 暴漏端口
    • 3.3 查看服务
    • 3.4 测试服务

1 Kubernetes简介(k8s)

传统部署:互联网早期会直接将应用程序部署在物理机上或者虚拟操作系统中,如部署到tomcat/weblogin/websphere等,这种部署方式比较简单,但是很难合理地分配计算资源,而且程序之间容易产生影响;

容器化部署:运行应用程序所需要的资源都被容器包装,并和底层基础架构解耦, 带来很多便利,但是也会出现一些问题,比如说:

  • 一个容器故障停机了,怎么样让另外一个容器立刻启动去替补停机的容器
  • 当并发访问量变大的时候,怎么样做到横向扩展容器数量

这些容器管理的问题统称为容器编排问题,为了解决这些容器编排问题,就产生了一些容器编排的软件,目前k8s的时长占有率是最高的,本文参考尚硅谷教程记录了k8s一主一从简单集群环境的搭建过程,及实践过程中遇到的问题解决办法。

这里环境搭建是通过kubeadm 部署方式,kubeadm 是官方社区推出的一个用于快速部署kubernetes 集群的工具,这个工具能通过两条指令完成一个kubernetes 集群的部署:

  • 创建一个Master 节点kubeadm init
  • 将Node 节点加入到当前集群中$ kubeadm join <Master 节点的IP 和端口>

2 安装实战

用到的主机是2台Linux系统,均内置Centos 7操作系统,准备好系统后我们在来从零开始安装docker、k8s三大组件-kubeadm/kubelet/kubectl程序。

2.1 主机安装并初始化

大家都装过CentOS虚拟机吧,默认过程不详述了,我装的是CentOS 7,安装的时候打开了网卡,因为安装过程中需要访问外网拉取镜像,硬盘设置为30GB 或更多。
这里有个坑,后面集群初始化的时候报错:
the number of available CPUs 1 is less than the required 2 也就是说硬件配置必须要有2个或更多CPU,建议还是用实体机测试吧
记录系统初始化步骤之前看一个小知识点,就是使用MobaXterm工具操作Linux系统的时候,工具栏有个MultiExec工具可以同时打开多个窗口同时执行某个命令或者粘贴命令行执行,这样我们就不用反复切换三台机器执行同样的代码了,部署集群环境又简单了一步,多窗口样子如下图:
在这里插入图片描述

  1. 设置主机名解析

    为了方便后面集群节点间的直接调用,在这配置一下主机名解析,企业中通常会有内部DNS服务器做解析。两台机器同时执行以下命令:

cat <<EOF>> /etc/hosts
192.168.177.132     master
192.168.177.133     node1
EOF
  1. 时间同步(两台机器同时执行)
    • kubernetes要求集群中的节点时间必须精确一致,这里有两个方案,一个是直接使用chronyd服务从网络同步时间

# 启动chronyd服务
systemctl start chronyd
# 设置chronyd服务开机自启
systemctl enable chronyd
# chronyd服务启动稍等几秒钟,就可以用date命令验证时间了
date

  • 另一种时间同步方式

#设置系统时区为 中国/上海
timedatectl set-timezone Asia/Shanghai
#将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0
#重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond

  1. 禁用iptables和firewalld服务(两台机器同时执行)
    kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则
    在这里插入图片描述
  2. 禁用selinux(两台机器同时执行)
    selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种奇葩问题
    在这里插入图片描述
  3. 禁用swap分区(两台机器同时执行)
    kubernetes要求每个节点都要禁用swap设备

#编辑分区配置文件/etc/fstab,注释掉swap分区一行
注意修改完毕之后需要重启linux服务
vim /etc/fstab
注释掉 /dev/mapper/centos-swap swap
#/dev/mapper/centos-swap swap

  1. 修改linux的内核参数(两台机器同时执行)
# 修改linux的内核采纳数,添加网桥过滤和地址转发功能
# 编辑/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 -p
# 加载网桥过滤模块
[root@master ~]# modprobe br_netfilter
# 查看网桥过滤模块是否加载成功
[root@master ~]# lsmod | grep br_netfilter
  1. 配置ipvs功能(两台机器同时执行)
# 1.安装ipset和ipvsadm
[root@master ~]# yum install ipset ipvsadmin -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
# 3.为脚本添加执行权限
[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
nf_conntrack_ipv4      15053  10 
nf_defrag_ipv4         12729  1 nf_conntrack_ipv4
nf_conntrack          133095  10 ip_vs,nf_nat,nf_nat_ipv4,nf_nat_ipv6,xt_conntrack,nf_nat_masquerade_ipv4,nf_nat_masquerade_ipv6,nf_conntrack_netlink,nf_conntrack_ipv4,nf_conntrack_ipv6

2.2 安装docker

(两台机器同时执行)

# 1、切换镜像源,wget命令找不到的话就 yum -y install wget
[root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d.docker-ce.repo

# 2、查看当前镜像源中支持的docker版本,我这里报错了,需要先cd到/etc/yum.repos.d/文件夹
[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 ~]# cat <<EOF> /etc/docker/daemon.json
{
	"exec-opts": ["native.cgroupdriver=systemd"],
	"registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF
# 5、启动dokcer
[root@master ~]# systemctl restart docker
[root@master ~]# systemctl enable docker

上面我执行第2部分查看当前镜像源中支持的docker版本时报错如下,没匹配到软件包,需要cd到/etc/yum.repos.d/文件夹下面就ok了
在这里插入图片描述

2.3 安装Kubernetes组件

(两台机器同时执行)

# 1、由于kubernetes的镜像在国外,速度比较慢,这里切换成国内的镜像源
# 2、编辑/etc/yum.repos.d/kubernetes.repo,添加下面的配置
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=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
[root@k8s-node1 ~]# yum makecache
# 3、安装kubeadm、kubelet和kubectl
[root@master ~]# yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y

# 4、配置kubelet的cgroup
#编辑/etc/sysconfig/kubelet, 添加下面的配置
cat <<EOF > /etc/sysconfig/kubelet
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
EOF
# 5、设置kubelet开机自启
[root@master ~]# systemctl enable --now kubelet

2.4 准备集群镜像

(两台机器同时执行)

# 在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看
[root@master ~]# kubeadm config images list
# 下载镜像
# 此镜像kubernetes的仓库中,由于网络原因,无法连接,下面提供了一种替换方案,直接执行
images=(
	kube-apiserver:v1.17.4
	kube-controller-manager:v1.17.4
	kube-scheduler:v1.17.4
	kube-proxy:v1.17.4
	pause:3.1
	etcd:3.4.3-0
	coredns:1.6.5
)
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

2.5 集群初始化

下面的操作只需要在master节点上执行即可

# 创建集群,注意192.168.177.132是master节点的ip
[root@master ~]# kubeadm init 
	--apiserver-advertise-address=192.168.177.132 
	--image-repository registry.aliyuncs.com/google_containers 
	--kubernetes-version=v1.17.4 
	--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

下面的操作只需要在node节点上执行即可

#kubeadm join命令在master执行完上面的初始化后进行提示,注意保存,后面会使用该命令让node节点加入k8s集群
kubeadm join 192.168.177.132:6443 --token awk15p.t6bamck54w69u4s8 \
    --discovery-token-ca-cert-hash sha256:a94fa09562466d32d29523ab6cff122186f1127599fa4dcd5fa0152694f17117

此时,通过kubectl get nodes命令查看主从节点都是NotReady状态

2.6 安装flannel网络插件

只在master节点操作即可,需要下载kube-flannel.yml配置文件,外网不好下载,可以直接生成/root/kube-flannel.yml文件,内容如下:

https://github.com/flannel-io/flannel/tree/master/Documentation/kube-flannel.yml

[root@k8s-master1 ~]# docker pull registry.cn-hangzhou.aliyuncs.com/eagleslab/service:flannel-cni-pluginv12
[root@k8s-master1 ~]# docker tag registry.cn-hangzhou.aliyuncs.com/eagleslab/service:flannelv014 quay.io/coreos/flannel:v0.14.0
[root@k8s-master1 ~]# docker pull registry.cn-hangzhou.aliyuncs.com/eagleslab/service:flannel-cni-pluginv12
[root@k8s-master1 ~]# docker tag registry.cn-hangzhou.aliyuncs.com/eagleslab/service:flannel-cni-pluginv12 rancher/flannel-cni-plugin:v1.2
[root@k8s-master1 ~]# kubectl apply -f kube-flannel.yml 
Warning: policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
[root@k8s-master1 ~]# kubectl get nodes
NAME       STATUS   ROLES                  AGE   VERSION
master      Ready    control-plane,master   50m   v1.22.4
node1       Ready    <none>                 44m   v1.22.4

此时,通过kubectl get nodes命令查看主从节点都是Ready状态

3 部署nginx 测试

3.1 创建一个nginx服务

[root@k8s-master1 ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created

3.2 暴漏端口

[root@k8s-master1 ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed

3.3 查看服务

[root@k8s-master1 ~]# kubectl get pod,svc
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-6799fc88d8-ldpw2   1/1     Running   0          31s

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   172.16.0.1      <none>        443/TCP        56m
service/nginx        NodePort    172.16.172.68   <none>        80:32550/TCP   14s

3.4 测试服务

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

centos7安装RabbitMQ

1、查看本机基本信息 查看Linux发行版本 uname -a # Linux VM-0-8-centos 3.10.0-1160.11.1.el7.x86_64 #1 SMP Fri Dec 18 16:34:56 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux cat /etc/redhat-release # CentOS Linux release 7.9.2009 (Core)2、创建创建工作目录 mkdir /…

下一代视频编码技术2023

下一代视频编码技术 下面将从这两个角度来介绍华为云视频在下一代视频编码技术上的一些工作。这些技术得益于华为2012 媒体技术院全力支持。 2.1 下一代视频编码标准技术 从上图可以看出&#xff0c;下一代的视频编码标准大概分为三个阵营或者三个类型&#xff1a; 国际标准…

卷积神经网络(CNN)经典模型分析(一)

CNN经典模型分析&#x1f42c; 目录: 一、CNN概论二、model分析LeNet5AlexNetVggNetGoogleNetResNet 三、参考资料 一、CNN概论 如图所示&#xff1a;人工智能最大&#xff0c;此概念也最先问世&#xff1b;然后是机器学习&#xff0c;出现的稍晚&#xff1b;最后才是深度学习…

Python编程自动化办公案例(2)

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.前期代码 二.实现批量读取 1.os库 2.实现思路 &#xff08;1&#…

VBA提高篇_ 22 事件处理

文章目录1.事件编程2.常用工作簿事件名称与对应处理过程名称示例3. 事件编程的步骤4&#xff0e;工作簿事件4.1 Open4.2 BeforeClose4.3 NewSheet5&#xff0e;工作表事件6&#xff0e;变量和过程函数的作用域1.事件编程 写在事件发生地(对应工作簿或工作表) 2.常用工作簿事…

22 pandas字符串操作

文章目录字符串对象方法cat和指定字符串进行拼接查看数据不指定参数&#xff0c;所有姓名拼接不指定参数&#xff0c;所有姓名拼接添加分隔符添加数据遇到空值时合并split按照指定字符串分隔partition 按照指定字符串分割get 获取指定位置的字符&#xff0c;只能获取1个slice 获…

LeetCode题目笔记——6362. 合并两个二维数组 - 求和法

文章目录题目描述题目链接题目难度——简单方法一&#xff1a;常规双指针遍历代码/Python方法二&#xff1a;字典\哈希表代码/Python总结题目描述 给你两个 二维 整数数组 nums1 和 nums2. nums1[i] [idi, vali] 表示编号为 idi 的数字对应的值等于 vali 。nums2[i] [idi, …

Flutter-Widget-学习笔记

Widget 是整个视图描述的基础。 参考&#xff1a;https://docs.flutter.dev/resources/architectural-overview Widget 到底是什么呢&#xff1f; Widget 是 Flutter 功能的抽象描述&#xff0c;是视图的配置信息&#xff0c;同样也是数据的映射&#xff0c;是 Flutter 开发框…

2023年美赛C题Wordle预测问题二建模及Python代码详细讲解

更新时间&#xff1a;2023-2-19 相关链接 &#xff08;1&#xff09;2023年美赛C题Wordle预测问题一建模及Python代码详细讲解 &#xff08;2&#xff09;2023年美赛C题Wordle预测问题二建模及Python代码详细讲解 &#xff08;3&#xff09;2023年美赛C题Wordle预测问题三、四…

【Python】进制、计算机中的单位、编码、数据类型、索引、字符串切片、字符串的功能方法

一、进制计算机中底层所有的数据都是以 010101 的形式存在&#xff08;图片、文本、视频等&#xff09;。二进制八进制十进制&#xff08;也就是我们熟知的阿拉伯数字&#xff09;十六进制进制转换v1 bin(25) # 十进制转换为二进制 print(v1) # "0b11001"v2 oct(23…

【数据结构】顺序表:随机访问的速度快到飞起

&#x1f451;专栏内容&#xff1a;数据结构⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;日拱一卒&#xff0c;功不唐捐 文章目录一、前言二、线性表三、顺序表1、定义2、静态顺序表3、动态顺序表4、接口实现Ⅰ、初始化Ⅱ、销毁Ⅲ、增容Ⅳ、插入Ⅴ、删…

中国各省人力资本测算就业人员受教育程度构成(2000-2021年)

数据来源&#xff1a;自主整理 时间跨度&#xff1a;2000-2021年 区域范围&#xff1a;全国各省 指标说明&#xff1a; 人力资本测算公式&#xff1a;&#xff08;小学*6初中*9高中*12大专及以上*16&#xff09;/六岁及以上人口 参考文献&#xff1a; [1]罗仁福, 刘承芳,…

Python pandas「原有或者新建」Excel中「追加新或者新建」sheet

1.pandas原有Excel中追加新sheet 使用Pandas库&#xff0c;我们可以轻松将数据追加到现有的Excel工作簿中的新工作表中。以下是追加新工作表的简单步骤&#xff1a; 读取现有的Excel文件 使用Pandas库中的read_excel()函数读取现有的Excel文件。指定Excel文件的路径和文件名&a…

多模态机器学习入门Tutorial on MultiModal Machine Learning——第一堂课个人学习内容

文章目录课程记录核心技术Core Technical Challengesrepresentation表示alignment对齐转换translationFusion融合co-learning共同学习总结Course Syllabus教学大纲个人总结第一周的安排相关连接课程记录 这部分是自己看视频&#xff0c;然后截屏&#xff0c;记录下来的这部分的…

C生万物 | 模拟实现库函数strcpy之梅开n度

文章目录【梅开一度】&#xff1a;观察库函数strcpy()的实现【梅开二度】&#xff1a;模仿实现strcpy()【梅开三度】&#xff1a;优化简练代码【梅开四度】&#xff1a;assert()断言拦截【梅开五度】&#xff1a;const修饰常量指针【梅开六度】&#xff1a;还可以有返回值哦&am…

如何使用linux服务器多核跑程序和unhashable type: ‘list‘报错的解决方案

问题描述 在使用服务器多核跑程序的时候&#xff0c;需要把核心的程序抽取出来&#xff0c;然后提供迭代参数。然后就可以使用多核去跑程序了。但是在执行的过程中报错如下&#xff1a; Exception has occurred: TypeError unhashable type: list File "/home/LIST_208…

【机器学习 深度学习】通俗讲解集成学习算法

目录&#xff1a;集成学习一、机器学习中的集成学习1.1 定义1.2 分类器(Classifier)1.2.1 决策树分类器1.2.2 朴素贝叶斯分类器1.2.3 AdaBoost算法1.2.4 支持向量机1.2.5 K近邻算法1.3 集成学习方法1.3.1 自助聚合(Bagging)1.3.2 提升法(Boosting)1.3.2.1 自适应adaboost1.3.3 …

【C语言编译器】02 Windows下 7 种C语言IDE的使用(万字长文警告,含Visual Studio多个版本)

目录一、Visual Studio1.1 VS 20101.2 VS 20151.21 简介1.22 使用1.3 VS 20171.31 简介1.32 使用1.4 VS 20191.41 简介1.42 使用1.5 VS 20221.6 VS 安全函数问题1.7 VS “无法查找或打开PDB文件” 问题二、CLion2.1 CLion简介及安装2.2 使用CLion编写C程序三、Dev C3.1 Dev C简…

【ubuntu 22.04不识别ch340串口】

这个真是挺无语的&#xff0c;发现国内厂商普遍对开源环境不感兴趣&#xff0c;ch340官方linux驱动好像被厂家忘了&#xff0c;现在放出来的驱动还是上古内核版本&#xff1a; 于是&#xff0c;驱动居然要用户自己编译安装。。还好网上有不少大神&#xff1a;链接&#xff0c;…

一起学 pixijs(3):Sprite

大家好&#xff0c;我是前端西瓜哥。今天来学习 pixijs 的 Sprite。 Sprite pixijs 的 Sprite 类用于将一些纹理&#xff08;Texture&#xff09;渲染到屏幕上。 Sprite 直译为 “精灵”&#xff0c;是游戏开发中常见的术语&#xff0c;就是将一个角色的多个动作放到一个图片…