kubernetes集群部署
提示:
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
例如:
提示:以下是本篇文章正文内容,下面案例可供参考
一、k8s是什么?
示例:xxxx。
二、系统初始化
2.1、 机器配置
机器名 | 配置 | 系统 |
---|---|---|
hostname1 | 2C4G100g | centos7 |
hostname2 | 2C4G00g | centos7 |
hostname3 | 2C4G100g | centos7 |
2.2、机器配置更改
2.2.1、设置系统主机名以及 Host 文件的相互解析
hostnamectl set-hostname 要设置的机器名
hostnamectl set-hostname k8s-master01 设置机器名为k8s-master01
2.2.2、安装依赖包
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
2.2.3、设置防火墙为 Iptables 并设置空规则
代码如下(示例):
systemctl stop firewalld && systemctl disable firewalld # 关闭防火漆设置开机自启
yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
2.2.4、关闭 SELINUX
代码如下(示例):
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
2.2.5、调整内核参数,对于 K8S
2.2.5.1、调整内核参数
代码如下(示例):
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
2.2.5.2、重启让配置生效
再执行:
cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
sysctl -p /etc/sysctl.d/kubernetes.conf
再执行这一步调整内核参数的时候有可能会报错:
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: 没有那个文件或目录 sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: 没有那个文件或目录
- 升级内核版本即可解决,下面提供了升级内核版本的步骤
2.2.6、调整系统时区
2.2.6.1、 查看当前系统时区
timedatectl
2.2.6.2、如果时区不是上海的修改为上海的
代码如下(示例):
# 设置系统时区为 中国/上海
timedatectl set-timezone Asia/Shanghai
# 将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0
# 重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond
2.2.7、关闭系统不需要服务
代码如下(示例):
systemctl stop postfix && systemctl disable postfix
2.2.8、设置 rsyslogd 和 systemd journald
2.2.8.1、创建配置日志目录及日志文件
代码如下(示例):
mkdir /var/log/journal # 持久化保存日志的目录
mkdir /etc/systemd/journald.conf.d # 创建新系统日志配置文件存放目录
2.2.8.2、日志文件配置添加
代码如下(示例):
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
# 持久化保存到磁盘
Storage=persistent
# 压缩历史日志
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
# 最大占用空间 10G
SystemMaxUse=10G
# 单日志文件最大 200M
SystemMaxFileSize=200M
# 日志保存时间 2 周
MaxRetentionSec=2week
# 不将日志转发到 syslog
ForwardToSyslog=no
EOF
2.2.8.3、重启journald服务
systemctl restart systemd-journald
3、升级系统内核
3.1、调整k8s内核参数的时会出现报错
- 调整内核参数
代码如下(示例):
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 #关闭ipv6协议
net.netfilter.nf_conntrack_max=2310720
EOF
最重要的是:
net.bridge.bridge-nf-call-iptables=1 -- 开启网桥模式
net.bridge.bridge-nf-call-ip6tables=1 --- 开启网桥模式
net.ipv6.conf.all.disable_ipv6=1 ----- 关闭ipv6协议
有可能会出现:
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: 没有那个文件或目录 sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: 没有那个文件或目录
3.2、 查看当前的系统内核版本
**查看内核版本 uname -r **
3.3、 升级内核版本
3.3.1、 查看现在可使用内核
代码如下(示例):
cat /boot/grub2/grub.cfg |grep menuentry
- 只有3.1的内核
3.3.2、升级内核
代码如下(示例):
3.3.2.1、获取源
1.获取源
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
3.3.2.2、安装,装完成后检查
2.安装,装完成后检查 /boot/grub2/grub.cfg中对应内核menuentry中是否包含 initrd16 配置,如果没有,再安装一次!
yum --enablerepo=elrepo-kernel install -y kernel-lt
3.3.2.3、查看系统的全部内核
3.查看系统的全部内核
rpm -qa | grep kernel
3.3.2.4、查看设置内核的名称
cat /boot/grub2/grub.cfg |grep menuentry
3.3.2.5、设置开机从新内核启动
设置开机从新内核启动
grub2-set-default '你的内核'
低版本是:
grub2-set-default 'CentoS Linux(4.4.202-1.el7.elrepo.×86_64) 7 (Core)’
我的7.9版本是:
grub2-set-default 'CentOS Linux (5.4.188-1.el7.elrepo.x86_64) 7 (Core)'
3.3.2.6、重启使配置有效
reboot
3.3.2.7、查看正在使用的内核
uname -a
- 执行第五步的时候要查看你的内核都有哪些 我的centos是7.9的所有我的下载的内核版本较高
- 查看内核版本: cat /boot/grub2/grub.cfg |grep menuentry
- 执行: grub2-set-default ‘CentOS Linux (5.4.188-1.el7.elrepo.x86_64) 7 (Core)’
- 然后重启系统使配置生效
4. 安装k8s
4.1、kube-proxy开启ipvs的前置条件
执行:
modprobe br_netfilter
4.1.1、低版本配置:
执行:
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
- 再执行:
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules &&
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
-
报错:
modprobe: FATAL: Module nf_conntrack_ipv4 not found.
-
但是在进行配置时会报错modprobe: FATAL: Module nf_conntrack_ipv4 not found.
这是因为使用了高内核,较如博主就是使用了5.2的内核,一般教程都是3.2的内核。在高版本内核已经把nf_conntrack_ipv4替换为nf_conntrack了。所以正确配置应该如下
cat <<EOF> /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
4.1.2、高版本配置
# 1.安装ipset和ipvsadm
[root@master ~]# yum install ipset ipvsadmin -y
# 2.添加需要加载的模块写入脚本文件
[root@master ~]# cat <<EOF> /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
# 3.为脚本添加执行权限
[root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
# 4.执行脚本文件
[root@master ~]# bash /etc/sysconfig/modules/ipvs.modules
# 5.查看对应的模块是否加载成功
[root@master ~]# lsmod | grep -e -ip_vs -e nf_conntrack
nf_conntrack_netlink 49152 0
nfnetlink 20480 3 nf_conntrack_netlink,ip_set
nf_conntrack 155648 5 xt_conntrack,nf_nat,nf_conntrack_netlink,xt_MASQUERADE,ip_vs
nf_defrag_ipv6 24576 2 nf_conntrack,ip_vs
nf_defrag_ipv4 16384 1 nf_conntrack
libcrc32c 16384 4 nf_conntrack,nf_nat,xfs,ip_vs
5、安装 Docker 软件
5.1、安装 Docker 软件(方式一:)
5.1.1、删除所有的docker
代码示例: (如下)
yum remove -y docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engin
5.1.2、修改镜像源并安装依赖
代码示例: (如下)
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
- 或者
yum install wget jg psmisc vim net-tools telnet yum-utils device-mapper-persistent-data lvm2 git -y
5.1.3、配置并下载docker 源为阿里云的
代码示例: (如下)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum install -y docker-ce-19.03.5-3.el7
5.1.4、再依次执行
代码示例: (如下)
modprobe br_netfilter
5.1.5、再执行
代码示例: (如下)
echo "*/3 * * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1 &" >> /var/spool/cron/root
systemctl restart crond
mkdir -p /opt/docker
mkdir -p /etc/docker
5.1.6、配置你的docker仓库(也可后续搭建完成docker仓库后再操作)
代码示例: (如下)
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://fozxkv57.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.25.69"],
"data-root": "/home/docker/",
"log-driver": "json-file",
"max-concurrent-downloads":20,
"live-restore":true,
"max-concurrent-uploads":10,
"debug":true,
"log-opts": {
"max-size": "300m",
"max-file": "1"
}
}
EOF
5.1.7、重启docker
代码示例: (如下)
systemctl daemon-reload && systemctl enable docker && systemctl restart docker
5.2、安装 Docker 软件(方式二:)
也可以执行下面的初步安装
5.2.1、安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
5.2.2、配置docker源
代码示例: (如下)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5.2.3、下载最新版docker
代码示例: (如下)
yum update -y && yum install -y docker-ce
5.2.4、创建 /etc/docker 目录,配置 daemon
代码示例: (如下)
mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
}
}
EOF
mkdir -p /etc/systemd/system/docker.service.d
5.2.5、重启docker服务
代码示例: (如下)
systemctl daemon-reload && systemctl restart docker && systemctl enable docker
6、安装 kubernetes(主从配置)
6.1、安装 Kubeadm (主从配置)
6.1.1、更改yum源配置
也可参考 https://blog.csdn.net/Lovely_red_scarf/article/details/123535212
- 因为默认的源或者阿里云源没有kubernetes的下载地址
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
6.1.2、下载 kubeadm、kubectl、kubelet
代码示例: (如下) 我这里下载1.8.1版本的,今天是2022.4.6截至今天各大厂商支持最低版本就是1.8.1
yum -y install kubeadm-1.18.1 kubectl-1.18.1 kubelet-1.18.1 -y
6.1.2、kubelet设置开机自启动
代码示例: (如下)
systemctl enable kubelet.service
6.1.2、kubelet设置开机自启动
代码示例: (如下)
6.2、 初始化主节点–(仅在master节点执行)
6.2.1、获取k8s默认的配置文件
代码示例: (如下)
kubeadm config print init-defaults > kubeadm-config.yaml
6.2.2、修改默认的配置文件与本机适配
代码示例: (如下)
- 再把默认的调度方式改为ipvs
配置
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.21.214
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: k8s-master01
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.18.0
networking:
dnsDomain: cluster.local
podSubnet: "10.244.0.0/16"
serviceSubnet: 10.96.0.0/12
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
SupportIPVSProxyMode: true
mode: ipvs
6.2.2、使用k8s的配置文件 执行安装
代码示例: (如下)
kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-init.log
报错: unknown flag: --experimental-upload-certs To see the stack trace of this error execute with --v=5 or higher
解决办法
- 之前安装V1.15的时候是可以的,可能是版本升级的原因。
unknown flag: --experimental-upload-certs,将–experimental-upload-certs 替换为 --upload-certs
重新执行:
kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log
安装
6.2.2.1:安装成功后当前安装目录下会出现kubeadm-init.log
6.2.3、创建集群管理的配置文件(master需要)
代码示例: (如下)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
6.2.3、查看已安装kubectl版本
yum list kubectl –showduplicates
7、加入主节点以及其余工作节点 (安装完kubeadm 和kubectl kubelet后执行下述)
执行安装日志中的加入命令即可 kubeadm-init.log 中的
8、部署网络
flannel 网段默认地址: 10.244.0.0/16 所以pod的podSubnet 要设为一致
8.1、查看集群状态
代码示例: (如下)
kubectl get nodes
8.2、 下载fiannel
代码示例: (如下)
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
8.2、 执行安装
代码示例: (如下)
kubectl create -f kube-flannel.yml
注意:有时候可能会安装失败因为网络的原因,只需要再次执行安装即可
- 也可以使用 kubectl describe pod kube-flannel-ds-28m2p -n kube-system 查看pod日志
8.3、 查看fiannel是否已经安装
kubectl get pods -n kube-system
因为默认安装的工具都在kube-system这个namespace中 所以查看kube-system中的pods
-
等了许久后发现终于好了,这个时候再执行: kubectl get pods -n kube-system
-
就可以查看现在集群的节点的状态 现在已经是ready的了
kubectl get nodes
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了使用kubeadm安装k8s。