机器准备
搭建环境是centos7, 四核心4G内存四台机器
一个master节点,一个etcd,两台node
机器名称 | IP 地址 |
---|---|
master | 192.168.1.128 |
node1 | 192.168.1.129 |
node2 | 192.168.1.130 |
node3 | 192.168.1.131 |
机器时间同步
各节点时间要求精确同步,可以直接联网的话,使用
systemctl start chronyd.service
systemctl enable chronyd.service
or
ntpdate -u cn.pool.ntp.org
节点的DNS解析
设置主机名
hostnamectl set-hostname master/node01/node02/node03....
在每台机器上向 /etc/hosts文件添加
cat <<EOF >>/etc/hosts
192.168.1.127 master
192.168.1.129 node01
192.168.1.130 node02
192.168.1.131 node03
EOF
每台机器上关闭firewalld,禁用swap设备,关闭selinux
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
直接修改文件
sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
关闭swap设备
swapoff -a
sed -i 's /.* swap.*/#&/' /etc/fstab
or 直接修改文件(/etc/fstab)
注释这一行
#/dev/mapper/centos-swap swap swap defaults 0 0
查看swap是否被正确关闭
free -m
每台机器设置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
设置国内源
yum install -y wget
mkdir /etc/yum.repos.d/bak && mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos7_base.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.cloud.tencent.com/repo/epel-7.repo
yum clean all && yum makecache
给每台机器安装docker
$ yum -y install wget
# 添加docker yum源
$ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O/etc/yum.repos.d/docker-ce.repo
# 安装
$ yum -y install docker-ce
# 设置开机启动
$ systemctl enable docker
# 启动docker
$ systemctl start docker
集群搭建
每台机器都安装kubeadm、kubelet、kubectl
这三个工具的国内镜像在阿里云上有,进去对应自己的机器版本选链接,配置仓库如下:
cat <<EOF >/etc/yum.repos.d/kubernetes.repo
[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
配置过后安装
yum install -y kubelet kubeadm kubectl
安装过程中,可能由于Google和阿里的同步问题,导致gpgcheck不通过,可以使用
yum install -y kubelet-1.17.0 kubeadm-1.17.0 kubectl-1.17.0 --nogpgcheck
设置kubelet开机自启动
systemctl enable kubelet
注意这里不用启动kubelet,因为master还没有初始化,日志会提示缺少yaml文件,kubelet无法启动
Master节点的初始化
指令
- kubeadm init (master节点初始化)
- kubeadm join (node节点加入集群)
- kubeadm reset (消除执行过后的init or join 的影响)
初始化
kubeadm init \
--apiserver-advertise-address=192.168.1.127 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.17.0 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=swap
- apiserver地址即Master本机地址
- pod-network-cidr即pod网络对应的网段,因为kubernetes自身没有设计pod网络,所以需要其余的网络插件,常用的是flannel,这个地址是flannel默认的
正常情况
可以看到以下信息
kubeadm join 192.168.1.127:6443 --token 2yxrh1.eet93u5rgkanl5vz \
--discovery-token-ca-cert-hash sha256:238315c75883d5abe8f8e898acd68a2618fce3053f383cefa456db5f7aaa05f1
- 这是其他机器访问的凭证
失败情况及其解决方法
错误查询手段
systemctl status kubelet
不过这是大概率是没有正常运行的,前面也提到了,只有正常init生成config的yaml文件,kubelet才能running
然后查看kubelet运行日志
journalctl -xeu kubelet
错误解决
swap没有禁用,free -m 命令查看
selinux没有禁用
docker和kubernetes启动参数cgroup-driver不同
通过 docker info 查看 cgroup-driver参数
同时修改 /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
}
systemctl restart docker
systemctl status docker
curl -sSL http://localhost:10248/healthz‘ failed with error: Get “http://loc
怀疑是内核参数的问题,修改内核
root@master1:~# echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
root@master1:~# echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
root@master1:~# echo 'net.bridge.bridge-nf-call-ip6tables = 0 ' >> /etc/sysctl.conf
root@master1:~# echo 'net.bridge.bridge-nf-call-iptables = 1 ' >> /etc/sysctl.conf
root@master1:~# echo 'net.bridge.bridge-nf-call-arptables = 0' >> /etc/sysctl.conf
root@master1:~# sysctl -p
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 0
失败后通过 kubeadm reset 命令,删除不必要的文件
初始化成功的提示
你已经成功初始化了master
为了使用集群,你需要为机器的用户提供证书
你现在需要取安装集群pod网络插件
之后你才可以将其余节点加入集群
为机器用户提供证书
kubernetes提供双向认证机制,只有用户名下有其CA证书文件才可以对集群进行操作
模版(对非root用户)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
设置root用户
mkdir -p /root/.kube
cp /etc/kubernetes/admin.conf /root/.kube/config
安装网络插件
拉取flannel镜像
docker pull quay.io/coreos/flannel:v0.11.0-amd64
部署flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
Node节点加入集群
启动转发功能
sysctl -w net.ipv4.ip_forward=1
通过在Node机器执行集群凭证,就可以加入集群
kubeadm join 192.168.1.128:6443 --token 2yxrh1.eet93u5rgkanl5vz \
--discovery-token-ca-cert-hash sha256:238315c75883d5abe8f8e898acd68a2618fce3053f383cefa456db5f7aaa05f1
如果tooken 和 CA证书过期了,可以在Master节点用以下命令
# 生成 token
kubeadm token create
# CA证书生成
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
# token 查询
kubeadm token list
加入集群的节点会使用Master设置的源,下载flannel、kube-proxy、coredns、pause四个镜像(如果无法正常下载,可以将这些镜像从master scp到node节点docker load即可)
可使用 docker images 查看
root@node01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rancher/mirrored-flannelcni-flannel v0.20.2 b5c6c9203f83 8 days ago 59.6MB
rancher/mirrored-flannelcni-flannel-cni-plugin v1.1.0 fcecffc7ad4a 6 months ago 8.09MB
registry.aliyuncs.com/google_containers/kube-proxy v1.17.0 7d54289267dc 3 years ago 116MB
registry.aliyuncs.com/google_containers/coredns 1.6.5 70f311871ae1 3 years ago 41.6MB
registry.aliyuncs.com/google_containers/pause 3.1 da86e6ba6ca1 4 years ago 742kB
查看集群状态
主节点执行
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 89d v1.17.0
node01 Ready <none> 7d1h v1.17.0
node02 Ready <none> 7d1h v1.17.0
node03 Ready <none> 5h3m v1.17.0
参考资料
- centos7上用kubeadm搭建kubenetes集群(详细+踩坑记录)
- 本机虚拟机centos7环境搭建k8s集群-实践篇
- The HTTP call equal to ‘curl -sSL http://localhost:10248/healthz‘ failed with error: Get “http://loc
- k8s node节点重启docker后,所有该节点的容器无法运行
- kubeadm join 使用的 token 过期之后,如何加入集群
- K8s无法删除状态为terminating的pod解决方法
- kubernetes node节点加入容器 [ERROR FileContent–proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forw