CentOs搭建Kubernetes集群

news/2024/11/14 13:08:41/

kubeadm

minikube 还是太“迷你”了,方便的同时也隐藏了很多细节,离真正生产环境里的计算集群有一些差距,毕竟许多需求、任务只有在多节点的大集群里才能够遇到,相比起来,minikube 真的只能算是一个“玩具”。

Kubernetes 是很多模块构成的,而实现核心功能的组件像 apiserver、etcd、scheduler 等本质上都是可执行文件,所以也可以采用和其他系统差不多的方式,使用 Shell 脚本或者 Ansible 等工具打包发布到服务器上。

不过 Kubernetes 里的这些组件的配置和相互关系实在是太复杂了,用 Shell、Ansible 来部署的难度很高,需要具有相当专业的运维管理知识才能配置、搭建好集群,而且即使这样,搭建的过程也非常麻烦。

为了简化 Kubernetes 的部署工作,让它能够更“接地气”,社区里就出现了一个专门用来在集群中安装 Kubernetes 的工具,名字就叫“kubeadm”,意思就是“Kubernetes 管理员”。

下面使用kubeadm搭建一个1master,1work ,1console的k8s集群

安装前的准备工作

改主机名

由于 Kubernetes 使用主机名来区分集群里的节点,所以每个节点的 hostname 必须不能重名。你需要修改“/etc/hostname”这个文件,把它改成容易辨识的名字,比如 Master 节点就叫 master,Worker 节点就叫 worker:

sudo vi /etc/hostname

改 Docker 配置

安装完成docker后需要你再对 Docker 的配置做一点修改,在“/etc/docker/daemon.json”里把 cgroup 的驱动程序改成 systemd ,然后重启 Docker 的守护进程

cat <<EOF | sudo tee /etc/docker/daemon.json
{"registry-mirrors": ["https://5pfmrxk8.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"storage-driver": "overlay2"
}
EOFsudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker

改网络设置

为了让 Kubernetes 能够检查、转发网络流量,你需要修改 iptables 的配置,启用“br_netfilter”模块:

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOFcat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1 # better than modify /etc/sysctl.conf
EOFsudo sysctl --system

改交换分区

需要修改“/etc/fstab”,关闭 Linux 的 swap 分区,提升 Kubernetes 的性能:

sudo swapoff -a
sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab

完成之后,最好记得重启一下系统,然后给虚拟机拍个快照做备份,避免后续的操作失误导致重复劳动。

安装 kubeadm

在 Master 节点和 Worker 节点上都要安装

1、添加 kubeadm 的国内库

官方 Google Cloud 库可能网速慢下载不下来

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kube*
EOF

2、安装、更新所需的软件包

# 安装所需的软件包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2# 添加 Kubernetes 软件包仓库
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/# 更新 yum 软件包索引
sudo yum update -y

3、安装 kubeadm, kubelet, 和 kubectl 指定版本(1.23.3)

sudo yum install -y kubelet-1.23.3 kubeadm-1.23.3 kubectl-1.23.3

在这里插入图片描述

4、查看版本

kubeadm version
kubectl version --client

在这里插入图片描述

5、标记 kubelet 包不自动更新

# 安装 yum-plugin-versionlock 插件
sudo yum install yum-plugin-versionlock
#使用命令 apt-mark hold ,锁定这三个软件的版本
sudo apt-mark hold kubeadm kubelet kubectl
#或者 将软件包添加到版本锁定列表中
sudo yum versionlock add kubeadm kubelet kubectl

安装 Master 节点

kubeadm 的用法非常简单,只需要一个命令 kubeadm init 就可以把组件在 Master 节点上运行起来,不过它还有很多参数用来调整集群的配置,可以用 -h 查看。

常用的 3 个参数:

  • –pod-network-cidr,设置集群里 Pod 的 IP 地址段。
  • –apiserver-advertise-address,设置 apiserver 的 IP 地址,对于多网卡服务器来说很重要(比如 VirtualBox 虚拟机就用了两块网卡),可以指定 apiserver 在哪个网卡上对外提供服务。
  • kubernetes-version,指定 Kubernetes 的版本号。

kubernetes_137">1、初始化kubernetes集群

指定了 Pod 的地址段是“10.244.0.0/16”,service的地址是 10.96.0.0/12 ,apiserver 的服务地址是“自己机器的ip”,Kubernetes 的版本号是“1.23.3”

kubeadm init \
--apiserver-advertise-address=本身的虚拟机ip \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.3 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

2、建立“.kube”目录

To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config

在本地建立一个“.kube”目录,然后拷贝 kubectl 的配置文件,你只要原样拷贝粘贴就行。
在这里插入图片描述

3、保存kubeadm join 信息

kubeadm join 172.16.*.*:6443 --token fnbir9.g81u885fcu8jvbji \--discovery-token-ca-cert-hash sha256:77423363c190a976de43ebe4e06bf90e35fdf918bda7ac995392714f0895c9de 

其他节点要加入集群必须要用指令里的 token 和 ca 证书,所以这条命令务必拷贝后保存好:
在这里插入图片描述
token默认只有24个小时,如果过期了或者忘了,可以重新获取加入集群的命令

kubeadm token create --print-join-command

4、检查 Kubernetes 集群的节点状态

kubectl version
kubectl get node

在这里插入图片描述
Master 节点的状态是“NotReady”,这是由于还缺少网络插件,集群的内部网络还没有正常运作。

安装 Flannel 网络插件

使用项目的“kube-flannel.yml”在 Kubernetes 里部署一下就好了。不过因为它应用了 Kubernetes 的网段地址,需要修改文件里的“net-conf.json”字段,把 Network 改成刚才 kubeadm 的参数 --pod-network-cidr 设置的地址段。
kube-flannel.yml文件地址

1、kube-flannel.yml内容

apiVersion: v1
kind: Namespace
metadata:labels:k8s-app: flannelpod-security.kubernetes.io/enforce: privilegedname: kube-flannel
---
apiVersion: v1
kind: ServiceAccount
metadata:labels:k8s-app: flannelname: flannelnamespace: kube-flannel
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
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
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:labels:k8s-app: flannelname: flannel
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: flannel
subjects:
- kind: ServiceAccountname: flannelnamespace: kube-flannel
---
apiVersion: v1
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"}}
kind: ConfigMap
metadata:labels:app: flannelk8s-app: flanneltier: nodename: kube-flannel-cfgnamespace: kube-flannel
---
apiVersion: apps/v1
kind: DaemonSet
metadata:labels:app: flannelk8s-app: flanneltier: nodename: kube-flannel-dsnamespace: kube-flannel
spec:selector:matchLabels:app: flannelk8s-app: flanneltemplate:metadata:labels:app: flannelk8s-app: flanneltier: nodespec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/osoperator: Invalues:- linuxcontainers:- args:- --ip-masq- --kube-subnet-mgrcommand:- /opt/bin/flanneldenv:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: EVENT_QUEUE_DEPTHvalue: "5000"image: docker.io/flannel/flannel:v0.25.1name: kube-flannelresources:requests:cpu: 100mmemory: 50MisecurityContext:capabilities:add:- NET_ADMIN- NET_RAWprivileged: falsevolumeMounts:- mountPath: /run/flannelname: run- mountPath: /etc/kube-flannel/name: flannel-cfg- mountPath: /run/xtables.lockname: xtables-lockhostNetwork: trueinitContainers:- args:- -f- /flannel- /opt/cni/bin/flannelcommand:- cpimage: docker.io/flannel/flannel-cni-plugin:v1.4.0-flannel1name: install-cni-pluginvolumeMounts:- mountPath: /opt/cni/binname: cni-plugin- args:- -f- /etc/kube-flannel/cni-conf.json- /etc/cni/net.d/10-flannel.conflistcommand:- cpimage: docker.io/flannel/flannel:v0.25.1name: install-cnivolumeMounts:- mountPath: /etc/cni/net.dname: cni- mountPath: /etc/kube-flannel/name: flannel-cfgpriorityClassName: system-node-criticalserviceAccountName: flanneltolerations:- effect: NoScheduleoperator: Existsvolumes:- hostPath:path: /run/flannelname: run- hostPath:path: /opt/cni/binname: cni-plugin- hostPath:path: /etc/cni/net.dname: cni- configMap:name: kube-flannel-cfgname: flannel-cfg- hostPath:path: /run/xtables.locktype: FileOrCreatename: xtables-lock

修改net-conf.json:
如果不是10.244.0.0/16,net-conf.json修改成“自己设置的pod网段”:

  net-conf.json: |{"Network": "自己设置的pod网段","Backend": {"Type": "vxlan"}}

2、启动Flannel插件

#创建文件
touch kube-flannel.yml
#编辑文件,将修改过的内容copy进去
vim kube-flannel.yml
#生成插件pod
kubectl apply -f kube-flannel.yml

kube-flannel.yml默认就是“10.244.0.0/16”,可以直接使用下面命令:

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

3、查看Flannel插件是否正常运行

#查看DaemonSet是否正常运行
#如果kube-flannel-ds的副本数显示为1/1,则表示DaemonSet正在正常运行
kubectl get daemonset -n kube-system
#检查kube-flannel的Pod是否正常运行
#如果输出显示Pod的状态为Running,则表示kube-flannel插件正在正常运行。
kubectl get pods -n kube-system -l app=flannel#检查kube-flannel的日志以查找任何错误
#查看日志是否显示任何错误或警告信息。
kubectl logs -n kube-system <kube-flannel-pod-name>

在这里插入图片描述

4、查看集群节点状态

kubectl get node

在这里插入图片描述
Master 节点的状态是“Ready”,表明节点网络也工作正常了

安装 Worker 节点

1、安装前置操作

把准备工作配置和kubeadm安装好

2、执行kubeadm join

只需要用之前拷贝的那条 kubeadm join 命令就可以了,用 sudo 来执行:

sudo \
kubeadm join 172.16.*.*:6443 --token fnbir9.g81u885fcu8jvbji \--discovery-token-ca-cert-hash sha256:77423363c190a976de43ebe4e06bf90e35fdf918bda7ac995392714f0895c9de 

3、查看节点状态

kubectl get node

在这里插入图片描述
发现还是NotReady状态

4、复制配置文件

远程复制

sudo scp -r root@*.*.*.*:/etc/kubernetes/admin.conf /etc/kubernetes/admin.confmkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

手动复制

mkdir -p $HOME/.kube
#把/etc/kubernetes/admin.conf文件copy到本机,再执行命令
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

再次查看节点状态,变成ready

在这里插入图片描述

安装Console

可以节点本身充当Console(就是不用单独安装)

1、安装kubectl

# 下载:
curl -LO https://dl.k8s.io/release/v1.23.3/bin/linux/arm64/kubectl# 安装
sudo install kubectl /usr/local/bin/kubectl# 从master节点复制文件sudo scp stark@192.168.88.134:/etc/kubernetes/admin.conf /etc/kubernetes/admin.conf

2、 从master节点复制文件

远程复制

sudo scp -r root@*.*.*.*:/etc/kubernetes/admin.conf /etc/kubernetes/admin.confmkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

手动复制

mkdir -p $HOME/.kube
#把/etc/kubernetes/admin.conf文件copy到本机,再执行命令
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

测试集群

在console节点是执行kubectl run ,运行 Nginx 来测试一下:

kubectl run ngx --image=nginx:alpine
kubectl get pod -o wide

会发现,pod被调度到了work节点上运行
在这里插入图片描述


http://www.ppmy.cn/news/1460749.html

相关文章

qt 窗体嵌入到任务栏

qwidget嵌入到任务栏 #include <QApplication> #include <QWidget> #include <QDebug> #include <windows.h> #include <QVBoxLayout> // 包含 QVBoxLayout 头文件 #include <QLabel> #include <QLineEdit>int main(int argc, char…

钩子函数onMounted定义了太多访问MySQL的操作 导致数据库异常

先放几种后端遇到的异常&#xff0c;多数和数据库有关 pymysql.err.InternalError: Packet sequence number wrong - got 102 expected 1 127.0.0.1 - - [09/May/2024 17:49:37] "GET /monitorLastTenList HTTP/1.1" 500 AttributeError: NoneType object has no at…

鸿蒙应用开发系列 EX篇:HarmonyOS应用开发者基础认证

文章目录 系列文章背景认证考试题库参考注意:题库会不定时的进行具备调整甚至整体轮换,此为2024.5月版本注意:题库中题目的选项每次都会随机顺序,请参考内容判断题单选题多选题系列文章 鸿蒙应用开发系列 篇一:鸿蒙系统概述 鸿蒙应用开发系列 篇二:鸿蒙系统开发工具与环…

【静态分析】软件分析课程实验A2-常量传播和Worklist求解器

Tai-e官网&#xff1a; 概述 | Tai-e 参考&#xff1a; https://www.cnblogs.com/gonghr/p/17979609 -------------------------------------------------------- 1 作业导览 为 Java 实现常量传播算法。实现一个通用的 worklist 求解器&#xff0c;并用它来解决一些数据…

免费PDF批量加密工具

最近在找PDF批量加密的软件来着&#xff0c;发现很多都是需要收费的&#xff0c;当然如果平时工作需要用的比较多&#xff0c;支持一下还是ok的&#xff0c;但是多数人还是偶尔用一下所以没有必要买。 工作用的话&#xff0c;一般企业文件、个人隐私资料、重要合同...所有重要文…

RateLimiter 限流算法使用

Rate Limiter 是一种限流算法&#xff0c;用于控制系统中的资源使用率。它可以用于限制用户的访问速度&#xff0c;防止系统被过度访问&#xff0c;从而导致系统崩溃或性能下降。 通常用于网络服务、 API 接口和数据库等领域&#xff0c;以确保系统的稳定性和可靠性。 原理 R…

深度学习之视觉特征提取器——AlexNet

AlexNet 参考资料&#xff1a; &#xff08;1&#xff09;ImageNet十年历任霸主之AlexNet - 知乎 (zhihu.com) &#xff08;2&#xff09;AlexNet - Wikipedia 引入 AlexNet在2012年以第一名在Top-1分类精度霸榜ImageNet&#xff0c;并超过第二名近10个百分点&#xff0c;…

《二十一》QT QML编程基础

QML概述 QML&#xff08;Qt Meta-Object Language&#xff09;是一种声明性语言&#xff0c;它被用于描述Qt框架中用户界面的结构和行为。QML提供了一种简洁、灵活的方式来创建动态和交互式的界面。 QML基于JavaScript语法&#xff0c;通过使用QML类型和属性来定义界面的元素…