0%

使用 Kubeadm 安装 Kubernetes 集群

kubernetes 是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。

Kubernetes 有多种安装方式,比如麻烦无比的二进制安装方式,本篇文章主要讲解如何使用 Kubeadm 来安装 Kubernetes 集群。

前期准备工作

系统 角色 IP 主机名 内存(2G以上)
Centos 7 master 192.168.60.11 k8s-master-11.cn 2G
Centos 7 node 192.168.60.16 k8s-node-16.cn 2G
Centos 7 node 192.168.60.170 k8s-node-170.cn 2G

本文搭建的只是 Kubernetes 集群,而不是 Kubernetes 高可用集群,高可用集群需要多台 master 节点来避免 master 节点中某台服务可能宕机。下面这些前期准备,需要在所以服务器上执行一遍。由于本文使用的操作系统是 Centos,其中你是 Ubuntu 用户,请查看官方具体的操作

根据表格中的信息修改服务器主机名的,具体的主机名请根据自己实际命名修改。需要注意的是,必须保证每台服务器的主机名唯一。

1
2
3
4
5
# 修改主机名
hostnamectl set-hostname k8s-master-11.cn

# 查看主机名
hostname

向每台服务器上的 /etc/hosts 文件添加一下配置。因为只有三台服务器,我们直接修改 hosts 文件来指定,如果是很大的集群,每次添加一个节点,都要修改每台服务器的 hosts 文件,这样会很麻烦,所以可以选择使用dns去解析,但是我们这里只有几台服务器,就直接修改 hosts 文件即可。

1
2
3
192.168.60. k8s-master-252.cn
192.168.60.227 k8s-node-227.cn
192.168.60.15 k8s-node-15.cn

关闭防火墙

1
2
3
4
5
6
# 停止
systemctl stop firewalld.service
# 禁用
systemctl disable firewalld.service
# 查看防火墙状态
firewall-cmd --state

关闭服务器的 swap 交换空间

1
2
3
4
swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
# 查看交换free
free -m

安装 Docker, Kubernetes 官网的安装 Docker 教程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 如果已经安装,需要卸载的话,使用以下命令
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 安装依赖包
yum install yum-utils device-mapper-persistent-data lvm2

# 设置稳定的仓库
yum-config-manager --add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

# Install Docker CE.
yum update && yum install \
containerd.io-1.2.10 \
docker-ce-19.03.4 \
docker-ce-cli-19.03.4

# 配置docker 加速器:
mkdir /etc/docker

## 粘贴内容
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
"exec-opts": ["native.cgroupdriver=systemd"]
}

mkdir -p /etc/systemd/system/docker.service.d

# 重启docker
systemctl daemon-reload
systemctl restart docker

注意: 修改配置文件后,记得重启 Docker。

关闭 SElinux

1
2
3
4
5
# 关闭
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 查看状态
getenforce

同步服务器时间,并把时区设置为上海时区,如果是 Ubuntu 用户,请自行百度查询如何设置更新服务器时间。

1
2
3
4
5
6
7
# 同步时间
yum install -y ntpdate
# 设置时区
timedatectl set-timezone Asia/Shanghai

# 检查服务器时间是否同步
date

Centos7 用户还需要设置路由

1
2
yum install -y bridge-utils.x86_64
modprobe br_netfilter

将桥接的IPV4流量传递到iptables 的链

1
2
3
4
5
6
7
8
vi /etc/sysctl.d/kubernetes.conf

# 粘贴内容
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

# 刷新
sudo sysctl --system

设置 kubeadm 下载地址

1
2
3
4
5
6
7
8
9
10
11
vi /etc/yum.repos.d/kubernetes.repo

# 粘贴内容
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

下载 kubelet kubeadm kubectl

1
2
3
4
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

# 设置开机启动
systemctl enable --now kubelet

到此,每台服务器上的准备工作基本准备完成了。下面一节,将会讲解如何使用 kubeadm 初始化 kubernetes 集群。

Kubeadm 初始化 Kubernetes 集群

注意:在我们选定的 Master 节点的服务器上操作以下命令。

这里我使用的是配置文件初始化集群,如果你想直接使用命令,请查看官网的具体参数文档,kubeadm init 参数官网地址

1
2
# 生产配置文件
kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml

查看 kubeadm.yml 文件,并修改下面几个有备注的地方。其中主要修改的是主节点IP;镜像地址,这里我们使用的是阿里云镜像仓库;以及Pod 所在网段,如果你服务器所在的集群网段不和 192.168.0.0/16 冲突,可以不修改这个网段地址,使用默认即可。注意:如果修改了网段地址,需要在网络插件 calico 中修改 CALICO_IPV4POOL_CIDR 的默认值,改为你修改后的网段值。这里我就碰到一个坑,我的服务器网段是在 192.169.0.0 网段的,一开始,没修改默认时,安装 calico 时,一直出问题。后来查看 calico 官网文档,发现需要修改 kubernetes 默认网段,但是忘记修改 calico 中的默认值,然后又出现 Pod 中无法 PING 通集群服务器的IP 的问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
#修改为主节点IP
advertiseAddress: 192.168.60.11
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: k8s-master-1
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
#修改镜像仓库
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.17.0
networking:
# 配置 pod 所在网段和虚拟机所在网段不重复(这里用的是Flannel 默认网段),如果宿主机已经使用该网段,则必须更改网段
podSubnet: 10.244.0.0/16
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
scheduler: {}
1
2
3
4
5
6
7
8
9
10
11
12
# 查看需要下载镜像
kubeadm config images list --config kubeadm.yml

# 步骤一:拉取镜像
kubeadm config images pull --config kubeadm.yml

# 步骤二:初始化k8s
kubeadm init --config=kubeadm.yml --upload-certs | tee kubeadm-init.log

# 或者使用参数直接初始化master节点
kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.60.237
--upload-certs

执行成功后,会出现上面图中的信息,你需要在 master 节点执行第一个圈出的命令,这样你可以在master节点上使用 kubectl 命令;第二个圈出的命令,需要你在node节点上执行操作,将 node 节点加入 master 节点。

将node节点加入master节点后,使用kubectl get nodes 查看节点,你会发现这里有三台服务器,如下图所示,但是这时候,status状态不是下面显示的 Ready,而是 NotReady (PS:因为我这个截图是按照好后的截图),这表示集群之间网络时不互通的,需要安装网络插件,安装好网络插件后就会出现下面的信息了。

注意: Kubernetes 所以执行操作都是在master节点操作的,node节点主要是启动各种 Pod 的。

安装网络插件 Calico

Calico 官方地址

1
2
3
4
5
# 安装Calico
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

# 查看是否安装完成
watch kubectl get pods --all-namespaces

注意: 如果默认的宿主机的默认网段是192.168.0.0/16,则需要修改该网段,详情请看kubeadm master节点初始化步骤。如果修改了Kubernetes Pod 的网段地址,需要在 calico.yaml 中修改 CALICO_IPV4POOL_CIDR 对应的值,这个值的默认值为 192.168.0.0/16,然后修改为kubeadm 中修改后的值。如下图所示:

新增 node 节点

如果需要新增新的node节点,你需要执行上面的前期准备工作,然后使用下面的命令,获取 token 和 SHA256,然后在新的节点上,执行 kubeadm join 命令,将新节点加入集群,具体命令请看下面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 查看 Token
kubeadm token list

# 创建新的token
kubeadm token create

# 查看 Kubernetes认证的SHA256加密字符串
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

# 新Node节点使用命令加入,根据得到的token和SHA256替换
kubeadm join 192.168.60.252:6443 --token bq9xsp.bpf3zfl7mndpl9h2 \
--discovery-token-ca-cert-hash sha256:937e143e3bd79a24f1cdefd2693072484757beeb06869af07ba4962a78b4544d

#查看工作节点
kubectl get nodes

# 打印kubeadm join 命令
kubeadm token create --print-join-command
客官,赏一杯coffee嘛~~~~