CentOs搭建Kubernetes集群

news2024/11/27 22:22:03

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"
}
EOF

sudo 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
EOF

cat <<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
EOF

sudo 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 的版本号。

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/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo 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: flannel
    pod-security.kubernetes.io/enforce: privileged
  name: kube-flannel
---
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: flannel
  name: flannel
  namespace: kube-flannel
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    k8s-app: flannel
  name: flannel
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - nodes/status
  verbs:
  - patch
- apiGroups:
  - networking.k8s.io
  resources:
  - clustercidrs
  verbs:
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    k8s-app: flannel
  name: flannel
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: flannel
subjects:
- kind: ServiceAccount
  name: flannel
  namespace: 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: flannel
    k8s-app: flannel
    tier: node
  name: kube-flannel-cfg
  namespace: kube-flannel
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    app: flannel
    k8s-app: flannel
    tier: node
  name: kube-flannel-ds
  namespace: kube-flannel
spec:
  selector:
    matchLabels:
      app: flannel
      k8s-app: flannel
  template:
    metadata:
      labels:
        app: flannel
        k8s-app: flannel
        tier: node
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/os
                operator: In
                values:
                - linux
      containers:
      - args:
        - --ip-masq
        - --kube-subnet-mgr
        command:
        - /opt/bin/flanneld
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: EVENT_QUEUE_DEPTH
          value: "5000"
        image: docker.io/flannel/flannel:v0.25.1
        name: kube-flannel
        resources:
          requests:
            cpu: 100m
            memory: 50Mi
        securityContext:
          capabilities:
            add:
            - NET_ADMIN
            - NET_RAW
          privileged: false
        volumeMounts:
        - mountPath: /run/flannel
          name: run
        - mountPath: /etc/kube-flannel/
          name: flannel-cfg
        - mountPath: /run/xtables.lock
          name: xtables-lock
      hostNetwork: true
      initContainers:
      - args:
        - -f
        - /flannel
        - /opt/cni/bin/flannel
        command:
        - cp
        image: docker.io/flannel/flannel-cni-plugin:v1.4.0-flannel1
        name: install-cni-plugin
        volumeMounts:
        - mountPath: /opt/cni/bin
          name: cni-plugin
      - args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        command:
        - cp
        image: docker.io/flannel/flannel:v0.25.1
        name: install-cni
        volumeMounts:
        - mountPath: /etc/cni/net.d
          name: cni
        - mountPath: /etc/kube-flannel/
          name: flannel-cfg
      priorityClassName: system-node-critical
      serviceAccountName: flannel
      tolerations:
      - effect: NoSchedule
        operator: Exists
      volumes:
      - hostPath:
          path: /run/flannel
        name: run
      - hostPath:
          path: /opt/cni/bin
        name: cni-plugin
      - hostPath:
          path: /etc/cni/net.d
        name: cni
      - configMap:
          name: kube-flannel-cfg
        name: flannel-cfg
      - hostPath:
          path: /run/xtables.lock
          type: FileOrCreate
        name: 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.conf

mkdir -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.conf

mkdir -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.coloradmin.cn/o/1670968.html

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

相关文章

软件验收测试需要做哪些测试?

软件验收测试是在软件开发完成后的最后一个阶段&#xff0c;用来验证软件是否符合需求和预期的功能。在进行软件验收测试时&#xff0c;需要进行以下几种测试&#xff1a; 功能测试&#xff1a;验证软件的各项功能是否符合需求和预期。包括输入输出的正确性、功能的完整性、功能…

数字绘画教学实训解决方案

一、建设背景 1.1政策背景 教育信息化政策推动&#xff1a;近年来&#xff0c;随着教育信息化政策的不断推动&#xff0c;各级教育部门纷纷出台相关政策&#xff0c;鼓励和支持教育信息化的发展。数字绘画作为现代艺术教育的重要组成部分&#xff0c;其教学实训解决方案的建设…

5.13号模拟前端面试10问

1.介绍箭头函数和普通函数的区别 箭头函数和普通函数在JavaScript中有一些重要的区别。以下是关于这些区别的详细解释&#xff1a; 语法结构上的差异&#xff1a; 箭头函数使用更简洁的语法&#xff0c;它不需要使用function关键字&#xff0c;而是使用一个箭头&#xff08;…

数据可视化(十):Pandas数据分析师职位信息表分析——箱线图、水平柱状图、学历城市双维分析等高级操作

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

苹果手机系统恢复工具:轻松解决iPhone各类系统问题!

随着苹果手机的iOS系统不断升级&#xff0c;越来越多的系统问题不断出现&#xff0c;如卡在恢复模式、系统崩溃白苹果、应用无响应、等&#xff0c;这些问题不仅影响用户体验&#xff0c;还可能导致手机无法正常使用。 遇到系统问题&#xff0c;一般我们可以先尝试使用强制重启…

云原生技术发展概述:投身云计算,从拥抱云原生开始

一、云原生的起源 云计算领域正在进行着一场革命&#xff0c;主机虚拟化实现了主机资源的池化&#xff0c;可以看作是云计算的上半场。以容器为基础的云原生真正实现了应用层的弹性&#xff0c;可以看作是云计算的下半场。 图来源&#xff1a;CNCF公开资料 有人说&#xff0c…

使用非官网购买Chatgpt的api调用

测试代码 from openai import OpenAI client OpenAI(api_key用户密钥) import json import os import timeclass ChatGPT:def __init__(self, user):self.user userself.messages [{"role": "system", "content": "Agent"}]def as…

嗨动PDF编辑器适合你的pdf编辑器,试试吧!

pdf编辑器有哪些&#xff1f;在数字化办公日益普及的今天&#xff0c;PDF文档因其跨平台、高保真度的特性而备受欢迎。无论是工作汇报、学术研究还是日常学习&#xff0c;我们都需要对PDF文档进行编辑、修改和整理。然而&#xff0c;如何选择合适的PDF编辑器却成了许多人头疼的…

算法题解记录25+++验证二叉搜索树(百日筑基)

题目描述&#xff1a; 难度&#xff1a;中等 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左 子树 只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必…

讯方·智汇云校4月HCIE通过28人!证书量总计123!

智汇云校捷报 —4月华为认证证书量123本— 智汇云校4月IE捷报来了 讯方技术2024年PMP第一期3月考期顺利结班&#xff0c;考试全员通过~ 2024年4月&#xff0c;云校HCIA、HCIP、HCIE共通过123人&#xff01; 62人通过HCIA 33人通过HCIP 28人通过HCIE 祝贺以下学员通过HC…

基于Echarts的大数据可视化模板:服务器运营监控

目录 引言背景介绍研究现状与相关工作服务器运营监控技术综述服务器运营监控概述监控指标与数据采集可视化界面设计与实现数据存储与查询优化Echarts与大数据可视化Echarts库以及其在大数据可视化领域的应用优势开发过程和所选设计方案模板如何满足管理的特定需求模板功能与特性…

喜茶与 BE@RBRICK 联名,开启酷黑2.0全新潮流体验

5 月 13 日&#xff0c;喜茶官宣与知名潮玩 BERBRICK 联名&#xff0c;双方联合推出联名特调饮品「BERBRICK黑凤梨」、联名版 HEYTEA x BERBRICK 公仔套组&#xff0c;以及结合双方品牌元素全新设计的黑银视觉包材、周边、主题店氛围及线下活动等&#xff0c;带来全方位的酷黑潮…

Verilog中信号发生器的代码实现

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 描述 题目描述&#xff1a; 请编写一个信号发生器模块&#xff0c;根据波形选择信号wave_choise发出相应的波形&#xff1a;wave_choice0时&#xff0c;发出方波信号&#xff1b;wave_choice1时&#xff0c;发出锯齿…

【Java】Java中栈溢出的常见情况

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

ARM架构安全特性之隔离技术

安全之安全(security)博客目录导读 目录 一、保护代码和数据 二、TrustZone 三、安全世界之间的隔离 四、Secure-EL2扩展 五、保护主流计算工作负载 六、领域管理扩展(RME) 七、内存密集型可信应用程序 八、Arm动态TrustZone技术 强制执行明确定义的安全边界是安全工程…

maven .lastUpdated文件作用

现象 有时候我在用maven管理项目时会发现有些依赖报错&#xff0c;这时你可以看一下本地仓库中是否有.lastUpdated文件&#xff0c;也许与它有关。 原因 有这个文件就表示依赖下载过程中发生了错误导致依赖没成功下载&#xff0c;可能是网络原因&#xff0c;也有可能是远程…

韶音、南卡、倍思开放式耳机值得买吗?王牌机型对比测评

今年&#xff0c;开放式耳机市场迎来了众多新品&#xff0c;为消费者提供了丰富的选择。在这样的背景下&#xff0c;正确挑选一款既符合音质需求又兼具佩戴舒适的开放式耳机显得格外关键。作为长期使用开放式耳机的用户&#xff0c;我发现很多人在韶音、南卡、漫步者这三个品牌…

Linux-- 重定向缓冲区

目录 0.接上篇文章 1.粗略的见一下这两个问题 2.理解重定向 3.理解缓冲区 0.接上篇文章 Linux--基础IO&#xff08;文件描述符fd&#xff09;-CSDN博客 1.粗略的见一下这两个问题 先来了解几个函数&#xff1a; stat()函数用于获取指定文件或符号链接的元数据。如果文件是…

大数据BI可视化(Echarts组件)项目开发-熟悉结合Vue开发图表组件7.0附带1/6商家销售统计(横向柱状图)

一.创建项目 创建 1.npm install -g vue/cli vue create vision 2. 3. 4.版本 5.是否使用历史路由 6.CSS预处理 7.ES标准配置 8.啥时候es标准提示-保存文件后 9.将配置文件放入单独文件中处理 10.需要保留新建项目以上设置 11.选择“Use PNPM”或者“Use NPM” 12.创建 13访…

时间瑾眼中的IT行业现状与未来趋势

文章目录 技术革新与行业应用IT行业的人才培养与教育人工智能与机器学习的演进数据安全与隐私保护可持续发展与绿色技术社会责任与道德规范 随着技术的不断进步&#xff0c;IT行业已成为推动全球经济和社会发展的关键力量。从云计算、大数据、人工智能到物联网、5G通信和区块链…