使用kubeadm方式快速部署一个K8S集群

目录

一、环境准备

二、环境初始化 

三、在所有主机上安装相关软件

1、安装docker

2、配置k8s的yum源

3、安装kubelet、kubeadm、kubectl

四、部署Kubernetes Master

五、加入Kubernets Node

六、部署CNI网络插件

七、测试k8s集群


一、环境准备

我的是CentOS7系统,然后准备三台虚拟主机

一台master,和两台node:node1、node2

我设置的主机名以及对应IP如下:

主机名IP地址
k8smaster192.168.198.150
k8snode1192.168.198.151
k8snode2192.168.198.152

二、环境初始化 

虚拟主机准备好之后,每一台都必须要关闭防火墙和selinux服务,以及关闭swap

在所有主机上执行:

#所有主机都要执行的操作

#关闭防火墙

临时:systemctl stop firewalld

永久:systemctl disable firewall

#关闭selinux

临时:setenforce 0

永久:sed -i 's/enforcing/disabled' /etc/selinux/config

#关闭swap

临时:swapoff -a

永久:sed -ri 's/.*swap.*/#&/' /etc/fstab

#开启流量转发,将桥接的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 ntpdate -y

ntp time.windows.com

仅在192.168.198.150(master)主机上执行:

#master上做的操作

#在master上添加hosts,根据自己设置的主机名和对应IP添加

cat >> /etc/hosts << EOF

192.168.198.150 k8smaster

192.168.198.151 k8snode1

192.168.198.152 k8snode2

EOF

三、在所有主机上安装相关软件

所有主机上执行以下所有安装操作

1、安装docker

#使用阿里云的提供的docker仓库

curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#更新yum缓存

yum clean all && yum makecache

#查看yum源中可用的版本

yum list docker-ce --showduplicates | sort -r

#直接yum安装

yum install -y docker-ce-20.10.6

#也可以直接安装旧版本

#yum install -y docker-ce-18.09.9

#启动docker,并设置开机自启

systemctl start docker
systemctl enable docker

#查看版本信息,能看到则安装启动成功

docker version

然后配置加速器,可以去登录自己的阿里云账号,获取容器镜像服务

点击链接:

阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

复制步骤就可以完成了

2、配置k8s的yum源

#配置阿里的官方yum源,方便后面软件的安装

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=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
EOF

3、安装kubelet、kubeadm、kubectl

#由于版本更新频繁,所以我这里指定版本号部署,也可以不指定版本

yum install -y kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4

#设置开机自启

systemctl enable kubelet

四、部署Kubernetes Master

仅在主机192.168.198.150(master)上执行:

#执行命令初始化

kubeadm init    \

--apiserver-advertise-address=192.168.198.150    \     #写主机的IP

--image-repository registry.aliyuncs.com/google_containers    \     #指定为阿里云仓库地址

--kubernetes-version v1.19.4    \          #指定版本信息,和你安装的版本要一致

--service-cidr=10.88.0.0/12     \        #这个无所谓,只要不和其他的IP冲突即可

--pod-network-cidr=10.240.0.0/16          #同样的,不和其他IP冲突即可

#上面的斜杠\表示换行,方便展示命令,其实是一条完整命令,如下

kubeadm init --apiserver-advertise-address=192.168.198.150 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.19.4 --service-cidr=10.88.0.0/12 --pod-network-cidr=10.240.0.0/16

#然后就可以看到拉取到了这些镜像
[root@k8smaster ~]# docker images
REPOSITORY                                                        TAG        IMAGE ID       CREATED       SIZE
registry.aliyuncs.com/google_containers/kube-proxy                v1.19.4    635b36f4d89f   2 years ago   118MB
registry.aliyuncs.com/google_containers/kube-controller-manager   v1.19.4    4830ab618586   2 years ago   111MB
registry.aliyuncs.com/google_containers/kube-apiserver            v1.19.4    b15c6247777d   2 years ago   119MB
registry.aliyuncs.com/google_containers/kube-scheduler            v1.19.4    14cd22f7abe7   2 years ago   45.7MB
registry.aliyuncs.com/google_containers/etcd                      3.4.13-0   0369cf4303ff   2 years ago   253MB
registry.aliyuncs.com/google_containers/coredns                   1.7.0      bfe3a36ebd25   3 years ago   45.2MB
registry.aliyuncs.com/google_containers/pause                     3.2        80d28bedfe5d   3 years ago   683kB
[root@k8smaster ~]#

我们刚才在执行完kubeamd init命令之后,结尾会有以下信息

然后就可以直接复制这三条命令去执行

#执行以下命令即可使用kubectl工具

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

五、加入Kubernets Node

仅在两个Node节点(node1、node2)上执行:

继续看到刚才在Master上执行完kubeamd init命令之后的结尾信息

#复制命令到Node节点:192.168.198.151(node1)和192.168.198.152(node2)上执行

kubeadm join 192.168.198.150:6443 --token pto6nc.ibvfrahbo8siq8rh \
    --discovery-token-ca-cert-hash sha256:485c64cd0b07b7c7aab9c95decd09b8bf2d4ab105c207d203767486d68f075a8

在Master上可以看到节点信息,k8snode1和k8snode2就被加入进来了

[root@k8smaster ~]# kubectl get nodes
NAME        STATUS     ROLES    AGE   VERSION
k8smaster   NotReady   master   21m   v1.19.4
k8snode1    NotReady   <none>   98s   v1.19.4
k8snode2    NotReady   <none>   88s   v1.19.4

#默认token有效期为24小时,过期后就不可用了,需要重新创建token可以执行以下命令

kubeadm token create --print-join-command

六、部署CNI网络插件

在192.168.198.150(master)上执行

#从docker hub上下载镜像仓库,由于是国外网站,可能会失败,多试几次

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

如果一直失败的话,可以试试以下办法:

vim kube-flannel.yml,然后复制下面代码框中的内容进去,保存退出之后,再执行kubectl apply -f kube-flannel.yml命令即可

---
kind: Namespace
apiVersion: v1
metadata:name: kube-flannellabels:k8s-app: flannelpod-security.kubernetes.io/enforce: privileged
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:labels:k8s-app: flannelname: flannel
rules:
- apiGroups:- ""resources:- podsverbs:- get
- apiGroups:- ""resources:- nodesverbs:- get- list- watch
- apiGroups:- ""resources:- nodes/statusverbs:- patch
- apiGroups:- networking.k8s.ioresources:- clustercidrsverbs:- list- watch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:labels:k8s-app: flannelname: flannel
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: flannel
subjects:
- kind: ServiceAccountname: flannelnamespace: kube-flannel
---
apiVersion: v1
kind: ServiceAccount
metadata:labels:k8s-app: flannelname: flannelnamespace: kube-flannel
---
kind: ConfigMap
apiVersion: v1
metadata:name: kube-flannel-cfgnamespace: kube-flannellabels:tier: nodek8s-app: flannelapp: flannel
data:cni-conf.json: |{"name": "cbr0","cniVersion": "0.3.1","plugins": [{"type": "flannel","delegate": {"hairpinMode": true,"isDefaultGateway": true}},{"type": "portmap","capabilities": {"portMappings": true}}]}net-conf.json: |{"Network": "10.244.0.0/16","Backend": {"Type": "vxlan"}}
---
apiVersion: apps/v1
kind: DaemonSet
metadata:name: kube-flannel-dsnamespace: kube-flannellabels:tier: nodeapp: flannelk8s-app: flannel
spec:selector:matchLabels:app: flanneltemplate:metadata:labels:tier: nodeapp: flannelspec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/osoperator: Invalues:- linuxhostNetwork: truepriorityClassName: system-node-criticaltolerations:- operator: Existseffect: NoScheduleserviceAccountName: flannelinitContainers:- name: install-cni-pluginimage: docker.io/flannel/flannel-cni-plugin:v1.2.0command:- cpargs:- -f- /flannel- /opt/cni/bin/flannelvolumeMounts:- name: cni-pluginmountPath: /opt/cni/bin- name: install-cniimage: docker.io/flannel/flannel:v0.22.2command:- cpargs:- -f- /etc/kube-flannel/cni-conf.json- /etc/cni/net.d/10-flannel.conflistvolumeMounts:- name: cnimountPath: /etc/cni/net.d- name: flannel-cfgmountPath: /etc/kube-flannel/containers:- name: kube-flannelimage: docker.io/flannel/flannel:v0.22.2command:- /opt/bin/flanneldargs:- --ip-masq- --kube-subnet-mgrresources:requests:cpu: "100m"memory: "50Mi"securityContext:privileged: falsecapabilities:add: ["NET_ADMIN", "NET_RAW"]env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: EVENT_QUEUE_DEPTHvalue: "5000"volumeMounts:- name: runmountPath: /run/flannel- name: flannel-cfgmountPath: /etc/kube-flannel/- name: xtables-lockmountPath: /run/xtables.lockvolumes:- name: runhostPath:path: /run/flannel- name: cni-pluginhostPath:path: /opt/cni/bin- name: cnihostPath:path: /etc/cni/net.d- name: flannel-cfgconfigMap:name: kube-flannel-cfg- name: xtables-lockhostPath:path: /run/xtables.locktype: FileOrCreate
#执行命令下载
[root@k8smaster ~]# kubectl apply -f 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
[root@k8smaster ~]# #然后再来查看status状态,还没好的多等一会儿就会好
[root@k8smaster ~]# kubectl get pods -n kube-system
NAME                                READY   STATUS    RESTARTS   AGE
coredns-6d56c8448f-82vp9            0/1     Pending   0          64m
coredns-6d56c8448f-vdlrw            0/1     Pending   0          64m
etcd-k8smaster                      1/1     Running   0          64m
kube-apiserver-k8smaster            1/1     Running   0          64m
kube-controller-manager-k8smaster   1/1     Running   0          64m
kube-proxy-89dm9                    1/1     Running   0          64m
kube-proxy-ltrtj                    1/1     Running   0          44m
kube-proxy-ngph4                    1/1     Running   0          44m
kube-scheduler-k8smaster            1/1     Running   0          64m#查看nodes状态,都是Ready即可
[root@k8smaster ~]# kubectl get nodes
NAME        STATUS   ROLES    AGE   VERSION
k8smaster   Ready    master   91m   v1.19.4
k8snode1    Ready    <none>   71m   v1.19.4
k8snode2    Ready    <none>   71m   v1.19.4

七、测试k8s集群

在192.168.198.150(master)上执行

在Kubernetes集群中创建一个pod,验证是否正常运行

#拉取nginx镜像 
[root@k8smaster ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created#等待状态变成running
[root@k8smaster ~]# kubectl get pod
NAME                     READY   STATUS              RESTARTS   AGE
nginx-6799fc88d8-s2pt9   0/1     ContainerCreating   0          67s#设置对外暴露的端口,提供访问
[root@k8smaster ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed#查看对外暴露的端口信息,因为我目前还没启动好,状态显示还在连网拉取当中
[root@k8smaster ~]# kubectl get pod,svc
NAME                         READY   STATUS              RESTARTS   AGE
pod/nginx-6799fc88d8-s2pt9   0/1     ContainerCreating   0          11mNAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.80.0.1       <none>        443/TCP        109m
service/nginx        NodePort    10.81.133.109   <none>        80:32061/TCP   48s
[root@k8smaster ~]# ##可以看到端口是80映射到32061

由于我的状态还在ContainerCreating中,很慢,泡的枸杞都喝完两杯了还没好(不知道是网速问题,还是设备资源给小了的问题),就没法演示了,等到状态是Running就可以测试了。测试的时候就可以用任意一个Node节点的IP,后面跟上刚查看到的32061这个端口,便可以访问到nginx的欢迎界面。

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

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

相关文章

Django(6)-django项目自动化测试

Django 应用的测试应该写在应用的 tests.py 文件里。测试系统会自动的在所有以 tests 开头的文件里寻找并执行测试代码。 我们的 polls 应用现在有一个小 bug 需要被修复&#xff1a;我们的要求是如果 Question 是在一天之内发布的&#xff0c; Question.was_published_recentl…

【业务功能篇82】微服务SpringCloud-ElasticSearch-Kibanan-docke安装-进阶实战

四、ElasticSearch进阶 https://www.elastic.co/guide/en/elasticsearch/reference/7.4/getting-started-search.html 1.ES中的检索方式 在ElasticSearch中支持两种检索方式 通过使用REST request URL 发送检索参数(uri检索参数)通过使用 REST request body 来发送检索参数…

燃气管网监测系统,24小时守护燃气安全

随着社会的发展和人民生活水平的提高&#xff0c;燃气逐渐成为人们日常生活和工作中不可或缺的一部分。然而&#xff0c;近年来&#xff0c;屡屡发生的燃气爆炸问题&#xff0c;也让人们不禁对燃气的安全性产生了担忧。因此&#xff0c;建立一个高效、实时、准确的燃气管网监测…

【现场问题】oracle 11g 和12c 使用jdbc链接,兼容的问题

oracle不同版本 问题是什么寻找解决方式首先Oracle的jdbc链接有几种形式?Oracle 11g的链接是什么呢Oracle 12C的链接是什么呢我的代码是哪种&#xff01;&#xff1f;发现问题没 解决问题代码 问题是什么 项目上建立Oracle数据源&#xff0c;以前大部分都是&#xff0c;11g的…

后端开发有哪几种语言? - 易智编译EaseEditing

后端开发是构建应用程序的一部分&#xff0c;负责处理服务器端的逻辑、数据库交互和数据处理。有许多编程语言可用于后端开发&#xff0c;以下是一些常见的后端开发语言&#xff1a; Java&#xff1a; Java是一种广泛使用的面向对象编程语言&#xff0c;具有强大的跨平台能力。…

C++避坑——most vexing parse问题

1."坑"的问题是什么&#xff1f; 先看一段代码&#xff1a; class Functor { public:void operator()(){std::cout << "我是线程的初始函数" << std::endl;} };int main() {std::thread t(Functor());// 强制高速编译器这是一个构造函数!t.j…

用QT实现MVP模式

近些天用qt 作项目,遇到参数界面.偷闲写个mvp模式示例. mvp模式重要的有两点 1 低耦合: 界面与后端数据类,不直接引用,可方便替换. 2 形成界面驱动-界面更新的闭环.:通过函数指针类技术,让数据自动回流. MVP (Model-View-Presenter) 视图&#xff08;View&#xff09;: 接…

Open3D 点云均值滤波

目录 一、算法原理1、均值滤波2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、均值滤波 对待处理的当前采样点,选择一个模板,该模板由其邻近的若干个数据点组成,…

Linux 下 Mysql 的使用(Ubuntu20.04)

文章目录 一、安装二、使用2.1 登录2.2 数据库操作2.2.1 创建数据库2.2.2 删除数据库2.2.3 创建数据表 参考文档 一、安装 Linux 下 Mysql 的安装非常简单&#xff0c;一个命令即可&#xff1a; sudo apt install mysql-server检查安装是否成功&#xff0c;输入&#xff1a; …

【推荐】Spring与Mybatis集成

目录 1.概述 2.集成 2.1代码演示&#xff1a; 3.整合 3.1概述 3.2 进行整合分页 接着上两篇&#xff0c;我已经写了Mybatis动态之灵活使用&#xff0c;mybatis的分页和特殊字符的使用方式接下来把它们集成起来&#xff0c;是如何的呢&#x1f447;&#x1f447;&#x1…

【Linux应用部署篇】在CSDN云IDE平台部署Etherpad文档编辑器

【Linux应用部署篇】在CSDN云IDE平台部署Etherpad文档编辑器 一、CSDN云IDE平台介绍1.1 CSDN云IDE平台简介1.2 CSDN云IDE平台特点 二、本次实践介绍2.1 本次实践介绍2.2 Etherpad简介 三、登录CSDN云IDE平台3.1 登录CSDN开发云3.2 登录云IDE3.3 新建工作空间3.4 进入工作空间 四…

足球- EDA的历史数据分析并可视化

足球- EDA的历史数据分析并可视化 背景数据介绍探索数据时需要遵循的一些方向:数据处理导入库数据探索 数据可视化赛事分析主客场比分相关性分析时间序列分析 总结 背景 该数据集包括从1872年第一场正式比赛到2023年的44&#xff0c;341场国际足球比赛的结果。比赛范围从FIFA世…

海运费查询国际海运费知识-箱讯科技

在国际贸易中&#xff0c;海运是一种常见且重要的货物运输方式。了解海运费用及其查询方法以及国际海运费的相关知识对于进出口商和物流从业人员来说至关重要。本文将介绍海运费查询的方法和国际海运费的相关知识&#xff0c;帮助读者更好地理解和应用于实际业务中。 一、海运费…

Spring和mybatis整合

一、Spring整合MyBatis 1. 导入pom依赖 1.1 添加spring相关依赖(5.0.2.RELEASE) spring-core spring-beans spring-context spring-orm spring-tx spring-aspects spring-web 1.2 添加mybatis相关依赖 mybatis核心&#xff1a;mybatis(3.4.5) Mybatis分页&#xff1a;pagehel…

Smartbi电子表格软件版本更新,首次推出Excel轻应用和语音播放

Smartbi电子表格软件又又又更新啦&#xff01; 此次更新&#xff0c;首次推出了新特性——Excel轻应用和语音播报。另外&#xff0c;还对产品功能、Demo示例、配套文档进行了完善和迭代。 低代码开发Excel轻应用 可实现迅速发布web应用 业务用户的需求往往都处于“解决问题”…

结构型模式-代理模式

代理模式* 定义&#xff1a;在代理模式&#xff08;Proxy Pattern&#xff09;中&#xff0c;一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中&#xff0c;我们创建具有现有对象的对象&#xff0c;以便向外界提供功能接口。 意图&#xff1a;为其…

MySQL的日志undolog、binlog、redolog

1. 日志层次 binlog是Server层&#xff0c;undolog和redolog是innodb引擎层特有的。 2. 记录了什么 & 作用 binlog 记录了所有数据库结构变更和表数据修改的SQL日志。 主要用于数据备份和主从复制&#xff0c;比如误删数据了可以用binlog找回。 undolog 如下图&#…

IET独立出版 | EI检索 | 2023年第三届机械、航空航天与汽车工程国际会议

会议简介 Brief Introduction 2023年第三届机械、航空航天与汽车工程国际会议&#xff08;CMAAE 2023&#xff09; 会议时间&#xff1a;2023年12月8 -10日 召开地点&#xff1a;中国南京 大会官网&#xff1a;www.cmaae.org 航天是当今世界最具挑战性和广泛带动性的高技术领域…

火山引擎边缘云,助你沉浸式回忆童年

发现了吗&#xff1f;在抖音、西瓜视频上能观看4K修复的经典港片了&#xff01;得益于抖音、中国电影资料馆、火山引擎共同发起的“经典香港电影修复计划”&#xff0c;我们童年时期看过的《大话西游之大圣娶亲》《武状元苏乞儿》等22部港片以更清晰、流畅、颜色饱满的状态回归…

SpringBootWeb 登录认证

登录认证&#xff0c;那什么是认证呢&#xff1f; 所谓认证指的就是根据用户名和密码校验用户身份的这个过程&#xff0c;认证成功之后&#xff0c;我们才可以访问系统当中的信息&#xff0c;否则就拒绝访问。 在前面的案例中&#xff0c;我们已经实现了部门管理、员工管理的…