应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

裸机搭建k8s集群

7308人阅读 2022/5/30 15:20 总访问:5194268 评论:1 收藏:0 手机
分类: K8S


这里自己用虚拟机搭建的,可以整一个主节点,几个子节点。要保证虚拟机能访问外网,能获取自己的ip地址以及能相互ping通。怎么装虚拟机可以参考这篇文章,网络这些的设置里边也有提到。
https://www.tnblog.net/aojiancc2/article/details/6357
装虚拟机的时候保证每个节点包括主节点有两个cpu,和2g内存。不然装环境会有问题的。

每个节点设置好主机名

  1. hostnamectl set-hostname master
  2. hostnamectl set-hostname node1
  3. hostnamectl set-hostname node2

主节点设置成master,子节点设置成node1,node2…。设置好后可以输入hostname查询一下是否设置成功了。

所有节点都修改 hosts


设置hosts是为了让主机名和ip地址做一个映射,能够使用主机名进行通讯。这里ip地址换成自己的电脑ip地址。我这里用vi编辑文件的,vim暂时没有装。

  1. vi /etc/hosts
  2. 192.168.1.102 master
  3. 192.168.2.108 node2
  4. 192.168.2.109 node1

修改之后根据主机名拼一下,试试能不能拼通

所有节点关闭 SELinux

  1. # 所有节点关闭 SELinux
  2. setenforce 0
  3. sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

关闭所有节点的防火墙

  1. systemctl stop firewalld
  2. systemctl disable firewalld

可以使用如下命令查看防火墙是否关闭

  1. systemctl status firewalld

所有节点设置iptables

  1. iptables -P FORWARD ACCEPT

所有节点关闭 swap

  1. swapoff -a

防止开机自动挂载 swap 分区(将 /etc/fstab 中的内容注释掉)

  1. sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

所有节点关闭 selinux 和 firewalld

将 selinux 由 enforcing 改为 disabled 。注意下面命令中 disabled 前面是数字 1,不是小写的英文字母 l

  1. sed -ri 's#(SELINUX=).*#\1disabled#' /etc/selinux/config

临时关闭 enforce

  1. setenforce 0

验证 enforce 是否已关闭:如关闭,应返回结果:Permissive

  1. getenforce

时间同步可能会执行一下

我这里是默认就同步了的,所以不执行也可以的。


如果要设置的话,所有主机均需要操作。最小化安装系统需要安装ntpdate软件。同步的是阿里云的时间。

  1. # crontab -l
  2. 0 */1 * * * /usr/sbin/ntpdate time1.aliyun.com

所有节点修改内核参数(配置网桥过滤及内核转发)

第一种方法(推荐!写到独立内核文件中):

  1. cat > /etc/sysctl.d/k8s.conf <<EOF
  2. net.bridge.bridge-nf-call-ip6tables = 1
  3. net.bridge.bridge-nf-call-iptables = 1
  4. net.ipv4.ip_forward = 1
  5. vm.max_map_count = 262144
  6. vm.swappiness=0
  7. EOF

第二种方法(写到默认内核文件中:/etc/sysctl.conf)

  1. cat >> /etc/sysctl.conf <<eof
  2. net.bridge.bridge-nf-call-ip6tables = 1
  3. net.bridge.bridge-nf-call-iptables = 1
  4. net.ipv4.ip_forward = 1
  5. vm.max_map_count = 262144
  6. vm.swappiness=0
  7. eof

第三种方法(写到默认内核文件中:/etc/sysctl.conf):

  1. sudo sysctl -w net.bridge.bridge-nf-call-ip6tables=0
  2. sudo sysctl -w net.bridge.bridge-nf-call-iptables = 1
  3. sudo sysctl -w net.ipv4.ip_forward = 1
  4. sudo sysctl -w vm.max_map_count = 262144
  5. sudo sysctl -w vm.swappiness=0

参数说明:

  • net.bridge.bridge-nf-call-ip6tables 和 net.bridge.bridge-nf-call-iptables,netfilter实际上既可以在L2层过滤,也可以在L3层过滤的。当值为 0 ,即要求iptables不对bridge的数据进行处理。当值为 1,也就意味着二层的网桥在转发包时也会被iptables的FORWARD规则所过滤,这样就会出现L3层的iptables rules去过滤L2的帧的问题。
  • max_map_count,文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量。如不设置可能会报错:“max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]”
  • net.ipv4.ip_forward,出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功能。要让Linux系统具有路由转发功能,需要配置 Linux 的内核参数 - net.ipv4.ip_forward = 1。如果你不设置这个,你部署的web服务可能会在外部访问不到。
  • swappiness,等于 0 的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。

然后所有节点执行如下命令加载内核使修改生效

  1. modprobe br_netfilter
  2. sysctl -p /etc/sysctl.d/k8s.conf

所有节点添加安装源

  1. # 添加 k8s 安装源
  2. cat <<EOF > kubernetes.repo
  3. [kubernetes]
  4. name=Kubernetes
  5. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
  6. enabled=1
  7. gpgcheck=1
  8. repo_gpgcheck=1
  9. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  10. EOF
  11. mv kubernetes.repo /etc/yum.repos.d/
  12. # 添加 Docker 安装源
  13. yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

如果执行yum-config-manager报错:yum-config-manager: 未找到命令。
这个是因为系统默认没有安装这个命令,这个命令在yum-utils 包里,可以通过命令yum -y install yum-utils 安装就可以了。

然而你执行yum -y install yum-utils,可能还会遇到错

repomd.xml signature could not be verified for kubernetes

是因为repo 的 gpg 验证不通过导致的,可以修改repo_gpgcheck=0跳过验证。
在linux下,repo文件都是存放在/etc/yum.repos.d文件夹之中的
进入/etc/yum.repos.d,找到kubernetes.repo,文件打开修改即可

修改repo_gpgcheck=0跳过验证。

修改之后在执行yum -y install yum-utils就可以成功了

所有节点安装所需组件


版本更新太频繁了,刚开始用最新版本的时候坑要多点,所以可以固定一个版本,可以少点不同版本的坑。

比如我这里装的kubelet的1.16.2,和docker的18.06.3。要注意k8s和docker的版本对应。不然也可能会遇到问题的

  1. yum install -y kubelet-1.16.2 kubeadm-1.16.2 kubectl-1.16.2 docker-ce-18.06.3.ce-3.el7

1.18.0版本 (相比1.16.x推荐使用1.18版本)

  1. yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0 --disableexcludes=kubernetes docker-ce-18.06.1.ce-3.el7

如果你想装最新版本,那么不接版本号就可以了

  1. yum install -y kubelet kubeadm kubectl docker-ce

安装成功之后可以使用docker —version,和kubelet —version查看版本号

所有节点启动 kubelet、docker,并设置开机启动

  1. systemctl enable kubelet
  2. systemctl start kubelet
  3. systemctl enable docker
  4. systemctl start docker

所有节点修改 docker 配置

主要是修改docker的cgroupdrive为systemd。不然和k8s的cgroupdrive不一致,会出现问题的。

  1. # kubernetes 官方推荐 docker 等使用 systemd 作为 cgroupdriver,否则 kubelet 启动不了
  2. cat <<EOF > daemon.json
  3. {
  4. "exec-opts": ["native.cgroupdriver=systemd"],
  5. "registry-mirrors": ["https://ud6340vz.mirror.aliyuncs.com"]
  6. }
  7. EOF
  8. mv daemon.json /etc/docker/

修改之后,重启生效

  1. # 重启生效
  2. systemctl daemon-reload
  3. systemctl restart docker

用 kubeadm 初始化集群(仅在主节点跑)

  1. # 初始化集群控制台 Control plane
  2. # 失败了可以用 kubeadm reset 重置
  3. kubeadm init --image-repository=registry.aliyuncs.com/google_containers


初始化的时候最好设置一下,pod,service网段这些,还有监听使用的ip地址这些。
不然如果有多网卡,不设置监听的ip,识别到错误的网卡,就会出现错误的ip,你集群都加入不进来的。还有不设置pod,service网段这些你可能后面部署应用后通信会有问题,比如使用了NodePort类型的service,只有工作节点能访问,master节点访问不到(-。-坑了我很久的一个问题)。所以建议使用下面这种。当然也可以在配置文件中设置,就不用再kubeadm init中给参数了

  1. kubeadm init \
  2. --apiserver-advertise-address=192.168.12.244 \
  3. --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
  4. --kubernetes-version v1.18.0 \
  5. --service-cidr=10.1.0.0/16 \
  6. --pod-network-cidr=10.244.0.0/16

执行成功如下:

把最下面的kubeadm命令复制一下,后边集群中的子节点要通过这个加入

复制授权文件,以便 kubectl 可以有权限访问集群

  1. # 如果你其他节点需要访问集群,需要从主节点复制这个文件过去其他节点
  2. mkdir -p $HOME/.kube
  3. cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  4. chown $(id -u):$(id -g) $HOME/.kube/config
  5. # 在其他机器上创建 ~/.kube/config 文件也能通过 kubectl 访问到集群

把工作节点(slave)加入到集群中(在所有 slave 执行)

就执行刚刚复制的命令,类似:kubeadm join 192.168.2.102:6443 —token xxx —discovery-token-ca-cert-hash xxx

注意格式:

复制出来是这种带换行的格式

需要处理成一行的格式在执行:

运行成功效果如下:

在主节点查看集群

使用kubectl get nodes查看集群情况:


其他节点有安装 kubectl 也可以查看

目前节点都是NotReady状态,因为这个 Master 节点的网络尚未就绪。

安装网络插件flannel,否则 node 是 NotReady 状态,主节点跑就行(网络插件推荐使用calico了,可以跳过flannel的安装方法看下面的教程)

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


注意由于这是外国的网址很有可能会访问不到遇到错误:kube-flannel.yml The connection to the server raw.githubusercontent.com was refused。
是因为域名解析不了,所以访问不了。

解决方法:

不用域名登录,直接用ip登录,或者去/etc/hosts里设置下域名解析

1、通过第三方网站查询到raw.githubusercontent.com所对应的ip是多少
http://ip.tool.chinaz.com/raw.githubusercontent.com

2、修改/etc/hosts做好域名解析,ip最好用网站上查询到的最新的
使用vi命令打开hosts文件:

  1. vi /etc/hosts

添加:185.199.109.133 raw.githubusercontent.com

3、再次执行上面贴的命令就可以成功了

再次查看节点状态就已经正常了!

解决方法2

把地址换一下,换成可以访问的地址。

  1. kubectl apply -f https://www.tnblog.net/k8s/kube-flannel.yml

如果访问不到了,可以自己把kube-flannel.yml下载下来,然后在执行:
链接: https://pan.baidu.com/s/1lotIWPVZYjmav89-wjbe_A?pwd=pqeb 提取码: pqeb 复制这段内容后打开百度网盘手机App,操作更方便哦

安装网络插件calico

calico和flannel类似,感觉更强大一点,所以推荐使用它

下载calico

注意版本,如果直接下载最新版本会报错,和你的k8s不匹配,比如我这里k8s使用的1.18.0,calico使用v3.14版本是可以的

  1. wget https://docs.projectcalico.org/v3.14/manifests/calico.yaml --no-check-certificate


如果因为网络问题下载不到可以使用下面的地址下载后然后放到传递k8s的电脑上即可。

链接: https://pan.baidu.com/s/1VNUPE4HmIAW_F2_Mo-wfgg?pwd=c75e 提取码: c75e 复制这段内容后打开百度网盘手机App,操作更方便哦

下载之后修改配置,修改calico.yaml里的pod网段


把calico.yaml里pod所在网段改成kubeadm init时选项—pod-network-cidr所指定的网段。
默认是192.168.0.0/16。把这个地址修改成kubeadm init时选项—pod-network-cidr所指定的网段,所以我这里应该修改成10.244.0.0/16。

1:使用vi calico.yaml打开文件
2:在命令模式下输入/192就可以快速定位到需要修改的地址了,不然慢慢找太麻烦了,文件很长
3:然后把注释取消掉,把value的默认值修改成我们的ip地址即可

4:执行一下即可kubectl apply -f calico.yaml

可能在多网卡下你还需要配置一下calico使用的网卡问题


视频教程地址:录一套视频准备地址放到tnblog


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

Session

2024/2/5 14:07:55

亲测有效[给力]

裸机搭建k8s集群可能遇到的坑

执行yum-config-manager报错如果执行yum-config-manager报错:yum-config-manager: 未找到命令。这个是因为系统默认没有安...

k8s编写yaml文件的一些小问题

Yaml文件编写的小毛病kubenetes yaml 随在编写yaml文件中难免会出现一些磕磕碰碰的问题 建议大家去这个网站编写 yaml 文...

初探k8s

概念补充Deployment 是在 Pod 这个抽象上更为上层的一个抽象层,它可以定义一组 Pod 的副本数量,以及这个 Pod 的版本。一...

k8s 结合 Service 与 Deployment 部署容器

前言最近看到了学习k8s的网站,在文章末尾分享给大家,所以我最近的教程也会根据上面的课程来进行一些总结Service:暴露容...

k8s理论整理(持续更新)

整理一GOKubernetes 的工作节点负责运行应用程序 Pod 等工作负载;还可以运行网络或存储等扩展功能;每个节点上都运行了 ku...

k8s详解基本对象

k8s详解基本对象[TOC] 参考yaml代码如下apiVersion: apps/v1 kind: Deployment metadata: name: k8s-demo names...

.netcore 通过Flurl验证k8s内部访问与获取环境变量

.netcore验证k8s内部访问与获取环境变量[TOC] 创建k8s-name项目 项目结构如下 实验过程 st=>start: k8s-demo项...

.netcore 通过Flurl验证k8s内部访问与获取环境变量 (二)

.netcore验证k8s内部访问与获取环境变量 (二)[TOC] 修改k8s-name项目 NameController.cs [ApiController] ...

Mysql k8s部署Volume(hostPath)

Mysql K8s部署Volume[TOC] Mysql 与 Yaml 稍作修改这里提供的是官网的链接:https://kubernetes.io/docs/tasks/run-a...

k8s ConfigMap 配置中心

k8s ConfigMap 配置中心[TOC] ConfigMap 简介 ConfigMap用于保存配置数据的键值对,可以用来保存单个属性,也可以用...

k8s Deployment中Rollout与Rollback使用与滚动更新

k8s Deployment中Rollout与Rollback使用[TOC] Rollout 简介 Deployment 的 rollout 当且仅当 Deployment 的 pod temp...

kubectl proxy 让外部网络访问k8s service的ClusterIP

kubectl proxy 让外部网络访问K8S service的ClusterIP[TOC] 使用kubectl proxy命令就可以使API server监听在本地的800...

k8s 网络(笔记)

K8s 网络(笔记)[TOC] K8s 网络 Docker容器网络回顾K8s CNIFlannel 网络插件跨node的 pod to podCluster Service是什么...

Jenkins在k8s中的安装

Jenkins在k8s中的安装[TOC] k8s部署Jenkins.yaml--- apiVersion: apps/v1 kind: Deployment #设置资源的类型为Deploym...

Centos7安装k8s(基于kubeadm)

Centos7安装k8s(基于kubeadm)[TOC] 下载相关包 链接:https://pan.baidu.com/s/1H9MuZsf28f_3uyVHBUS8jQ提取码:w9tv ...