一直久闻k8s大名,甚至在工作中也曾使用过k8s。
但是一直没有自己手动实践搭建一套完整的k8s集群,
逐近期工作有使用微服务架构
,所以打算看看能不能一次性把k8s也接进去,自己先来练手和熟悉环境。
话不多说,不了解k8s
可以不用看了,本文只涉及一个基础的k8s
测试集群搭建,不会讲很多深奥的知识,
如果需要了解k8s的可以自己看官方文档:https://kubernetes.io/
一.先决条件
我这里使用了3台腾讯云轻量服务器做测试,配置为2核4g
建议有条件可以配置给高一点,体验的感觉也会好一点,当然你也可以使用电脑虚拟机虚拟化3台机器出来。
机器架构:
name | ip | 防火墙开放端口 |
---|---|---|
master | 10.0.0.16 | 10250,10251,10252,10255,2379,2380,6443 |
node1 | 10.0.0.6 | 10250,30000-32767 |
node2 | 10.0.0.12 | 10250,30000-32767 |
请确保机器同时处于同一内网环境下,我这里都是使用的内网ip。
如果你使用的云服务器,一定要记得开放防火墙端口!!!如果不是则确认你linux当前有无防火墙,开放指定端口即可!!!
二.准备工作
注意下面的每一步操作都需要在3台服务器上都执行,部分操作根据当前服务器不同类型稍作修改!!!
1.设置hostname
在每台机器上设置对应的hostname
,例如master我这里就设置的k8s-master
,其他两台机器分别是:k8s-node1
,k8s-node2
sudo vi /etc/hostname
2.修改机器hosts
每台机器的hosts
都设置成对应的hostname
sudo vi /etc/hosts
10.0.0.16 k8s-master
10.0.0.6 k8s-node1
10.0.0.12 k8s-node2
3.安装docker
我这里使用docker
作为容器化,所以每台机器都需要安装docker
sudo apt update -y && apt install -y docker.io
4.修改docker配置,在“/etc/docker/daemon.json”里把 cgroup 的驱动程序改成 systemd ,然后重启 Docker 的守护进程
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker
5.为了让 Kubernetes 能够检查、转发网络流量,你需要修改 iptables 的配置,启用 “br_netfilter”模块:
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1 # better than modify /etc/sysctl.conf
EOF
sudo sysctl --system
6.关闭swap,提高linux性能,我的建议是最好都关闭,以免出现不可预知的错误
sudo swapoff -a
sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab
6.安装 kubeadm
如果你是国内的服务器或虚拟机,你可以跟我一样使用阿里云
的源,不然的话默认走的是谷歌
的源。
总所周知的原因谷歌服务是没法在国内访问的,如果你是境外的服务器就不用这么麻烦了,Fuck GFW~
sudo apt install -y apt-transport-https ca-certificates curl
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
安装kubeadm,我这里固定版本为:1.23.3
,请注意!最新版本已经不支持docker的CRI
了,我已经帮你踩过坑了。
除非你不使用docker作为容器化,否则听我的劝!
sudo apt update
sudo apt install -y kubeadm=1.23.3-00 kubelet=1.23.3-00 kubectl=1.23.3-00
# 下面这条命令是锁住当前版本,建议执行
sudo apt-mark hold kubeadm kubelet kubectl
# 测试是否安装成功
kubeadm version
下载组建所需镜像,这里我们依然使用阿里云加速
repo=registry.aliyuncs.com/google_containers
for name in `kubeadm config images list`; do
src_name=${name#k8s.gcr.io/}
src_name=${src_name#coredns/}
docker pull $repo/$src_name
docker tag $repo/$src_name $name
docker rmi $repo/$src_name
done
完成准备工作后重启所有机器reboot
三.初始化Master
初始化master
kubeadm init --pod-network-cidr=10.244.0.0/16
初始化成功后会提示让你配置kube,按照提示走命令就行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
!!!还会给你返回以下类似的一条命令,请注意保存,用于node
节点的加入
kubeadm join 10.0.0.16:6443 --token g4qijw.m6hsm3r1yv46x08p \
--discovery-token-ca-cert-hash sha256:9641c0b5d5858e3ebda3c25b40fc444513d5f9ab8582eb9b41add153bfb0880e9
测试是否安装成功
kubectl version
kubectl get node
设置网络插件flannel
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
四.初始化worker节点
执行刚刚master初始化成功后的join命令(记得先决条件里面说的防火墙开放!!)
kubeadm join 10.0.0.16:6443 --token g4qijw.m6hsm3r1yv46x08p \
--discovery-token-ca-cert-hash sha256:9641c0b5d5858e3ebda3c25b40fc444513d5f9ab8582eb9b41add153bfb0880e9
回到master服务器控制台执行命令
kubectl get node
验证node是否加入成功,如下就是成功:
root@k8s-master:~# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 12m v1.23.3
k8s-node1 Ready <none> 59s v1.23.3