kubeadm快速搭建Kubernetes1.21.14集群
1.配置要求
###本次实验环境使用Kubernetes1.21.14版本 docker19.03.14版本 内核3.10.0-1160.90.1.el7.x86_64搭建
CentOS 7.9 可以部署 Kubernetes 1.21.x 版本。在部署之前,需要检查主机是否符合 Kubernetes 系统要求,
包括:
操作系统要求:CentOS 7.9,内核版本不低于 3.10。
容器运行时要求:Docker 1.13.x 或更高版本、cri-o 1.18 或更高版本。
硬件资源要求:至少 2GB 的可用内存、2个或更多的CPU内核、20GB
Kubernetes 版本 最低内核版本
1.22.x 4.14.0
1.21.x 3.10.0
1.20.x 3.10.0
1.19.x 3.10.0
1.18.x 3.10.0
1.17.x 3.10.0
2.准备环境
角色 | IP |
master | 192.168.26.101 |
node1 | 192.168.26.102 |
node2 | 192.168.26.103 |
2.1设置防火墙为 Iptables 并设置空规则,关闭selinux
[root@xkf ~]# systemctl stop firewalld && systemctl disable firewalld [root@xkf ~]# yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F &&service iptables save [root@xkf ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config [root@xkf ~]# setenforce 0
2.2关闭swap交换分区
[root@xkf ~]# swapoff -a #临时 [root@xkf ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab #永久
2.3设置主机名,添加hosts文件
[root@xkf ~]# hostnamectl set-hostname master [root@xkf ~]# bash [root@master ~]# vim /etc/hosts [root@master ~]# cat /etc/hosts 192.168.26.101 master 192.168.26.102 node1 192.168.26.103 node2 [root@master ~]# scp /etc/hosts root@192.168.26.102:/etc/hosts [root@master ~]# scp /etc/hosts root@192.168.26.103:/etc/hosts
2.4调整内核参数,将桥接的IPv4流量传递到iptables的链
需要开启网络桥接功能 [root@master ~]# brctl show 提示“command not found”,则需要先安装bridge-utils [root@master ~]# yum -y install bridge-utils 打开某些内核参数 [root@master ~]# modprobe br_netfilter [root@master ~]# sysctl -p 调整 [root@master ~]# 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 EOF [root@master ~]# cp kubernetes.conf /etc/sysctl.d/kubernetes.conf [root@master ~]# sysctl -p /etc/sysctl.d/kubernetes.conf 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 [root@master ~]# sysctl --system #生效
2.5时间同步
[root@master ~]# yum install ntpdate -y [root@master ~]# ntpdate time.windows.com 30 Apr 07:26:27 ntpdate[2628]: adjust time server 52.231.114.183 offset -0.002402 sec
2.6升级系统内核
#2.6.1更新系统软件包: [root@master ~]# yum update #2.6.2添加ELRepo软件源: [root@master ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org [root@master ~]# yum install https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm #2.6.3安装kernel-ml软件包: [root@master ~]# yum --enablerepo=elrepo-kernel install kernel-ml #2.6.4修改GRUB引导菜单,使操作系统默认启动新内核: [root@master ~]# grub2-set-default 0 #2.6.5生成GRUB引导配置文件: [root@master ~]# grub2-mkconfig -o /boot/grub2/grub.cfg #2.6.7重启系统,让新内核生效: reboot ##2.7kube-proxy开启ipvs的前置条件(解决svc和pod之间的调度关系) 加载的 IPVS 模块所对应的 modprobe 命令 [root@master ~]# 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 EOF [root@master ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules 执行其中包含的 modprobe 命令,将所需的 IPVS 模块加载到内核中 [root@master ~]# bash /etc/sysconfig/modules/ipvs.modules [root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4 ip_vs_sh 16384 0 ip_vs_wrr 16384 0 ip_vs_rr 16384 0 ip_vs 200704 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr nf_conntrack 180224 1 ip_vs nf_defrag_ipv6 24576 2 nf_conntrack,ip_vs libcrc32c 16384 3 nf_conntrack,xfs,ip_vs
3.所有节点安装Docker/kubeadm/kubelet
Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。
3.1 安装Docker
3.1.1卸载旧版本的 Docker
[root@master ~]# yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
3.1.2安装依赖包
[root@master ~]# yum update -y [root@master ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
3.1.3配置阿里云
[root@master ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.1.4安装
列出所有可用的 Docker 版本 [root@master ~]# yum list docker-ce --showduplicates | sort -r 安装指定版本 [root@master ~]# yum install docker-ce-19.03.14 docker-ce-cli-19.03.14 containerd.io #打开docker并设置开机自启 [root@master ~]# systemctl enable docker && systemctl start docker Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service. #查看版本 [root@node2 ~]# docker --version Docker version 19.03.14, build 5eb3275d40
3.1.5创建Docker 的配置文件
创建Docker 的配置文件并进行相应的配置,以便提高 Docker 运行的安全性和性能 # 创建 /etc/docker 目录 [root@master ~]# mkdir -p /etc/docker # 配 daemon. [root@master ~]# cat > /etc/docker/daemn.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver":"json-file", "log-opts":{ "max-size": "100m" } } EOF [root@master ~]# mkdir -p /etc/systemd/system/docker.service.d # 重启docker服务 [root@master ~]# systemctl daemon-reload && systemctl restart docker && systemctl enable docker
3.2添加阿里云yum软件源
[root@master ~]# 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 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
3.3安装kubeadm,kubelet和kubectl
由于版本更新频繁,这里指定版本号部署:
这三条命令分别用于列出 kubeadm、kubelet 和 kubectl 可用的软件包版本 yum list kubeadm --showduplicates yum list kubelet --showduplicates yum list kubectl --showduplicates kubeadm:初始化工具 kubelet:命令行管理工具 kubectl:跟docker (cri)交互创建容器 [root@master ~]# yum -y install kubelet-1.21.14-0 kubeadm-1.21.14-0 kubectl-1.21.14-0 #查看版本 [root@master ~]# kubeadm version kubeadm version: &version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.14", GitCommit:"0f77da5bd4809927e15d1658fb4aa8f13ad890a5", GitTreeState:"clean", BuildDate:"2022-06-15T14:16:13Z", GoVersion:"go1.16.15", Compiler:"gc", Platform:"linux/amd64"} [root@master ~]# systemctl enable kubelet 不可以启动但要设置开机自启,初始化时会自动启动 Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
4.部署Kubernetes Master,node节点
4.1部署Kubernetes Master节点
[root@master ~]# kubeadm init \ --apiserver-advertise-address=192.168.26.101 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.21.14 \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.244.0.0/16 #由于默认拉取镜像地址 k8s.gcr.io 国内无法访问,这里指定阿里云镜像仓库地址。 #末尾显示为初始化成功 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config kubeadm join 192.168.26.101:6443 --token maynsp.qmr39gylukq0wb77 \ --discovery-token-ca-cert-hash sha256:2a7d51b2cb779fb504fc5e0e41eb3c7b067d603e3ecce7dea1c6ffe46ea0a918 #使用 kubectl 工具 运行以下命令: [root@master ~]# mkdir -p $HOME/.kube [root@master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@master ~]# chown $(id -u):$(id -g) $HOME/.kube/config
4.2部署node节点加入集群
#节点加入集群 [root@node1 ~]# kubeadm join 192.168.26.101:6443 --token maynsp.qmr39gylukq0wb77 \ --discovery-token-ca-cert-hash sha256:2a7d51b2cb779fb504fc5e0e41eb3c7b067d603e3ecce7dea1c6ffe46ea0a918 [root@node2 ~]# kubeadm join 192.168.26.101:6443 --token maynsp.qmr39gylukq0wb77 \ --discovery-token-ca-cert-hash sha256:2a7d51b2cb779fb504fc5e0e41eb3c7b067d603e3ecce7dea1c6ffe46ea0a918
5.部署calico网络插件
#部署calico网络插件 [root@master ~]# rz -E rz waiting to receive. [root@master ~]# ls \ anaconda-ks.cfg calico(1).yaml kubernetes.conf [root@master ~]# kubectl apply -f calico\(1\).yaml #查看节点信息需要等待一会:都为 Ready [root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready control-plane,master 112m v1.21.14 node1 Ready <none> 110m v1.21.14 node2 Ready <none> 110m v1.21.14 #获取 Kubernetes 集群中 kube-system 命名空间中所有 Pod 的当前状态 [root@master ~]# kubectl get pods -n kube-system -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES calico-kube-controllers-67bb5696f5-5s6hz 1/1 Running 0 96m 10.244.166.129 node1 <none> <none> #............都为1/1 kube-scheduler-master 1/1 Running 0 103m 192.168.26.101 master <none> <none>
5.1测试,排错
#显示 Kubernetes 控制平面组件的健康状态 [root@master ~]# kubectl get cs Warning: v1 ComponentStatus is deprecated in v1.19+ NAME STATUS MESSAGE ERROR controller-manager Unhealthy Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused scheduler Unhealthy Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused etcd-0 Healthy {"health":"true"} #有报错,正常状态为 ok ok Healthy {"health": "true"} #解决 [root@master ~]# cd /etc/kubernetes/manifests/ [root@master manifests]# vim kube-scheduler.yaml [root@master manifests]# vim kube-controller-manager.yaml 两个文件都注释掉 # - --port=0 重新加载 [root@master manifests]# systemctl daemon-reload [root@master manifests]# systemctl restart kubelet.service #正确没有报错 [root@master manifests]# kubectl get cs Warning: v1 ComponentStatus is deprecated in v1.19+ NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-0 Healthy {"health":"true"} #检查 Pod 的状态 [root@master manifests]# kubectl get pods -n kube-system | grep scheduler kube-scheduler-master 1/1 Running 0 2m25s