基于CentOS 7.6搭建Kubernetes 1.17.3集群demo

2023-05-16

本demo仅涉及基本的Kubernetes功能实践与介绍,无高可用配置。部署版本为当前时间阿里开源镜像站提供的最新版本1.17.3。

文章目录

  • 部署环境
  • 安装准备
    • 域名解析
    • 关闭SELinux和防火墙
    • 配置yum源
    • 时间同步
    • 禁用swap
    • 加载br_netfilter模块
    • 内核参数修改
    • 加载ipvs内核模块
  • 部署docker容器运行环境
    • 安装docker-ce
    • Docker文件配置
    • 配置镜像加速器
    • 修改Cgroup Driver
  • 部署Kubernetes
    • 安装kubelet、kubeadm和kubectl
    • 配置kubelet
    • kubectl命令补全
  • 集群初始化
    • 编辑集群初始化配置文件
    • 下载镜像
    • 集群初始化
    • 加载环境变量
    • 验证各组件是否正常
  • 部署网络插件
  • 将Node节点加入集群
  • 部署问题记录
    • selinux状态变为Enforcing
    • Cgroup Driver不符合要求
    • [ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
    • 集群初始化失败重新执行
    • 因为网络原因无法通过在线的配置清单部署flannel

部署环境

IP地址主机名角色操作系统主机配置
192.168.88.21k8s-01masterCentOS 7.64U8G
192.168.88.22k8s-02nodeCentOS 7.64U8G
192.168.88.23k8s-03nodeCentOS 7.64U8G

安装准备

以下操作除特殊说明外在所有节点执行

域名解析

cat >> /etc/hosts <<EOF
192.168.88.21 k8s-01
192.168.88.22 k8s-02
192.168.88.23 k8s-03
EOF

关闭SELinux和防火墙

各节点运行的kube-proxy组件均要借助iptables或ipvs构建Service对象,为避免干扰在部署Kubernetes之前关闭SELinux和防火墙。

setenforce 0
sed -i 's/=enforcing/=disabled/' /etc/sysconfig/selinux
systemctl stop firewalld 
systemctl disable firewalld

配置yum源

centos

mv -f /etc/yum.repos.d/*.repo /tmp/
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache fast

docker-ce

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

kubernetes

cat <<EOF > /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
EOF
yum clean all
yum makecache fast

时间同步

将master节点配置成NTP服务器,再将node节点的时间与master节点同步。

在master节点部署NTP服务器

yum -y install ntp
sed -i 17c"restrict 0.0.0.0 mask 255.255.255.0 nomodify notrap" /etc/ntp.conf
sed -i 20a"server 127.127.1.0" /etc/ntp.conf
sed -i 21a"fudge 127.127.1.0 stratum 10" /etc/ntp.conf
systemctl enable ntpd
systemctl restart ntpd

在node节点同步时间

yum -y install ntp
ntpdate k8s-01

禁用swap

临时禁用

swapoff -a

永久禁用

sed -i '/swap/s/^/#/' /etc/fstab

如果内存资源吃紧,也可以选择在执行 kubeadm init 时设置忽略检查错误。

加载br_netfilter模块

本Kubernetes集群demo网络插件使用flannel,该网络需要设置内核参数bridge-nf-call-iptables=1,修改这个参数需要系统有br_netfilter模块。

查看br_netfilter模块

lsmod |grep br_netfilter

如果系统没有br_netfilter模块则执行下面的新增命令,如有则忽略以下操作。

临时新增br_netfilter模块

modprobe br_netfilter

该方式重启后会失效

永久新增br_netfilter模块

cat > /etc/rc.sysinit << EOF
#!/bin/bash
for file in /etc/sysconfig/modules/*.modules ; do
[ -x \$file ] && \$file
done
EOF
cat > /etc/sysconfig/modules/br_netfilter.modules << EOF
modprobe br_netfilter
EOF
chmod +x /etc/sysconfig/modules/br_netfilter.modules

内核参数修改

内核参数临时修改

sysctl net.bridge.bridge-nf-call-iptables=1
sysctl net.bridge.bridge-nf-call-ip6tables=1

内核参数永久修改

cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl -p /etc/sysctl.d/k8s.conf

加载ipvs内核模块

Kubernetes默认使用ipvs代理模式的Service资源,但它依赖的ipvs相关的内核模块不会自动加载,需要手动载入。

cat > ipvs.modules <<EOF
#!/bin/bash
ipvs_mods_dir="/usr/lib/modules/\$(uname -r)/kernel/net/netfilter/ipvs"
for i in \$(ls \$ipvs_mods_dir | grep -o "^[^.]*");  do
    /sbin/modinfo -F filename \$i &> /dev/null
    if [ \$? -eq 0 ]; then
        /sbin/modprobe \$i
    fi
done
EOF

修改文件权限,并且手动为当前系统环境加载内核模块

chmod +x /etc/sysconfig/modules/ipvs.modules
/etc/sysconfig/modules/ipvs.modules
lsmod |grep ip_vs

部署docker容器运行环境

以下操作除特殊说明外在所有节点执行

安装docker-ce

docker版本列举

yum list docker-ce --showduplicates |sort -r

选择指定版本安装(无要求直接安装最新版)

yum -y install docker-ce
systemctl enable docker
systemctl restart docker

Docker文件配置

Docker自动设置iptables的FORWARD链默认策略为DROP,会影响到Kubernetes集群依赖的报文转发功能,因此需要在docker启动后重新将FORWARD链的默认策略设置为ACCEPT。

sed -i '/ExecStart=\/usr\/bin\/dockerd/aExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT' /usr/lib/systemd/system/docker.service

配置镜像加速器

国内访问DockerHub下载镜像的速度较慢,建议使用国内的镜像对其进行加速(这里的操作与修改Cgroup Driver合并)

修改Cgroup Driver

cat >> /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl daemon-reload
systemctl restart docker

部署Kubernetes

以下操作除特殊说明外在所有节点执行

安装kubelet、kubeadm和kubectl

kubelet是运行于集群每个节点上的Kubernetes代理程序,以自托管方式部署的Kubernetes集群,除kubelet和docker外的所有组件均以Pod的形式运行。

  • kubelet 运行在集群所有节点上,用于启动Pod和容器等对象的工具
  • kubeadm 用于初始化集群,启动集群的命令工具
  • kubectl 用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件

检查版本

yum list |grep kube
yum list kubelet --showduplicates

安装

yum -y install kubelet-1.17.3-0 kubeadm-1.17.3-0 kubectl-1.17.3-0

配置kubelet

编辑kubelet的配置文件 /etc/sysconfig/kubelet,忽略禁止使用swap的限制(可选)

KUBELET_EXTRA_ARGS="--fail-swap-on=false"

设置kubelet服务开机自启(kubeadm强制要求)

systemctl enable kubelet

kubectl命令补全

在master节点执行

echo "source <(kubectl completion bash)" >> ~/.bash_profile
source .bash_profile

集群初始化

以下操作在master节点执行

编辑集群初始化配置文件

将集群初始化配置文件导出

kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml

修改配置文件里主机IP地址为本机地址

  advertiseAddress: 192.168.88.21

修改配置文件里获取系统镜像时使用的镜像仓库

imageRepository: registry.aliyuncs.com/google_containers

修改配置文件里声明的kubernetes版本

kubernetesVersion: v1.17.3

设置Pod网络

  podSubnet: 10.244.0.0/16

下载镜像

查看所需镜像列表

kubeadm config images list --config kubeadm.yml

提前拉取镜像

kubeadm config images pull --config kubeadm.yml

集群初始化

根据准备好的配置文件进行初始化

kubeadm init --config kubeadm.yml

初始化成功会得到以下信息,注意一定要留存

Your Kubernetes control-plane has initialized successfully!

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

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.88.21:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:dfcb727e5828cc811e710edbdb1dde5b104bb4f2650177fa30efbffad5ab0e0f 

加载环境变量

根据上面给出的提示执行

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

验证各组件是否正常

kubectl get cs
NAME                 STATUS    MESSAGE             ERROR
scheduler            Healthy   ok                  
controller-manager   Healthy   ok                  
etcd-0               Healthy   {"health":"true"}   

部署网络插件

在master节点使用在线版的配置文件部署flannel

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

查看node状态

kubectl get node
NAME     STATUS   ROLES    AGE   VERSION
k8s-01   Ready    master   67m   v1.17.3

将Node节点加入集群

在node节点执行集群初始化时获得的kubeadm join命令

kubeadm join 192.168.88.21:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:dfcb727e5828cc811e710edbdb1dde5b104bb4f2650177fa30efbffad5ab0e0f

再次查看集群节点状态

kubectl get node
NAME     STATUS   ROLES    AGE     VERSION
k8s-01   Ready    master   80m     v1.17.3
k8s-02   Ready    <none>   5m57s   v1.17.3

到此一个基础的Kubernetes集群部署完成。

部署问题记录

selinux状态变为Enforcing

安装docker-ce时安装了一个依赖软件包:container-selinux,此后Linux系统中的selinux被其取代,此时查看selinux的状态发现变为Enforcing,但是并不影响Kubernetes的部署。

Cgroup Driver不符合要求

docker默认使用的Cgroup Driver是cgroupfs,而Kubernetes推荐使用的是systemd。

直接进行集群初始化会报错并退出,需要修改。

cat >> /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl daemon-reload
systemctl restart docker

[ERROR FileContent–proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1

提示需要修改一个内核参数

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

集群初始化失败重新执行

如果第一次集群初始化已经将apiserver等Pod拉起但是后面失败的话,重新执行初始化命令会提示pod已经存在、端口已被占用等等信息,此时需要将集群重置。

kubeadm reset

因为网络原因无法通过在线的配置清单部署flannel

使用阿里云服务器将配置清单下载

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于CentOS 7.6搭建Kubernetes 1.17.3集群demo 的相关文章

随机推荐

  • Kafka,ZK集群开发或部署环境搭建及实验

    本文属于原创 xff0c 转载注明出处 xff0c 欢迎关注微信小程序小白AI博客 微信公众号小白AI或者网站 https xiaobaiai net 或者我的CSDN http blog csdn net freeape 文章目录 1 前
  • Spring Boot 基于Spring Integration 实现MQTT客户端简单订阅发布功能

    本文属于翻译 xff0c 转载注明出处 xff0c 欢迎关注微信小程序小白AI博客 微信公众号小白AI或者网站 https xiaobaiai net TOC 1 简介 Spring Integration 提供入站 inbound 和出站
  • php 获取今天开始的时间戳

    一天86400秒 time 61 time date 61 date 39 Y m d 39 time 今天的年月日 startTime 61 strtotime date 39 Y m d 39 time 今天开始时间的时间戳 endTi
  • Spring Boot Kafka概览、配置及优雅地实现发布订阅

    本文属于原创 xff0c 转载注明出处 xff0c 欢迎关注微信小程序小白AI博客 微信公众号小白AI或者网站 https xiaobaiai net 文章目录 1 前言2 Spring Kafka功能概览2 1 自动创建主题2 2 发送消
  • An Ota Package Tool

    文章目录 OtaPackageToolInstallationBinary InstallationInstalling Tool from Source UsagePreparationExamplesFull UpdatesIncrem
  • [开源]OTA打包工具

    文章目录 OTA打包工具 96 ota packer 96 安装二进制安装源码编译安装 使用准备示例全量包增量包生成关于OTA包版本之间文件变更类型说明 96 ota packer 96 使用条件License OTA打包工具 ota pa
  • [golang]包管理

    文章目录 1 GOPATH vs Go Modules2 Go Modules Go Module Proxy 和 goproxy cn3 Go Modules 相关知识3 1 语义化版本控制规范3 2 go mod3 3 go sum3
  • 【名名的Bazel笔记】自定义规则实现将多个静态库合并为一个动态库或静态库

    文章目录 1 前言2 自定义规则实现2 1 规则功能2 2 实现规则的理论基础2 3 规则代码实现 3 总结4 参考资料 1 前言 为了实现如标题所述的将多个静态库合并为一个动态库 xff0c 内置的 Bazel 规则是没有这个功能的 xf
  • 【名名的Bazel笔记】自定义工具链实现交叉编译

    文章目录 1 前言2 Non Platform 方式3 Platform 方式3 1 平台3 1 1 概述3 1 2 定义约束和平台3 1 3 通用的约束和平台3 1 4 指定平台构建 3 2 工具链3 3 Platform 43 Tool
  • PX4/Pixhawk---uORB深入理解和应用

    The Instructions of uORB PX4 Pixhawk 软件体系结构 uORB 主题发布 主题订阅 1 简介 1 1 PX4 Pixhawk的软件体系结构 PX4 Pixhawk的软件体系结构主要被分为四个层次 xff0c
  • join函数

    Python中我们经常会用到join函数 join函数的基本格式是 xff1a span class token string 39 39 span span class token punctuation span join span c
  • Glance详解

    Glance简介 Glance是OpenStack平台中负责镜像服务的组件 xff0c 其功能包括系统镜像的查找 注册和获取等 简单来说glance的功能就是用户可以通过其提供的REST API查询和获取镜像元数据 xff0c 通过Glan
  • 深入理解k8s中的service概念

    文章目录 service的概念kube proxy的作用kube proxy的三种模式Userspace Proxy ModeIptables Proxy ModeIPVS proxy mode service的概念 在k8s集群中 xff
  • Java_Save could not be completed. Try File> Save As. if the problem persists.

    所以最好不要用 开头的符号作为变量名 xff0c 变量名中含有一些奇怪的字符也会产生编码问题
  • Cinder详解

    文章目录 理解cindercinder架构cinder apicinder volumecinder schedulervolume providercinder DB cinder设计思想 理解cinder 操作系统得到存储空间一般有两种
  • shell:重启&&关机

    文章目录 shutdownhaltpoweroffrebootinitsync shutdown 关机重启命令 shutdown h 10十分钟后关机shutdown h 0马上关机shutdown h now马上关机shutdown c取
  • 基于docker的Jenkins-Gitlab-Ansible实现自动化部署

    环境准备 安装docker xff0c 略 拉取Jenkins Gitlab镜像 docker pull jenkins docker pull gitlab ce 部署 Jenkins 生成Jenkins span class token
  • SSH远程登录出现的常见问题与解决方法

    运维工程师经常会使用ssh远程登录主机 ssh的使用并不复杂 xff0c 但是也有可能会遇到各种各样的错误 xff0c 我在本篇博文中总结了一些常见的ssh报错信息与解决方法 Connection refused 可能原因 xff1a 网络
  • 从两个角度理解Kubernetes基本概念

    想要理解Kubernetes集群首先要思考两个问题 xff1a 它是由什么组成的 它是怎样工作的 而想要搞清楚这两个问题我们可以在两个不同的层面寻找答案 从物理层面看 从直观的层面来看 xff0c Kubernetes将多个物理机或虚拟机汇
  • 基于CentOS 7.6搭建Kubernetes 1.17.3集群demo

    本demo仅涉及基本的Kubernetes功能实践与介绍 xff0c 无高可用配置 部署版本为当前时间阿里开源镜像站提供的最新版本1 17 3 文章目录 部署环境安装准备域名解析关闭SELinux和防火墙配置yum源时间同步禁用swap加载