利用 Kubeadm 创建 Kubernetes 集群之 Centos,你会了吗?

前记

Kubeadm 是一个工具,通过提供 kubeadm initkubeadm join 来作为创建 Kubernetes 集群的最佳实践 “快速路径”

简单理解就跟 Docker swarm 差不多吧,KubeadmGA 版本都已经发布了,那还等什么呢?

部署

资源版本
  1. CentOS 7.6 64
  2. Kubernetes version: v1.13.2
  3. Docker version 18.06

这里为什么使用 Docker 18.06 是因为 kubeadm now properly recognizes Docker 18.09.0 and newer, but still treats 18.06 as the default supported version.

所以我们默认还是使用 18.06

服务器

这里我们使用 CentOS 7.6 64,同时测试环境为阿里云服务器

IP Address Hostname CPU Memory
172.16.1.86 Master 2C 4G
172.16.1.87 Node1 2C 4G
172.16.1.88 Node2 2C 4G

这里注意一下服务器系统,目前官方已支持 Ubuntu 16.04+Debian 9CentOS 7RHEL 7

配置

关闭防火墙

1
2
3
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
systemctl stop firewalld && systemctl disable firewalld

设定 /etc/hosts

1
2
3
172.16.1.86 Master
172.16.1.87 Node1
172.16.1.88 Node2

禁用 Swap

1
swapoff -a && sysctl -w vm.swappiness=0

将配置中 net.bridge.bridge-nf-call-iptables 被设为 1

1
2
3
4
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
安装 Docker

在 3 台服务器上都安装上 Docker,此次实验 Docker 版本:Docker version 18.06

Centos Docker 安装文档

安装完成启动 Docker

1
systemctl enable docker.service
安装 K8s

在 3 台服务器上配置 YUM 源为阿里镜像源

1
2
3
4
5
6
7
8
9
cat <<EOF > /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
EOF

您需要在每台机器上都安装以下的软件包:

  1. kubeadm: 用来初始化集群的指令。
  2. kubelet: 在集群中的每个节点上用来启动 podcontainer 等。
  3. kubectl: 用来与集群通信的命令行工具。
1
2
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable kubelet && systemctl start kubelet

版本:Kubernetes version: v1.13.2

Master

Master 节点上配置 kubelet 所需的 cgroup 驱动

1
2
3
cat <<EOF >  /var/lib/kubelet/kubeadm-flags.env
KUBELET_EXTRA_ARGS=--cgroup-driver=cgroupfs
EOF

需要重启 kubelet

1
2
systemctl daemon-reload
systemctl restart kubelet

k8s.gcr.io 镜像本地化

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
kubeadm config images list //查看所需要的镜像

// 编辑脚本从hub获取镜像
vim k8s.sh

#!/bin/bash
docker pull coredns/coredns:1.2.6
docker tag coredns/coredns:1.2.6 k8s.gcr.io/coredns:1.2.6
docker rmi coredns/coredns:1.2.6
images=(
kube-apiserver:v1.13.2
kube-controller-manager:v1.13.2
kube-scheduler:v1.13.2
kube-proxy:v1.13.2
pause:3.1
etcd:3.2.24
)
for imageName in ${images[@]} ; do
docker pull mirrorgooglecontainers/$imageName
docker tag mirrorgooglecontainers/$imageName k8s.gcr.io/$imageName
docker rmi mirrorgooglecontainers/$imageName
done

// 编辑脚本权限
chmod +x k8s.sh

// 执行脚本
./k8s.sh

初始化 Master

1
kubeadm init --kubernetes-version=v1.13.2 --pod-network-cidr=10.244.0.0/16

配置 kubectl 认证信息

1
2
3
4
5
6
7
8
# 非root用户
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# root用户
export KUBECONFIG=/etc/kubernetes/admin.conf
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

安装网络插件 flannel

1
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
Node

Node 镜像本地化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 编辑脚本从hub获取镜像
vim k8s.sh

#!/bin/bash
images=(
kube-proxy:v1.13.2
pause:3.1
)
for imageName in ${images[@]} ; do
docker pull mirrorgooglecontainers/$imageName
docker tag mirrorgooglecontainers/$imageName k8s.gcr.io/$imageName
docker rmi mirrorgooglecontainers/$imageName
done

// 编辑脚本权限
chmod +x k8s.sh

// 执行脚本
./k8s.sh

将节点加入集群

1
kubeadm join 172.16.1.86:6443 --token xxx --discovery-token-ca-cert-hash xxx
Dashboard

未完待续…


题外话:

安装过程中可以用 tail -f 100 /var/log/messages 查看日志,便于找到问题所在