使用kubeadm安装生产环境kubernetes

本文为基于kubeadm搭建生产环境级别高可用的k8s集群。

1. 环境准备

1.0. master硬件配置

参考:

Kubernetes集群Master节点上运行着etcd、kube-apiserver、kube-controller等核心组件,对于Kubernetes集群的稳定性有着至关重要的影响,对于生产环境的集群,必须慎重选择Master规格。Master规格跟集群规模有关,集群规模越大,所需要的Master规格也越高。

说明 :可从多个角度衡量集群规模,例如节点数量、Pod数量、部署频率、访问量。这里简单的认为集群规模就是集群里的节点数量。

对于常见的集群规模,可以参见如下的方式选择Master节点的规格(对于测试环境,规格可以小一些。下面的选择能尽量保证Master负载维持在一个较低的水平上)。

节点规模
Master规格
磁盘

1~5个节点

4核8 GB(不建议2核4 GB)

6~20个节点

4核16 GB

21~100个节点

8核32 GB

100~200个节点

16核64 GB

1000个节点

32核128GB

1T SSD

注意事项:

  • 由于Etcd的性能瓶颈,Etcd的数据存储盘尽量选择SSD磁盘。

  • 为了实现多机房容灾,可将三台master分布在一个可用区下三个不同机房。(机房之间的网络延迟在10毫秒及以下级别)

  • 申请LB来做master节点的负载均衡实现高可用,LB作为apiserver的访问地址。

1.1. 设置防火墙端口策略

生产环境设置k8s节点的iptables端口访问规则。

1.1.1. master节点端口配置

协议
方向
端口范围
目的
使用者

TCP

入站

6443

Kubernetes API server

所有

TCP

入站

2379-2380

etcd server client API

kube-apiserver, etcd

TCP

入站

10250

Kubelet API

自身, 控制面

TCP

入站

10259

kube-scheduler

自身

TCP

入站

10257

kube-controller-manager

自身

1.1.2. worker节点端口配置

协议
方向
端口范围
目的
使用者

TCP

入站

10250

Kubelet API

自身, 控制面

TCP

入站

30000-32767

NodePort Services

所有

添加防火墙iptables规则

master节点开放6443、2379、2380端口。

1.2. 关闭​​swap​​分区

1.3. 开启br_netfilter和bridge-nf-call-iptables

参考:https://imroc.cc/post/202105/why-enable-bridge-nf-call-iptables/

2. 安装容器运行时

在所有主机上安装容器运行时,推荐使用containerd为runtime。以下分别是containerd与docker的安装命令。

2.1. Containerd

1、参考:安装containerd

2、生成默认配置

3、修改CgroupDriver为systemd

k8s官方推荐使用systemd类型的CgroupDriver。

4、重启containerd

2.2. Docker

官方建议配置cgroupdriver为systemd。

2.3. Container Socket

运行时
Unix 域套接字

Containerd

unix:///var/run/containerd/containerd.sock

CRI-O

unix:///var/run/crio/crio.sock

Docker Engine (使用 cri-dockerd)

unix:///var/run/cri-dockerd.sock

3. 安装kubeadm,kubelet,kubectl

在所有主机上安装kubeadm,kubelet,kubectl。最好版本与需要安装的k8s的版本一致。

离线下载安装

4. 配置kubeadm config

参考:

4.1. 配置项说明

4.1.1. 配置类型

kubeadm config支持以下几类配置。

可以使用以下命令打印init和join的默认配置。

4.1.2. Init配置

kubeadm init配置中只有InitConfigurationClusterConfiguration 是必须的。

InitConfiguration:

  • bootstrapTokens

  • nodeRegistration

    • criSocket:runtime的socket

    • name:节点名称

  • localAPIEndpoint

    • advertiseAddress:apiserver的广播IP

    • bindPort:k8s控制面安全端口

ClusterConfiguration:

  • networking:

    • podSubnet:Pod CIDR范围

    • serviceSubnet: service CIDR范围

    • dnsDomain

  • etcd:

    • dataDir:Etcd的数据存储目录

  • apiserver

    • certSANs:设置额外的apiserver的域名签名证书

  • imageRepository:镜像仓库

  • controlPlaneEndpoint:控制面LB的域名

  • kubernetesVersion:k8s版本

4.2. Init配置示例

在master节点生成默认配置,并修改配置参数。

修改配置内容

安装完成后可以查看kubeadm config

5. 安装Master控制面

提前拉取镜像:

5.1. 安装master

部署参数说明:

  • --control-plane-endpoint:指定控制面(kube-apiserver)的IP或DNS域名地址。

  • --apiserver-advertise-address:kube-apiserver的IP地址。

  • --pod-network-cidr:pod network范围,控制面会自动给每个节点分配CIDR。

  • --service-cidr:service的IP范围,default "10.96.0.0/12"。

  • --kubernetes-version:指定k8s的版本。

  • --image-repository:指定k8s镜像仓库地址。

  • --upload-certs :标志用来将在所有控制平面实例之间的共享证书上传到集群。

  • --node-name:hostname-override,作为节点名称。

执行完毕会输出添加master和添加worker的命令如下:

5.2. 添加其他master

添加master和添加worker的差别在于添加master多了--control-plane 参数来表示添加类型为master

6. 添加Node节点

7. 安装网络插件

如果Pod CIDR的网段不是10.244.0.0/16,则需要加flannel配置中的网段更改为与Pod CIDR的网段一致。

7.1. 问题

原因:

宿主机节点有cni0网卡,且网卡的IP段与flannel的CIDR网段不同,因此需要删除该网卡,让其重建。

解决:

8. 部署dashboard

镜像: kubernetesui/dashboard:v2.5.0

默认端口:8443

9. 重置部署

删除flannel

10. 问题排查

10.1. kubeadm token过期

问题描述:

添加节点时报以下错误:

原因:token过期,初始化token后会在24小时候会被master删除。

解决办法:

基于新生成的token重新添加节点。

10.2. 修改kubeadm join的master IP或端口

kubeadm join命令会去kube-public命名空间获取名为cluster-infoConfigMap。如果需要修改kubeadm join使用的master的IP或端口,则需要修改cluster-info的configmap。

修改配置文件中的server字段

执行kubeadm join的命令时指定新修改的master地址。

参考:

最后更新于

这有帮助吗?