本文主要是参考了k8s官网的教程,并且镜像使用的是国内的阿里云的资源,保证了下载的速度。
准备工作
Kubernetes将集群中的机器划分为一个Master和一些Node。在Master上运行着集群管理相关的一组进程kube-apiserver、kube-controller-manager和kubescheduler,这些进程实现了整个集群的资源管理、Pod调度、弹性伸缩、安全控制、系统监控和纠错等管理功能,并且都是自动完成的。
Node作为集群中的工作节点,运行真正的应用程序,在Node上Kubernetes管理的最小运行单元是Pod。在Node上运行着Kubernetes的kubelet、kube-proxy服务进程,这些服务进程负责Pod的创建、启动、监控、重启、销毁,以及实现软件模式的负载均衡器。
以下操作每台机器上面都需要运行。
| IP | 系统版本 | 用途 |
|---|---|---|
| 192.168.1.77 | centos 7.7 | master |
| 192.168.1.78 | centos 7.7 | node1 |
配置要求如下:
- 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响您应用的运行内存)
- 2 CPU 核或更多
如下是安装的步骤流程图。

前期准备工作
kubeadm是Kubernetes官方提供的用于快速安装Kubernetes集群的工具,在安装之前,需要先做如下准备。
集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
节点之中不可以有重复的主机名、MAC 地址或 product_uuid。使用
sudo cat /sys/class/dmi/id/product_uuid命令对 product_uuid 校验。开启机器上的某些端口。请参考:检查所需端口
禁用交换分区。为了保证 kubelet 正常工作,您 必须 禁用交换分区
1
2
3
4# 关闭 swap
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab确保使用的是 iptables 工具不使用 nftables 后端。这是因为nftables 后端与当前的 kubeadm 软件包不兼容:它会导致重复防火墙规则并破坏
kube-proxy。RHEL 8 不支持切换到旧版本模式,因此与当前的 kubeadm 软件包不兼容。在 Debian 10 (Buster)、Ubuntu 19.04、Fedora 29 和较新的发行版本中会出现这种问题。关闭防火墙以及selinux
1
2
3
4
5
6
7# 关闭 防火墙
systemctl stop firewalld && systemctl disable firewalld
yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
# 关闭 SeLinux
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config修改主机名,需要设置不同的hostname:
1
2
3hostnamectl set-hostname master #或者 node1
echo "127.0.0.1 $(hostname)" >> /etc/hosts
timedatectl set-timezone Asia/Shanghai持久化journal日志,非必要。可以参考:https://blog.steamedfish.org/post/systemd-journald/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21mkdir /var/log/journal # 持久化保存日志的目录
mkdir /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
# 持久化保存到磁盘
Storage=persistent
# 压缩历史日志
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
# 最大占用空间 10G
SystemMaxUse=10G
# 单日志文件最大 200M
SystemMaxFileSize=200M
# 日志保存时间 2 周
MaxRetentionSec=2week
# 不将日志转发到 syslog
ForwardToSyslog=no
EOF
systemctl restart systemd-journald
安装docker
Kubernetes从1.6开始使用CRI(Container Runtime Interface)容器运行时接口,同时支持 Docker、CRI-O、Containered 等多种容器环境,但默认的容器运行时仍然是Docker,使用的是kubelet中内置dockershim CRI实现。安装方法请参考:Docker
由于 iptables 被绕过而导致流量无法正确路由的问题。您应该确保 在 sysctl 配置中的 net.bridge.bridge-nf-call-iptables 被设置为 1。
1 | modprobe br_netfilter |
可以使用 lsmod |grep br_netfilter查看模块是否有正常加载。
再运行安装,这里使用aliyun源:
1 | # 安装依赖包 http://dockerdocs.gclearning.cn/install/linux/docker-ce/centos/ |
对于使用systemd作为init system的Linux的发行版,使用systemd作为docker的cgroup driver可以确保服务器节点在资源紧张的情况更加稳定,因此这里修改各个节点上docker的cgroup driver为systemd。即:native.cgroupdriver=systemd
安装k8s工具
您需要在每台机器上安装以下的软件包:
kubeadm:用来初始化集群的指令。kubelet:在集群中的每个节点上用来启动 pod 和容器等,是一个持续运行的后台服务。kubectl:用来与集群通信的命令行工具。
kubeadm 不能 帮您安装或者管理 kubelet 或 kubectl,所以您需要确保它们与通过 kubeadm 安装的控制平面的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。 然而,控制平面与 kubelet 间的相差一个次要版本不一致是支持的,但 kubelet 的版本不可以超过 API 服务器的版本。 例如,1.7.0 版本的 kubelet 可以完全兼容 1.8.0 版本的 API 服务器,反之则不可以。官方文档:kubeadm
先配置K8S的yum源
1 | cat <<EOF > /etc/yum.repos.d/kubernetes.repo |
使用 yum list kubelet --showduplicates来查看可用的版本,默认可以直接进行安装:
1 | yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes |
加载ipvs模块
使用ipvs模块来替代iptables,性能更好,但不是必须。
1 | cat > /etc/sysconfig/modules/ipvs.modules <<EOF |
初始化master节点
官方文档是直接使用的是google源,但是国内是访问不了的,所以就必须修改源,有以下2种方法。
手工下载镜像法
docker pull
总体思路是使用 kubeadm config images list 先输出镜像名,然后替换为阿里源:
1 | # 获取依赖镜像列表 |
详细的操作如下:
1 | [root@master ~]# kubeadm config images list 2>/dev/null |sed -e 's/^/docker pull /g' -e 's#k8s.gcr.io#registry.cn-hangzhou.aliyuncs.com/google_containers#g' |
kubeadm init初始化
使用kubeadm init --kubernetes-version=1.17.2进行初始化,目前最新的 K8s 版本为 1.17.2,有关kubeadm说明可以参考: 官方中文文档
1 | [root@master ~]# kubeadm init --kubernetes-version=1.17.2 --pod-network-cidr=10.244.0.0/16 --image-repository=registry.aliyuncs.com/google_containers |
执行成功后,根据提示,根据拷贝 admin.conf 文件到当前用户相应目录下。
1 | mkdir -p $HOME/.kube |
kubeadm init主要执行了以下操作:
- [init]:指定版本进行初始化操作
- [preflight] :初始化前的检查和下载所需要的Docker镜像文件
- [kubelet-start] :生成kubelet的配置文件
/var/lib/kubelet/config.yaml,没有这个文件kubelet无法启动,所以初始化之前的kubelet实际上启动失败。 - [certs]:生成Kubernetes使用的证书,存放在
/etc/kubernetes/pki目录中。 - [kubeconfig] :生成 KubeConfig 文件,存放在/etc/kubernetes目录中,组件之间通信需要使用对应文件。
- [control-plane]:使用
/etc/kubernetes/manifest目录下的YAML文件,安装 Master 组件。 - [etcd]:使用
/etc/kubernetes/manifest/etcd.yaml安装Etcd服务。 - [wait-control-plane]:等待control-plan部署的Master组件启动。
- [apiclient]:检查Master组件服务状态。
- [upload-config]:更新配置
- [kubelet]:使用configMap配置kubelet。
- [mark-control-plane]:为当前节点打标签,打了角色Master,和不可调度标签,这样默认就不会使用Master节点来运行Pod。
- [bootstrap-token]:生成token记录下来,后边使用kubeadm join往集群中添加节点时会用到
- [addons]:安装附加组件CoreDNS和kube-proxy
查看结果
1 | # 执行如下命令查看pod信息,等待 3-10 分钟,直到所有的容器组处于 Running 状态 |
安装pod-network
运行 kubectl get nodes会发现node的状态是NotReady的,还需要安装网络插件,根据 官方文档pod-network 的说明,有支持多种插件。选用了weave-net。
1 | [root@master ~]# kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')" |
注意:如果 下载好的网络插件里面的网段必须跟初始化时指定的 serviceSubnet 一样,不然会出现问题。
去污点
即使只有一台 Master 主机,集群也是可以正常使用的,但默认情况下,出于安全考虑,集群不会在 control-plane 运行节点上部署 pods,如果需要正常使用单节点集群,需要使用如下命令解除该限制:
1 | [root@master ~]# kubectl describe nodes master |grep Taints |
使用yaml方法
使用kubeadm config print init-defaults 2>/dev/null >kubeadm-config.yaml可以打印集群初始化默认的使用的配置:
1 | apiVersion: kubeadm.k8s.io/v1beta2 |
由此可以简单一点,保留以下yaml文件:
1 | apiVersion: kubeadm.k8s.io/v1beta2 |
运行 kubeadm init --config kubeadm-config.yaml 进行初始化。成功之后,再安装pod-network网络插件。
可以使用 kubeadm config view 查看集群信息。
1 | [root@master ~]# kubeadm config view |
将node加入到集群
加入到集群的命令为:kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>
token未过期
默认情况下,kubeadm init成功之后,会默认生成一个token,默认是24小时有效的。如果未过期,可以使用以下方法获取。
使用 kubeadm join 指令加入,就是 kubeadm init 输出的最后一行,如果忘记了,可以使用kubeadm token create --print-join-command来查看如下:
1 | # 在master上面运行 |
回到 Master 节点使用kubectl get nodes查看集群,会看到node1是NotReady的状态,这是由于要下载images导致的,耐心一下:
1 | [root@master ~]# kubectl get nodes -o wide |
如果不想等待,可以先使用上面的方法,将 k8s.gcr.io/kube-proxy:v1.17.2 先下载下来。
token过期
如果超过了24小时,那可以创建一个新的token。
1 | [root@master ~]# kubeadm token create |
然后在要加的节点上面运行 kubeadm join 192.168.1.60:6443 --token mwuh2n.nraceakhrm79qjos --discovery-token-ca-cert-hash 4429d40f4060078508cc766e30116dde357d76ffb3450e7967fceaef21b400e4。
安装Dashboard
Dashboard 是基于网页的 Kubernetes 用户界面。您可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。您可以使用 Dashboard 获取运行在集群中的应用的概览信息,也可以创建或者修改 Kubernetes 资源(如 Deployment,Job,DaemonSet 等等)。例如,您可以对 Deployment 实现弹性伸缩、发起滚动升级、重启 Pod 或者使用向导创建新的应用。官方链接为:https://github.com/kubernetes/dashboard/tree/master/docs
安装方法如下:
1 | wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc5/aio/deploy/recommended.yaml |
这时就会自动下载镜像了。注意,目前Dashboard的namespace为 kubernetes-dashboard。可以运行 kubectl get pods -n kubernetes-dashboard来查看pod的状态。
第二步要需要创建RBAC。就是创建权限访问控制。
1 | apiVersion: v1 |
执行 kubectl create -f kubernetes-dashboard-admin.rbac.yaml 就可以了。或者使用以下方法快速创建:
1 | kubectl create serviceaccount admin-user -n kubernetes-dashboard |
第三步就是访问。这里特别要注意的是可以使用firefox浏览器访问这个地址:https://{master-ip}:6443/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login。没错,就是这么一长串的地址,其实这是API访问方式。
这时会要求输入一个token,可以使用使用来获取:ubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')。点击进入就可以了。
但这边有一个问题,就是chrome的浏览器不能访问,这是因为SSL证书是自签的,chrome不认,但可以这样做:
1 | # 生成client-certificate-data |
然后手动将证书导入chrome。正常情况下,Chrome的证书都是自动导入的。手动导入证书,只是非正常情况下才会用到,比如遇到“您打开的链接不是私密连接”,这个时候就需要手动导入证书了。点击浏览器 菜单-设置-高级-管理证书,选择“受信任的根证书颁发机构”这一栏,然后点击导入。(注意 版本的差别:chrome71选择个人)
然后根据步骤操作完。导入上面生成的p12文件后,重启浏览器chrome://restart,再次访问就可以了。
附:minikube安装集群
根据 Minikube - Kubernetes本地实验环境 以及 minikube官方文档 的说明,但是这些说明文档都没有说在 minikube start 之前需要做一些前期的准备工作,直接运行这条指令会出现各种各样的问题。所以我这边给出我自己认为正确的方式:
由于是在虚拟机上面做的测试,所以minikube只能运行在 --vm-driver=none的模式上,但官方实际上有说明了可能会出现各种各样的问题。还是不建议使用,用kubeadm搭建也很快速了。
第一步:准备工作,本文的第一部分都需要操作。但有一个需要注意的是:在安装k8s工具时,只需要安装kubectl即可。全部安装也是可以的。
第二步:下载minikube,以及使用阿里的源进行下载镜像。
1 | [root@localhost ~]# curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && sudo install minikube-linux-amd64 /usr/local/bin/minikube |
然后查看k8s的状态
1 | [root@localhost ~]# k get componentstatuses |
但有一个问题是coredns启动不了,提示 no route to host 无解中,求高手赐教。
1 | [root@localhost ~]# k get pod -A |grep core |
在 https://minikube.sigs.k8s.io/docs/examples/ 例子中,可以正常创建deployment以及svc的,但 minikube dashboard 运行是会报错的,还是放弃吧,用kubeadm吧。