K8S 集群搭建

news/2024/7/4 7:37:46 标签: kubernetes, 容器, 云原生

 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.niftyadmin.cn/n/5181129.html

相关文章

andorid 日历选择器

先看效果图&#xff1a; 主要代码 package com.example.flyimport android.annotation.SuppressLint import android.content.Context import android.graphics.Color import android.util.AttributeSet import android.view.LayoutInflater import android.view.View import…

桶装水订水小程序app,线上预约订水更便捷

桶装水订水小程序app&#xff0c;线上预约订水更便捷。设置好地址&#xff0c;一键订水&#xff0c;工作人员送水到家。还能配送新鲜果蔬&#xff0c;绿色健康有保证。送水软件手机版&#xff0c;提供各种品牌桶装水&#xff0c;在线发起订水服务&#xff0c;由服务人员送水到家…

展望未来:揭秘2024年中国消费品及零售业消费趋势

过去二十年间&#xff0c;中国经济蓬勃发展&#xff0c;人民生活水平稳步提升&#xff0c;消费市场充满活力。时至今日消费已成为中国经济增长最大的贡献力量。进入2023&#xff0c;一方面&#xff0c;受到疫情波动以及面对疫情后时代来临的冲击&#xff0c;中国消费市场面临增…

智能手机主动安全防护系统设计与实现

论文下载链接《智能手机主动安全防护系统设计与实现》 智能手机主动安全防护系统设计与实现 Design and Implementation of an Active Security Protection System for Smartphones 目录 目录 2 摘要 3 关键词 4 第一章 绪论 4 1.1 研究背景 4 1.2 研究目的与意义 5 1.3 相关…

原论文一比一复现 | 更换 RT-DETR 主干网络为 【ResNet-50】【ResNet-101】【ResNet-152】| 对比实验必备

本专栏内容均为博主独家全网首发,未经授权,任何形式的复制、转载、洗稿或传播行为均属违法侵权行为,一经发现将采取法律手段维护合法权益。我们对所有未经授权传播行为保留追究责任的权利。请尊重原创,支持创作者的努力,共同维护网络知识产权。 更深层的神经网络更难训练。…

21、Flink 的table API与DataStream API 集成(1)- 介绍及入门示例、集成说明

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

大电机安保数据采集系统的设计

摘要 由于国内人民生活水平的提高&#xff0c;科技不断地进步&#xff0c;控制不断地完善&#xff0c;从而促使大电机安保数据采集技术在电机领域占据主导权&#xff0c;也使得大电机安保数据采集控制系统被广泛应用。在大电机安保设计领域中&#xff0c;大电机安保数据采集量控…

如何将微软 Office 宏转换为 ONLYOFFICE 宏

想要将微软 Office VBA 宏转换为可在 ONLYOFFICE 中无缝使用的宏&#xff1f;嗯&#xff0c;虽然这种需求并没有直接的解决方案&#xff0c;不过我们也会在本文中介绍 VBA 宏的转换步骤——正好我们手上也有一个来自用户的实际案例可供参考。 VBA 宏 以下是原始的 VBA 宏代码&…