K8S安装Master教程(亲测成功)

2023-10-27

配置hosts

vim /etc/hosts

追加如下内容

192.168.18.10 k8s-master
192.168.18.11 k8s-node1
192.168.18.12 k8s-node2
192.168.18.13 k8s-admin

安装依赖包

yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vimnet-tools git

配置防火墙

设置防火墙为 Iptables 并设置空规则

systemctl stop firewalld && systemctl disable firewalld
yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save

关闭selinux

使用命令永久关闭selinux

sed -i 's/enforcing/disabled/' /etc/selinux/config && setenforce 0

关闭swap分区

两条命令都需要执行

# 临时关闭
swapoff -a

# 永久关闭,下次生效
sed -ri 's/.*swap.*/#&/' /etc/fstab

调整内核参数

cat > kubernetes.conf << EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
vm.overcommit_memory=1 # 不检查物理内存是否够用
vm.panic_on_oom=0 # 开启 OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF


cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
sysctl -p /etc/sysctl.d/kubernetes.conf

调整系统时区

rm -f /etc/localtime
ln -sf /usr/share/zoneinfo/Asia/Shanghai
reboot

关闭系统不需要服务

systemctl stop postfix && systemctl disable postfix

设置 rsyslogd 和 systemd journald

mkdir /var/log/journal # 持久化保存日志的目录
mkdir /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/99-prophet.conf << EOF
[Journal]
Storage=persistent
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
SystemMaxUse=10G
SystemMaxFileSize=200M
MaxRetentionSec=2week
ForwardToSyslog=no
EOF
systemctl restart systemd-journald

升级系统内核

CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定。

rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含initrd16配置,如果没有,再安装一次!

cat /boot/grub2/grub.cfg | grep initrd16
yum --enablerepo=elrepo-kernel install -y kernel-lt

设置开机从新内核启动

grub2-set-default 'CentOS Linux (4.4.189-1.el7.elrepo.x86_64) 7 (Core)'

检查一下

reboot
uname -r 

设置主机名

hostnamectl set-hostname k8s-master

加载ip_vs内核模块

modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack_ipv4

设置下次开机自动加载

cat > /etc/modules-load.d/ip_vs.conf << EOF 
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
EOF

安装kubeadm,kubelet和kubectl

配置yum源(这里使用阿里云的源)

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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
EOF

安装指定版本的kubeadm,kubelet,kubectl

yum install -y kubelet-1.18.8 kubeadm-1.18.8 kubectl-1.18.8

设置开机自启

systemctl enable kubelet

列出所有版本

yum list kubelet --showduplicates

部署Kubernetes Master节点

master节点初始化

kubeadm init \
  --kubernetes-version 1.18.8 \
  --apiserver-advertise-address=0.0.0.0 \
  --service-cidr=10.96.0.0/16 \
  --pod-network-cidr=10.245.0.0/16 \
  --image-repository registry.aliyuncs.com/google_containers 

参数说明

  • –kubernetes-version v1.18.8 指定版本
  • –apiserver-advertise-address 为通告给其它组件的IP,一般应为master节点的IP地址
  • –service-cidr 指定service网络,不能和node网络冲突
  • –pod-network-cidr 指定pod网络,不能和node网络、service网络冲突
  • –image-repository registry.aliyuncs.com/google_containers 指定镜像源,由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。
  • 如果k8s版本比较新,可能阿里云没有对应的镜像,就需要自己从其它地方获取镜像了。
  • –control-plane-endpoint 标志应该被设置成负载均衡器的地址或 DNS 和端口(可选)

注意点:版本必须和上边安装的kubelet,kubead,kubectl保持一致

配置kubectl

就是执行初始化成功后输出的那三条命令

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

查看节点信息

kubectl get nodes

此时只能看到master节点,等待其他节点加入进来后即可看到。

安装 flannel

创建配置文件

vim kube-flannel.yml

填写如下内容(推荐写在一个yaml文件中然后上传)

---
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: psp.flannel.unprivileged
  annotations:
    seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/default
    seccomp.security.alpha.kubernetes.io/defaultProfileName: docker/default
    apparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/default
    apparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default
spec:
  privileged: false
  volumes:
  - configMap
  - secret
  - emptyDir
  - hostPath
  allowedHostPaths:
  - pathPrefix: "/etc/cni/net.d"
  - pathPrefix: "/etc/kube-flannel"
  - pathPrefix: "/run/flannel"
  readOnlyRootFilesystem: false
  # Users and groups
  runAsUser:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  fsGroup:
    rule: RunAsAny
  # Privilege Escalation
  allowPrivilegeEscalation: false
  defaultAllowPrivilegeEscalation: false
  # Capabilities
  allowedCapabilities: ['NET_ADMIN', 'NET_RAW']
  defaultAddCapabilities: []
  requiredDropCapabilities: []
  # Host namespaces
  hostPID: false
  hostIPC: false
  hostNetwork: true
  hostPorts:
  - min: 0
    max: 65535
  # SELinux
  seLinux:
    # SELinux is unused in CaaSP
    rule: 'RunAsAny'
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: flannel
rules:
- apiGroups: ['extensions']
  resources: ['podsecuritypolicies']
  verbs: ['use']
  resourceNames: ['psp.flannel.unprivileged']
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - nodes/status
  verbs:
  - patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: flannel
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: flannel
subjects:
- kind: ServiceAccount
  name: flannel
  namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: flannel
  namespace: kube-system
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: kube-flannel-cfg
  namespace: kube-system
  labels:
    tier: node
    app: flannel
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.245.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-flannel-ds
  namespace: kube-system
  labels:
    tier: node
    app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  template:
    metadata:
      labels:
        tier: node
        app: flannel
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/os
                operator: In
                values:
                - linux
      hostNetwork: true
      priorityClassName: system-node-critical
      tolerations:
      - operator: Exists
        effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      - name: install-cni
        image: quay.io/coreos/flannel:v0.14.0
        command:
        - cp
        args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      containers:
      - name: kube-flannel
        image: quay.io/coreos/flannel:v0.14.0
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
          limits:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: false
          capabilities:
            add: ["NET_ADMIN", "NET_RAW"]
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      volumes:
      - name: run
        hostPath:
          path: /run/flannel
      - name: cni
        hostPath:
          path: /etc/cni/net.d
      - name: flannel-cfg
        configMap:
          name: kube-flannel-cfg

执行yaml文件

kubectl apply -f kube-flannel.yaml

查看flannel部署结果

kubectl -n kube-system get pods -o wide

查看各个node的状态

kubectl get nodes
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

K8S安装Master教程(亲测成功) 的相关文章

  • 未找到证书管理器证书并且未创建挑战

    我跟着https docs cert manager io en venafi tutorials quick start index html https docs cert manager io en venafi tutorials
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • 为什么 fopen("any_path_name",'r') 不给出 NULL 作为返回值?

    在调试一些代码时 我得到如下内容 include
  • 并行运行 shell 脚本

    我有一个 shell 脚本 打乱大型文本文件 600 万行和 6 列 根据第一列对文件进行排序 输出 1000 个文件 所以伪代码看起来像这样 file1 sh bin bash for i in seq 1 1000 do Generat
  • CMake 链接 glfw3 lib 错误

    我正在使用 CLion 并且正在使用 glfw3 库编写一个程序 http www glfw org docs latest http www glfw org docs latest 我安装并正确执行了库中的所有操作 我有 a 和 h 文
  • 使用包管理器时如何管理 Perl 模块?

    A 最近的问题 https stackoverflow com questions 397817 unable to find perl modules in intrepid ibex ubuntu这让我开始思考 在我尝试过的大多数 Li
  • 与 pthread 的进程间互斥

    我想使用一个互斥体 它将用于同步对两个不同进程共享的内存中驻留的某些变量的访问 我怎样才能做到这一点 执行该操作的代码示例将非常感激 以下示例演示了 Pthread 进程间互斥体的创建 使用和销毁 将示例推广到多个进程作为读者的练习 inc
  • 配置tomat的server.xml文件并自动生成mod_jk.conf

    我在用apache 2 2 15 and tomcat6 6 0 24 on CentOS 6 4并希望使用 tomcat 服务器的功能 通过添加以下内容自动生成 mod jk conf 文件
  • 如何在 Linux 中使用 C 语言使用共享内存

    我的一个项目有点问题 我一直在试图找到一个有据可查的使用共享内存的例子fork 但没有成功 基本上情况是 当用户启动程序时 我需要在共享内存中存储两个值 当前路径这是一个char and a 文件名这也是char 根据命令参数 启动一个新进
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • 绕过 dev/urandom|random 进行测试

    我想编写一个功能测试用例 用已知的随机数值来测试程序 我已经在单元测试期间用模拟对其进行了测试 但我也希望用于功能测试 当然不是全部 最简单的方法是什么 dev urandom仅覆盖一个进程 有没有办法做类似的事情chroot对于单个文件并
  • linux下如何从文本文件中获取值

    我有一些文本格式的文件 xxx conf 我在这个文件中有一些文本 disablelog 1 当我使用 grep r disablelog oscam conf 输出是 disablelog 1 但我只需要值1 请问你有什么想法吗 一种方法
  • Apache 访问 Linux 中的 NTFS 链接文件夹

    在 Debian jessie 中使用 Apache2 PHP 当我想在 Apache 的文档文件夹 var www 中创建一个新的小节时 我只需创建一个指向我的 php 文件所在的外部文件夹的链接 然后只需更改该文件夹的所有者和权限文件夹
  • 使用os.execlp时,为什么`python`需要`python`作为argv[0]

    代码是这样的 os execlp python python child py other args this works os execlp python child py other args this doesn t work 我读过
  • 如何在 Mac OSX Mavericks 中正确运行字符串工具?

    如何在 Mac OSX Mavericks 中正确运行字符串工具 我尝试按照我在网上找到的示例来运行它 strings a UserParser class 但我收到此错误 错误 Applications Xcode app Content
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • Linux下显卡内存使用情况

    Linux下有哪些工具可以监控显卡内存使用情况 NVIDIA 性能套件 http developer nvidia com content nvidia perfkit有Linux版本 可以实时监控各种显卡属性 包括显卡内存使用情况 显然
  • [A-Z] 表示 [A-Za-z] 是怎么回事?

    我已经注意到 至少在我使用的一些基于 Unix 的系统上 ls A Z 已经给了我预期的结果ls A Za z 让我无法轻松获得以大写字母开头的该死的文件列表 我刚刚遇到了同样的事情grep 我无法让它停止与小写字母匹配 A Z 直到我最终
  • 来源和出口有什么区别?

    我正在编写一个 shell 脚本 以读取具有 key value 对的文件并将这些变量设置为环境变量 但我有疑问 如果我这样做source file txt是否会将该文件中定义的变量设置为环境变量 或者我应该逐行读取文件并使用导出命令设置它
  • 如何在shell脚本中给出密码?

    在 shell 脚本文件中 我使用一些命令 例如scp and make install要求我输入密码 我运行一个 shell 脚本来编译一个大项目 一段时间后它会要求我输入密码才能使用scp 我需要等待该过程并在此之后提供密码 我只想通过

随机推荐

  • Qt 信号和槽机制

    这篇文章篇幅很长 阅读可能需要10分钟以上 如果你是Qt的初学者 前面的6个章节就已经够用了 至少能够让你在一些普通的场面撑得起场子 但如果你想了解的更深一点 最后一个章节是必不可少的内容 Qt提供了很多我们学习的文档 甚至是源码 阅读源码
  • wenda+chatGLM-6B构建本地知识库过程记录(含问题)

    目录 本机环境 搭建过程 1 下载wenda项目 2 准备虚拟环境 3 修改配置文件 4 知识库预先构建索引 问题记录 本机环境 OS Win11 显卡 RTX 4090 GPU使用情况 搭建过程 1 下载wenda项目 项目地址 GitH
  • QString 乱谈(3)-Qt5与中文

    两个月前 简单写过QTextCodec中的setCodecForTr等终于消失了 Qt5 在Qt论坛上 不少用户都对去掉这两个函数表示特别的不了解 为什么会这样 我想多少能说明不少用户对C 中源码字符集和执行字符集的不太了解 从而造成对这种
  • 02=windows下安装PostgreSQL(The database cluster initialisation failed)

    The database cluster initialisation failed windows下安装报错 The database cluster initialisation failed 我没找到解决方法 win10下报错 win
  • tpcc-mysql_TPCC-MySQL安装、使用及结果解读

    tpcc mysql用于MySQL基准测试 percona基于TPC C 下面简写成TPCC 衍生出来的产品 下面对tpcc mysql进行安装然后使用 最后结果解读 安装very easy let s do it 一 下载epel源 ro
  • 关于解决安装ubuntu双系统中出现的不能识别磁盘分区、空闲空间变不可用问题

    分享交流 谢谢指正 仅供参考 最近给自己电脑重装了windows系统 win7旗舰版 然后就索性又装了ubuntu的Linux套件 弄个双系统 方便今后的Linux学习 其中在分区挂载点这一块也碰到了不少问题 花了些功夫 好在都解决了 现在
  • ubuntu22.04编译安装gcc12.2

    ubuntu22 04编译安装gcc12 2 更新apt sudo apt get update 安装wget sudo apt get install wget zlib2 make 3 下载相应版本的gcc安装包 把下面的地址换成相应版
  • C++:this

    this 它指向当前对象 通过它可以访问当前对象的所有成员 所谓当前对象 是指正在使用的对象 例如对于stu show stu 就是当前对象 this 就指向 stu this 只能用在类的内部 通过 this 可以访问类的所有成员 包括
  • H264码流RTP封装方式详解

    H264码流RTP封装方式详解 文章目录 H264码流RTP封装方式详解 1 H264基本概念 2 NALU Header介绍 3 RTP封装H264码流 3 1 单一NALU模式 3 2 组合帧封装模式 3 3 分片封装模式 4 代码解析
  • Qt的4种多线程实现方式

    一 QThread类的run 一 实现方法 新建一个集成QThread的类 重写虚函数run 通过run启动线程 二 示例 class WorkerThread public QThread Q OBJECT void run overri
  • Oracle drop if exists

    参考https stackoverflow com questions 1799128 oracle if table exists 我的官方博客http blog alei tech 转载请注明 网页地址https alei tech 2
  • 参考文献必备神器:这个插件能快速知道收藏的论文是否靠谱

    贾浩楠 发自 凹非寺 量子位 报道 公众号 QbitAI AI读文献 又有新的黑科技上线了 专攻AI分析论文内容的Scite最近刚刚开源了scite zotero plugin工具 scite zotero plugin能自动将论文中的引用
  • 97 条 Linux 运维工程师常用命令总结

    ls mv cp scp rm touch pwd cd mkdir rmdir echo cat more less nl head tail vi vim which whereis locate 数据库快速搜寻档案 find grep
  • “泰迪杯”挑战赛-通过图像处理和数据挖掘实现车辆检测与跟踪

    目 录 挖掘目标 分析方法与过程 2 1 总体流程 2 2 具体步骤 2 3 结果分析 结论 参考文献 1 挖掘目标 在建设平安城市的进程中 安全是政府日常管理工作中的重要任务 随着城市报警和监控系统的建设 对于监控数据的分析也日显重要 本
  • powerdesigner物理视图 导出建库脚本(mysql)

    第一步 设置powerdesigner 物理视图 导出数据库类型 菜单栏 DataBase 数据库 generate Database 第二步 设置Powerdesigner 物理视图 导出数据库语言类型 第三步 根据第二步的相关配置 进行
  • web.xml文件详解

    前言 一般的web工程中都会用到web xml web xml主要用来配置 可以方便的开发web工程 web xml主要用来配置Filter Listener Servlet等 但是要说明的是web xml并不是必须的 一个web工程可以没
  • Python错误提示:TypeError: sequence item 2: expected str instance, int found

    我们知道在对list进行拼接 对字符串进行拼接的时候可以使用 join 但是在将list进行拼接转换为字符串的时候报错 大家可以对比看一下 list01 name age 20 s join list01 print s try list0
  • java8之lambda表达式简介

    文章目录 1 概念 2 基础语法 2 1 语法格式一 2 2 语法格式二 2 3 语法格式三 2 4 语法格式四 2 5 语法格式五 2 6 语法格式六 3 Lambda 表达式需要 函数式接口 的支持 4 java内置四大核心函数式接口
  • python的split分割数组_NumPy数组的分割

    在 NumPy 中 利用 split hsplit 和 vsplit 等函数可实现数组的分割操作 split 函数 该函数可沿特定的轴将数组分割为子数组 使用 split 函数的方法如下 numpy split arr indices or
  • K8S安装Master教程(亲测成功)

    配置hosts vim etc hosts 追加如下内容 192 168 18 10 k8s master 192 168 18 11 k8s node1 192 168 18 12 k8s node2 192 168 18 13 k8s