文章概要

演示环境集群规划:

由于机器性能有限,也只能勉强搭建如下配置的k8s集群,但是不影响我们使用和学习k8s集群。

角色

IP

操作系统

CPU&内存

硬盘

k8s-master

192.168.220.101

CentOS-7.5-x86_64

2核&2GB

20GB

k8s-node1

192.168.220.102

CentOS-7.5-x86_64

2核&2GB

20GB

k8s-node2

192.168.220.103

CentOS-7.5-x86_64

2核&2GB

20GB

一 CentOS7虚拟机配置

1.1 虚拟机软件网络配置

1.1.1 配置虚拟机的网络适配器

  • 右键 “CentOS7_64_10” -> 选择“设置”

 

  • 选择“网络适配器” -> 选择 “NAT模式” -> 确定

 

1.1.2 设置虚拟机使用静态IP

  • 找到菜单栏“编辑” -> “虚拟网络编辑器”

 

  • 点击“更改设置”

在Win10环境中,必须先点击“更改设置”,才能更改虚拟网络编辑器

 

  • 选择VMnet8

选择“VMnet8”,设置子网和子网掩码,其中子网的网段可以随意设置,但是尽量不要设置为1,因为1通常被家里的网络占用,容易产生网络冲突,我这里设置为220,尽量不设置为1即可。

 

  • NAT设置

仍然是上面的界面,设置完步骤3,单击“NAT设置”。

 

设置网关IP,网段的选择和前面的“子网IP”网段一致,二者都是220;设置网关地址:通常都是2,保持默认即可。最后点击确定。

 

  • 修改完成之后

先选择“应用”,再选择“确定”。

 

1.2 虚拟机内部网络配置

  • 修改Linux的ifcfg-ens33

打开Linux的终端窗口:

[root@bigdata10 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33

 

  • 修改主机名称
[root@bigdata10 ~]# vi /etc/hostname
bigdata10
  • 修改主机名称映射文件(hosts)

修改“/etc/hosts”,添加IP地址和名称的映射关系。

[root@bigdata10 ~]# vi /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.220.10         bigdata10
192.168.220.101        k8s-master
192.168.220.102        k8s-node1
192.168.220.103        k8s-node2
  • reboot重启虚拟机

验证网络连接是否配置成功。

 

查看是否能连接到外网,ping www.baidu.com

 

验证主机名称是否配置正确

 

1.3 Linux基础软件配置

1.3.1 安装epel-release

epel-release相当于一个软件仓库, 在CentOS系统中,大多数 rpm 包在官方repository 中找不到。

[root@bigdata10 ~]# yum install -y epel-release

1.2.1 安装wget

[root@bigdata10 ~]# yum install -y wget

1.3.3 关闭防火墙

在每个公司里面,通常单个服务器的防火墙都是关闭状态,公司整体对外设置一个非常安全的防火墙。

1.3.3.1 关闭firewalld

[root@bigdata10 ~]# systemctl stop firewalld
[root@bigdata10 ~]# systemctl disable firewalld.service 

1.3.3.2 将 SELinux 设置为 disabled模式

[root@bigdata10 ~]# vi /etc/selinux/config
SELINUX=disabled

1.3.3.3 关闭swap

在 kubelet 1.8 版本之后,必须关闭 swap,否则 kubelet 无法正常启动。

[root@bigdata10 ~]# vi /etc/fstab
# 注释掉下面这一行内容
#/dev/mapper/centos_bigdata10-swap swap                    swap    defaults        0 0

1.3.4 创建bigdata账号

通常都不能直接用root账号安装软件,因此需要创建一个权限比较大的运维账号bigdata。

[root@bigdata10 ~]# useradd bigdata
[root@bigdata10 ~]# passwd bigdata

为方便后续加sudo执行root权限的命令,给bigdata添加root权限

[root@bigdata10 ~]# chmod +w /etc/sudoers
[root@bigdata10 ~]# vi /etc/sudoers

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL

## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS

## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL
bigdata ALL=(ALL)       NOPASSWD:ALL

注意:bigdata这一行不能放在root行下面,因为所有用户都属于wheel组,先配置了bigdata拥有免密sudo功能,但是程序执行到%wheel行时,该功能覆盖会需要密码。所以bigdata需要放在%wheel这行的下面。

1.3.5 允许 iptables 检查桥接流量

1.3.5.1 br_netfilter

确保 br_netfilter 模块被加载,可以通过运行 lsmod | grep br_netfilter 来完成。如果想显示加载该模块,可执行sudo modprobe br_netfilter

[root@bigdata10 ~]# vi /etc/modules-load.d/k8s.conf
br_netfilter

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

为了让每个虚拟机节点上的 iptables,能够正确地查看桥接流量,需要修改如下配置信息。

[root@bigdata10 ~]# vi /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

1.3.6 配置虚拟机时间和Win10主机同步

[root@bigdata10 ~]# yum install -y ntpdate
[root@bigdata10 ~]# ntpdate time.windows.com

配置完所有内容之后,关闭Linux虚拟机,shutdown now

1.4 克隆3台虚拟机

在克隆虚拟机之前,必须要关闭掉基础虚拟机“bigdata10”。

  • 右键“CentOS7_64_10” -> “管理” -> “克隆”

 

  • 连续点击两次“下一步”,直到出现“克隆类型”界面

 

  • 创建虚拟机

 

  • 修改MAC地址

一般克隆完成后,虚拟机的网卡MAC地址会自动改变的,如果没有自动改变,可以手动修改。

选中虚拟机,选择网络适配器,然后点击右边的高级。

 

 

 

  • 启动克隆后的虚拟机

打开终端,修改虚拟机IP。

[root@bigdata10 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33

 

 

  • 生成UUID
[root@bigdata10 ~]# uuidgen
1af15a21-5da2-4c03-bfea-690ecece765f

再次修改ifcfg-ens33,将新生成的uuid复制进去

[root@bigdata10 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33

 

  • 修改克隆机的主机名
[root@bigdata10 ~]# vi /etc/hostname
k8s-master
  • 重启克隆机
[root@bigdata10 ~]# reboot
  • 最后克隆出一台k8s-master虚拟机。

虚拟机名称

虚拟机IP

k8s-master

192.168.220.101

注意:我目前只克隆出一个k8s-master,主要原因是,有些公共的软件需要在三台k8s虚拟机上安装,我选择在克隆出的k8s-master上安装,然后基于k8s-master,再克隆出k8s-node1和k8s-node2。

为什么不在基础虚拟机上克隆呢?因为基础虚拟机除了做k8s集群的基础机器,还有别的用途。

二 安装Docker

如果使用 Docker 作为 K8S 容器运行时的话,kubelet 需要先要通过 dockershim 调用Docker,再通过 Docker 去调用 containerd,这样的话就需要先按照 Docker。

需要在所有的虚拟机上都安装 Docker。

2.1 安装 Docker

2.1.1 下载Docker

[bigdata@k8s-master ~]$ sudo wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

2.1.2 安装Docker

[bigdata@k8s-master ~]$ sudo yum -y install docker-ce-18.06.1.ce-3.el7

2.1.3 启动Docker

设置开机默认启动Docker,并启动Docker

[bigdata@k8s-master ~]$ sudo systemctl enable docker && systemctl start docker

2.1.4 验证Docker版本

[bigdata@k8s-master ~]$ docker --version
Docker version 18.06.1-ce, build e68fc7a
[bigdata@k8s-master ~]$ 

2.2 设置Docker镜像源

2.2.1 设置Docker的阿里镜像源

修改文件 /etc/docker/daemon.json,没有这个文件就创建。

[bigdata@k8s-master ~]$ sudo vi /etc/docker/daemon.json
{
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}

镜像源有很多种,我这里只是选择了用阿里的镜像源,镜像源包括但不限于以下几种:

  • 网易:http://hub-mirror.c.163.com
  • Docker中国区官方:https://registry.docker-cn.com
  • 中国科技大学:https://docker.mirrors.ustc.edu.cn
  • 阿里巴巴:https://b9pmyelo.mirror.aliyuncs.com

2.2.2 重启Docker

[bigdata@k8s-master ~]$ sudo systemctl restart docker

2.2.3 验证Docker镜像源是否配置成功

[bigdata@k8s-master ~]$ sudo docker info

出现以下内容,表示安装成功。

 

2.3 添加阿里云yum软件源

[bigdata@k8s-master ~]$ sudo vi /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

2.4 安装kubeadm,kubelet和kubectl

2.4.1 安装kubeadm,kubelet和kubectl

我们选择安装比较稳定1.18版本

[bigdata@k8s-master ~]$ sudo yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0

 

2.4.2 设置成开机启动

设置为开机自动启动,如果先立刻启动服务,追加 --now:立刻启动服务

[bigdata@k8s-master ~]$ sudo systemctl enable kubelet --now kubelet

2.4.3 查看启动状态

[bigdata@k8s-master ~]$ systemctl status kubelet

未经过 kubeadm init 或者 kubeadm join,kubelet 会不断重启,这个是正常现象……,执行 init 或 join 后问题会自动解决,暂时不用理会kubelet.service

 

三 克隆k8s-node节点

在克隆虚拟机之前,必须要关闭掉虚拟机“k8s-master”。

  • 右键“CentOS7_64_101” -> “管理” -> “克隆”

 

  • 连续点击两次“下一步”,直到出现“克隆类型”界面

 

  • 创建虚拟机

 

  • 生成MAC地址

 

 

 

  • 启动克隆后的虚拟机

打开终端,修改虚拟机IP,生成uuid

[root@k8s-master ~]# uuidgen
e0d1ac32-0e52-409e-abf4-6ba15d38dbec
[root@k8s-master ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33

 

  • 修改克隆机的主机名
[root@k8s-master ~]# vi /etc/hostname
k8s-node1

 

  • 重启克隆机
[root@bigdata10 ~]# reboot
  • 参照克隆k8s-node1虚拟机的流程,克隆出另外一个虚拟机k8s-node2。

虚拟机名称

虚拟机IP

k8s-master

192.168.220.101

k8s-node1

192.168.220.102

k8s-node2

192.168.220.103

四 部署k8s Master

4.1 初始化kubeadm

在 192.168.220.101( k8s-master) 执行下面的命令。

[bigdata@k8s-master ~]$ sudo kubeadm init --apiserver-advertise-address=192.168.220.101 --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
  • --kubernetes-version:1.18.0
  • --image-repository:默认是官网k8s.gcr.io,需要换成阿里的镜像
  • --apiserver-advertise-address=192.168.220.101:这里的IP是k8s-master节点的IP
  • --service-cidr=10.96.0.0/12:用于指定SVG网络范围,默认值: 10.96.0.0/12
  • --pod-network-cidr=10.244.0.0/16:指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 –pod-network-cidr有自己的要求,这里设置为10.244.0.0/16 是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR。

正常执行之后,会出现successfully。

 

再通过docker命令验证一下,是否安装成功。

 

4.2 使用 kubectl 工具

根据 kubeadm init 输出的一部分提示,要使非 root 用户可以运行 kubectl,请运行以下命令:

 

  • 用bigdata账号执行以下命令:
[bigdata@k8s-master ~]$ mkdir -p $HOME/.kube
[bigdata@k8s-master ~]$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[bigdata@k8s-master ~]$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 查看k8s集群,有几个可用节点
[bigdata@k8s-master ~]$ kubectl get nodes

执行完成之后,发现只有一个k8s-master节点,现在还没有Node节点,并且还是NotReady状态。因此,需要在Node节点中执行一个命令,将Node节点加入到k8s集群。

 

五 加入 Kubernetes Node

5.1 将Node节点加入k8s集群

注意:这步操作是在Node节点执行,在k8s-node1和k8s-node2节点,执行以下命令。具体怎么做呢?

根据 kubeadm init 输出的一部分提示,要使用 root 用户运行以下命令。注意,你在操作的时候,一定要用你的机器生成的token,一定不要拷贝我的token

 

向集群添加node节点, 执行在 kubeadm init 输出的 kubeadm join 命令:

[root@k8s-node1 ~]# kubeadm join 192.168.220.101:6443 --token 71j0dp.b9g0yv4zpj1yy8dm --discovery-token-ca-cert-hash sha256:b1fc739c748a7de02cfcc6d0c59a581c29fe44deaf0289c4d06941d86692c8d8
[root@k8s-node2 ~]# kubeadm join 192.168.220.101:6443 --token 71j0dp.b9g0yv4zpj1yy8dm --discovery-token-ca-cert-hash sha256:b1fc739c748a7de02cfcc6d0c59a581c29fe44deaf0289c4d06941d86692c8d8

如果加入成功,会出现如下提示信息:

 

5.2 token有效期

token的默认有效时间是24小时,当token过期后,需要重新生成token。生成命令如下:

[bigdata@k8s-master ~]$ kubeadm token create --print-join-command

5.3 验证是否加入成功

[bigdata@k8s-master ~]$ kubectl get nodes

现在k8s-node1和k8s-node2两个工作节点,已经成功添加。但是,目前还是NotReady的状态,因为我们还没有配置网络组件。

 

六 安装Pod网络插件

6.1 安装CNI

在k8s-master节点安装CNI:Container Network Interface,必须要部署一个基于 Pod 网络插件的容器网络接口 (CNI),只有这样 Pod 才可以相互通信。由于这个镜像是国外的镜像,可能第一次执行失败,失败就多试几次

[bigdata@k8s-master ~]$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

出现下面的提示,就表示安装成功了。

 

6.2 验证是否成功安装

[bigdata@k8s-master ~]$ kubectl get pods -n kube-system

 

运行完成后,我们查看状态可以发现,已经变成了Ready状态了。

[bigdata@k8s-master ~]$ kubectl get nodes

 

七 搭建K8S Dashboard

7.1 下载dashboard文件

7.1.1 下载哪个版本最好

因为我们安装的是kubernetes1.18.0版本,应该安装哪个版本的dashboard最合适呢?我们登录到:
https://github.com/kubernetes/dashboard/releases

 

可见,dashboard的2.0.3版对kubernetes1.18.0支持的最好,我们就下载dashboard2.0.3。

7.1.2 下载方式

[bigdata@k8s-master ~]$ wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml

下载完成之后,不要着急安装,需要先修改几个地方。

7.2 修改recommended.yaml

  • 修改imagePullPolicy

直接用Notepad++连接到k8s-master服务器,大概在193行的位置,将imagePullPolicy: Always 改为imagePullPolicy: IfNotPresent

 

镜像拉取有三种策略(imagePullPolicy):

    1. Always:总是拉取镜像,每次容器启动或者重启时,都会从远程仓库拉取镜像。
    2. IfNotPresent:本地有则使用本地镜像,不会从远程仓库拉取镜像。
    3. Never:只使用本地镜像,从不拉取远程仓库镜像。
  • 在277行处增加imagePullPolicy: IfNotPresent
    spec:
      containers:
        - name: dashboard-metrics-scraper
          image: kubernetesui/metrics-scraper:v1.0.4
          imagePullPolicy: IfNotPresent			# 新增位置
          ports:
            - containerPort: 8000
              protocol: TCP
          livenessProbe:
            httpGet:
              scheme: HTTP
              path: /
              port: 8000

 

  • NodePort访问方式

为了便于本地访问,修改yaml文件,将service改为NodePort 类型

spec:
  type: NodePort						#增加type: NodePort
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30000				#增加nodePort: 30000
  selector:
    k8s-app: kubernetes-dashboard

 

注意:在新增和修改内容的时候,一定要注意对齐方式,否则会出错。

7.3 运行安装dashboard

  • 安装dashboard
[bigdata@k8s-master ~]$ kubectl apply -f recommended.yaml 

 

  • 验证后台进程是否启动成功

通过执行以下命令可知,服务被分配到了k8s-node1,对外端口为nodePort:3000(配置文件中设置的)。

[bigdata@k8s-master ~]$ kubectl get svc -n kubernetes-dashboard
[bigdata@k8s-master ~]$ kubectl get pod -n kubernetes-dashboard -o wide

 

在用谷歌浏览器访问时,因为镜像中默认自带的证书是一个不可信任的证书,因此,需要在高级中,选择仍然访问。

 

  • 获取token测试
[bigdata@k8s-master ~]$ kubectl get secret -n kubernetes-dashboard | grep kubernetes-dashboard-token
kubernetes-dashboard-token-kgpmq   kubernetes.io/service-account-token   3      3h53m

## 根据自己的运行结果输入命令
[bigdata@k8s-master ~]$ kubectl describe secret kubernetes-dashboard-token-kgpmq -n kubernetes-dashboard

 

 

  • 登录

输入万token值,登录。什么都看不见?为什么呢?因为我们还没有创建用户,没有权限哦。

 

7.4 配置登录权限

  • 创建用于登录的用户
[bigdata@k8s-master ~]$ kubectl create serviceaccount dashboard-admin -n kube-system
  • 关联权限
[bigdata@k8s-master ~]$ kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
  • 导出登录用户的token
[bigdata@k8s-master ~]$ kubectl get secret -n kube-system | grep dashboard-admin
dashboard-admin-token-rbbwv                      kubernetes.io/service-account-token   3      4m12s
[bigdata@k8s-master ~]$ 
[bigdata@k8s-master ~]$ kubectl describe secret dashboard-admin-token-rbbwv -n kube-system

 

  • 使用新生成的token

这次终于成功了。