前言: 采坑

k8s有3种安装方式,如下所示:

  • minikube:这是一个k8s集群模拟器,只有一个节点的集群,只为了测试使用,master和node都在一台机器上
  • 直接使用带有容器功能的云平台安装:这个可以采用阿里云或者腾讯云服务器带有容器功能的,这个的优点就是可视化搭建,步骤简单,完全不用自己去安装了,缺点是收费。
  • 裸机安装:至少有两台服务器,一个主节点,一个工作节点。需要在即安装k8s的组件。配置稍微麻烦点。

我因为是自己学习使用,所以采用裸机安装。全程自己操作,我是通过在本机安装虚拟机,安装了3台虚拟机,我的环境是mac笔记本。如果想要参考mac笔记本安装虚拟机,可以看这篇文章:https://www.cnblogs.com/ITPower/p/15906012.html


一. 环境准备

操作系统:macOS 笔记本

虚拟机: Parallels

网络环境搭建:参考文章- https://www.cnblogs.com/ITPower/p/15906012.html

二. 集群搭建

1、搭建环境需要的组件

1) master节点需要的组件

  • docker
  • kubectl:集群命令行交互工具
  • kubeadm:集群初始化工具

2)node节点需要的组件

  • docker
  • kubelet:管理pod的容器,确保他们健康稳定的运行
  • Kube-proxy: 网络代理,负责网络相关工作

2、开始搭建

第一步:设置每个节点的主机名

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

这条命令会删除/etc/hostname文件中的主机名,然后替换为新的主机名。系统会更新/etc/hosts文件.

然后输入名称查询是否已经变更了主机名

  1. hostname

第二步:添加ip和主机名的映射关系

获取服务器的ip,并在宿主机访问. 我的三台虚拟机的ip是

  1. 10.211.55.200
  2. 10.211.55.201
  3. 10.211.55.202

将ip和主机名的映射关系添加到3台服务器中,执行命令

  1. sudo vim /etc/hosts

然后将下列代码拷贝进去

  1. 10.211.55.200 master
  2. 10.211.55.201 node1
  3. 10.211.55.202 node2

全部都配置好了以后,在三台服务ping一下,看看是否能访问通

  1. ping master
  2. ping node1
  3. ping node2

能ping通就说明配置没问题。

第三步:关闭所有节点的SELINUX

关闭所有节点的SELINUX, Redhat使用了SELinux来增强安全

  1. setenforce 0
  2. sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

上面两个命令的含义:第一个是临时关闭防火墙,不需要重启服务;第二个是永久关闭防火墙,需要重启。

验证防火墙是否关闭成功

  1. getenforce 或者 sestatus

SELINUX相关命令科普

sestatus # 查询SELINUX的状态

关闭selinux的方法有两种:临时关闭和永久关闭。

  1. 临时关闭防火墙

    临时关闭在重启后会失效。

    临时关闭命令:

    1. setenforce 0

    查看是否关闭成功:

    1. getenforce

    临时关闭报错 setenforce: setenforce() failed ,问题是权限不够,我们需要管理员权限才可以。要先获取root权限

    1. su - root
    2. setenforce 0
  2. 永久关闭防火墙

    编辑配置文件 /etc/selinux/config 。需要重启才可以生效

    1. sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config

    我们常用的方法是,先配置临时生效,再更改配置文件。这样就算服务器重启了,selinux也还是关闭的。

第四步:关闭所有节点的防火墙和swapoff

  1. systemctl stop firewalld
  2. systemctl disable firewalld

验证防火墙的状态

  1. systemctl status firewalld

关闭swapoff

  1. swapoff -a
  2. sed -i 's/.*swap.*/#&/' /etc/fstab

第五步:添加k8s安装源和docker安装源

添加k8s安装源

  1. cat <<EOF > /etc/yum.repos.d/kubernetes.repo
  2. [kubernetes]
  3. name=Kubernetes
  4. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
  5. enabled=1
  6. gpgcheck=1
  7. repo_gpgcheck=1
  8. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  9. EOF

添加docker安装源

  1. sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

第六步:安装k8s组件

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

三台服务器都安装。

第七步:启动kubelet、docker,并设置开机启动

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

Kubelet组件运行在Node节点上,维持运行中的Pods以及提供kuberntes运行时环境,主要完成以下使命:

1.监视分配给该Node节点的pods

2.挂载pod所需要的volumes

3.下载pod的secret

4.通过docker/rkt来运行pod中的容器

5.周期的执行pod中为容器定义的liveness探针

6.上报pod的状态给系统的其他组件

7.上报Node的状态

一定要检查kubelet的状态是否正常

  1. systemctl daemon-reload
  2. systemctl status kubelet

这是启动成功的状态。

我在启动kubelet这里遇到的麻烦,总是提示启动失败。各种排查都没有找到原因。最后卸载重新安装了,记录一下卸载流程

第一步:我使用的yum install安装的,所以卸载使用 yum remove

  1. yum -y remove kubelet //-y表示又询问都是yes

第二步:查看kubelet包在linux中是否存在

  1. yum list kubelet

我们看到包还在,原因是软件卸载了,并没有删除软件包

第三步:检查删除的状态

  1. systemctl status kubelet

状态提示:

  1. Warning: kubelet.service changed on disk. Run 'systemctl daemon-reload' to reload units.

第四步:验证删除成功

执行systemctl daemon-reload

  1. systemctl daemon-reload

执行完以后在查询状态

  1. systemctl status kubelet

Unit kubelet.service could not be found.

第五步:重新安装

  1. yum -y install kubelet

第六步:启动kubelet,并开机启动

  1. systemctl enable kubelet
  2. systemctl start kubelet

第八步:修改docker配置

kuberneters官方推荐docker等使用systemd作为cgroupdriver,否则kubelet启动不了

为什么要修改docker的cgroup driver? https://www.cnblogs.com/architectforest/p/12988488.html

  1. cat <<EOF > /etc/docker/daemon.json
  2. {
  3. "registry-mirrors": ["https://registry.docker-cn.com"],
  4. "exec-opts": ["native.cgroupdriver=systemd"]
  5. }
  6. EOF

重启docker

  1. // 守护进程重启
  2. systemctl daemon-reload
  3. systemctl restart docker

验证docker的Cgroup是否是systemd

  1. docker info |grep Cgroup

应该返回如下内容

  1. [root@node1~]# docker info |grep Cgroup
  2. Cgroup Driver: systemd
  3. #docker驱动程序为 systemd

第九步:用kubeadm来初始化集群(仅master节点执行)

注意:这个命令仅在master节点执行

1)初始化集群控制台, 失败了可以用kubeadm reset重置

  1. 注意:只在主节点运行
  2. kubeadm init --kubernetes-version=1.23.4 \
  3. --apiserver-advertise-address=10.211.55.200 \
  4. --image-repository registry.aliyuncs.com/google_containers \
  5. --service-cidr=10.96.0.0/12 \
  6. --pod-network-cidr=10.244.0.0/16
  • 执行了这个命令以后,会帮我们创建集群的控制台

  • --image-repository registry.aliyuncs.com/google_containers 指定镜像源,由于kubeadm 默认从官网k8s.grc.io下载所需镜像,国内无法访问,因此需要通过--image-repository指定阿里云镜像仓库地址

  • --kubernetes-version:版本信息 kubectl version 查询

  • 定义POD的网段为: 10.244.0.0/16

  • apiserver地址就是master本机IP地址

  • --service-cidr=10.96.0.0/12 : 这个参数后的IP地址直接就套用10.96.0.0/12 ,以后安装时也套用即可,不要更改

    --pod-network-cidr=10.244.0.0/16 : k8s内部的pod节点之间网络可以使用的IP段,不能和service-cidr写一样,如果不知道怎么配,就先用这个10.244.0.0/16

初始化失败的可以重置,使用命令

  1. kubeadm reset

重置以后会有这样一段提示

The reset process does not clean your kubeconfig files and you must remove them manually.

Please, check the contents of the $HOME/.kube/config file.

意思是kubeadm reset 执行后不会删除$HOME/.kube文件,需要手动执行rm -rf $HOME/.kube

然后重新初始化。

初始化的过程中异常记录

异常1:

It seems like the kubelet isn't running or healthy.

首先可以用命令检查kubelet的状态

  1. systemctl status kubelet

状态返回异常

然后看日志,看看日志包的什么错?

  1. journalctl -xefu kubelet

日志说的很清楚,没有找到/var/lib/kubelet/config.yaml文件

这个问题最后我卸载了kubelet,然后重新装了一遍就好了。

最后,看到下面的内容,就表示安装成功了

复制出来最后两行, 并进行保存

  1. kubeadm join 10.211.55.200:6443 --token c8ysgy.uvo10ecrlqktmvft \
  2. --discovery-token-ca-cert-hash sha256:1ef77481c6c0efc18455e611d84567c3bb236da39cf98c2d0393c5454c4ba213

如果当时忘了复制,也没有关系, 使用命令重新获取

重新获取token的命令:

  1. kubeadm token create --print-join-command

第十步:复制授权文件(仅master节点执行)

注意:这个授权文件要去在root权限下执行

  1. 复制授权文件,以便kubectl有权限访问集群
  2. su - root
  3. mkdir -p $HOME/.kube
  4. cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  5. chown $(id -u):$(id -g) $HOME/.kube/config

第十一步:将工作节点加入到集群(仅在node节点执行)

将初始化主节点时生产的代码在node节点执行一下即可。

注意:要删掉第一个行后面的“\”

  1. kubeadm join 10.211.55.200:6443 --token c8ysgy.uvo10ecrlqktmvft --discovery-token-ca-cert-hash sha256:1ef77481c6c0efc18455e611d84567c3bb236da39cf98c2d0393c5454c4ba213

在两个node节点都执行一遍

异常问题记录

异常1:

  1. /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1

这时我们手动设置这个为1

  1. echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables

当多次调整都不成功的时候,可以重新获取一下token

  1. kubeadm token create --print-join-command

看到如下结果就成功了:

接下来可以使用kubectl来查看子节点

  1. kubectl get node

我们看到有一个master节点,两个node节点。他们的状态都是NotReady ;master节点是一个控制平台,并且是主节点。

第十二步:安装网络查件(在master上安装)

为什么上面节点都是NotReady呢?因为我们还需要安装一个网络插件,他们才能工作。

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

安装成功的图如下:

然后再查看节点状态

  1. kubectl get node

现在就都是ready状态了。

4.2 K8S超级完整安装配置的更多相关文章

  1. 游戏服务端pomelo完整安装配置过程

    版权声明:本文为博主原创文章,转载或又一次发表请先与我联系. https://blog.csdn.net/jonahzheng/article/details/27658985 游戏服务端pomelo ...

  2. Ubuntu环境Docker+K8s+Dashboard的安装配置(无坑亲测)

    安装之前的准备: 安装docker 使用国内 daocloud 一键安装命令: curl -sSL https://get.daocloud.io/docker | sh 直接从dockerhub下载 ...

  3. MySQL 8.0.18 InnoDB Cluster 主从(MGR)完整安装配置

    提示: MySQL InnoDB Cluster底层依赖Group Replication模式,至少3台机器 1.  准备3台 CentOS Linux 7 (Core), 修改各主机名:db-hos ...

  4. inkscope完整安装配置

    准备centos7基础系统 首先安装基础系统centos7 在安装选项那里选择base web server ,选择其他的也可以,选择mini安装会缺很多常用的软件包,后续需要一个个安装比较麻烦 关闭 ...

  5. 【转】android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创)

    原文网址:http://www.cnblogs.com/zdz8207/archive/2012/11/27/android-ndk-install.html android 最新 NDK r8 在w ...

  6. FastDFS分布式文件系统&Nginx负载均衡最小环境安装配置[超级详解]

    1.背景 FastDFS 是一款开源的.分布式文件系统(Distributed File System),由淘宝开发平台部资深架构师余庆开发.该开源项目的主页是 http://code.google. ...

  7. 【转】Nginx 学习笔记(十一)nginx下安装配置naxsi waf防火墙(附完整编译、配置)

    原文地址:http://f2ex.cn/nginx-installed-configuration-naxsi-waf/ Naxsi 是第三方 nginx 模块 ,它和 Modsecurity 都是开 ...

  8. android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创)

      android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创) 一直想搞NDK开发却一直给其他事情耽搁了,参考了些网上的资料今天终于把 ...

  9. kubernetes(K8S)快速安装与配置集群搭建图文教程

    kubernetes(K8S)快速安装与配置集群搭建图文教程 作者: admin 分类: K8S 发布时间: 2018-09-16 12:20 Kubernetes是什么? 首先,它是一个全新的基于容 ...

随机推荐

  1. shell基础知识查缺补漏

    最近在看<Linux程序设计(第4版)>,其中有一个章节主要讲了shell脚本方面的,内容不细,但是利用较短的篇幅讲的也不少了.对我们自己来说也是一个查缺补漏的过程,所以就写下这篇读书笔记 ...

  2. 【体验】在Adobe After Effects CC 2018中使用脚本创建窗口

    1.主界面 2.脚本编辑器主界面 3.对象浏览器 在脚本编辑器中按F1 4.写一段 ScriptUI var win = new Window('window', 'my win', [100, 10 ...

  3. luis使用手册

    Luis聊天机器人的使用 首先打开luis官网 图5.1  luis官网界面 图5.2  app应用管理界面 界面显示现有应用,显示它们的名称,语言,日期,以及使用次数.点击创建一个新的app应用. ...

  4. Spring Boot 3.0.0 发布第一个里程碑版本M1,你的 Java 升到17 了吗?

    2022年1月20日,Spring官方发布了Spring Boot 3.0.0的第一个里程碑版本M1. 下面一起来来看看Spring Boot 3.0.0 M1版本都有哪些重大变化: Java基线从 ...

  5. 集合框架-ArrayList练习(去除ArrayList集合中的重复元素)

    1 package cn.itcast.p3.arraylist.test; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; ...

  6. 微服务探索之路03篇-docker私有仓库Harbor搭建+Kubernetes(k8s)部署私有仓库的镜像

    ❝ 目录: 微服务探索之路01篇.net6.0项目本地win10系统docker到服务器liunx系统docker的贯通 微服务探索之路02篇liunx ubuntu服务器部署k8s(kubernet ...

  7. 用c#实现编写esp32单片机获取DHT11温度传感器参数

    欢迎爱好c#的爱好者,本文章我们将用C#的nanoframework框架来编写获取esp32单片机上的DHT11传感器的温度和湿度 实现我们需要准备配置好esp32的环境可以看看之前写的esp32搭建 ...

  8. K8s PV and PVC and StorageClass

    PVC和PV之间没有依靠ID.名称或者label匹配,而是靠容量和访问模式,PVC的容量和访问模式需要是某个PV的子集才能自动匹配上.注意:PVC和PV是一对一的,也即一个PV被一个PVC自动匹配后, ...

  9. ORB_SLAM3 + ROS采坑实录(从零开始的毕设生活第一弹)

    ORB-SLAM3配置 https://github.com/UZ-SLAMLab/ORB_SLAM3 https://github.com/shanpenghui/ORB_SLAM3_Fixed E ...

  10. Redis内存满了怎么办(新年快乐)

    Redis内存满了怎么办(新年快乐) 入我相思门,知我相思苦. 长相思兮长相忆,短相思兮无穷极. 一.配置文件 Redis长期使用或者不设置过期时间,导致内存爆满或不足,可以到Redis的配置文件re ...