Kubernetes 之一特性与 Kubeadm 方式搭建集群

Kubernetes 概述

Kubernetes 简介

Kubernetes 是 Google 开源的一个容器编排引擎,简称 K8s,是用 8 代替 8 个字符 ubernete 而成的缩写。Kubernetes 可用于管理云平台中多个主机上的容器化的应用,支持自动化部署、大规模扩缩容、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。Kubernetes 提供了应用部署、规划、更新、维护的一种机制。在 Kubernetes 中,可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。

各种部署方式的区别

传统的应用部署方式是通过插件或脚本来安装应用,这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新、回滚等操作;当然也可以通过创建虚拟机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。新的方式是通过部署容器方式实现,每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能够快速部署,由于容器与底层设施、机器文件系统解耦的,所以它能在不同云、不同版本操作系统间进行迁移。容器占用资源少、部署快,每个应用可以被打包成一个容器镜像,每个应用与容器间成一对一关系也使容器有更大优势,使用容器可以在 buildrelease 的阶段,为应用创建容器镜像,因为每个应用不需要与其余的应用堆栈组合,也不依赖于生产环境基础结构,这使得从研发到测试、生产能提供一致环境。类似地,容器比虚拟机轻量、更 “透明”,这更便于监控和管理。

Kubernetes 功能介绍

  • 自动装箱:基于容器对应用运行环境的资源配置要求自动部署应用容器
  • 自我修复:当容器运行失败时,会对容器进行重启;当所部署的 Node 节点有问题时,会对容器进行重新部署和重新调度;当容器未通过监控检查时,会关闭此容器直到容器正常运行时,才会对外提供服务
  • 水平扩展:通过简单的命令、用户 UI 界面或基于 CPU 等资源使用情况,对应用容器进行规模扩大或规模剪裁
  • 服务发现:用户不需使用额外的服务发现机制,就能够基于 Kubernetes 自身能力实现服务发现和负载均衡
  • 滚动更新:可以根据应用的变化,对应用容器运行的应用,进行一次性或批量式更新
  • 版本回退:可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退
  • 密钥和配置管理:在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署
  • 存储编排:自动实现存储系统挂载及应用,这特别对有状态应用实现数据持久化非常重要;存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph 等)、公共云存储服务
  • 批处理:提供一次性任务,定时任务,满足批量数据处理和分析的场景

Kubernetes 架构

应用部署架构分类

  • 无中心节点架构:GlusterFS
  • 有中心节点架构:HDFS、K8S

Kubernetes 集群架构

kubernetes-framework-2

Kubernetes 集群架构节点角色

kubernetes-framework-1

  • Master(主控节点):Kubernetes 集群控制节点,负责对集群进行调度管理,接受集群外的用户去集群操作请求。Master 由 API Server、Scheduler、ClusterState Store(ETCD 存储系统)和 Controller MangerServer 组成

    • Scheduler:节点调度,选择 Node 节点来应用部署
    • API Server:集群统一入口,以 RESTful 接口将数据交给 ETCD 存储系统
    • Controller MangerServer:处理集群中的常规后台任务,一个资源对应一个控制器
  • Node(工作节点):Kubernetes 集群工作节点,负责运行用户业务应用容器,Node 由 Kubelet、Kube-Proxy 和 ContainerRuntime 组成

    • Kubelet:负责 Pod 对应的容器的创建、启停管理,与 Master 节点协作,实现集群管理的基本功能
    • Kube-Proxy:提供 Kubernetes 的通信与负载均衡功能的重要组件

Kubernetes 核心概念

kubernetes-framework-3

Kubernetes 集群搭建

集群搭建方式

目前生产环境搭建 Kubernetes 集群主要有以下两种方式:

  • KubeadmKubeadm 是一个 Kubernetes 部署工具,提供 kubeadm initkubeadm join 命令,可用于快速搭建 Kubernetes 集群

  • 二进制包:从 Github 下载发行版的二进制包,手动部署每个组件,组成 Kubernetes 集群。Kubeadm 虽然降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,生产环境推荐使用二进制包搭建 Kubernetes 集群,虽然手动部署比较麻烦,但期间可以学习很多工作原理,也利于后期维护

集群搭建要求

搭建 Kubernetes 集群需要满足以下几个条件:

  • 一台或多台机器,建议操作系统 CentOS 7.x86_64
  • Master 节点的硬件配置:2GB 或更多 RAM,2 个 CPU 或更多 CPU,硬盘 20GB 或更多
  • Node 节点的硬件配置:4GB 或更多 RAM,4 个 CPU 或更多 CPU,硬盘 40GB 或更多
  • 集群中所有机器之间的网络可以互通
  • 系统内可以访问外网,需要拉取镜像
  • 禁用 swap 分区

集群搭建规划

Kubernetes 集群搭建规划分为单 Master 集群和多 Master 集群两种,为了提高集群的高可用性,生产环境一般采用后者的规划方案,如下图所示:

kubernetes-cluster-plan

Kubeadm 方式搭建单 Master 集群

搭建目标

-(1)在所有节点上安装 Docker 和 kubeadm
-(2)部署 Kubernetes Master
-(3)部署容器网络插件
-(4)部署 Kubernetes Node,将节点加入 Kubernetes 集群中
-(5)部署 Dashboard Web 页面,可视化查看 Kubernetes 资源

软件环境

软件版本安装方式
CentOS 7.93.10.0-1160.15.2.el7.x86_64 虚拟机
Dockerdocker-ce-18.06.1.ce-3.el7YUM
Kubelet1.18.0YUM
Kubeadm1.18.0YUM
Kubectl1.18.0YUM
Dashboard2.0.3Kubernetes

服务器规划

kubernetes-kubeadm-1

Host Name 角色 IPCPUMemoryDisk
k8s-mastermaster192.168.31.61>= 2C>=2G>=20G
k8s-node1node192.168.31.62>= 4C>=4G>=40G
k8s-node2node192.168.31.63>= 4C>=4G>=40G
k8s-node3node192.168.31.64>= 4C>=4G>=40G

系统初始化

值得一提的是,以下系统初始化操作都必须在所有节点上执行一次,重点包括在所有节点里安装 Docker、Kubelet、Kubeadm。这里要求 Kubelet、Kubeadm、Kubectl 的版本与 Docker 的版本互相匹配(兼容),不建议安装最新版本的 Docker,因为 Kubernetes 对最新版的 Docker 兼容不够及时,容易导致 Kubeadm 方式搭建 Kubernetes 集群失败。


关闭防火墙

1
2
3
4
5
# 临时关闭
# systemctl stop firewalld

# 永久关闭
# systemctl disable firewalld

关闭 selinux

1
2
3
4
5
# 临时关闭
# setenforce 0

# 永久关闭
# sed -i 's/enforcing/disabled/' /etc/selinux/config

关闭 swap

1
2
3
4
5
# 临时关闭
$ swapoff -a

# 永久关闭
# sed -i 's/.*swap.*/#&/' /etc/fstab

系统时间同步

1
2
3
4
5
# 安装时间同步工具
# yum install ntpdate -y

# 设置时间同步服务器
# ntpdate time.windows.com

安装 Docker,这是由于 Kubernetes 默认的 CRI(容器运行时)为 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
# 添加YUM源
# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

# 安装Docker(指定版本号,否则默认安装最新版本)
# yum -y install docker-ce-18.06.1.ce-3.el7

# 开机自启动Docker
# systemctl enable docker

# 启动Docker
# systemctl start docker

# 配置阿里的Docker镜像加速
# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}

# 重启Docker
# systemctl restart docker

# 查看Docker的版本
# docker --version

# 查看Docker的安装信息
# docker info

安装 Kubelet、Kubeadm、Kubectl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 添加YUm源
# vim /etc/yum.repos.d/kubernetes.repo
[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

# 安装(指定版本号,否则默认会安装最新版本)
# yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0

# 开机自启动Kubelet
# systemctl enable kubelet

# 提示:Kubelet安装完成后不需要手动启动,因为在Node节点成功加入集群之前,Kubelet自身会不断重启(期间会伴随着各种启动错误,这点不用在意)

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

1
2
3
4
5
6
7
# 添加路由规则
# vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1

# 配置生效
# sysctl --system

设置主机名

1
# hostnamectl set-hostname <hostname>

添加 hosts(Master 和各 Node 节点都配置)

1
2
3
4
5
6
# 添加hosts
# vim /etc/hosts
192.168.31.61 k8s-master
192.168.31.62 k8s-node1
192.168.31.63 k8s-node2
192.168.31.64 k8s-node3

部署 Master 节点

在 Master 节点执行 Kubeadm 初始化操作,--service-cidr--pod-network-cidr 一般都不需要更改,详细参数说明如下,点击查看详细的安装日志信息

  • --apiserver-advertise-address:Master 节点的 IP 地址
  • --kubernetes-version:Kubernetes 的版本号,必须与上面 Kubelet 的版本号一致
  • --apiserver-advertise-address:一般指定为 Haproxy + Keepalived 的 VIP
  • --image-repository:由于默认拉取镜像地址 k8s.gcr.io 国内无法访问,指定阿里云镜像仓库地址
  • --pod-network-cidr:指定 Pod Network 的地址范围,由于 Kubernetes 支持多种网络方案,而且不同网络方案对参数有各自要求,设置为 10.244.0.0/16 表示使用 Flannel 网络方案
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
# 执行初始化
# kubeadm init \
--apiserver-advertise-address=192.168.31.61 \
--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

# 当终端打印如下的提示信息,则说明Docker开始拉取镜像,这个过程比较耗时(严重依赖网速)
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'

# 初始化完成后,记录下终端最后打印的Kubeadm命令(如下),后续添加Node节点到集群时会使用到
### kubeadm join 192.168.1.109:6443 --token jve1cd.3ulp5fqifsptti23 --discovery-token-ca-cert-hash sha256:01229ee179cf13855dbf38bc050b3251928571996d60878f30ce13c08aaa62d5

# 查看Docker的镜像列表
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.aliyuncs.com/google_containers/kube-proxy v1.18.0 43940c34f24f 11 months ago 117MB
registry.aliyuncs.com/google_containers/kube-apiserver v1.18.0 74060cea7f70 11 months ago 173MB
registry.aliyuncs.com/google_containers/kube-controller-manager v1.18.0 d3e55153f52f 11 months ago 162MB
registry.aliyuncs.com/google_containers/kube-scheduler v1.18.0 a31f78c7c8ce 11 months ago 95.3MB
registry.aliyuncs.com/google_containers/pause 3.2 80d28bedfe5d 13 months ago 683kB
registry.aliyuncs.com/google_containers/coredns 1.6.7 67da37a9a360 13 months ago 43.8MB
registry.aliyuncs.com/google_containers/etcd 3.4.3-0 303ce5db0e90 16 months ago 288MB

在 Master 节点配置 Kubectl 工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建目录
# mkdir -p $HOME/.kube

# 拷贝配置文件
# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

# 文件授权
# chown $(id -u):$(id -g) $HOME/.kube/config

# 查询组件的状态
# kubectl get cs
NAME STATUS MESSAGE
ERROR etcd-0 Healthy {"health":"true"}
controller-manager Healthy ok
scheduler Healthy ok

# 提示:当上面的 STATUS 结果都为 "Healthy",表示组件处于健康状态,否则需要检查错误,如果排除不了问题,可以使用 "kubeadm reset" 命令重置集群后重新初始化

Master 节点安装 Flannel 网络插件

查看集群状态,此时的 Master 处于 “NotReady”(未就绪),这是因为集群中尚未安装 Flannel 网络插件,部署完网络插件后状态会自动变为 Ready

1
2
3
4
# 查看集群状态
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady master 12m v1.18.0

安装 Flannel 网络插件,若 kubectl apply -f 命令执行后提示网络连接失败,可留意文章后面给出的解决方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 安装Flannel网络插件
# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# 查询Pod组件的状态
# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-7ff77c879f-67rjn 1/1 Running 0 4m35s
coredns-7ff77c879f-xpq9h 1/1 Running 0 4m35s
etcd-k8s-master 1/1 Running 0 4m44s
kube-apiserver-k8s-master 1/1 Running 0 4m44s
kube-controller-manager-k8s-master 1/1 Running 0 4m44s
kube-flannel-ds-4jtp4 1/1 Running 0 2m36s
kube-proxy-8bbhk 1/1 Running 0 4m34s
kube-scheduler-k8s-master 1/1 Running 0 4m44s

# 提示:Flannel 网络插件安装完成后,需要耐心等待一段时间,直到 "kubectl get pods -n kube-system" 命令查询到的所有 Pod 组件的状态都为 Running 为止

当 Master 节点处于 Ready 状态,就可以开始将 Node 节点加入集群

1
2
3
4
# 查看集群状态
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 12m v1.18.0

将 Node 节点加入到 Kubernetes 集群

在各个 Node 节点里执行以下命令,向 Kubernetes 集群添加新节点,该命令是上述 kubeadm init 命令执行完成后在终端记录下来的

1
2
# 添加Node节点到集群
# kubeadm join 192.168.1.109:6443 --token jve1cd.3ulp5fqifsptti23 --discovery-token-ca-cert-hash sha256:01229ee179cf13855dbf38bc050b3251928571996d60878f30ce13c08aaa62d5

测试 Kubernetes 集群功能

在 Master 节点执行以下命令,查看集群中所有节点的状态,当它们的状态都为 Ready 时,表示 Kubernetes 集群已经成功搭建起来了。值得一提的是,集群中所有节点的状态变更为 Ready,这需要花较长时间,可能花十几分钟甚至几十分钟

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
# 查看集群状态
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 9m37s v1.18.0
k8s-node1 Ready <none> 2m43s v1.18.0
k8s-node2 Ready <none> 11s v1.18.0
k8s-node3 Ready <none> 1s v1.18.0

# 查询Pod组件的状态
# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-7ff77c879f-67rjn 1/1 Running 0 30m
coredns-7ff77c879f-xpq9h 1/1 Running 0 30m
etcd-k8s-master 1/1 Running 0 30m
kube-apiserver-k8s-master 1/1 Running 0 30m
kube-controller-manager-k8s-master 1/1 Running 0 30m
kube-flannel-ds-4jtp4 1/1 Running 0 28m
kube-flannel-ds-6k8sp 1/1 Running 0 23m
kube-flannel-ds-bzwrt 1/1 Running 0 23m
kube-flannel-ds-rc8vv 1/1 Running 0 23m
kube-proxy-8bbhk 1/1 Running 0 30m
kube-proxy-9f96v 1/1 Running 0 23m
kube-proxy-9j6qh 1/1 Running 0 23m
kube-proxy-bqm7t 1/1 Running 0 23m
kube-scheduler-k8s-master 1/1 Running 0 30m

# 查看集群版本
# kubectl version --short
Client Version: v1.18.0
Server Version: v1.18.0

# 提示:当各节点的 Linux 系统重启后,Kubernetes 集群里对应的组件会自动启动,不需要人为干预

在 Master 节点里创建一个 Nginx 容器,验证 Kubernetes 集群是否正常运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 创建Nginx容器
# kubectl create deployment nginx --image=nginx

# 暴露Nginx的端口
# kubectl expose deployment nginx --port=80 --type=NodePort

# 查看Pod组件
# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod/nginx-f89759699-59cb7 1/1 Running 0 2m1s

# 查看Svc
# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 48m
service/nginx NodePort 10.102.129.11 <none> 80:32517/TCP 10s

# 提示:浏览器访问 "http://<any_node_ip>:32517",若 Ngninx 容器在集群中创建并启动成功,则默认会打开 Nginx 的首页

Kubeadm 部署 Dashboard 可视化插件

在 Kubeadm 部署 Dashboard 可视化插件的流程中,以下所有操作都是直接在 Master 节点里执行,后续不再累述。


Dashboard 简介

在 Kubernetes 社区中,有一个很受欢迎的 Dashboard 项目,它可以给用户提供一个可视化的 Web 界面来查看当前集群的各种信息。用户可以用 Kubernetes Dashboard 部署容器化的应用、监控应用的状态、执行故障排查任务以及管理 Kubernetes 各种资源。

Dashboard 部署

执行 YAML 文件直接部署 Dashboard,这里的 Kubernetes 1.8 版本对应的 Dashboard 版本为 v2.0.3,两者的版本号必须匹配

1
2
# 部署
# kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml

查看 Dashboard 的运行状态,可以看到以 deployment 方式部署,运行了 2 个 Pod 及 2 个 Service

1
2
3
4
5
6
7
8
9
10
11
# 查看Pod的状态
# kubectl -n kubernetes-dashboard get pods
NAME READY STATUS RESTARTS AGE
dashboard-metrics-scraper-6b4884c9d5-wn22s 0/1 ContainerCreating 0 48s
kubernetes-dashboard-7f99b75bf4-fn956 0/1 ContainerCreating 0 48s

# 查看Svc的状态
# kubectl -n kubernetes-dashboard get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.96.115.247 <none> 8000/TCP 117s
kubernetes-dashboard ClusterIP 10.100.88.170 <none> 443/TCP 117s

Dashboard 暴露服务

这里作为演示,使用 NodePort 方式将 Dashboard 的服务暴露在集群外,指定使用 30443 端口(可自定义)

1
2
3
4
5
6
7
8
# 暴露Service
# kubectl patch svc kubernetes-dashboard -n kubernetes-dashboard -p '{"spec":{"type":"NodePort","ports":[{"port":443,"targetPort":8443,"nodePort":30443}]}}'

# 查看暴露的Service
# kubectl -n kubernetes-dashboard get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.96.115.247 <none> 8000/TCP 6m2s
kubernetes-dashboard NodePort 10.100.88.170 <none> 443:30443/TCP 6m2s

或者下载 YAML 文件,手动更改 Service 部分的端口,并以为 NodePort 方式进行部署

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
# 下载YAML文件
# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml

# 更改YAML文件
# vim recommended.yaml

---
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort
ports:
- port: 443
targetPort: 8443
nodePort: 30443
selector:
k8s-app: kubernetes-dashboard
---

# 更新配置
# kubectl apply -f recommended.yaml

Dashboard 认证方式登录

Dashboard 支持 Kubeconfig 和 Token 两种认证方式,这里选择 Token 认证方式登录,首先执行以下操作创建登录用户

1
2
3
4
5
# 创建YAML配置文件,复制下面的内容到文件中
# vim dashboard-adminuser.yaml

# 创建登录用户
# kubectl apply -f dashboard-adminuser.yaml

YAML 配置文件 dashboard-adminuser.yaml 的完整内容如下,指定了一个名称为 admin-user 的服务账号,并放在 kubernetes-dashboard 命名空间下,并将 cluster-admin 角色绑定到 admin-user 账户,这样 admin-user 账户就有了管理员的权限。默认情况下,Kubeadm 创建集群时已经创建了 cluster-admin 角色,只需直接绑定即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard

查看 admin-user 账户的 Token

1
2
# 查看Token
# kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

使用火狐浏览器打开 https://<any_node_ip>:30443,访问 Dashboard 的登录界面,由于谷歌浏览器会强制使用 HTTPS 协议,这将导致无法访问 Dashboard 的登录页面,因此建议使用火狐浏览器进行访问

kubernetes-dashboard-1

将获取到的 Token 复制到登录界面的 Token 输入框中,成功登陆 Dashboard

kubernetes-dashboard-2

Dashboard 登录超时

Dashboard 默认登录超时时间是 15min,可以为 Dashboard 容器增加 --token-ttl 参数来自定义超时时间,配置示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 下载YAML文件
# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml

# 更改YAML文件
# vim recommended.yaml

---
args:
- --auto-generate-certificates
- --namespace=kubernetes-dashboard
- --token-ttl=43200
---

# 更新配置
# kubectl apply -f recommended.yaml

Kubeadm 搭建集群问题总结

1
[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2

执行 kubeadm init 命令,提示 CPU 核心数少于 2,可以添加命令参数 --ignore-preflight-errors=NumCPU 忽略警告

1
[ERROR Swap]: running with swap on is not supported. Please disable swap

执行 kubeadm init 命令,提示启用了 swap 分区,可以添加命令参数 --ignore-preflight-errors 'Swap' 忽略错误

1
[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 19.03.1. Latest validated version: 18.09

执行 kubeadm init 命令,提示 Docker 的版本过高,可能与 Kubernetes 的版本不兼容

1
The connection to the server raw.githubusercontent.com was refused - did you specify the right host or port?

执行 kubectl apply -f 命令,提示网络链接失败,这是国内无法访问 raw.githubusercontent.com 导致,临时解决方法如下:

  • https://www.ipaddress.com 网站上查询 raw.githubusercontent.com 域名的真实 IP 地址
  • 更改系统的 /etc/hosts 配置文件,添加一行内容 185.199.108.133 raw.githubusercontent.com,将 185.199.108.133 替换为查询到真实的 IP 地址
  • 重新执行 kubectl apply -f 命令即可

参考资料