Centos7安装k8s集群
主机准备
所有的主机最低配置
2*VCPU / 2*MEM
!!!注意
: 主机名不能带有下划线_
,否则K8S会报错.可以带中划线-
参考: https://www.cnblogs.com/xiao987334176/p/11899321.html
主机名 | IP地址 |
---|---|
master | 192.168.32.200 |
node1 | 192.168.32.201 |
node2 | 192.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
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 Driver
为cgroupfs
,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驱动
要和docker
的cgroup
保持一直。
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即可
注意: 数据会完全清空,生产环境慎用