一,K8S架构:
主节点(1台 master)+ 工作节点 (2台 node01和node02)
podSubnet(pod网段) 10.244.0.0/16
serviceSubnet(service网段): 10.96.0.0/12
实验环境规划:
配置: 4Gib内存 / 4vCPU / 60G硬盘
网络:NAT模式
二,最佳稳定组合:
centos | containerd | kubelet | kubeadm | kubectl | kubernetes | calico | dockers |
---|---|---|---|---|---|---|---|
7.9 | 1.6.22 | 1.25.0 | 1.25.0 | 1.25.0 | 1.25.0 | v3.26.1 | 24.0.6 |
先安装containerd ,然后在安装 docker(主要用于创建dockerfile镜像)
三,准备
(一)基础环境
1,机器设置静态ip
# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.40.180
NETMASK=255.255.255.0
GATEWAY=192.168.40.2
DNS1=192.168.40.2
设置完毕后,重启:
service network restart
2,升级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;
3,关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
#如果显示Disabled说明selinux已经关闭
getenforce
4,配置/ 互相绑定主机名
设置主机名,并刷新:
hostnamectl set-hostname master && bash
绑定主机名:
# /etc/hosts
192.168.40.180 master
192.168.40.181 node1
192.168.40.182 node2
5,主机之间免密登录
每台机器同样操作
# 一直回车,不输入密码
ssh-keygen
ssh-copy-id master
# 测试登录
ssh master
6,关闭交换分区swap
# 临时关闭
swapoff -a
# 永久关闭
vi /etc/fstab
#/dev/mapper/centos-swap swap swap defaults 0 0
如果是克隆的虚拟机,需要同时删除UUID
7,修改机器内核参数
每台机器执行同样操作
# 加载内核
modprobe br_netfilter
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
# 查看加载
sysctl -p /etc/sysctl.d/k8s.conf
sysctl:在运行时配置内核参数工具
-p :从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载
8,关闭firewalld防火墙
systemctl stop firewalld && systemctl disable firewalld
9,配置安装阿里云的repo源
安装docker和containerd,都需要配置安装阿里云的repo源。
# 安装工具
yum install yum-utils -y
# 安装阿里源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 配置国内阿里云docker的repo源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
10,安装k8s组件需要的阿里云的repo源
安装k8s组件需要的阿里云的repo源
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF
11,时间同步
每台机器,都做相同操作
# 安装ntpdate命令
yum install ntpdate -y
# 跟网络时间做同步
ntpdate cn.pool.ntp.org
# 把时间同步做成计划任务
crontab -e
* */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org
# 重启crond服务
service crond restart
12,安装基础软件包
yum install -y 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 telnet ipvsadm
(二)安装所需软件
13,安装containerd
# 下载安装
yum install containerd.io-1.6.22* -y
# 添加配置
cd /etc/containerd
rm -rf *
下载配置文件:config.toml
创建修改config.toml
配置文件里的harbor
的ip地址,变成真实环境的harbor的ip
重启,并设置开机启动
systemctl start containerd && systemctl enable containerd
或者
systemctl enable containerd --now
14,安装初始化k8s需要的软件包
# 安装
yum install -y kubelet-1.25.0 kubeadm-1.25.0 kubectl-1.25.0
# 开机启动
systemctl enable kubelet
- Kubeadm: 用来初始化k8s集群的一个工具
- Kubelet: 安装在集群所有节点上,用于启动Pod的,kubeadm安装k8s,k8s控制节点和工>作节点的组件,都是基于pod运行的,只要pod启动,就需要kubelet
- Kubectl: 通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
15,kubeadm初始化k8s集群
# 每台机器设置容器运行时
crictl config runtime-endpoint /run/containerd/containerd.sock
# 仅仅在master机器上 生成文件
kubeadm config print init-defaults > kubeadm.yaml
一定要自己通过kubeadm config print init-defaults命令生成!
修改生成的配置文件(总共6处):
# 1处:改为master控制节点的ip
advertiseAddress: 192.168.40.180
# 2处:指定containerd容器运行时
criSocket: unix:///run/containerd/containerd.sock
# 3处:改为控制节点主机名
name: master
# 4处:指定阿里云镜像仓库地址
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
# 5处:指定pod网段, 在serviceSubnet: 10.96.0.0/12下方,新增加这个
podSubnet: 10.244.0.0/16
# 6处:在文件最后,插入以下内容,(复制时,要带着---):
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
K8S初始化镜像包:k8s_1.25.0.tar.gz
# 导入所需要的镜像包
ctr -n=k8s.io images import k8s_1.25.0.tar.gz
# 开始安装
kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification
安装成功!按提示执行栅条命令:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
测试:
kubectl get nodes
kubectl get pods -n kube-system -owide
16,添加工作节点node01
# 在master机器执行,查看加入节点的命令:
kubeadm token create --print-join-command
# 在node1机器执行,把node1加入k8s集群:
kubeadm join 192.168.40.180:6443 --token vulvta.9ns7da3saibv4pg1 --discovery-token-ca-cert-hash sha256:72a0896e27521244850b8f1c3b600087292c2d10f2565adb56381f1f4ba7057a --ignore-preflight-errors=SystemVerification
忽略无效检查:--ignore-preflight-errors=SystemVerification
【注意】:该命令如果重复执行 或者添加失败时,可以执行以下命令:
kubeadm reset
添加查看标签:
kubectl label nodes node1 node-role.kubernetes.io/work=work
17,安装网络组件-Calico
把安装calico需要的镜像calico.tar.gz传到master和node1、node2节点,手动解压:
ctr -n=k8s.io images import calico.tar.gz
calico.yaml到master上,修改1处:
# calico.yaml文件需要做如下修改:
- name: IP_AUTODETECTION_METHOD
value: "interface=ens33"
使用yaml文件安装calico 网络插件:
kubectl apply -f calico.yaml
18,延长k8s证书有效期
# 查看证书有效时间:
openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -text |grep Not
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep Not
# 延长证书过期时间
# 1.把update-kubeadm-cert.sh文件上传到master节点
# 2.在master上执行如下:
chmod +x update-kubeadm-cert.sh
./update-kubeadm-cert.sh all
19,安装docker做镜像
yum install docker-ce-24.0.6 -y
systemctl start docker
systemctl enable docker
配置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"]
}
# 重启docker生效
systemctl restart docker
四,测试
1、测试在k8s创建pod是否可以正常访问网络
把busybox-1-28.tar.gz上传到node01、node02节点,手动解压。
docker load -i busybox-1-28.tar.gz
运行pod,测试ping命令:
kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- sh
/ # ping www.baidu.com
PING www.baidu.com (39.156.66.18): 56 data bytes
64 bytes from 39.156.66.18: seq=0 ttl=127 time=39.3 ms
如果可以ping通网络,说明calico网络插件安装正常!
2,测试coredns是否正常
kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- sh
/ # nslookup kubernetes.default.svc.cluster.local
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: kubernetes.default.svc.cluster.local
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
10.96.0.10 是coreDNS的clusterIP,说明coreDNS配置好了。
解析内部Service的名称,是通过coreDNS去解析的。
【注意】
busybox要用指定的1.28版本,因为最新版本的nslookup
会解析不到dns
和ip