K8S 集群搭建

 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

复制上述令牌,登录即可

整合成功

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

unity 使用Vuforia扫描实体物体交互

文章目录 前言一、Vuforia是什么&#xff1f;二、Unity导入Vuforia1.去Unity - Windows – Asset Store&#xff0c;搜vuforia engine&#xff0c;添加到我的资源2.从 Unity 的菜单 Assets -> Import package -> Custom Package 导入脚本&#xff0c;添加 Vuforia Engine…

Echarts 图表添加横向 竖向滚动条

1.横向滚动条 dataZoom: [{// 设置滚动条的隐藏与显示show: true,// 设置滚动条类型type: "slider",// 设置背景颜色backgroundColor: "rgb(19, 63, 100)",// 设置选中范围的填充颜色fillerColor: "rgb(16, 171, 198)",// 设置边框颜色borderCo…

PGVector 管理工具 pgAdmin

PGVector 管理工具 pgAdmin pgAdmin 下载地址pgAdmin 安装pgAdmin 使用 pgAdmin 下载地址 https://www.postgresql.org/ftp/pgadmin/pgadmin4/ pgAdmin 安装 双击 pgadmin4-*-x64.exe 安装文件&#xff0c;选择安装路径&#xff0c;后面安装提示单击 next 就可以了。 pgAdm…

数据迁移教程 | 从 Postgre/Greenplum 到 DolphinDB

PostgreSQL 是一种开源的关系型数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;是最广泛使用的开源数据库之一。它允许用户通过添加自定义函数、数据类型和索引等方式扩展其功能&#xff0c;支持 ACID 事务&#xff0c;并使用多版本并发控制 (MVCC&#xff09;来管理并…

JDK 环境变量设置

目录 一. 前言 二. 下载 JDK 2.1. JDK 8 2.2. JDK 17 2.3. JDK 21 三. 环境变量设置 3.1. Windows 环境配置 3.1.1. 打开环境变量配置窗口 3.1.2. 配置环境变量 JAVA_HOME 3.1.3. 配置环境变量 CLASSPATH 3.1.4. 环境变量 Path 末尾追加 3.1.5. 检查JDK是否安装成…

北斗卫星推动我国法治建设

北斗卫星推动我国法治建设发展 10月26日下午&#xff0c;第二届北斗规模应用国际峰会北斗规模应用法治保障专题论坛在湖南省株洲市召开。与会专家围绕北斗法治建设全局、北斗涉外法治建设、北斗品牌塑造、北斗产业生态建设及政策法规完善等方面&#xff0c;进行了深入研讨交流。…

搬砖日记:post传数组(三种格式)

1. json型 request({url: /msg/message/batch/read,data,method: post,content-Type: application/json })2. formData数组型 Content-Type: application/x-www-form-urlencoded request({url: /msg/message/batch/read,data,method: post,})3.formData字段重复传型 把data换成…

经典文献阅读之--Fast and Robust Ground Surface Estimation...(均匀B样条采样快速估计地平面)

0. 简介 对于激光雷达的地面估计分割&#xff0c;目前其实有很多方法做了快速并鲁棒的分割&#xff0c;比如说我们之前写的一篇《经典文献阅读之–FEC》一文中就给出了快速分割的方案&#xff0c;当中第一步就是需要对地面进行分割。而我们这次看的是一篇使用均匀B样条的方法来…

第2关:多表查询

任务描述 join操作符编程要求测试说明 任务描述 本关任务&#xff1a; 使用join操作符实现多表查询。 join操作符 1.笛卡尔积&#xff0c;RXS 可直接转换为SQL语句 2.等值连接&#xff0c;记作 可直接转换为SQL语句 3.自然连接&#xff0c;记作 可转换为SQL语句 4.左外连接…

Java架构核心基础知识硬核整理,赶快收藏起来吧!!!

Java架构核心基础 lecture&#xff1a;波哥 一、数据结构和算法 1.数据结构 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下&#xff0c;精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同…

保护您的Google账号安全:检查和加固措施

简介&#xff1a;随着我们在日常生活中越来越依赖于Google账号&#xff0c;我们的个人信息和敏感数据也变得越来越容易受到威胁。为了确保您的Google账号的安全性&#xff0c;本文将介绍一些简单但有效的方法&#xff0c;帮助您检查和加固您的Google账号。 --- 在数字时代&am…

【工具使用】卸载VS(Visual Studio)

目录 方法一&#xff1a;使用TotalUninstaller工具方法二&#xff1a;官网的卸载方法 方法一&#xff1a;使用TotalUninstaller工具 下载地址&#xff1a;https://github.com/Microsoft/VisualStudioUninstaller/releases 1.点击下载地址&#xff0c;选择TotalUninstaller进行…

CNKI上最新硕士博士论文pdf格式文件owner密码找回难度

听人说CNKI上比较早期的硕士博士论文pdf格式文件密码修改权限Owner密码是123456&#xff0c;想办法找了几个文件试了试果然如此。 但又听人说CNKI上最新硕士博士论文pdf格式文件owner密码已经不是了。虽然直接移除这种密码的工具到处都是&#xff0c;推测一下新增的owner密码及…

从道一云到畅捷通T+通过接口配置打通数据

从道一云到畅捷通T通过接口配置打通数据 接通系统&#xff1a;道一云 在道一云坚实的技术基础上&#xff0c;道一云推出全新升级的2.0产品矩阵&#xff0c;分别是低码平台、智能门户、场景应用。基于云原生底座&#xff0c;为企业提供集智能门户解决网关流量问题、企业微信端的…

深入理解 Spring Boot 内置工具类:ReflectionUtils

文章目录 1. 什么是反射&#xff1f;2. 使用 ReflectionUtils2.1 获取类的所有字段2.2 调用方法2.3 访问字段 3. 源码分析3.1 doWithFields3.2 findMethod3.3 invokeMethod 4. 拓展与分析4.1 拓展4.2 性能考虑4.3 Java 9 模块化 5. 总结 &#x1f389;欢迎来到架构设计专栏~深入…

探索数据湖和大数据在亚马逊云服务云存储服务上的威力

文章作者&#xff1a;Libai 引言 在当今数字化的环境中&#xff0c;组织生成的数据量正以前所未有的速度增长。数据量的激增催生了对高效存储和管理解决方案的需求。数据湖和亚马逊云服务云存储服务上的大数据是一个强大的组合&#xff0c;使组织能够充分发挥其数据的潜力。 亚…

Socket网络编程(服务端和客户端代码示例)

本文主要讲解Socket网络编程。 首先介绍socket&#xff0c;包括TCP和UDP通信过程&#xff1b;然后介绍常用的函数&#xff1b;最后编写client-server例子&#xff0c;并进行测试。 文章目录 Socket介绍TCP通信过程服务器端通信过程&#xff1a;客户端通信过程&#xff1a; UDP通…

数据结构——带头双向循环链表

呀哈喽&#xff0c;我是结衣。 前言 说到链表前面我们讲了单链表&#xff0c;但是链表可不止一种&#xff0c;要分类的话。链表可以分为带头或不带头&#xff0c;单向或双向&#xff0c;循环或者不循环&#xff0c;也就是说链表一共应该是有8种结构的&#xff0c;我们上次讲的…

记一次请求头header丢失问题排查实录

前言 前端小王需要调用兄弟部门老张的后端接口&#xff0c;老张提供的接口&#xff0c;需要token鉴权才能调用成功。当小王按约定携带token调用老张的接口时&#xff0c;起先因为跨域问题&#xff0c;导致前端小王没法成功请求老张的接口。于是小王就跟老张说&#xff0c;能不…

【科研新手指南4】ChatGPT的prompt技巧 心得

ChatGPT的prompt心得 写在最前面chatgpt咒语1&#xff08;感觉最好用的竟然是这个&#xff0c;简单方便快捷&#xff0c;不需要多轮对话&#xff09;chatgpt思维链2&#xff08;复杂任务更适用&#xff0c;简单任务把他弄复杂了&#xff09;机理chatgpt完整咒语1&#xff08;感…