知识点14--搭建k8s本地测试集群

news2025/1/9 3:31:35

首先要做安装前的准备:

1、最少三台节点,CentOS 7系统,每台不低于4核4G资源,并配置host域名

[root@hdp1 ~] cat /etc/hosts
192.168.88.186 hdp1
192.168.88.187 hdp2
192.168.88.188 hdp3

2、所有节点保证时间同步、并做SSH互信

SSH互信:https://blog.csdn.net/dudadudadd/article/details/117816179
取消SSH检查:https://blog.csdn.net/dudadudadd/article/details/117899463
时间服务:https://blog.csdn.net/dudadudadd/article/details/110947177

3、所有节点关闭防火墙、setenfore、SELINUX、交换分区

关闭防火墙:
systemctl stop firewalld.service
systemctl disable firewalld.service

关闭setenfore和SELINUX:
setenforce 0 && sed -i 's/^SELINUX=.*$/SELINUX=disabled/' /etc/selinux/config && getenforce

关闭交换分区:
vi /etc/fstab
注释swap的行 
#/dev/mapper/cs-swap     none                    swap    defaults        0 0
# 查看是否关闭
free -h

4、在git上选择你要安装的版本https://github.com/kubernetes/kubernetes/releases
在这里插入图片描述
在git上只是看一下版本,安装的时候用阿里的镜像yum安装,但是你要知道如果有一天别人和你说起除了yum安装rpm包这种方式之外的tar包安装,你要知道,这种方法需要从git上下载安装包,并且不是直接点击Assets下面的连接,而是点击CHANGELOG,去下载分包
在这里插入图片描述


现在开始正式的安装。

1、三台节点下载docker,由于k8s的1.20.15以后不在支持docker,所有docker的版本也不宜过高,防止出现k8s和docker之间的版本问题,这里安装18.06.3,安装方法

https://blog.csdn.net/dudadudadd/article/details/128176347

和k8s一起使用需要添加一个配置,编辑文件/etc/docker/daemon.json

"exec-opts": ["native.cgroupdriver=systemd"]

改完后重启docker

systemctl daemon-reload
systemctl restart docker

2、准备k8s的国内镜像yum,在任意一台机器上,新建/etc/yum.repos.d/kubernetes.repo文件

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
enabled=1

刷新yum源

yum repolist

由于另外两台节点也有使用所以先推送过去

scp kubernetes.repo hdp2:/etc/yum.repos.d/
scp kubernetes.repo hdp3:/etc/yum.repos.d/

3、选择出一台机器做主节点,安装服务,这里用hdp1做主节点

安装k8s的安装工具kubeadm、客户端kubectl、节点服务kubelet,注意只能安装1.20.15一下的版本,原因我已经在docker的介绍中说过了。这里安装1.17.0

yum install -y kubelet-1.17.0 kubeadm-1.17.0 kubectl-1.17.0

安装完成后,你要确保下面的系统文件的值都是1

/proc/sys/net/bridge/bridge-nf-call-ip6tables 
/proc/sys/net/bridge/bridge-nf-call-iptables

如果不是1,运行下面的命令

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

sysctl --system

修改/etc/sysconfig/kubelet

KUBELET_EXTRA_ARGS="--fail-swap-on=false"

设置kubelet和docker服务系统开机自启

systemctl enable kubelet docker

初始化master节点

kubeadm init --kubernetes-version=v1.17.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap --image-repository registry.aliyuncs.com/google_containers

init的参数都可以通过–help查帮助
--kubernetes-version 指定安装版本,如果不指定默认"stable-1"
--pod-network-cidr 设置pod网络的ip地址范围,这个返回一般不变,就和docker内部容器的ip一样
--service-cidr Service的ip和pod网络一样一般不变
--ignore-preflight-errors 是忽略某些警告
--image-repository设置镜像下载的远程仓库,一定要设置成阿里云
--apiserver-advertise-address设置API Server的通信地址不过一般默认就行,还可以改端口号,不过一般也默认

最后会输出如下的信息,表示初始化成功

[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

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 192.168.88.186:6443 --token iwhiht.j7d3xzmc5zlrr4o4 \
    --discovery-token-ca-cert-hash sha256:4ff043695bb82b72a8982f76c92588726c88fd2fddbbd31e53e5dcfff144fd30 

此时按照输出的日志已经告诉了你下一步该做什么,To start using your cluster, you need to run the following as a regular user,就是用一个普通的用户执行三条命令,在项目上使用的话就需要严格执行,但是个人自己的虚拟机上使用直接用root用户就行,而且只用运行前两条就行,不然还要去配置新用户添加sudo权限,比较麻烦。总之上面三条命令的最终目的就是让一个日后负责k8s的运维人员有可执行的k8s命令,而一般不可能拿不到root密码,所以用一个普通的用户。

[root@hdp1 ~] mkdir -p $HOME/.kube
[root@hdp1 ~] cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

最后一段相当重要!!!!!!Then you can join any number of worker nodes by running the following on each as root的信息你一定要保留,它是在告诉你,其他的k8s节点可以在root用户下使用kubeadm join 192.168.88.186:6443 --token iwhiht.j7d3xzmc5zlrr4o4 --discovery-token-ca-cert-hash sha256:4ff043695bb82b72a8982f76c92588726c88fd2fddbbd31e53e5dcfff144fd30命令加入master所在的k8s集群,这条命令一定要保存下来!!!!!!后面如果丢失想要再找回来巨麻烦!!!!!

当你运行完日志中的命令,在master节点上你就可以运行k8s的命令了,比如运行get获取组件状态信息

[root@hdp1 ~] kubectl get cs
NAME                 STATUS    MESSAGE             ERROR
controller-manager   Healthy   ok                  
scheduler            Healthy   ok                  
etcd-0               Healthy   {"health":"true"} 

你重点要看一下当前集群的节点

[root@hdp1 ~] kubectl get nodes
NAME   STATUS     ROLES    AGE   VERSION
hdp1   NotReady   master   41m   v1.17.0

你会发现hdp1这个master节点未准备就绪,这是因为它缺一个重要的网络组件,之所以缺失是因为该组件k8s官方一直用的是第三方组件,本身不自带,一般是Flannel。所以我们要去git上找Flannel并安装。https://github.com/flannel-io/flannel,去找Deploying flannel manually,会告诉你如何安装
在这里插入图片描述
图片中已经告诉你,如果你是1.17+的版本,你可以直接运行命令下载相应的镜像并安装,刚好本篇中的版本够线。

[root@hdp1 ~] kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
namespace/kube-flannel 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

但是并不是看见created就大功告成了,你需要查看docker的镜像,知道看到flannel镜像被下载成功并启动了对应的容器,且master状态变成ready才可以。

[root@hdp1 ~] kubectl get nodes
NAME   STATUS   ROLES    AGE   VERSION
hdp1   Ready    master   61m   v1.17.0

这里注意一个诡异的问题,按照管理当前一切正常并且master变成ready后,运行kubectl get pods -n kube-system可以看到k8s系统命名空间下的pod中有一个flannel的pod,但是我在查看的时候发现没有,但是检查镜像、master状态、容器列表都表示着flannel安装没问题,最后在朋友的提示下查询了一下所有的命名空间,才发现flannel的pod在新版中已经不属于kube-system这个系统级的命名空间了

[root@hdp1 ~] kubectl get ns
NAME              STATUS   AGE
default           Active   78m
kube-flannel      Active   21m
kube-node-lease   Active   78m
kube-public       Active   78m
kube-system       Active   78m
[root@hdp1 ~] kubectl get pods -n kube-flannel
NAME                    READY   STATUS    RESTARTS   AGE
kube-flannel-ds-pkw5m   1/1     Running   0          26m

到此master节点才算安装完成。

4、现在我们开始安装其他的node节点,其他node节点也需要安装k8s包,kubectl是客户端node节点如果没有连接需求可以不安装

yum install -y kubelet-1.17.0 kubeadm-1.17.0

安装完成后,从主节点上把k8s现成的配置文件cp过去

scp /etc/sysconfig/kubelet hdp2:/etc/sysconfig/
scp /etc/sysconfig/kubelet hdp3:/etc/sysconfig/

同时node节点也需要docker和k8s的系统自启

systemctl enable kubelet docker

随后运行加入master节点的命令,但注意不要直接cp过来就运行,因为上面提示给你的命令只是一个核心参数,你需要另外添加其他的配置,因为node节点在加入命令运行之后也会初始化

[root@hdp2 ~] kubeadm join 192.168.88.186:6443 --token iwhiht.j7d3xzmc5zlrr4o4 --discovery-token-ca-cert-hash sha256:4ff043695bb82b72a8982f76c92588726c88fd2fddbbd31e53e5dcfff144fd30 --ignore-preflight-errors=Swap
W1209 20:14:15.083053    1815 join.go:346] [preflight] WARNING: JoinControlPane.controlPlane settings will be ignored when control-plane flag is not set.
[preflight] Running pre-flight checks
        [WARNING Swap]: running with swap on is not supported. Please disable swap
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.17" ConfigMap in the kube-system namespace
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

加入之后注意,和master一样node节点在刚加入集群的时候大概率是notready,需要等待一会,它会从master同步flannel

[root@hdp1 ~] kubectl get nodes
NAME   STATUS     ROLES    AGE    VERSION
hdp1   Ready      master   102m   v1.17.0
hdp2   NotReady   <none>   63s    v1.17.0
[root@hdp1 ~] kubectl get nodes
NAME   STATUS   ROLES    AGE     VERSION
hdp1   Ready    master   105m    v1.17.0
hdp2   Ready    <none>   3m54s   v1.17.0
hdp3   Ready    <none>   2m6s    v1.17.0

在master节点还可以查询到k8s系统pod情况

[root@hdp1 ~]# kubectl get pods -n kube-system -o wide
NAME                           READY   STATUS    RESTARTS   AGE     IP               NODE   NOMINATED NODE   READINESS GATES
coredns-9d85f5447-4dg48        1/1     Running   0          108m    10.244.0.3       hdp1   <none>           <none>
coredns-9d85f5447-vj5z7        1/1     Running   0          108m    10.244.0.2       hdp1   <none>           <none>
etcd-hdp1                      1/1     Running   0          108m    192.168.88.186   hdp1   <none>           <none>
kube-apiserver-hdp1            1/1     Running   0          108m    192.168.88.186   hdp1   <none>           <none>
kube-controller-manager-hdp1   1/1     Running   0          108m    192.168.88.186   hdp1   <none>           <none>
kube-proxy-6w698               1/1     Running   0          108m    192.168.88.186   hdp1   <none>           <none>
kube-proxy-8pclr               1/1     Running   0          5m29s   192.168.88.188   hdp3   <none>           <none>
kube-proxy-psjwj               1/1     Running   0          7m17s   192.168.88.187   hdp2   <none>           <none>
kube-scheduler-hdp1            1/1     Running   0          108m    192.168.88.186   hdp1   <none>           <none>

到此k8s集群也就安装完成了。个人自己使用完全足够。毕竟我在前面的知识点也说了,我们只是用来做测试,而不是专业做运维,没有必要做复杂的高可用。也不要有强迫症,做开发的基本不会接触到k8s,但容器引擎尝尝接触,毕竟你要交付环境和开发结果物。

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

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

相关文章

离散数学与组合数学-数理逻辑-01命题与联结词

文章目录1. 命题与联结词1.1 命题1.2 常用联结词1.3 命题公式1.4 命题的等值演算与推理等价关系式基本等价式1. 命题与联结词 1.1 命题 命题&#xff1a;我们对确定对象做出的陈述句称为命题&#xff08;propositions and statements 命题或陈述&#xff09;。当判断为真时&a…

《小猫猫大课堂》2—开启C语言的世界,喵!

更新不易&#xff0c;麻烦多多点赞&#xff0c;欢迎你的提问&#xff0c;感谢你的转发&#xff0c; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我…

学不会的python之正则表达式详解(re模块)

本篇博客介绍了正则表达式与在python中的应用(re模块)&#xff0c;及一些在开发中常见的模式示例。参考书籍《python核心编程(第三版)》 学不会的python之正则表达式正则表达式(模式)简介正则应用搜索与匹配注意特殊符号与字符择一匹配匹配单个字符注意问题起始、结尾、单词边界…

天津教育杂志天津教育杂志社天津教育编辑部2022年第35期目录

卷首语《天津教育》投稿&#xff1a;cn7kantougao163.com 强化教学保障意识 助力基础教育又好又快发展 本刊编辑部; 1 本刊视线_关注 家校协同下的青少年心理健康问题探讨 袁玉萍; 4-6 本刊视线_学校体育 中学体育课程主体活动教学模式的实施 张强;李聚虎; 7-9 本刊…

Python制作粒子烟花,提前开始跨年?

前言 跨年倒计时20天&#xff1f;我已经开始整烟花了&#xff0c;虽然不是很好看吧&#xff0c;但是也能将就看看 &#x1f625; 这个的背景图&#xff0c;音乐&#xff0c;还有文字都是可以自己修改的哦 效果展示 导入库 import random import pygame as py import tkinte…

CENTOS上的网络安全工具(十五)cascade的部署

这一篇&#xff0c;我们尝试在CentOS上安装并运用一款“小众”安全工具——Cascade。这个工具给人的感觉只是作为验证ATT&CK理念的一个存在&#xff0c;而且由于其运转还需要依托CAR&#xff0c;所以对数据的处理停留在主机log类的层面&#xff0c;可能暂时还不太受安全公司…

【Lilishop商城】No3-3.模块详细设计,会员信息(会员基本信息)、店铺设置(店铺信息、配送模板)的详细设计

仅涉及后端&#xff0c;全部目录看顶部专栏&#xff0c;代码、文档、接口路径在&#xff1a; 【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客 全篇会结合业务介绍重点设计逻辑&#xff0c;其中重点包括接口类、业务类&#xff0c;具体的结合源代码…

Briefings in Bioinformatics2021 | 从头药物设计的深度生成模型的综合性评估

论文标题&#xff1a;Comprehensive assessment of deep generative architectures for de novo drug design 论文地址&#xff1a;Comprehensive assessment of deep generative architectures for de novo drug design | Briefings in Bioinformatics | Oxford Academic 一…

JMeter的三种参数化方式

一、 用户定义的变量 1.线程组-配置元件添加用户定义的变量 2.引用变量 ${变量} 二、 csv Data Set config &#xff08;1&#xff09;csv Data Set config之.CSV 1.造.csv格式文件的数据 2.设置CSV数据文件 3.消息体数据&#xff0c;引用变量名.{变量名} 4.设置线程组&…

关于Elasticsearch查询(match、match_phrase、query_string和term)

由上图看出&#xff0c; QueryBuilder 是整个查询操作的核心&#xff0c;决定了查询什么样的数据和期望得到什么结果这些核心的问题。 QueryBuilder 只是一个接口&#xff0c;需要具体的实体类才可以。那么如何创建 QueryBuilder 的实例呢&#xff1f;有两种方式 通过 QueryB…

AOP开发明确的的事项

12.2. AOP开发明确的的事项 12.2.1、需要编写的内容 编写核心业务代码&#xff08;目标类的目标方法&#xff09; 编写切面类&#xff0c;切面类中有通知(增强功能方法) 在配置文件中&#xff0c;配置织入关系&#xff0c;即将哪些通知与哪些连接点进行结合 12.2.2、AOP 技…

什么是MinIO

本文为joshua317原创文章,转载请注明&#xff1a;转载自joshua317博客 什么是MinIO - joshua317的博客 什么是MinIO&#xff1f; MinIO 是一款高性能、分布式的对象存储系统. 它是一款软件产品, 可以100%的运行在标准硬件。即X86等低成本机器也能够很好的运行MinIO。 MinIO提…

容灾演练月报 | 福莱特集团核心系统完成“跨云”容灾切换演练

11月&#xff0c;美创科技携手福莱特集团、金华银行、稠州银行、慈溪市卫健委及医疗行业等总计19家用户完成容灾切换演练&#xff0c;其中完成2次灾难切换&#xff0c;有效验证了各用户单位容灾系统的可靠性及高可用性&#xff01; 本月典型案例&#xff1a;福莱特集团 福莱特集…

CANoe.DiVa简单配置

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

RK3588核心板显示资源分配实操竟如此简单!飞凌嵌入式

前言 眼睛作为人类最重要的感觉器官&#xff0c;通过“视觉”帮助我们接收了大部分的外界信息&#xff0c;“视觉效果的好坏”直接影响着我们日常生产和生活质量的高低&#xff0c;因此“显示能力”成为了评价产品优劣的一项重要指标。在影音、游戏、智慧办公、工业自动化和交通…

OpenAI ChatGPT微信接入教程

OpenAI ChatGPT微信接入教程 OpenAI ChatGPT 接入 个人WeChat(微信)&#xff0c;让AI互动更方便&#xff01; 准备工作 Ⅰ&#xff0c;OpenAI 账号&#xff0c;参考ChatGPT注册试用全攻略 Ⅱ&#xff0c;微信账号&#xff08;需要绑定支付方式&#xff0c;需支持网页登录&am…

JVM篇之牛刀小试(三)年轻代参数优化探索

前言 在JVM 篇之 牛刀小试 &#xff08;一&#xff09;我们谈到了关于年轻代参数的问题&#xff0c;就是当我没有设置-Xmn的时候&#xff0c;gc时间居然比我设置了500m的时候&#xff0c;时间还短&#xff0c;然后当时我就停止了探索。 后来我在公司飞书文档写了一篇文章分享&…

Java的注解和注解解析器是什么,运行方法如何,架构师必会知识体系

文章目录什么是[元数据](https://so.csdn.net/so/search?q元数据&spm1001.2101.3001.7020)(metadata)什么是注解(Annotation)?元注解自定义注解注解处理器什么是元数据(metadata) ​ 元数据由metadata译来&#xff0c;所谓的元数据就是“关于数据的数据”,更通俗的说就是…

网络篇汇总

路由器&#xff1a;属于网关设备&#xff0c;通过路由器可以将各种局域网、城域网、广域网连接起来&#xff0c;一般工作于网络层。它会根据信号的情况自动选择和设定路由&#xff0c;以最佳路径&#xff0c;按照前后顺序发送信号。路由器可连接多个逻辑上分开的网络&#xff0…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java随骑共享系统m7i8o

要对当前自己的学校对于计算机毕业设计的要求以及严格程度有所了解&#xff0c;这个主要是借助上一届已经毕业的学长学姐了解一下&#xff0c;但是有一点要注意的是&#xff0c;对于每一届毕业生的毕业设计的处理&#xff0c;学校都有很大的调整&#xff0c;这一点尤其重要。其…