主要内容:主要参考了网上的两个博客,添加了安装过过程中遇到的问题,服务器,我是先安装了docker,后安装k8s
准备工作:
第一步、 三台centos7服务器(一主二从),我的机器是centos7.9,并且设置IP组成局域网,服务器之间设置SSH免密码远程登录。
安装 k8s 的节点必须是大于 1 核心的 CPU 安装节点的网络信息 master BOOTPROTO=static IPADDR=10.173.1.89 NETMASK=255.255.255.0 GATEWAY=10.173.1.254
node1 BOOTPROTO=static IPADDR=10.173.1.88 NETMASK=255.255.255.0 GATEWAY=10.173.1.254
node2 BOOTPROTO=static IPADDR=10.173.1.90 NETMASK=255.255.255.0 GATEWAY=10.173.1.254
集群安装
(以下操作三台机器都要执行)
系统初始化
设置系统主机名以及Host文件
hostnamectl set-hostname k8s-master01(10.0.100.10)
hostnamectl set-hostname k8s-node01(10.0.100.11)
hostnamectl set-hostname k8s-node02(10.0.100.12)
安装依赖包
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
设置防火墙为Iptables并设置空规则
systemctl stop firewalld && systemctl disable firewalld
yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
关闭SELINUX
因为K8s安装的时候会去检测swap分区有无关闭,如果开启了话可能会把pod放在虚拟内存运行,大大降低工作效率。(也可以通过–ingress排除)
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
调整内核参数,对于K8s
必备三调参数:开启bridge网桥模式,关闭ipv6协议
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
cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
sysctl -p /etc/sysctl.d/kubernetes.conf
调整系统时区
# 设置系统时区为 中国/上海
timedatectl set-timezone Asia/Shanghai
# 将当前的UTC时间写入硬件时钟
timedatectl set-local-rtc 0
# 重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond
关闭系统不需要的服务
systemctl stop postfix && systemctl disable postfix
设置rsyslogd和systemd journald
让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
# 最大占用空间 10G
SystemMaxUse=10G
# 单日志文件最大 200M
SystemMaxFileSize=200M
# 日志保存时间2周
MaxRetentionSec=2week
# 不将日志转发到 syslog
ForwardToSyslog=no
EOF
systemctl restart systemd-journald
修改系统内核为4.44(实际调整成了5.4.197) CentOS 7.x系统自带的3.10x内核存在一些Bugs,导致运行的Docker、Kubernetes不稳定。
rpm -Uvh http://mirror.ventraip.net.au/elrepo/elrepo/el7/x86_64/RPMS/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
# 安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含 initrd16 配置,如果没有,再安装一次
yum --enablerepo=elrepo-kernel install -y kernel-lt
# 设置开机从新内核启动
grub2-set-default "CentOS Linux (4.4.182-1.el7.elrepo.x86_64) 7 (Core)"
[root@k8s-master01 ~]# uname -r
检测:
修改DNS
vim /etc/hosts
10.0.100.10 k8s-master01
10.0.100.11 k8s-node01
10.0.100.12 k8s-node02
(没有修改端口的就无需加-P )
scp -P 3388 /etc/hosts root@k8s-node01:/etc/hosts
scp -P 3388 /etc/hosts root@k8s-node02:/etc/hosts
kube-proxy开启ipvs的前置条件
kube-proxy主要解决 pod的调度方式,开启这个条件可以增加访问效率
modprobe br_netfilter
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(内核4.4)
#modprobe -- nf_conntrack(内核5.4 填这个,否则提示modprobe: FATAL: Module nf_conntrack_ipv4 not found)
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash
/etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack
安装Docker软件 (我安装的版本是20.10.16)
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum update -y && yum install -y docker-ce
创建/etc/docker目录
mkdir /etc/docker
配置daemon
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors":["http://hubmirror.c.163.com","https://docker.mirrors.ustc.edu.cn"],
"data-root":"/home/devmind/data/docker",
"exec-opts":["native.cgroupdriver=systemd"],
"log-driver":"json-file",
"log-opts":{
"max-size":"100m"
}
}
EOF
创建存放docker的配置文件
mkdir -p /etc/systemd/system/docker.service.d
重启docker服务
systemctl daemon-reload && systemctl restart docker && systemctl enable docker
安装Kubeadm(主从配置)
让kubeadm去引导成为k8s
备注:三台机器都要执行
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
yum install -y kubectl-1.22.2 kubelet-1.22.2 kubeadm-1.22.2
kubelet是与容器接口进行交互,而k8s通过kubeadm安装以后都是以Pod方式存在,底层是以容器的方式运行。所以一定要开机自启,不然的话启动不了k8s集群
systemctl enable kubelet.service
初始化主节点 (在master机器上面操作) 方式一:使用kubeadm init命令初始化 备注:(如果先安装了docker,后安装K8S,/etc/docker/daemon.json文件的,内容调整成:"exec-opts":["native.cgroupdriver=systemd"],需要执行systemctl restart docker 重启docker,并且执行kubeadm reset后,重新初始化)
正常执行命令:
kubeadm init --apiserver-advertise-address=10.173.1.89 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.22.2 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=all
效果如下:
配置环境变量 (master节点)
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
复制docker配置文件到node1和node2
scp -P 3388 /etc/docker/daemon.json root@root@k8s-node01:/etc/docker/
scp -P 3388 /etc/docker/daemon.json root@root@k8s-node02:/etc/docker/
重启node1和node2的docker
service docker restart
node1和node2加入集群
node1和node2集群执行命令:
kubeadm join 10.173.1.89:6443 --token 8hhfos.pxp8xyqaccotmvjh --discovery-token-ca-cert-hash sha256:c4e0509472a75522b86f4bce8b2ebe82eafb73f553aa753fa25ad95506bef003
master节点报错
Get "https://127.0.0.1:10257/healthz": dial tcp 127.0.0.1:10257: connect: connection refused
编辑文件
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
vim /etc/kubernetes/manifests/kube-scheduler.yaml
执行 kubectl get cs命令后,显示正常(若不正确,执行systemctl daemon-reload && systemctl restart kubelet再查看状态)
node节点加入失败错误信息 备注:可先解决master节点错误,再来解决node节点错误。
Unable to update cni config" err="no networks found in /etc/cni/net.d
Jun 08 00:17:43 k8s-master01 kubelet[10321]: E0608 00:17:43.739129 10321 kubelet.go:2332] "Container runtime network not ready" networkReady="NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized"
处理方案: 复制master机器的配置文件到node1和node2
scp -r -P 3388 /etc/cni root@k8s-node01:/etc/
scp -r -P 3388 /etc/cni root@k8s-node02:/etc/
master节点和node节点错误
解决方法:分别执行以下命令
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
systemctl daemon-reload && systemctl restart kubelet
安装容器网络
网络组件有很多种,只需要部署其中一个即可,推荐Calico。
Calico是一个纯三层的数据中心网络方案,Calico支持广泛的平台,包括Kubernetes、OpenStack等。
Calico 在每一个计算节点利用 Linux Kernel 实现了一个高效的虚拟路由器( vRouter) 来负责数据转发,而每个 vRouter 通过 BGP 协议负责把自己上运行的 workload 的路由信息向整个 Calico 网络内传播。
此外,Calico 项目还实现了 Kubernetes 网络策略,提供ACL功能。
去github上面下载最新版本,上传到master服务器,打开CALICO_IPV4POOL_CIDR节点,(建议先再本地修改完成后,校验格式无误再上传)
执行下面命令进行安装
kubectl apply -f calico.yaml
安装成功后,如下图所示
node节点: 加入集群 cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
部署dashboard
下载yaml文件,去github下载2.6版本 修改recommended.yaml文件,需要在下图位置添加NodePort,否则会报错
kubernetes-dashboard" is invalid: spec.ports[0].nodePort: Forbidden: may not be used when `type` is
kubectl apply -f recommended.yaml
kubectl get pods -n kubernetes-dashboard
kubectl get pods,svc -n kubernetes-dashboard
创建用户
kubectl create serviceaccount dashboard-admin -n kube-system
用户授权
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
获取用户Token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
复制token值,登录的时候需要用到
新增机器加入到机器
提示错误:could not find a JWS signature in the cluster-info ConfigMap for token ID "ied8i9"
原因:令牌过期
解决方法:
master节点:执行
kubeadm token create --print-join-command
kubeadm join 10.173.1.89:6443 --token lwnw6x.wnwia13rtmlc86op --discovery-token-ca-cert-hash sha256:be5dd9fa0bf828a62e5ef7633b9c1f3de282cfcd13aa035b3965d53de2ff9706
转载博客 前半部分参考
(40条消息) Kubernetes(K8S)集群部署搭建图文教程(最全)_果子哥丶的博客-CSDN博客_k8s部署
后半部分参考