kubeadm实际搭建多节点的Kubernetes集群

发布时间:2024年01月10日

kubeadm是什么?

kubadm官网:https://kubernetes.io/zh-cn/docs/reference/setup-tools/kubeadm/

Kubernetes的独立部署工具:kubeadm

让用户两条命令完成一个Kubernets集群的部署:

    # 创建一个Master节点
    $ kubeadm init

    # 将一个Node节点加入到当前集群中
    $ kubeadm join <Master节点的IP和端口>

实验环境

Kubernetes集群组网图参考:

这个 Kubernetes 集群就只有两台主机,一台是 Master 节点,另一台是 Worker 节点。

我的Kubernetes集群主机配置如下:

ipcpu内存磁盘(G)角色
192.168.184.1292c4g50Master
192.168.184.1302c2g50Worker
192.168.184.1362c2g30Console

安装前的准备工作

master和worker上都要操作

docker安装部分内容参考:https://juejin.cn/post/7235574844435349541

1. 修改主机名

sudo vi /etc/hostname

Master节点:

image.png

Worker节点:

image.png

2. 设置docker的cgroup驱动

使用systemd管理的Cgroup来进行资源控制与管理,因为相对Cgroupfs而言,Systemd限制CPU、内存等资源更加简单和成熟稳定。


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

3. 修改 iptables配置

为了让 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

4. 修改/etc/fstab

关闭 Linux 的 swap 分区,提升 Kubernetes 的性能:

sudo swapoff -a
sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab

安装kubeadm

master和worker上都要安装kubeadm

更新软件仓库

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

sudo apt update

安装

sudo apt install -y kubeadm=1.23.3-00 kubelet=1.23.3-00 kubectl=1.23.3-00

验证安装

kubeadm version
kubectl version --client

image.png

锁定kubeadm、kubelet、kubectl

避免意外升级导致版本错误

sudo apt-mark hold kubeadm kubelet kubectl

下载 Kubernetes 组件镜像

查看安装 Kubernetes 所需的镜像列表

kubeadm config images list --kubernetes-version v1.23.3

拉取镜像

repo=registry.aliyuncs.com/google_containers

for name in `kubeadm config images list --kubernetes-version v1.23.3`; 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

安装Master节点

kubeadm init \
--apiserver-advertise-address=192.168.184.129 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.3 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.10.0.0/16

我已经提前拉下来镜像,所以使用以下命令初始化集群

sudo kubeadm init \
    --pod-network-cidr=10.10.0.0/16 \
    --apiserver-advertise-address=192.168.184.129 \
    --kubernetes-version=v1.23.3

  • --pod-network-cidr,设置集群里 Pod 的 IP 地址段。
  • --apiserver-advertise-address,设置 apiserver 的 IP 地址,即Master的ip地址。
  • --kubernetes-version,指定 Kubernetes 的版本号。

执行完根据提示执行命令拷贝kubectl配置,命令行操作需要

To start using your cluster, you need to run the following as a regular user:

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

另外有一个提示节点加入集群的命令(重要):

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.184.129:6443 --token 09mf6a.jkzazzdbu3ypkebk \
        --discovery-token-ca-cert-hash sha256:50564907664b46361b122cbcbb19fabd52bdd303c4539a61ce77d8dbac85d3d1

查看Kubernetes 的版本和集群的节点状态:

kubectl version
kubectl get node

你会注意到 Master 节点的状态是“NotReady”,这是由于还缺少网络插件,集群的内部网络还没有正常运作。

kubeadm init后的kubernetes配置路径:/etc/kubernetes

安装Flannel 网络插件

Kubernetes 定义了 CNI 标准,有很多网络插件,这里我选择最常用的 Flannel,可以在它的 GitHub 仓库里(https://github.com/flannel-io/flannel/)找到相关文档。

需要修改文件里的“net-conf.json”字段,把 Network 改成刚才 kubeadm 的参数 --pod-network-cidr 设置的地址段。

https://github.com/flannel-io/flannel/blob/master/Documentation/kube-flannel.yml

kubectl apply -f kube-flannel.yml

在master节点就可以查看到

kubectl get node

安装 Worker 节点

Woker主机上执行初始化Kubernetes时,在Master上的提示命令

sudo kubeadm join 192.168.184.129:6443 --token 09mf6a.jkzazzdbu3ypkebk \
        --discovery-token-ca-cert-hash sha256:50564907664b46361b122cbcbb19fabd52bdd303c4539a61ce77d8dbac85d3d1

它会连接 Master 节点,然后拉取镜像,安装网络插件,最后把节点加入集群。

稍等片刻,就可以在Master节点上看到两个节点是Ready状态了。

image.png

如果在初始化集群时没有记住,可以使用kubeadm token create --print-join-command显示加入方式。

Console配置

Console上安装kubectl,用于管理Kubenetes

  • console节点mkdir ~/.kube创建目录
  • 在Master节点上将以下文件拷贝到Console节点
scp `which kubectl` lianhaifeng@192.168.184.136:~/
scp ~/.kube/config lianhaifeng@192.168.184.136:~/.kube

也可以直接以Master作为Console主机用于操作Kubenetes集群,不过一般不建议这么做

测试运行pod

现在让我们在Master或Console上用 kubectl run ,运行 Nginx 来测试一下:

kubectl run ngx --image=nginx:alpine
kubectl get pod -o wide

image.png

会看到 Pod 运行在 Worker 节点上,IP 地址是“10.10.1.2”,表明我们的 Kubernetes 集群部署成功。

小结

  • kubeadm 是一个方便易用的 Kubernetes 工具,能够部署生产级别的 Kubernetes 集群。
  • 安装 Kubernetes 之前需要修改主机的配置,包括主机名、Docker 配置、网络设置、交换分区等。
  • Kubernetes 的组件镜像存放在gcr.io,国内下载比较麻烦,可以考虑从 minikube 或者国内镜像网站获取。
  • 安装 Master 节点需要使用命令kubeadm init,安装Worker节点需要使用命令kubeadm join,还要部署Flannel等网络插件才能让集群正常工作。
文章来源:https://blog.csdn.net/python_9k/article/details/135501681
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。