K8S 集群搭建

news2024/12/24 18:20:31

 1、搭建清单

  • 2台linux服务器(一个master节点,一个node节点),建议搭3台(一个master,两个node)

我使用的是腾讯云,节点与节点使用公网IP通信

确保2台服务器都安装了docker

2、服务器前置工作

  • 如果是本机启动多个linux虚拟机,可忽略

建议学习阶段关闭防火墙及安全策略

如果需要添加安全组端口放行,我这里附上我的端口放行列表

放行端口如下:

  1. 8080:选择性放行,这个在证书会使用到,建议放行
  2. ping命令需要使用到ICMP协议的端口建议全部放行,不然在ping时会失败
  3.  6443:kube-apiserver 的通信端口。
  4. 2379:etcd 的 client 端口。
  5. 2380:etcd 的 peer 端口。
  6. 10250:kubelet 的安全端口,用于与 kube-apiserver 通信。
  7. 10251:kube-controller-manager 的安全端口,用于与 kube-apiserver 通信。
  8. 10252:kube-scheduler 的安全端口,用于与 kube-apiserver 通信。
  9. 还有一个dashboard端口,这个是在安装dashboard时动态生成的,注意下

3、K8S前置工作

K8S要求虚拟机必须配置的内容,如下:

#各个机器设置自己的域名

#master节点为:k8s-master,node节点为:k8s-node01
hostnamectl set-hostname xxxx


# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

#关闭swap
swapoff -a  
sed -ri 's/.*swap.*/#&/' /etc/fstab

#允许 iptables 检查桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system

4、安装kubelet、kubeadm、kubect

kubelet、kubeadm、kubect为K8S所有节点的三大件(每个节点都必须存在的)

注意:处理kubelet是以后台运行方式运行,其他的组件都是通过docker运行

  • 指定下载的yum源

cat <<EOF | sudo tee /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
exclude=kubelet kubeadm kubectl
EOF

  • 下载(最好加sudo,有些系统即使是root,下载时也会卡主)
sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes
  • 启动kubelet
sudo systemctl enable --now kubelet

kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环

5、使用kubeadm引导集群

5.1、下载各个机器需要的镜像
  • 在2个linux创建脚本
sudo tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.20.9
kube-proxy:v1.20.9
kube-controller-manager:v1.20.9
kube-scheduler:v1.20.9
coredns:1.7.0
etcd:3.4.13-0
pause:3.2
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
done
EOF

注意:上述镜像是master节点所需的镜像,而node节点只需要 kube-proxy即可,为了防止搭建过程失败,可以再node节点中安装上述所有镜像

如果只安装kube-proxy,脚本应为:

sudo tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-proxy:v1.20.9
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
done
EOF
  • 授权
chmod +x images.sh
  • 执行
./images.sh
5.2、修改节点信息
  • 集群的入口就是master节点

给所有服务器添加master节点信息

#cluster-endpoint 集群入口,这里的集群入口就是master节点的IP地址,111.230.19.178为master节点的公网IP

echo "111.230.19.178  cluster-endpoint" >> /etc/hosts

5.3、初始化主节点
kubeadm init \
--apiserver-advertise-address=111.230.19.178 \
--control-plane-endpoint=cluster-endpoint \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.168.0.0/16
  • --apiserver-advertise-address=111.230.19.178 表示主节点的IP地址
  • --control-plane-endpoint 表示控制屏的入口,必须与5.2一致
  • --image-repository 表示镜像仓库,这里用的是阿里云
  • --kubernetes-version K8S的版本
  • --service-cidr 集群内部负载均衡使用的
  • --pod-network-cidr

注意:必须保证service-cid与pod-network-cidr不能重叠,且不能与master和所有的node重叠

5.4、记初始化失败解决方案

这个失败问题,首先需要明确解决该问题的思路

思路如下:

  • kubectl服务是以后台方式运行的,其他的组件服务都是以docker方式运行的
  • 首先明确kubectl服务是否正常
  • 再找docker运行的k8s组件服务是否正常

1> 明确kubectl服务是否正常

systemctl status kubelet
  • active (running)  即表示是正常,下面的日志不需要看 

2>docker运行的k8s组件服务是否正常

kubeadm init 其实就是在启动docker中的容器,初始化失败的话,也就证明容器启动是失败的,我们去定位到底是哪个容器失败了,如下

docker ps -a

定位到2个容器启动失败,如下:

  1. k8s_etcd  【就是etcd组件】
  2.  k8s_kube-apiserver   【kube-apiserver组件】

查看容器启动时日志:

  • 注意:docker会自动重启失败的K8S容器,也就意味着失败容器的镜像ID会经过一段时间后改变,如果docker  logs报没有这个容器,请在docker  ps  -a一次!!!
docker logs 容器ID/容器名称

etcd容器出现的错误:

 etcdmain: listen tcp 111.230.19.178:2380: bind: cannot assign requested address,就是绑定这个IP+端口失败了

 kube-apiserver出现的错误:

 Err :connection error: desc = "transport: Error while dialing dial tcp 127.0.0.1:2379: connect: connection refused" 

注意:kube-apiserver连接2379端口(2379:etcd的client端口),其实就是去连接etcd!!!我们只需要解决etcd就可以了

解决方案:参考:天翼云服务器部署 k8s etcdmain: listen tcp xx.xx.xx.xx:2380: bind: cannot assign requested address-CSDN博客

实测没问题

5.5、master初始化成功后操作

内容需要记录,这里面有node节点加入master集群的token信息(该token有效期为24h)

  • 如果25htoken过期,可以在master节点使用下面命令重新生成token
kubeadm token create --print-join-command

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/

You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:

  kubeadm join cluster-endpoint:6443 --token 8vtydf.izdgell5pz20sm8n \
    --discovery-token-ca-cert-hash sha256:c91feabc45fb32737dc63a491ef5f41d41c1c80660ebb48e1aef487a27130f98 \
    --control-plane 

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

kubeadm join cluster-endpoint:6443 --token 8vtydf.izdgell5pz20sm8n \
    --discovery-token-ca-cert-hash sha256:c91feabc45fb32737dc63a491ef5f41d41c1c80660ebb48e1aef487a27130f98 

  • 在master节点中,执行init初始化成功后,信息里面的3句命令:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

5.6、安装网络插件
  • 这里插件选择的是calico,推荐使用fannel

在master节点执行

curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O

使用calico

kubectl apply -f calico.yaml
  • apply:应用什么
  • -f:表示file 文件

注意,calico.yaml文件中,有一处与master初始化时是一致的,如果kubectl  init时,pod-network-cidr=192.168.0.0/16   calico默认也是192.168

查看k8s当前节点信息

kubectl get nodes

5.7、kubectl常用命令

#查看集群所有节点
kubectl get nodes

#根据配置文件,给集群创建资源
kubectl apply -f xxxx.yaml

#查看集群部署了哪些应用?等同于docker  ps
kubectl get pods -A


# 运行中的应用在docker里面叫容器,在k8s里面叫Pod

5.8、加入node节点

在kubectl init中,把node节点加入命令复制,在node节点的机器上执行即可

  • docker images 查看镜像是否都有

  • 执行node节点添加命令(我的在步骤5.5中)

如果执行join时失败,如下

accepts at most 1 arg(s), received 3
To see the stack trace of this error execute with --v=5 or higher

请把join命令在记事本中打开,编辑下格式,可能是shell连接工具导致的错误

  • 在master节点中执行:
kubectl get nodes
  • 注意:如果node节点为noReady,可以等一会,k8s还在初始化 

5.9、删除node节点

 <1> 先查看一下这个node节点上的pod信息

kubectl get nodes -o wide

<2> 驱逐该node节点上的pod

kubectl drain k8s-node01 --delete-local-data --force --ignore-daemonsets

<3> 删除这个node节点

kubectl delete nodes k8s-node01

至此,集群搭建完毕


6、安装集群可视化界面dashboard

6.1、K8S applydashboard
  • 在主节点中执行:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml

如果无反应,可以在浏览器访问网址,然后在linux中新建yaml文件,把网页中的内容复制进yaml中,再kubectl apply -f yaml文件

  • 使用命令查看k8s的dashboard
kubectl get pod -A

6.2、配置dashboard端口
  • 修改dashboard配置文件
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
  • 找到type: ClusterIP,把type改为NodePort

  • 把dashboard的WEB访问页面的端口暴露到机器上(类似于docker -p端口映射)
kubectl get svc -A |grep kubernetes-dashboard

  • 注意:云服务器安全组需要放行该端口
  • 我的访问链接为(https请求):https://111.230.19.178:32473
  • 上述IP可以使用任意节点的IP都可以

注意,在访问前,一定要坚持所有的pods是否允许成功,否则访问会失败

kubectl get pods -A

  • 访问成功:https://111.230.19.178:32473

6.3、生成k8s访问账号密码
  • 创建访问账号,准备一个yaml文件; vi dash.yaml
#创建访问账号,准备一个yaml文件; vi dash.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard

  • K8S应用该脚本
kubectl apply -f dash.yaml
  • 获取访问令牌
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"

eyJhbGciOiJSUzI1NiIsImtpZCI6Ik02dmU1ZnBScUIxaE45YUdYWUJqZmVvY3FyYmVkSkNXZHhTaVp4bmZxdk0ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXZwZjJjIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5ZDBlZDcwOC1kOTJlLTQzOTQtOTA0OS04N2UxNjJmZmZmODIiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.luGUTFWDp79_UUa02-cBo44Vqs4JahXcNpqIe4IYAA93-WNr-5s3lCHuHXnWtY-eGMDqCqCuBMWnChIdKi97ZvxF6JcwOFkd0EEi04pM-EOGT37nJHGjx4KhjWPU4VQZgP9c172DD8HAMe6_VF4PEarB4lrTUXJqoAMufYO13rVRw8WxS-RPDfXSc7d2nEcy0x_fYd1LEKXwfYq_PvJFnoE2STNAbXcazQbfe0cKbyInkOpbhY_gV4WU1FH8pHNH3BQ4E-Hs6VO9UWujZ3f7jphlMPlIRnprg55CeHSvYHsrX6s6SDMGaWfLfa9REgSkzE-mPelV16EocffLhmMZFg 

  • 登录dashboard

复制上述令牌,登录即可

整合成功

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

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

相关文章

道路交通仿真方案【SUMO + TraCI + Python】

“城市交通模拟”&#xff08;SUMO&#xff09;是一个开源、高度可移植、微观和连续的交通模拟包&#xff0c;旨在处理大型网络&#xff08;SUMO 文档&#xff09;。 TraCI 是“交通控制接口”模块的简称&#xff0c;它可以访问正在运行的道路交通模拟&#xff0c;以检索模拟对…

理疗养生服务预约小程序要如何做

不少人面对身体症状疼痛&#xff0c;往往不会选择去医院&#xff0c;而是去理疗养生馆&#xff0c;选择艾灸、拔罐、中药贴敷等方式治疗改善或减轻疼痛。随着人们对中医信赖度增强&#xff0c;理疗养生市场增长迅速。 而在增长的同时&#xff0c;我们也注意到理疗养生馆经营痛…

点燃初冬!中海达亮相第一届中国测绘地理信息大会

11月8日&#xff0c;第一届中国测绘地理信息大会在浙江德清国际展览中心拉开帷幕。中海达携“海陆空、室内外”产品以及解决方案亮相展会&#xff0c;受到了与会领导、业界同仁、行业用户的高度关注。 ▲第一届中国测绘地理信息大会开幕式现场 本届大会以“科技引领&#xff0c…

电商平台api接口对接电商数据平台,获取商品详情页面实时信息须知

随着互联网的发展和普及&#xff0c;电商平台已成为人们日常生活中不可或缺的一部分。而为了保证电商平台的正常运行&#xff0c;平台与开发者之间需要进行数据交互&#xff0c;这便涉及到了电商平台API接口对接的问题。本文将详细介绍电商平台API接口对接的须知事项。 一、了解…

【原创】java+swing+mysql车辆维修管理系统设计与实现

摘要&#xff1a; 车辆维修管理系统是一个用于管理和追踪车辆维修过程的系统&#xff0c;它能够提高效率&#xff0c;减少错误&#xff0c;并提供详细的车辆历史记录&#xff0c;可以帮助车辆维修企业实现信息化管理&#xff0c;提高工作效率和客户满意度&#xff0c;降低运营…

RabbitMQ 核心部分之简单模式和工作模式

文章目录 一、Hello World&#xff08;简单&#xff09;模式1.导入依赖2.消息生产者3.消息消费者 二、Work Queues&#xff08;工作&#xff09;模式1.抽取工具类2.启动两个工作线程3.启动一个发送线程4.结果 总结 一、Hello World&#xff08;简单&#xff09;模式 在下图中&…

东北水利水电杂志东北水利水电杂志社东北水利水电编辑部2023年第11期目录

规划设计 导流泄洪洞射流-旋流梯级内消能工竖井出口体型优化 李金宝; 1-371 粉细砂地层防洪结构新形式研究 李泽鑫; 4-6《东北水利水电》投稿&#xff1a;cnqikantg126.com 引绰济辽工程鱼道进鱼口位置选择 银佳男;于月鹏;张鹏; 7-82471 大藤峡水利枢纽工程长期…

CRM销售管理软件哪个好,如何选?(二)

书接上回&#xff0c;我们从软件功能和厂商实力为大家介绍了CRM销售管理软件哪个好&#xff1f;该如何选型的难题&#xff0c;除了以上两点还有那些不容忽视的要素呢&#xff1f; 灵活性 CRM销售管理软件是企业信息化建设的中心&#xff0c;需要和其它企业管理应用进行集成实…

Python使用Mechanize库完成自动化爬虫程序

Mechanize是一个Python第三方库&#xff0c;它可以模拟浏览器的行为&#xff0c;实现自动化的网页访问、表单填写、提交等操作。下面是一个使用Mechanize库编写的爬虫的例子&#xff0c;它可以爬取百度搜索结果页面的标题和链接&#xff1a; import mechanize from bs4 import …

将铜互连扩展到2nm的研究

晶体管尺寸在3nm时达到临界点&#xff0c;纳米片FET可能会取代finFET来满足性能、功耗、面积和成本目标。同样&#xff0c;正在评估2nm铜互连的重大架构变化&#xff0c;此举将重新配置向晶体管传输电力的方式。 芯片制造商也可能会在2nm节点开始用钌或钼在一定程度上取代铜。…

一寸证件照排版工具,在线将证件照排版在相纸上

证件照是我们经常使用到的一种办事资料&#xff0c;考试报名和办理个人证件都是需要的&#xff0c;很多时候需要纸质照片&#xff0c;如果我们手头有打印机的话就很方便了&#xff0c;但相纸都是固定尺寸的例如5寸、6寸相纸&#xff0c;而数码证件照的尺寸则不固定&#xff0c;…

第二证券:被举牌一般会有几个涨停?

跟着股市的昌盛&#xff0c;越来越多的人初步查验出资&#xff0c;而其中一个备受注重的策略就是“举牌”。举牌是指某个股东对股票达到了必定比例的控制权&#xff0c;并告诉公司的一种行为。这种行为除了会对公司股价构成影响之外&#xff0c;还可以让股民猜疑和进一步价格走…

蓝牙特征值示例1-迈金L308自行车尾灯夜骑智能表情尾灯的

了解商品级蓝牙特征值 1 服务器&#xff08;设备&#xff09;描述 0x02-01-06 05-03-0F180A18 09-FF-FFFF166B001C0101 0A-09-4C3330385F37393937 01设备标识 03服务UUID FF厂商自定义数据(厂家编号&#xff1a;FFFF-166B001C0101) 完整设备名称&#xff1a; L308-7997 2 服…

Vue 3.0 + vite + axios+PHP跨域问题的解决办法

最后一个Web项目&#xff0c;采用前后端分离。 前端&#xff1a;Vue 3.0 viteelement plus 后端&#xff1a;PHP 运行时前端和后端是两个程序&#xff0c;前端需要时才向后端请求数据。由于是两个程序&#xff0c;这就会出现跨域问题。 比如前端某个地方需要请求的接口如下…

51单片机+DS1302设计一个电子钟(LCD1602显示时间)

一、前言 电子钟是一种能够准确显示时间的设备&#xff0c;广泛应用于家庭、办公场所和公共场所&#xff0c;为人们提供了方便和准确的时间信息。本项目设计一个基于51单片机的电子钟&#xff0c;使用DS1302作为RTC时钟芯片&#xff0c;LCD1602作为显示屏&#xff0c;并通过串…

安装MinGW并在codeblocks下使用

一、下载安装MinGW 1.下载MinGw安装器&#xff0c;下载地址 2. 安装 下载下来的知识一个安装器&#xff0c;我们双击安装会帮我们自动下载好相关文件 安装完成后会打开一个安装管理工具&#xff0c;在这个工具中我们选中想要安装的软件包然后安装到本地 选好以后在菜单栏选…

员工电脑监控的方法有哪些

有人在后台问&#xff0c;员工电脑监控的方法有哪些&#xff1f; 其实主要包括以下几方面&#xff1a;1&#xff09;安装监控软件 2&#xff09;使用操作系统自带的工具 3&#xff09;部署网络监控设备 4&#xff09;定期检查电脑 5&#xff09;制定严格的规章制度 因为内容比…

DISSECT

XAE 学习架构 OGB means ‘Orthogonal Gate Block’&#xff0c;shared (A ∗ ^∗ ∗, B ∗ ^∗ ∗) and unshared (A ⊥ ^⊥ ⊥, B ⊥ ^⊥ ⊥) information&#xff0c;Φ是编码器&#xff0c;Ψ是解码器 辅助信息 作者未提供代码

【ERROR】ERR_PNPM_NO_IMPORTER_MANIFEST_FOUND No package.json

1、报错 启动项目的时候&#xff0c;报这个错误&#xff0c;是因为根目录错误&#xff0c;查看&#xff0c;根目录是否错误。

Java系列之 查看某一部分代码执行时间长短

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 System.currentTimeMillis();//获取当前的总…