架构:服务器采用Master-nodes(1台)+ Worker-nodes(2台)
版本选择:
centos 7.9
kubelet-1.20.6
kubeadm-1.20.6
kubectl-1.20.6
升级centos7.9版本:
# 更换源
yum install wget -y
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 清理缓存
yum makecache
# 安装内核
wget -O /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum -y install epel-release
# 升级并重启
yum update -y;
reboot;
一,环境准备
所有机器节点,进行初始配置。
1. 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
【备注】:如果开启firewalld防火墙,需要把对应端口放行:
kube-apiserver端口是6443,etcd端口是2379、2380,kube-controller-manager端口是10257, kube-scheduler端口是10259,kubelet端口10250,Kube-proxy:默认使用动态分配的端口(TCP/UDP),通常在 1024 到 65535 之间。calico端口TCP 179,UDP4789,TCP5743,UDP4789,443
# 放开 kube-apiserver 端口 6443
sudo firewall-cmd --zone=public --add-port=6443/tcp --permanent
# 放开 etcd 端口 2379 和 2380
sudo firewall-cmd --zone=public --add-port=2379/tcp --permanent
sudo firewall-cmd --zone=public --add-port=2380/tcp --permanent
# 放开 kube-controller-manager 端口 10257
sudo firewall-cmd --zone=public --add-port=10257/tcp --permanent
# 放开 kube-scheduler 端口 10259
sudo firewall-cmd --zone=public --add-port=10259/tcp --permanent
# 放开 kubelet 端口 10250
sudo firewall-cmd --zone=public --add-port=10250/tcp --permanent
# 放开 Kube-proxy 的动态分配端口范围(TCP)
# 注意:这里假设动态端口范围为 1024 到 65535
sudo firewall-cmd --zone=public --add-port=1024-65535/tcp --permanent
# 放开 Calico 的端口
sudo firewall-cmd --zone=public --add-port=179/tcp --permanent
sudo firewall-cmd --zone=public --add-port=4789/udp --permanent
sudo firewall-cmd --zone=public --add-port=5743/tcp --permanent
sudo firewall-cmd --zone=public --add-port=443/udp --permanent
# 重新加载防火墙规则
sudo firewall-cmd --reload
2. 关闭selinux
# 以root用户编辑SELinux配置文件
sudo vi /etc/selinux/config
将
SELINUX=enforcing
改为
SELINUX=disabled
# 保存并退出编辑器
# 查看关闭状态
getenforce
3. 关闭swap,其影响docker性能,一定重启虚拟机
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
4. 重新设置 每台主机名, 并彼此绑定
# 先设置每台主机的主机名
hostnamectl set-hostname <新主机名>
# 每一台主机名绑定,修改hosts
cat >> /etc/hosts << EOF
192.168.159.135 k8s-master
192.168.159.136 k8s-node01
192.168.159.137 k8s-node02
EOF
或者
vi /etc/hosts
192.168.159.128 k8s-master
192.168.159.129 k8s-node01
192.168.159.130 k8s-node02
注意:主机名 尽量不要用 “_” 或者 “-”
5. 升级每台机器操作系统
重要:
添加/etc/yum.repos.d/CentOS-Base.repo为阿里云镜像源
,后续的步骤安装 都需要用到!
yum update -y
6.修改机器内核参数
# 首先加载相关模块
modprobe br_netfilter
modprobe ip_tables
# 配置文件更改
cat >> /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 查看配置生效
sysctl -p /etc/sysctl.d/k8s.conf
7. 更改安装阿里云的docke源
# step01
yum install -y yum-utils
# step02
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# step03
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# step04 清理缓存
yum makecache fast
8. 安装基础包软件
yum install -y yum-utils device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack ntpdate telnet ipvsadm
9.时间同步
【如果操作系统是centos7系统】:——使用ntpdate
# 安装时间工具
yum install ntpdate -y
# 时间同步(或者使用:ntpdate time.windows.com 方式)
ntpdate cn.pool.ntp.org
# 定时检查同步时间
crontab -e
* */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org
#重启crond服务
service crond restart
【如果操作系统是rockylinux8.9系统】:—— 使用chrony
# 如果没有该服务安装一下
yum -y install chrony
# 设置chronyd开机启动并立即启动chronyd服务同步网络时间
systemctl enable chronyd --now
# 编辑 chronyd 配置文件,使用中国的时间服务器同步时间,速度更快
vim /etc/chrony.conf
#文件最后增加如下内容
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp1.tencent.com iburst
server ntp2.tencent.com iburst
# 写个计划任务,定时同步时间:
crontab -e
* * * * * /usr/bin/systemctl restart chronyd
# 重启
systemctl restart chronyd
#查看当前时间
date
10. 免密登录(可选)
为了每台机器可以更快互传资料,在每一台机器上,设置免密登录,可选做。
# 生成公钥私钥,一直回车即可
ssh-keygen -t rsa
在每一台机器上分别执行相同命令:
# 执行过程中,输入对应机器的登录密码即可
ssh-copy-id k8s-master
ssh-copy-id k8s-node01
ssh-copy-id k8s-node02
二,安装软件
在所有机器节点,安装基础软件
1,安装docker(CentOS 7上安装)
卸载旧版本的Docker(如果有):
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安装Docker Engine:
# 查看docker版本
yum search docker-ce --showduplicates
# 开始安装
yum install docker-ce-20.10.6 -y
# 启动Docker,并且设置开机自启
systemctl start docker && systemctl enable docker
# 或者
systemctl enable docker --now
配置docker镜像加速器和驱动
vi /etc/docker/daemon.json
{
"registry-mirrors":["https://rsbud4vc.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com","http://qtid6917.mirror.aliyuncs.com", "https://rncxm540.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
重新加载:
# 重新加载,开启
systemctl daemon-reload && systemctl restart docker
# 查看docker状态
systemctl status docker
2,安装K8S
k8s安装所需组件kubeadm、kubelet、kubectl,所有节点都安装
添加K8S的阿里云yum源
# 创建kubernetes的yum仓库文件
vi /etc/yum.repos.d/kubernetes.repo
- 添加如下内容:
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
- 清除yum缓存并生成新的仓库缓存
sudo yum clean all
sudo yum makecache
安装kubeadm、kubelet、kubectl
yum search kubectl --showduplicates
# 安装如下插件
yum install -y kubelet-1.20.6 kubeadm-1.20.6 kubectl-1.20.6
# 开机启动
systemctl enable kubelet
【注意】因为k8s未初始化,所以此时查看kubelet 状态(下图),属于正常状态
部署kubernetes
仅仅在Master节点初始化,安装如下命令
# 初始化命令
kubeadm init \
--apiserver-advertise-address=192.168.159.138 \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version v1.20.6 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
显示如下:
接下来根据提示,执行给出的三条命令(见上图):
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 验证并查看集群相关信息
kubectl cluster-info
# 显示如下
kubectl cluster-info
Kubernetes control plane is running at https://192.168.159.138:6443
CoreDNS is running at https://192.168.159.138:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
至此,kubectl 安装成功!!
3,部署kubernetes (node节点)
- 执行如下命令,提取加入集群命令:
kubeadm token create --print-join-command
- 加入节点Node最总执行命令:
kubeadm join 192.168.159.138:6443 --token 5zmmow.dfez67syqzxjhsie --discovery-token-ca-cert-hash sha256:74d6a0079df24966e0e3c4adc678535167f853ed09af2d15f7732c8ce9c2bb7a --ignore-preflight-errors=SystemVerification
注意:最后需要拼接参数--ignore-preflight-errors=SystemVerification
4,部署CNI网络插件 (calico)
问题:节点加入后,节点状态处于NotReady
未准备好的状态,所以排查?
第1步,查看组件状态
kubectl get componentstatus
kubectl get cs # 缩写
第2步:因为目前没有创建pod。所以查看pod时,查看其他命名空间里(kube-system)的状态:
kubectl get pods -n kube-system
第3步,分析出主要原因是因为网络造成。所以需要部署CNI网络插件 calico
。
【解决安装】
下载calico.yaml配置文件
# 新建/进入新目录下载
cd /opt/k8s/
# 下载文件(下载不下的话,可用我上传的文件)
wget --no-check-certificate https://projectcalico.docs.tigera.io/archive/v3.25/manifests/calico.yaml
# calico v3.20版本
https://docs.projectcalico.org/v3.25/manifests/calico.yaml
kubelet为1.23.6 那么calico版本必须再3.23+或更高
再次,更改此文件中的下载镜像地址:
# 查看哪些镜像需要更改。
grep image calico.yaml
# 将地址更改未阿里云镜像地址。
sed -i 's#docker.io/##g' calico.yaml
最后执行命令:
kubectl apply -f calico.yaml
如果执行失败,怎么办???
修改 calico.yaml 文件
第一处:文件中的 CALICO_IPV4POOL_CIDR
配置
与上面初始化的--pod-network-cidr=10.244.0.0/16
的IP一致。
第二处:文件中name:CLUSTER_TYPE
,下方加入
网卡名称通过ifconfig
查看 ,本例为ens33
- name: IP_AUTODETECTION_METHOD
value: "interface=网卡名称"
还是不成功,那么升高/降低calico插件版本!!!
kubectl apply -f calico.yaml
执行成功,显示如下:
[root@Main k8s]# kubectl apply -f calico.yaml
poddisruptionbudget.policy/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
serviceaccount/calico-node created
configmap/calico-config created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
daemonset.apps/calico-node created
deployment.apps/calico-kube-controllers created
[root@Main k8s]#