Centos7安装k8s集群

23 篇文章 0 订阅

主机准备

所有的主机最低配置2*VCPU / 2*MEM

!!!注意: 主机名不能带有下划线_,否则K8S会报错.可以带中划线-
参考: https://www.cnblogs.com/xiao987334176/p/11899321.html

主机名IP地址
master192.168.32.200
node1192.168.32.201
node2192.168.32.202

禁用防火墙和SELinux

# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# 清空防火墙规则
iptables -F
# 禁用防火墙服务
systemctl disable --now firewalld

配置好hosts和ssh免密登录

在所有主机上执行

建议使用ansible来完成
https://blog.csdn.net/omaidb/article/details/120921192


更新Centos7的内核到4.4以上

在所有主机上执行
k8s在内核3.10下有bug,一定要更新到4.4

https://blog.csdn.net/omaidb/article/details/121856924


开启CPU负载均衡服务

# 开启tuned调优服务
systemctl enable --now tuned

# 使用系统推荐的优化方案
tuned-adm recommend

# 编辑tuned主配置文件
vim /etc/tuned/tuned-main.conf

## 开启动态微调
dynamic_tuning = 1

# 重启tuned服务
systemctl restart tuned

# 开机自启并现在开启irqbanlance服务
systemctl enable --now irqbalance

安装依赖包

在所有主机上执行

原文链接:https://blog.csdn.net/omaidb/article/details/129405503

# 安装lsb包
yum install -y redhat-lsb

# 安装常用依赖包
yum install -y pv net-tools vim lrzsz curl wget tree screen socat lsof telnet tcpdump iperf3 qrencode proxychains-ng traceroute bind-utils

yum install -y conntrack jq sysstat libseccomp git chrony

设置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

# 单文件最大200M
SystemMaxFileSize=200M

# 日志保存时间2周
MaxRetentionSec=2week

# 是否将日志转发到syslog
ForwardToSyslog=no
EOF

# 重启systemd-journald
systemctl restart systemd-journald

安装Docker或containerd.io

Centos7安装Docker https://blog.csdn.net/omaidb/article/details/121683661

RHEL8安装Docker
https://blog.csdn.net/omaidb/article/details/121071924


安装containerd.io

k8s1.24版本不再支持Docker,需要安装containerd.io作为容器运行时。

https://blog.csdn.net/omaidb/article/details/128677718

在所有主机上安装containerd.io

# 配置Docker-ce源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装containerd.io
yum install -y containerd.io

# 启动containerd服务
systemctl enable --now containerd



配置containerd

https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#installing-runtime

cri-dockerd 是一个基于传统的内置 Docker 引擎支持的项目, 它在 1.24 版本从 kubelet 中移除。
cri-dockerd项目地址:https://github.com/Mirantis/cri-dockerd

# 生成containerd的配置文件
mkdir /etc/containerd -p

# 生成配置文件--(墙内环境要一定要改,科学网络不用)
containerd config default > /etc/containerd/config.toml

# 查看puase镜像版本
kubeadm config images list
# 可能要手动指定这个puase镜像

在这里插入图片描述

# 编辑配置文件
vim /etc/containerd/config.toml

# sandbox_image = "k8s.gcr.io/pause:3.9"
# 国内镜像地址为:
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"

安装k8s组件

在所有主机上执行
注意,安装的版本要求和k8s版本一致


添加kubernetes软件源

https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

k8s海外源:

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

k8s国内源:

# 添加k8s--国内源
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
EOF

安装kubeadm和kubectl

1.23是最后一个支持Docker的版本。

# 查看k8s源中支持哪些版本
yum list kubeadm --showduplicates | sort -r
# 安装指定版本
yum install -y kubelet-1.23.0-0  kubeadm-1.23.0-0 kubectl-1.23.0-0 --disableexcludes=kubernetes

# 安装最新版
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

# 设置kubelet自启动
## 由于没有生成配置文件,集群初始化后自动启动
systemctl enable --now kubelet

配置docker的cgroup

https://www.cnblogs.com/chuanzhang053/p/15826837.html

docker默认使用的Cgroup Drivercgroupfs,K8S官方推荐使用systemd来代替cgroupfs
参考 https://v1-22.docs.kubernetes.io/zh/docs/setup/production-environment/container-runtimes/

# 查看docker当前的cgroup Driver
docker info | grep -i "Cgroup Driver"

在这里插入图片描述

mkdir -p /etc/docker
# 配置docker的cgroup Driver为systemd
cat <<EOF | tee /etc/docker/daemon.json
{
    "exec-opts": [
        "native.cgroupdriver=systemd"
    ]
}
EOF

配置kubelet的cgroup和kube_proxy_mode

在所有主机上执行
如果初始化集群出错,删除下方的配置,停止kubelet服务
然后kubeadm reset -f 清除配置,重新初始化

https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/

kubelet --help |grep cgroup-driver 可以查看k8s默认驱动
在这里插入图片描述
在这里插入图片描述

在安装k8s的过程中,kubelet使用的cgroup驱动要和dockercgroup保持一直。

vim /etc/sysconfig/kubelet

# 添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

# 设置kubelet开机自启,集群自动初始化完成自动拉起kubelet服务
systemctl daemon-reload
## 由于没有生成配置文件,集群初始化后自动启动
systemctl restart kubelet

# 在文件 /var/lib/kubelet/config.yaml 中添加设置 cgroupDriver: systemd,否则Kubeadm init将报错

配置kubectl命令行自动补全

所有主机上执行

https://blog.csdn.net/omaidb/article/details/121855263


国内镜像下载集群需要的镜像(非必须执行)

在所有主机上执行

因为要从国外的谷歌服务器上下载镜像,速度非常慢,要么自备科学上网,要么就先用国内源将镜像下载到本地

# 安装k8s集群之前,必须要提前准备好集群需要的镜像
## 查看需要的镜像
kubeadm config images list
kubeadm config images list|cut -d/ -f2

在这里插入图片描述

## 把查询到的最新组件版本信息添加到脚本中
sudo tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.22.4
kube-controller-manager:v1.22.4
kube-scheduler:v1.22.4
kube-proxy:v1.22.4
pause:3.5
etcd:3.5.0-0
coredns:v1.8.4
)

# 循环下载镜像,并重新打标签
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done

# 将coredns重新打标签
docker tag k8s.gcr.io/coredns:v1.8.4 k8s.gcr.io/coredns/coredns:v1.8.4

EOF


# 运行下载镜像的脚本
chmod +x ./images.sh && ./images.sh

# 查看所有镜像是否下载完成
docker images

检查镜像版本

在所有主机上执行
镜像tag不可以是latest,会报错,必须指定版本号

在这里插入图片描述
指定版本号

# 修改镜像标签名
docker tag k8s.gcr.io/coredns:latest k8s.gcr.io/coredns/coredns:v1.8.4

配置cluster-endpoint

所有机器添加master域名映射

# 所有机器添加master域名映射,以下需要修改为自己的ip(一般是master IP)
echo "172.31.0.4  cluster-endpoint" >> /etc/hosts

kuadm创建集群(本地镜像)

在master节点上执行
可以先在本地下载好所需镜像
所有网络范围不能重叠

# Centos8需要安装tc,否则会报没有tc
yum install -y iproute-tc

安装指定k8s版本

https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/

# 安装指定k8s版本---1.23.0是支持docker的版本
kubeadm init \
--kubernetes-version=v1.23.0 \
--control-plane-endpoint=cluster-endpoint \
--service-cidr=10.93.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address={master_ip}

# 不指定k8s版本时会默认安装最新版
# 不指定apiserver-advertise-address默认使用本机的默认ipv4地址(建议指定ip)
## --cri-socket 指定容器运行时环境
kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.93.0.0/12 \
--apiserver-advertise-address=192.168.32.200

创建集群(从国内镜像源拉取镜像)

在master节点上执行

如果没有科学网络,建议从国内镜像源拉取k8s镜像

# 使用国内源拉取镜像
kubeadm init \
--image-repository registry.aliyuncs.com/google_containers \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.93.0.0/12 \
--apiserver-advertise-address=192.168.32.200
## --image-repository 指定镜像仓库地址
## --pod-network-cidr pod网段地址,要与cni插件配置的yml中保持一致
## --service-cidr service的网段地址
## --apiserver-advertise-address 集群通告地址

创建集群报错排错
# 查看集群创建报错日志
journalctl -u kubelet

# coredns的pod一直是Pending状态
## 查看coredns的pod详情
kubectl describe po coredns-6d8c4cb4d-qf2br -n kube-system
## 错误提示是node有污点无法创建pod

# 查看node是否有污点
kubectl describe node node名称|grep -A 10 Taint

# 删除污点
## 允许master节点调度pod;去除污点NoSchedule,最后一个"-"代表删除
kubectl taint nodes k8s-master02 node-role.kubernetes.io/master:NoSchedule-

# 检查node的docker有没有配置systemd

复制k8s授权文件

# 复制k8s授权文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 注意保存加入node到集群的token

将node加入到集群

加入集群的token默认24小时有效
node节点上执行

加入node节点和加入master节点的区别.

# 加入node节点 和 加入maste节点--多了这个参数
--control-plane

在这里插入图片描述


查看k8s默认token和hash
# 在master节点上打印token
# 查看k8s默认token和hash
kubeadm token create --print-join-command

在这里插入图片描述


node加入到集群
# 将node加入到集群
kubeadm join 192.168.32.200:6443 --token j0qa1k.a6kq24f7cjh5qp1t \
        --discovery-token-ca-cert-hash sha256:59c7f63b40b4aa15dc62304babc403d2be66584737094184ab1d018fd541f6a8

在这里插入图片描述


查看node是否加入成功

在master节点上执行

# 查看node是否加入成功
kubectl get nodes

这时候的状态是NotReady,因为没有安装网络插件


安装cni网络插件

https://blog.csdn.net/omaidb/article/details/121283067


查看所有pod是否正常运行

# 查看所有pod的状态
kubectl get pods -A

# 查看异常pod的详细信息
kubectl describe pod coredns-78fcd69978-hdrbd -n kube-system

健康检查scheduler提示ERROR

在这里插入图片描述

# 查看健康检查告警
[root@master ~]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS      MESSAGE                                                                                       ERROR
scheduler            Unhealthy   Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused 

# 查看本地10251端口是否处于监听状态
ss -tunlp|grep 10251

# 解决办法
vim /etc/kubernetes/manifests/kube-scheduler.yaml
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
# 在这两个文件中找到port=0这一行注释掉即可. 保存会立即生效,pod自动重启.

在这里插入图片描述

在这里插入图片描述

# 再次执行健康检查就没有ERROR了
kubectl get cs

修改Services的负载均衡模式为ipvs

在这里插入图片描述
kubeadm方式安装的k8s修改kube-proxy为ipvs

# 修改configmap kube-proxy
kubectl -n kube-system edit cm kube-proxy

搜索mode关键字,参数默认为“ ”
在这里插入图片描述

# 修改为ipvs模式
mode: "ipvs"

kubeadm init超过24小时node加入集群

参考: https://blog.csdn.net/qq_36820037/article/details/108696508
K8S的Token管理:https://kubernetes.io/zh-cn/docs/reference/setup-tools/kubeadm/kubeadm-token/

#!/usr/bin/env bash

# 删除过期的token
kubeadm token list | grep invalid | awk '{print "kubeadm token delete "$1 }' | bash

# 获取masterip
masterip=$(cat /etc/kubernetes/manifests/kube-apiserver.yaml | grep "advertise-address=" | awk -F '=' '{print $2}')

# 创建新的token值--默认有效期24小时
kubeadm token create
# 获取token值
token=$(kubeadm token list | grep forever | head -n 1 | awk '{print $1}')

# 获取证书哈希值
ca_hash=$(openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //')

# 拼接token和哈希
echo "kubeadm join $masterip:6443 --token $token --discovery-token-ca-cert-hash sha256:$ca_hash "

部署Kubernetes Dashboard

https://blog.csdn.net/omaidb/article/details/121746492


重新初始化集群

在所有节点上执行
如果集群出错,可以重新初始化,初始化完成后再次加入node即可

注意: 数据会完全清空,生产环境慎用

https://blog.csdn.net/omaidb/article/details/121784091

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

识途老码

赞赏是第一生产力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值