作用 | IP地址 | 操作系统 | 配置 |
---|---|---|---|
Master | 192.168.2.30 | Centos7.9 基础设施服务器 | 2颗CPU 4G内存 50G硬盘 |
Node1 | 192.168.2.31 | Centos7.9 基础设施服务器 | 2颗CPU 4G内存 50G硬盘 |
Node2 | 192.168.2.32 | Centos7.9 基础设施服务器 | 2颗CPU 4G内存 50G硬盘 |
本次环境搭建需要安装三台Centos服务器(一主二从),k8s采用1.24.2版本。
安装虚拟机过程中注意下面选项的设置:
操作系统环境:CPU(2C) 内存(4G) 硬盘(50G)
语言选择:中文简体
软件选择:基础设施服务器
分区选择:自动分区
网络配置:按照下面配置网路地址信息
网络地址:192.168.2.30 (每台主机都不一样 分别为30、31、32) 子网掩码:255.255.255.0 默认网关:192.168.2.2 DNS: 223.5.5.5
主机名设置:按照下面信息设置主机名
master节点: master node节点: node1 node节点: node2
1)检查操作系统的版本
# 此方式下安装kubernetes集群要求Centos版本要在7.9 [root@master ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)
2) 主机名解析
为了方便后面集群节点间的直接调用,在这配置一下主机名解析,企业中推荐使用内部DNS服务器
# 主机名成解析 编辑三台服务器的/etc/hosts文件,添加下面内容 192.168.2.30 master 192.168.2.31 node1 192.168.2.32 node2
3) 时间同步
kubernetes要求集群中的节点时间必须精确一致,这里直接使用chronyd服务从网络同步时间。
企业中建议配置内部的时间同步服务器
# 安装chrony [root@master ~]# yum install chrony # 修改配置文件 [root@master ~]# vim /etc/chrony.conf server ntp1.aliyun.com iburst # 启动chronyd服务 [root@master ~]# systemctl start chronyd # 设置chronyd服务开机自启 [root@master ~]# systemctl enable chronyd # chronyd服务启动稍等几秒钟,就可以使用date命令验证时间了 [root@master ~]# date
4) 禁用iptables和firewalld服务
kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则
# 1 关闭firewalld服务 [root@master ~]# systemctl stop firewalld [root@master ~]# systemctl disable firewalld [root@master ~]# firewall-cmd --state not running # 2 关闭iptables服务 [root@master ~]# systemctl stop iptables [root@master ~]# systemctl disable iptables
5) 禁用selinux
selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题
# 编辑 /etc/selinux/config 文件,修改SELINUX的值为disabled # 注意修改完毕之后需要重启linux服务 SELINUX=disabled sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config setenfoce 0 [root@master ~]# sestatus SELinux status: disabled
6) 禁用swap分区
swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用
启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备
但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明
# 编辑分区配置文件/etc/fstab,注释掉swap分区一行 # 注意修改完毕之后需要重启linux服务 UUID=455cc753-7a60-4c17-a424-7741728c44a1 /boot xfs defaults 0 0 /dev/mapper/centos-home /home xfs defaults 0 0 # /dev/mapper/centos-swap swap swap defaults 0 0
7)升级操作系统内核
# 导入elrepo gpg key [root@master ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org # 安装elrepo YUM源仓库 [root@master ~]# yum -y install https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm # 安装kernel-ml版本,ml为长期稳定版本,lt为长期维护版本 [root@master ~]# yum --enablerepo="elrepo-kernel" -y install kernel-ml.x86_64 # 设置grub2默认引导为0 [root@master ~]# grub2-set-default 0 # 重新生成grub2引导文件 [root@master ~]# grub2-mkconfig -o /boot/grub2/grub.cfg # 更新后,需要重启,使用升级的内核生效。 [root@master ~]# reboot # 重启后,需要验证内核是否为更新对应的版本 [root@master ~]# uname -r 5.18.10-1.el7.elrepo.x86_64
8)修改linux的内核参数
# 修改linux的内核参数,添加网桥过滤和地址转发功能 # 编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置: net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 vm.swappiness=0 # 重新加载配置 [root@master ~]# sysctl -p /etc/sysctl.d/kubernetes.conf # 加载网桥过滤模块 [root@master ~]# modprobe br_netfilter # 查看网桥过滤模块是否加载成功 [root@master ~]# lsmod | grep br_netfilter
9)配置ipvs功能
在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的
两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块
# 1 安装ipset和ipvsadm [root@master ~]# yum install ipset ipvsadm -y # 2 添加需要加载的模块写入脚本文件 [root@master ~]# cat </etc/sysconfig/modules/ipvs.modules #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack EOF # 3 为脚本文件添加执行权限 [root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules # 4 执行脚本文件 [root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules # 5 查看对应的模块是否加载成功 [root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
k8s基本环境准备
由于kubernetes的镜像源在国外,速度比较慢,这里切换成国内的镜像源,本文使用阿里云YUM源
$ cat </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 clean all && yum makecache
# 集群软件安装 安装kubeadm、kubelet和kubectl # yum install kubeadm kubelet kubectl -y # 查看所有的可用版本 $ yum list kubeadm kubelet kubectl --showduplicates | sort -r # 默认安装的版本就是最新版1.24.X,当然也可以指定版本安装 ,如 yum install kubelet-1.16.2 kubeadm-1.16.2 kubectl-1.16.2 $ yum install kubeadm kubelet kubectl #安装后查看版本 $ kubeadm version kubeadm version: &version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.2", GitCommit:"f66044f4361b9f1f96f0053dd46cb7dce5e990a8", GitTreeState:"clean", BuildDate:"2022-06-15T14:20:54Z", GoVersion:"go1.18.3", Compiler:"gc", Platform:"linux/amd64"} # 配置kubelet的cgroup # 为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,建议修改如下文件内容。 $ cat </etc/sysconfig/kubelet KUBELET_EXTRA_ARGS="--cgroup-driver=systemd" KUBE_PROXY_MODE="ipvs" EOF # 设置kubelet开机自启 # systemctl enable kubelet
做完基础环境创建快照。
安装containerd
本文采用在线方式安装
所有节点都安装。
直接安装docker-ce源 # step 1: 安装必要的一些系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2 # Step 2: 添加软件源信息 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # Step 3 sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo # Step 4:查询软件包 yum list | grep containerd containerd.io.x86_64 1.6.6-3.1.el7 docker-ce-stable # Step 5:安装软件包 [root@node1 ~]# yum install containerd -y # Step 6:初始化默认配置 containerd config default | tee /etc/containerd/config.toml # Step 7:修改containerd配置更改cgroup sed -i "s#SystemdCgroup\ \=\ false#SystemdCgroup\ \=\ true#g" /etc/containerd/config.toml # Step 8:修改镜像源 sed -i "s#k8s.gcr.io#registry.aliyuncs.com/google_containers#g" /etc/containerd/config.toml # Step 9:配置crictl cat <初始化 Master 节点
方法一:通过配置文件初始化
1)生成并修改配置文件
# 生成配置文件 $ kubeadm config print init-defaults > kubeadm.yml修改如下配置:
advertiseAddress:为控制切面地址,( Master 主机 IP )
criSocket:为 containerd 的 socket 文件地址
name: 为master主机名
imageRepository:阿里云镜像代理地址,否则拉取镜像会失败
kubernetesVersion:为 k8s 版本
注意:一定要配置镜像代理,否则会由于防火墙问题导致集群安装失败
修改后配置文件如下:
apiVersion: kubeadm.k8s.io/v1beta3 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: # 控制切面的IP地址 advertiseAddress: 192.168.2.30 bindPort: 6443 nodeRegistration: # 容器运行时 socket 文件地址 criSocket: unix:///var/run/containerd/containerd.sock imagePullPolicy: IfNotPresent # 控制面主机名,可省略 name: master taints: - effect: NoSchedule key: node-role.kubernetes.io/master --- apiServer: timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta3 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {} dns: {} etcd: local: dataDir: /var/lib/etcd # 镜像服务地址 imageRepository: registry.aliyuncs.com/google_containers kind: ClusterConfiguration # K8S 版本 kubernetesVersion: 1.24.2 networking: dnsDomain: cluster.local # service 的网段 serviceSubnet: 10.96.0.0/12 scheduler: {} --- kind: KubeletConfiguration apiVersion: kubelet.config.k8s.io/v1beta1 cgroupDriver: systemd2)初始化 K8S 集群
# 查看所需镜像列表 $ kubeadm config images list --config kubeadm.yml # 拉取镜像 $ kubeadm config images pull --config kubeadm.yml # 根据配置文件启动 kubeadm 初始化 k8s $ kubeadm init --config=kubeadm.yml --upload-certs --v=6方法二:通过命令初始化
参数 作用 缺省 配置 --apiserver-advertise-address apiserver 绑定的 IP Master 主机 IP --apiserver-bind-port apiserver 监听的端口 6443 6443 --cri-socket CRI socket 文件路径 "unix:///var/run/containerd/containerd.sock" --control-plane-endpoint 控制面地址 master_vip:6440 --image-repository 选择拉取镜像的仓库 k8s.gcr.io registry.aliyuncs.com/google_containers --kubernetes-version 选择K8S版本 stable-1 1.24.2 --pod-network-cidr 指定 pod 的网络 10.244.0.0/16 --service-cidr 指定service 的IP 范围 10.96.0.0/12 10.96.0.0/12 kubeadm init --apiserver-advertise-address=192.168.2.30 --apiserver-bind-port=6443 --cri-socket="unix:///var/run/containerd/containerd.sock" --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=1.24.2 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12执行结果
Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.2.30:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:4ab2fe695b9917ac72d7ad4975605405d3f6a0731ef7f56ed627e79f93c8615b说明 1:加入指令可以通过如下命令重复获取
$ kubeadm token create --print-join-command说明 2:初始化失败可以用 reset 指令重置,解决问题后重新初始化
$ kubeadm reset说明 3:查看日志
$ journalctl -f -u kubelet说明 4:token 失效处理
# 重新生成token $ kubeadm token create abcdef.0123456789abcdef # 获取ca证书sha256编码hash值 $ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' b615fccddcd4e80fc6f9c5e477bfc7a053b017660b73fdeccf89c559739664d7 # 将新的node节点加入到k8s集群中 kubeadm join node主机ip地址:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:b615fccddcd4e80fc6f9c5e477bfc7a053b017660b7添加 Worker 节点
在 Worker 节点执行
[root@node1 ~]# kubeadm join 192.168.2.30:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:4ab2fe695b9917ac72d7ad4975605405d3f6a0731ef7f56ed627e79f93c8615b [preflight] Running pre-flight checks [preflight] Reading configuration from the cluster... [preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml' [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env" [kubelet-start] Starting the kubelet [kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap... This node has joined the cluster: * Certificate signing request was sent to apiserver and a response was received. * The Kubelet was informed of the new secure connection details. Run 'kubectl get nodes' on the control-plane to see this node join the cluster.安装网络插件
没有安装之前查看集群节点
[root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady control-plane 16m v1.24.2 node1 NotReady32s v1.24.2 node2 NotReady 5s v1.24.2 下载,这里我们安装 flannel
[root@master ~]# wget http://down.i4t.com/k8s1.24/kube-flannel.yml # 根据需求修改网卡配置,这里以eth0为主 containers: - name: kube-flannel image: rancher/mirrored-flannelcni-flannel:v0.17.0 command: - /opt/bin/flanneld args: - --ip-masq - --kube-subnet-mgr - --iface=eth0 # 如果是多网卡的话,指定内网网卡的名称 执行: [root@master ~]# kubectl apply -f kube-flannel.yml[root@master ~]# kubectl get nodes
结果