前言

Kubeadm 是一个 K8s 部署工具,提供 kubeadm init 和 kubeadm join,用于快速部 署 Kubernetes 集群。 官方地址

  1. # 创建一个 Master 节点
  2. kubeadm init
  3. # 将一个 Node 节点加入到当前集群中
  4. kubeadm join <Master节点的IP和端口 >

Kubeadm 降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可 控,推荐使用二进制包部署 Kubernetes 集群,虽然手动部署麻烦点,期间可以学习很 多工作原理,也利于后期维护。

1、安装要求

在开始之前,部署 Kubernetes 集群机器需要满足以下几个条件:

  • 一台或多台机器,操作系统 CentOS7.x-86_x64,安装
  • 硬件配置:2GB 或更多 RAM,2 个 CPU 或更多 CPU,硬盘 30GB 或更多
  • 集群中所有机器之间网络互通
  • 可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
  • 禁止 swap 分区

2、准备环境

  1. 软件环境 | 软件 | 版本 | | —- | —- | | 操作系统 | CentOS-7-x86_64-DVD-2003.iso | | Docker | 18-ce | | Kubernetes | 1.18.0 |
  1. 服务器规划 | 角色 | IP | | —- | —- | | k8s-master | 192.168.127.200 | | k8s-node01 | 192.168.127.201 | | k8s-node02 | 192.168.127.202 |

3、操作系统初始化配置

在每台服务器上均需执行,如有特殊则特殊说明

#安装wget以便获取数据包
yum install wget

#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

#关闭 selinux:
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 临时

#关闭 swap:
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
swapoff -a # 临时

#主机名(分别在对应服务器执行),后续用主机名代替ip地址说明:
hostnamectl set-hostname k8s-master #192.168.127.200
hostnamectl set-hostname k8s-node01 #192.168.127.201
hostnamectl set-hostname k8s-node02 #192.168.127.202

#在 k8s-master 添加 hosts:
cat >> /etc/hosts << EOF
192.168.127.200 k8s-master
192.168.127.201 k8s-node01
192.168.127.202 k8s-node02
EOF

#将桥接的 IPv4 流量传递到 iptables 的链:
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 生效
sysctl --system

#时间同步:
yum install ntpdate -y
ntpdate time.windows.com

4、安装Docker/kubeadm/kubelet

所有节点都需要安装Docker/kubeadm/kubelet

4.1 安装Docker

Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。

# k8s-master、k8s-node01、k8s-node02 全都执行
# 设置阿里源
[root@k8s-master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

# 安装
[root@k8s-master ~]# yum -y install docker-ce-18.06.1.ce-3.el7

# 启动及开机启动设置
[root@k8s-master ~]# systemctl enable docker && systemctl start docker

# docker 版本查看
[root@k8s-master ~]# docker --version
# k8s-master、k8s-node01、k8s-node02 全都执行
# 配置文件,设置阿里镜像源
[root@k8s-master ~]# mkdir /etc/docker
[root@k8s-master ~]# cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://0dhl3431.mirror.aliyuncs.com"]
}
EOF

# 配置完成,重启Docker
[root@k8s-master ~]# systemctl restart docker

4.2 添加阿里云YUM软件源

# k8s-master、k8s-node01、k8s-node02 全都执行
[root@k8s-master ~]# cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

4.3 安装kubeadm、kubelet、kubectl

# k8s-master、k8s-node01、k8s-node02 全都执行
[root@k8s-master ~]# yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
[root@k8s-master ~]# systemctl enable kubelet

这里指定版本安装,如不加版本号,默认安装最新版本

4、部署Kubernetes Master

# k8s-master节点执行
# 默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
[root@k8s-master ~]# kubeadm init \
  --apiserver-advertise-address=192.168.127.200 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.18.0 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16
# 当看到如下提示,说明已安装完成
Your Kubernetes control-plane has initialized successfully!

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

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

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

kubeadm join 192.168.127.200:6443 --token n3mudk.cmgtfepovgyilvoy \
    --discovery-token-ca-cert-hash sha256:798ebac41b255e74ce4c99f843e780cdb7c82c42302c293e5c3af7d416192e7e
# 安装完成后提示信息:To start using your cluster, you need to run the following as a regular user,需要执行如下操作
# k8s-master节点执行
[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 使用kubectl工具查看nodes
[root@k8s-master ~]# kubectl get nodes
NAME         STATUS     ROLES    AGE     VERSION
k8s-master   NotReady   master   4m54s   v1.18.0

因为要下载镜像,所以安装时间比较长,可以通过docker images查看已下载的镜像

5、加入Kubernetes Node

# 向集群添加新节点,执行在kubeadm init输出的kubeadm join命令
# 即安装完成时的提示信息:Then you can join any number of worker nodes by running the following on each as root:
# k8s-node01、k8s-node02 节点执行
[root@k8s-node01 ~]# kubeadm join 192.168.127.200:6443 --token n3mudk.cmgtfepovgyilvoy \
    --discovery-token-ca-cert-hash sha256:798ebac41b255e74ce4c99f843e780cdb7c82c42302c293e5c3af7d416192e7e

默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,操作如下:

[root@k8s-master ~]# kubeadm token create --print-join-command

每一次生成的token均不同,实际使用时以自己创建的token替换

6、部署CNI网络插件

# k8s-master节点执行
# 默认镜像地址无法访问,sed命令修改为docker hub镜像仓库
[root@k8s-master ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
[root@k8s-master ~]# kubectl apply -f kube-flannel.yml

# 查看插件安装情况
[root@k8s-master ~]#  kubectl get pods -n kube-system | grep kube-flannel
kube-flannel-ds-6z6ds                1/1     Running   0          8m46s
kube-flannel-ds-8t5gq                1/1     Running   0          8m46s
kube-flannel-ds-x2qhg                1/1     Running   0          8m46s

# 查看nodes状态
[root@k8s-master ~]# kubectl get nodes
NAME         STATUS   ROLES    AGE   VERSION
k8s-master   Ready    master   18m   v1.18.0
k8s-node01   Ready    <none>   11m   v1.18.0
k8s-node02   Ready    <none>   11m   v1.18.0

7、测试kubernetes集群

在Kubernetes集群中创建一个pod,验证是否正常运行:

# k8s-master节点执行
[root@k8s-master ~]# kubectl create deployment nginx --image=nginx
[root@k8s-master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
[root@k8s-master ~]# kubectl get pod,svc
NAME                        READY   STATUS    RESTARTS   AGE
pod/nginx-f89759699-tnv2c   1/1     Running   0          55s

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        20m
service/nginx        NodePort    10.103.63.117   <none>        80:32462/TCP   50s

浏览器访问地址:http://NodeIP:Port(这里是:http://192.168.127.201:32462)