1.kubeadm搭建生产环境的单master节点的k8s集群
1.1 初始化集群环境
虚拟机基于Rocky Linux
准备三台linux机器,每台机器配置:4VCPU/4G内存/60G硬盘
环境说明:
IP 主机名 角色 内存 cpu
192.168.126.63 xuegod63 master 4G 4VCPU
192.168.126.64 xuegod64 worker 4G 4VCPU
192.168.126.62 xuegod62 worker 4G 4VCPU
1.配置静态ip 每台机器网络模式保持一直,能互相通信,机器网卡名字统一
目录:vim /etc/NetworkManager/system-connections/ens33.nmconnection
2.永久关闭selinux
cd /etc/selinux/config
sed -i 's/SELINUX-enforcing/SELINUX-disanled/g' /etc/selinux/config
#注意:修改selinux配置文件后,重启机器,selinux才能生效
查看是否成功: getenforce
在安装k8s时,关闭SELinux是因为默认情况下,SELinux会阻止Kubernetes一些操作,如kubelet对容器文件的访问等。为了避免由于SELinux导致Kubernetes 运行不正常,建议在安装Kubernetes之前关闭:SELinux。
如果启用了·SELinux,需要针对·Kubernetes·进行特定的·SELinux·配置,以确保·Kubernetes正常工作。具体的操作如下:
安装policycoreutils-python·工具: yum install -y policycoreutils-python
为·kubelet、kube-proxy·和· container·runtime·的进程添加· SELinux·策略。例如,为kubelet·添加策略的命令为:
semanage fcontext -a -t container_runtime_exec_t /usr/local/bin/kubelet
重载SELinux策略:
restorecon -R /usr/local/bin/kubelet
3.配置主机名
在3台主机上分别配置对应的主机名称:
hostnamectl set-hostname xuegod63 && bash
hostnamectl set-hostname xuegod64 && bash
hostnamectl set-hostname xuegod62 && bash
4.配置Hosts文件
修改每台机器的/etc/hosts文件:为了让3台机器互相通信
192.168.126.63 xuegod63
192.168.126.64 xuegod64
192.168.126.62 xuegod62
5.安装基本的软件包(3台)
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 libaio-devel vim ncurses-devel autoconf automake zlib-devel epel-release openssh-server socat conntrack telnet ipvsadm
6.配置主机之间无密码登录
配置xuegod63到其它机器免密登录
ssh-keygen #一路回车,不输入密码
把本地的ssh公钥文件安装到远程主机对应的账户
ssh-copy-id xuegod63
ssh-copy-id xuegod64
ssh-copy-id xuegod62
7.关闭防火墙
systemctl stop firewalld; systemctl disable firewalld
[root@xuegod62~]#systemctl stop firewalld; systemctl disable firewalld
如果生产机器,防火墙开启,不能关,也可以,但是要放行一些端口:
6443:Kubernetes·APl Server
2379、2380:etcd服务
10250、10255:kubelet服务
10257:kube-controller-manager 服务
10259:kube-scheduler服务
30000-32767:在物理机映射的NodePort 端口
179、473、4789、9099:Calico服务端口
如何在防火墙规则里放行端口:
firewall-cmd --zone=public --add-port=6443/tcp --permanent
#–zone 指定了防火墙规则所属的区域,–add-port 指定了要开放的端口号和协议,–permanent·表示在重启后也会保留这个规则。“
8.关闭交换分区 swap
安装k8s 会检查交换分区,如果存在会报错,可以设置跳过检查交换分区 官方建议关掉 影响性能
swapoff -a
永久关闭 注释swap挂载
vim /etc/fstab #给swap这行开头加一下注释
交换分区(Swap)是为了在内存不足时,把部分内存的数据交换到硬盘上,以释放内存空间的一种机制。这样,即使物理内存不足,也可以保证系统运行的稳定性和正常性。在安装 Kubernetes 时,需要禁用交换分区。这是因为Kubernetes 在运行时需要使用大量的内存和 CPU资源,如果系统开始使用交换分区,会导致性能下降,严重影响Kubernetes的正常运行。因此,为了保证Kubernetes 的性能和稳定性,建议在安装Kubernetes 时禁用交换分区
9.修改内核参数
modprobe br_netfilter
modprobe是一个Linux命令,它用于动态加载内核模块到linux内核中。br_netfilter是linux内核模块之一,它提供了桥接网络设备和Netfilter之间的接口。Netfilter是Linux内核中的一个框架,它可以在数据包中通过网络协议栈时进行修改或过滤。
在kubernetes中,br_netfilter模块用于实现kubernetes集群中的网络功能。通过加载br_netfilter模块,我们可以确保在kubernetes集群中使用的iptables规则正确应用。
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
10、配置安装 docker 和 containerd 的需要的阿里云 yum 源
[root@xuegod63 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@xuegod64 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@xuegod62 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
11.配置安装k8s命令行工具需要的阿里云yum源
[root@xuegod63 ~] 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
然后在执行下面命令,使用在线Yum源安装kubeadm和kubelet
将xuegod63上kubernetes的yum源复制给xuegod64,xuegod62
[root@xuegod63 ~] scp /etc/yum.repos.d/kubernetes.repo xuegod64:/etc/yum.repos.d/
[root@xuegod63 ~] scp /etc/yum.repos.d/kubernetes.repo xuegod62:/etc/yum.repos.d/
12.配置时间同步
基于chrony配置服务器时间跟网络时间同步
以前使用ntpdate来同步系统时间,但是它是立即同步,在生产环境下,系统时间大范围的跳动,是非常严重的事件。
chrony 是网络时间协议(NTP)的另一种实现,与网络时间协议后台程序(ntpd)不同,它可以更快地且更准确地同步系统时钟。“
两个主要程序:chronyd和chronyc
chronyd:后台运行的守护进程,用于调整内核中运行的系统时钟和时钟服务器同步。它确定计算机增减时间的比率,并对此进行补偿
chronyc:命令行用户工具,用于监控性能并进行多样化的配置。它在chronyd 实例控制的计算机上工作
服务unit 文件:·/usr/lib/systemd/system/chronyd.service
监听端口:·323/udp,123/udp
配置文件:/etc/chrony.conf
ntpdate 和 chrony是服务器时间同步的主要工具,两者的主要区别就是:
1、执行 ntpdate 后,时间是立即修整,中间会出现时间断档;“
2、而执行 chrony 后,时间也会修正,但是是缓慢将时间追回,并不会断档。
生效:
systemctl restart chronyd
写个计划任务:
crontab -e
* * * * /usr/bin/systemctl restart chronyd
systemctl restart crond
在Kubernetes集群中,各个组件之间的通信和协调都需要依赖时间的同步,如果集群中各节点时间不一致,可能会导致各种奇怪的问题,例如节点之间无法进行正确的TLS握手等。因此,建议在安装Kubernetes集群之前,将集群中各个节点的时间同步到相同的时间源,保持时间的一致性。
13.安装containerd 1.24废弃docker(3台都装)
在Kubernetes集群中,containerd是容器运行时,它的主要作用是负责管理节点上的容器,实现容器的创建、销毁、运行、暂停、恢复等操作。而Pod是Kubernetes中最基本的调度单元,一个Pod包含一个或多个紧密关联的容器,在Kubernetes集群中,当一个Pod被调度到一个节点上时Kubernetes就会基于containerd在pod里运行容器。
在xuegod63 上安装 containerd
[root@xuegod63~]# yum install containerd.io-1.6.22 --allowerasing -y
Containerd 版本要按照我这个版本,其他版本有问题。
生成containerd的配置文件:
[root@xuegod63~]# mkdir -p /etc/containerd
[root@xuegod63~] containerd config default > /etc/containerd/config.toml
[root@xuegod63~]# cd /etc/containerd/
修改配置文件:
阿里云镜像
sandbox_image = "registry.k8s.io/pause:3.8"
改为
sandbox_image = "registry.aliyuncs.com/k8sxio/pause:3.8" (registry.aliyuncs.com/google_containers/pause:3.7)
SystemdCgroup = false
修改为
SystemdCgroup = true
配置镜像加速 上下级配置,缩进两个空格
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://bqr1dr1n.mirror.aliyuncs.com"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
endpoint = ["https://registry.aliyuncs.com/k8sxio"]
启动 containerd、并设置开启自启动
[root@xuegod63.~]# systemctl enable containerd --now
查看启动情况:
systemctl status containerd
**配置harbor:**
[plugins."io.containerd.grpc.vl.cri".registry.configs][plugins."io.containerd.grpc.vl.cri".registry.configs."192.168.40.62".tls]
[plugins."io.containerd.grpc.vl.cri".registry.configs."192.168.126.62".tls]
insecure_skip_verify = true
[plugins."io.containerd.grpc.vl.cri".registry.configs."192.168.126.62".auth]
username = "admin"
password = "Harbor12345"
14.安装docker-ce(3台都装)
15.安装初始化k8s需要的组件
[root@xuegod63~]# yum install -y kubelet-1.26.0 kubeadm-1.26.0 kubectl-1.26.0
[root@xuegod63~]#systemctl enable kubelet
[root@xuegod64~]# yum install -y kubelet-1.26.0 kubeadm-1.26.0 kubectl-1.26.0
[root@xuegod64~]#systemctl enable kubelet
[root@xuegod62~]# yum install -y kubelet-1.26.0 kubeadm-1.26.0 kubectl-1.26.0
[root@xuegod62~]#systemctl enable kubelet
查看版本:
yum install kubelet-1.26*
注:每个软件包的作用
kubelet: kubelet是Kubernetes 集群中的一个核心组件,是每个节点上的代理服务,负责与主控制节点通信,管理节点上的 Pod 和容器。
kubelet 的主要职责包括:
监控 pod 的状态并按需启动或停止容器、检查容器是否正常运行、与主控制节点通信,将节点状态和 Pod 状态上报给主控制节点、通过各种插件(如 volume 插件)与其他组件协同工作、管理容器的生命周期,包括启动、停止、重启等、拉取镜像
kubeadm:用于初始化 k8s 集群的命令行工具
kubectl:·用于和集群通信的命令行,通过 kubectl 可以部署和管理应用,查看各种资源,创建.删除和更新各种组件
安装k8s几种方式:
1.kubeadm
2.二进制
都是官网提供的方式,也是生产环境用的
还可以借助第三方平台:rancher,kubesphere 安装k8s (不太稳定)
1.2 初始化集群
备注: 安装k8s,物理机网段,pod网段,service网段不能冲突
使用kubeadm初始化k8s集群 配置文件
[root@xuegod63~]#kubeadm config print init-defaults > kubeadm.yaml
需要修改kubeadm.yaml文件:
查看containerd.sock的路径:
find / -name "containerd.sock"
镜像地址修改:
特别提醒:
1、nodeRegistration:criSocket: unix:///var/run/containerd/containerd.sock
nodeRegistration 是在Kubernetes集群中注册节点的一种方式。在这个配置中,crisocket 表示与此节点相关的容器运行时的地址,此处指的是使用Containerd作为容器运行时。
2、–image-repository·registry.cn-hangzhou.aliyuncs.com/google_containers 表示从阿里云镜像仓库的的名为"google_containers"的命名空间中拉取容器镜像,因为kubeadm 安装 k8s,控制节点的组件基于 pod 运行,所以需要镜像,默认的镜像仓库国内无法访问,所以需要指定阿里云镜像仓库,也可以把安装k8s1.26 需要的镜像用 ctr -n=k8s.io images import 解压,这样就可以直接在本地找镜像了。
3、podsubnet: 10.244.0.0/12 #指定 pod 网段
serviceSubnet: 10.96.0.0/12 #指定Service 网段
在k8s 集群中,pod网段,service网络,物理机网段不能冲突。
4、mode: ipvs 表示kube-proxy 代理模式是ipvs,如果不指定ipvs,会默认使用iptables,但是iptables 效率低,所以我们生产环境建议开启pvs,阿里云托管的K8s,也提供ipvs 模式
kubeadm安装k8s时,控制节点和工作节点的组件都是基于pod运行的
控制节点组件:apiserver,scheduler,controller-manager,etcd,容器,kubelet,kube-proxy,calico(网络组件)
工作节点: calico,容器运行时,kube-proxy,coredns,kubelet
**基于kubeadm.yaml文件初始化k8s **
[root@xuegod63~]#ctr -n=k8s.io images import k8s_1.26.0.tar.gz
[root@xuegod64~]#ctr -n=k8s.io images import k8s_1.26.0.tar.gz
[root@xuegod62~]#ctr -n=k8s.io images import k8s_1.26.0.tar.gz
备注:
1.k8s_1.26.0.tar.gz是什么?
k8s_1.26.0.tar.gz 是基于 ctr -n=k8s.io images export <安装 k8s 组件需要的 k8s 镜像>
k8s_1.26.0.tar.gz生成的,这个压缩包里面包含的镜像只适合安装k8s1.26 这个版本,如何安装其他版本,第一次安装不需要 ctr -n=k8s.io images import k8s_1.26.0.tar.gz解压镜像,执行kubeadm init 会自动把安装 k8s 组件需要的镜像拉下来,然后可以基于 ctr n=k8s.io images import 命令把这个版本镜像打包,下次再安装此版本,就可以基于ctr -n=k8s.io images import 解压了。
2.ctr·解压镜像为何加-n=k8s.io?
n=k8s.io 参数指定将镜像导入到k8s.io命名空间下,这通常是一个虚构的命名空间,用于导入Kubernetes官方发布的容器镜像。只要放到这个名称空间的镜像,才会被k8s·pod 找到。
[root@xuegod63 ~]#kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification
可能遇到的报错信息:
在/usr/lib/systemd/system/kubelet.service文件中加上报错的信息
重载下配置:
systemctl daemon-reload
已经装过一次了,kubeadm reset
删除下
有可能还是不行,systemd驱动不用升级:
systemctl daemon-reexec
安装完成后,如图所示:
粘贴图中的mkdir -p 这3段后就可以使用kubectl get nodes命令了。
1.3 实战-工作节点加入k8s集群
把xuegod64,62作为工作节点加入到k8s集群中
在xuegod63上查看加入节点的命令:
[root@xuegod63 ~]#kubeadm token create --print-join-command
kubeadm join 192.168.1.63:6443 --token s6f1ab.g6s71a2gn4d9pg5v \ --discovery-token-ca-cert-hash sha256:30092f3fd915c48b67695b8242a6196aebdde3a21c3bc521a8936bd628e30b0f
把 xuegod64 加入k8s 集群:
[root@xuegod64~]#kubeadm join 192.168.126.63:6443 --token s6f1ab.g6s71a2gn4d9pg5v \
--discovery-token-ca-cert-hash sha256:30092f3fd915c4866769568242a6196aebdde3a21c3bc521a8936bd628e30b0f --ignore-preflight-errors=SystemVerification
[root@xuegod63 ~]#kubectl get nodes
查看kubelet日志:
journalctl -xeu kubelet
1.4 安装kubernetes 网络组件-Calico
Calico·是一个开源的-Kubernetes 网络插件。
Calico·的设计理念是基于 Linux 系统网络的,使用标准的 Linux·路由和·iptables 规则,以实现高性能的网络互联和安全隔离。它支持·Pv4 和·IPv6 双栈网络,并且可以轻松地与现有的数据中心网络集成,提供了丰富的网络策略功能,可以通过简单的标签选择器来定义容器间的网络隔离和通信规则。
Calico·的架构采用了一种分布式的方式,其中每个节点都运行一个·Calico·的网络代理组件,称为Felix,Felix·负责监听·Kubernetes·APl·Server,获取节点和网络信息,并在本地维护一个路由表和iptables规则集,用于控制容器的网络访问。当容器发生变化时,Felix·会自动更新路由表和·iptables规则,确保网络互联和隔离的正确性。
Calico·还支持·BGP.协议,可以将·Kubernetes·集群扩展到跨数据中心和云提供商的多个节点上,从而实现灵活、可扩展的容器网络解决方案。
[root@xuegod63 ~]#ctr -n=k8s.io images import calico.tar.gz
[root@xuegod64 ~]#ctr -n=k8s.io images import calico.tar.gz
[root@xuegod62 ~]#ctr -n=k8s.io images import calico.tar.gz
上传 calico.yaml到xuegod63 中,使用yamL 文件安装 calico 网络插件。
备注:
修改 calico.yaml 文件:
如果机器有多个网卡,需要在 calico 配置文件里指定可以联网的网卡,假如机器只有一个网卡,也要指定下,这样就直接找到可以用的网卡了。
找到 3645 行:增加如下配置:
- name: IP_AUTODETECTION_METHOD
value: "interface=ens33"
查看节点信息:
kubectl get pods -n kube-system
calico-kube-controlers-d886b8fff-s8zd 0/1 Pending状态,是因为现在只有一个控制节点,calico-kube-controllers-d886b8fff-s8lzd不能调度到控制节点,所以是pending,等到工作节点创建好之后,pod 就会调度到工作节点上.
扩展
#部署yaml文件:
kubectl apply -f xxx.yaml
#获取节点和服务版本信息,并查看附加信息
kubectl get nodes -o wide
#获取pod信息,默认是default名称空间
kubectl get pod
#获取pod信息,默认是default名称空间,并查看附加信息
#kubectl get pod -o wide
#获取指定名称空间的pod
kubectl get pod -n kube-system
#获取指定名称空间中的指定pod
kubectl get pod -n kube-system podName
#获取所有名称空间的pod
kubectl get pod -A
#查看所有名称空间的service信息
kubectl get svc -A
#查看componentstatuses信息
kubectl get cs
#查看所有deployments信息
kubectl get deploy -A
#查看所有replicasets信息
kubectl get rs -A
#查看所有statefulsets信息
kubectl get sts -A
#查看所有jobs信息
kubectl get jobs -A