演示环境集群规划:
由于机器性能有限,也只能勉强搭建如下配置的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):
-
- Always:总是拉取镜像,每次容器启动或者重启时,都会从远程仓库拉取镜像。
- IfNotPresent:本地有则使用本地镜像,不会从远程仓库拉取镜像。
- 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
这次终于成功了。