本文介绍一下使用kubeadm安装K8S集群,并使用docker作为容器运行时的具体安装步骤。
环境说明
主机节点
机器角色 | IP地址 |
master | 192.168.30.11 |
node01 | 192.168.30.12 |
node02 | 192.168.30.13 |
软件说明
软件版本
软件 | 版本 |
docker | 20.10.8 |
kubeadm | 1.22.2 |
kubelet | 1.22.2 |
kubectl | 1.22.2 |
环境准备
(在所有节点上操作)
1. 关闭防火墙
systemctl stop firewalld systemctl disable firewalld
2. 关闭selinux
setenforce 0 # 临时关闭 sed -i 's/enforcing/disabled/g' /etc/selinux/config # 永久关闭
3. 关闭swap
swapoff -a # # 临时关闭 sed -ir 's/.*swap.*/#&/g' /etc/fstab # 永久关闭
4. 设置主机名
每个节点根据自己习惯去命名
hostnamectl set-hostname <hostname>
5. 在每个节点添加hosts信息
cat >> /etc/hosts << EOF 192.168.30.11 k8s-master 192.168.30.12 k8s-node01 192.168.30.13 k8s-node02 EOF
6. 创建k8s.conf文件,配置内核参数,将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables=1 net.bridge.bridge-nf-call-iptables=1 EOF 执行 sysctl --system 使得如上添加的配置生效
7. 时间同步(如果时间已经同步,这一步可以省略)
yum install ntpdate -y ntpdate ntpdate cn.pool.ntp.org 常用的NTP时间服务器 cn.ntp.org.cn #中国 edu.ntp.org.cn #中国教育网 ntp1.aliyun.com #阿里云 ntp2.aliyun.com #阿里云 cn.pool.ntp.org #最常用的国内NTP服务器
安装相关软件包
(master操作)
yum install conntrack-tools libseccomp libtool-ltdl -y
安装docker/kubeadm/kubelet
(master,node01,node02 均安装)
安装docker
# 安装相关软件 yum install -y yum-utils device-mapper-persistent-data lvm2 # 使用阿里云的源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 查看可用版本 yum list docker-ce --showduplicates # 选择一个版本进行安装,这里用 docker-ce-20.10.8-3.el7.x86_64 yum install docker-ce-20.10.8-3.el7.x86_64 -y # 启动 docker systemctl start docker # 查看状态 systemctl status docker # 设置开机启动 systemctl enable docker # 查看version信息 docker version # 设置镜像源 vim /etc/docker/daemon.json { "registry-mirrors": [ "https://registry.docker-cn.com", "https://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn" ], "exec-opts": ["native.cgroupdriver=systemd"] # 修改docker的cgroup为systemd }
安装kubeadm、kubelet、kubectl
(kubectl是master端的管理工具,node节点可以不用安装)
#由于官方源国内无法访问,这里使用阿里云yum源进行替换: 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=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF #安装kubeadm、kubelet、kubectl 由于版本更新频繁,这里安装1.22.2版本 yum install -y kubeadm-1.22.2 yum install -y kubelet-1.22.2 yum install -y kubectl-1.22.2 如果安装时提示公钥没有安装,解决方法:--nogpgcheck 进行跳过公钥检查安装 # 设置kubelet开机启动(注意:kubelet服务会暂时启动不了,先不用管它) systemctl enable kubelet
在master端初始化
kubeadm init \ --apiserver-advertise-address=192.168.30.11 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.22.2 \ --service-cidr=10.1.0.0/16 \ --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.30.11 这里填master地址即可
这个时候并不会成功,报错如下:
很明显,是kubelet没启动导致。
查看/var/log/messages日志,有这样一条:
failed to run Kubelet: failed to create kubelet: misconfiguration: kubelet cgroup driver: "systemd" is different from docker cgroup driver: "cgroupfs"
这是因为docker的Cgroup是cgroups,kubelet的Cgroups是systemd,两者的Cgroups不一样导致。
修改方法如下:
鉴于用的k8s版本更新较快,本文只记录当前1.22.2的修改方式,其他版本请参详官方: # 重置未初始化成功的kubeadm配置 echo y | kubeadm reset 修改docker,只需在/etc/docker/daemon.json中,添加"exec-opts": ["native.cgroupdriver=systemd"]即可 修改后如下: { "registry-mirrors": [ "https://registry.docker-cn.com", "https://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn" ], "exec-opts": ["native.cgroupdriver=systemd"] } 修改kubelet: cat > /var/lib/kubelet/config.yaml <<EOF apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: systemd EOF 重启docker 与 kubelet: systemctl daemon-reload systemctl restart docker systemctl restart kubelet
再次初始化就可以了。然后照着提示在操作就可以了。
安装网络
mkdir flannel cd flannel wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube- flannel.yml # 安装flannel网络 kubectl apply -f kube-flannel.yml # 检查 kubectl get pods -n kube-system
### 在执行 kubectl get cs 命令查看健康状态时,输出如下信息:
[root@k8s-master ~]# kubectl get cs Warning: v1 ComponentStatus is deprecated in v1.19+ NAME STATUS MESSAGE ERROR scheduler Unhealthy Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused controller-manager Healthy ok etcd-0 Healthy {"health":"true","reason":""}
这是不正常的,解决方法:
cd /etc/kubernetes/manifests # 创建备份文件夹bak mkdir bak # 备份kube-scheduler.yaml到bak文件夹下 cp kube-scheduler.yaml bak # 修改kube-scheduler.yaml文件 将 --port=0 这一行删除 # 重启kubelet systemctl restart kubelet
再次执行kubectl get cs,显示正常状态