k8s集群搭建

环境

  • 虚拟机:hyper-v

  • 系统:ubuntu-18.04.6-server

基础环境搭建

修改apt源

1
2
3
cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo sed -i "s@http://.*archive.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list
sudo sed -i "s@http://.*security.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list

关闭防火墙

整明白了之后再只开放具体的端口。

1
2
systemctl stop ufw
systemctl disable ufw

关闭swap

1
2
3
4
# 临时
swapoff -a
# 永久,注释文件中包含swap的行
vim /etc/fstab

配置hosts

1
2
3
4
vim /etc/hosts
192.168.137.100 k8s1
192.168.137.101 k8s2
192.168.137.102 k8s3

等基础环境搭建完成,每个节点分别设置自己的hostname

例如:

1
hostnamectl set-hostname k8s1

配置kubernetes apt源

1
2
3
4
5
6
echo "deb http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list
apt update
# 若提示public key is not available,则取NO_PUBKEY后面的字符串的后8位替换到下面的命令执行
gpg --keyserver keyserver.ubuntu.com --recv-keys 307EA071
gpg --export --armor 307EA071 | sudo apt-key add -
apt update

安装kubelet kubeadm kubectl

1
2
3
apt install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
systemctl enable kubelet

安装docker

1
apt install -y docker-ce

安装所需镜像

1
2
3
4
5
6
7
8
9
kubeadm config images list
# 会列出以下镜像
# k8s.gcr.io/kube-apiserver:v1.23.1
# k8s.gcr.io/kube-controller-manager:v1.23.1
# k8s.gcr.io/kube-scheduler:v1.23.1
# k8s.gcr.io/kube-proxy:v1.23.1
# k8s.gcr.io/pause:3.6
# k8s.gcr.io/etcd:3.5.1-0
# k8s.gcr.io/coredns/coredns:v1.8.6

由于上述命令执行所列出的镜像地址国内可能拉取不到,所以将地址更换为国内可访问的。

1
2
3
4
5
6
7
8
# 拉取中转镜像
docker pull k8simage/kube-apiserver:v1.23.1
docker pull k8simage/kube-controller-manager:v1.23.1
docker pull k8simage/kube-scheduler:v1.23.1
docker pull k8simage/kube-proxy:v1.23.1
docker pull k8simage/pause:3.6
docker pull k8simage/etcd:3.5.1-0
docker pull xyz349925756/coredns:v1.8.6
1
2
3
4
5
6
7
8
# 重命名中转镜像标签
docker tag k8simage/kube-apiserver:v1.23.1 k8s.gcr.io/kube-apiserver:v1.23.1
docker tag k8simage/kube-controller-manager:v1.23.1 k8s.gcr.io/kube-controller-manager:v1.23.1
docker tag k8simage/kube-scheduler:v1.23.1 k8s.gcr.io/kube-scheduler:v1.23.1
docker tag k8simage/kube-proxy:v1.23.1 k8s.gcr.io/kube-proxy:v1.23.1
docker tag k8simage/pause:3.6 k8s.gcr.io/pause:3.6
docker tag k8simage/etcd:3.5.1-0 k8s.gcr.io/etcd:3.5.1-0
docker tag xyz349925756/coredns:v1.8.6 k8s.gcr.io/coredns/coredns:v1.8.6
1
2
3
4
5
6
7
8
# 删除中转标签
docker rmi k8simage/kube-apiserver:v1.23.1
docker rmi k8simage/kube-controller-manager:v1.23.1
docker rmi k8simage/kube-scheduler:v1.23.1
docker rmi k8simage/kube-proxy:v1.23.1
docker rmi k8simage/pause:3.6
docker rmi k8simage/etcd:3.5.1-0
docker rmi xyz349925756/coredns:v1.8.6

master配置

上来先配置hosts

初始化

1
kubeadm init --apiserver-advertise-address=192.168.137.100 --kubernetes-version v1.23.1 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16

--apiserver-advertise-address值为master的ip地址。

若卡在kubelet的启动,则按下面步骤进行操作

1
2
3
4
5
6
7
8
# 查看docker Cgroup Driver的值
docker info | grep -i cgroup
# 查看kubelet cgroupDriver的值
cat /var/lib/kubelet/config.yaml
# 若两个值不一致则将kubelet的cgroupDriver改为与docker一致
vim /var/lib/kubelet/config.yaml
# 重启kubelet
systemctl restart kubelet

初始化成功后会提示

1
2
kubeadm join 192.168.137.100:6443 --token 1094in.pjnnp76v94a1bef1 --discovery-token-ca-cert-hash sha256:82a29989a1425df58746d36286b58e0bd99898de40e055797c97134b35b9aad8
# token会在24小时后失效

创建.kube目录

1
2
3
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

安装 Pod 网络附加组件

未安装时,执行命令kubectl get pod -n kube-system会有部分状态为pending(阻塞)。

组件有好多,也不知道装哪个,先装了顺眼的flannel吧。

1
kubectl apply -f https://fastly.jsdelivr.net/gh/flannel-io/flannel@master/Documentation/kube-flannel.yml

过一段时间再执行kubectl get pod -n kube-system,可以发现所有状态都为running了。

将master设为工作节点

1
kubectl taint nodes --all node-role.kubernetes.io/master-

会输出node/k8s1 untainted

查看集群节点状态

1
kubectl get nodes

当前只有一个节点且状态为ready。

node配置

上来先配置hosts

加入集群

复制master初始化成功后提示的命令,执行。

再次执行kubectl get nodes查看节点,发现多了对应的节点。

再稍等片刻,所有的节点状态都为ready了。

至此集群搭建完成 :)

参考资料


k8s集群搭建
https://blog.kedr.cc/posts/331375146/
作者
zhuweitung
发布于
2022年1月18日
许可协议