使用kubeadm搭建Kubernetes集群

1,173 阅读4分钟

kubeadm是什么?

kubadm官网:kubernetes.io/zh-cn/docs/…

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安装部分内容参考:juejin.cn/post/723557…

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 仓库里(github.com/flannel-io/…

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

github.com/flannel-io/…

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 集群部署成功。

安装dashboard插件

在 Kubernetes 社区中,有一个很受欢迎的 Dashboard 项目,它可以给用户提供一个可视化的 Web 界面来查看当前集群的各种信息。毫不意外,它的部署也相当简单:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

执行后: image.png 查看pod情况: image.png

dashboard官方说明:github.com/kubernetes/…

小结

  • kubeadm 是一个方便易用的 Kubernetes 工具,能够部署生产级别的 Kubernetes 集群。
  • 安装 Kubernetes 之前需要修改主机的配置,包括主机名、Docker 配置、网络设置、交换分区等。
  • Kubernetes 的组件镜像存放在gcr.io,国内下载比较麻烦,可以考虑从 minikube 或者国内镜像网站获取。
  • 安装 Master 节点需要使用命令 kubeadm init,安装 Worker 节点需要使用命令 kubeadm join,还要部署 Flannel 等网络插件才能让集群正常工作。