40分钟

任务2 搭建Kubernetes集群

任务目的

本任务将通过kubeadm工具搭建Kubernetes集群,在搭建前,还需要做一些yum源配置,Docker镜像加速,镜像预下载等准备动作。

本任务使用的容器镜像与相关的k8s组件或插件的关系为:

组件或插件

容器镜像

pause

k8s.gcr.io/pause:3.1

etcd

k8s.gcr.io/etcd:3.3.10

apiserver

k8s.gcr.io/kube-apiserver:v1.14.0

scheduler

k8s.gcr.io/kube-scheduler:v1.14.0

controller-manager

k8s.gcr.io/kube-controller-manager:v1.14.0

kube-proxy

k8s.gcr.io/kube-proxy:v1.14.0

coredns

k8s.gcr.io/coredns:1.3.1

kubernetes-dashboard

k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1

任务步骤

1.前期准备

关闭防火墙服务,并禁止其自启动。

关闭防火墙的原因是nftables后端兼容性问题,产生重复的防火墙规则,并会杀掉kube-proxy

[root@k8s-master ~]# systemctl disable firewalld
[root@k8s-master ~]# systemctl stop firewalld

临时关闭swap,并永久关闭swap分区。

关闭swap分区是因为如果具有可用的swap会与内存限制发生非常奇怪和不良的交互。例如,一个达到内存限制的容器随后将开始溢出到swap内存中。

[root@k8s-master ~]# swapoff -a
[root@k8s-master ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab

关闭SELinux,并修改/etc/sysconfig/selinux文件禁用SELinux。

在kubelet中改进SELinux支持之前,关闭SELinux是允许容器访问主机文件系统所必要的操作,例如pod网络所需的文件系统。

[root@k8s-master ~]# setenforce 0
[root@k8s-master ~]# vi /etc/sysconfig/selinux
禁用SELinux

2.Master节点安装Kubernetes

添加kubeadm相关yum源。

[root@k8s-master ~]# vi /etc/yum.repos.d/kubernetes.repo

添加如下内容:

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.cloud.tencent.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0

安装kubeadm和相关工具(如果已安装Docker,则取消下面命令中的docker)。

[root@k8s-master ~]# yum install -y docker-1.13.1 {kubelet,kubeadm,kubectl}-1.14.2-0.x86_64 kubernetes-cni-0.7.5-0.x86_64

安装完毕后,配置Docker镜像加速。

[root@k8s-master ~]# vi /etc/docker/daemon.json

添加"registry-mirrors": ["https://mirror.ccs.tencentyun.com"]内容,并保存。

内容如下:

{
  "registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}
配置docker镜像加速

启动Docker和Kubelet服务,并设置为开机自启动。

[root@k8s-master ~]# systemctl enable docker
[root@k8s-master ~]# systemctl start docker
[root@k8s-master ~]# systemctl enable kubelet
[root@k8s-master ~]# systemctl start kubelet

由于网络原因,访问不了谷歌官方提供的镜像仓库,所以使用Docker拉取能够访问到的仓库,并将这些镜像打上标签。以便kubeadm工具使用。

这里提前拉取了一些需要的Pod中的镜像,因为有的镜像仓库国内无法访问。如果不拉取的话,Pod有可能会出现ErrImagePullImagePullBackOff问题。

docker pull mirrorgooglecontainers/pause:3.1
docker tag docker.io/mirrorgooglecontainers/pause:3.1  k8s.gcr.io/pause:3.1

docker pull mirrorgooglecontainers/etcd:3.3.10
docker tag docker.io/mirrorgooglecontainers/etcd:3.3.10 k8s.gcr.io/etcd:3.3.10

docker pull mirrorgooglecontainers/kube-apiserver:v1.14.0
docker tag docker.io/mirrorgooglecontainers/kube-apiserver:v1.14.0 k8s.gcr.io/kube-apiserver:v1.14.0

docker pull mirrorgooglecontainers/kube-scheduler:v1.14.0
docker tag docker.io/mirrorgooglecontainers/kube-scheduler:v1.14.0 k8s.gcr.io/kube-scheduler:v1.14.0

docker pull mirrorgooglecontainers/kube-controller-manager:v1.14.0
docker tag docker.io/mirrorgooglecontainers/kube-controller-manager:v1.14.0 k8s.gcr.io/kube-controller-manager:v1.14.0

docker pull mirrorgooglecontainers/kube-proxy:v1.14.0
docker tag docker.io/mirrorgooglecontainers/kube-proxy:v1.14.0 k8s.gcr.io/kube-proxy:v1.14.0


docker pull coredns/coredns:1.3.1
docker tag docker.io/coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1

docker pull docker.io/mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.1
docker tag docker.io/mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.1 k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1

这时可以查看Docker上的镜像。

[root@k8s-master ~]# docker images
查看镜像

将上述镜像打包为k8s-master.tar文件(由于镜像文件比较大,打包过程需等待几十秒钟)。Node节点上的Pod创建时也需要其中一些镜像,使用打包好的镜像可以避免Node节点重复拉取镜像。

[root@k8s-master ~]# docker save  $(docker images | grep  -v REPOSITORY | grep -E "k8s"  |awk 'BEGIN{OFS=":";ORS="\n"}{print $1,$2}') -o k8s-master.tar

k8s-master.tar拷贝到作为Node1和Node2节点的CVM上,输入密码。

[root@k8s-master ~]# scp k8s-master.tar root@k8s-node1:/data/
[root@k8s-master ~]# scp k8s-master.tar root@k8s-node2:/data/
拷贝示例

运行kubeadm init安装Master。

[root@k8s-master ~]# kubeadm init --kubernetes-version=1.14.0

安装成功后,复制下图中的命令,Node1和Node2节点将通过该命令加入到集群中。

Master节点安装成功

这时设置环境变量。

[root@k8s-master ~]# vi /etc/profile

export KUBECONFIG=/etc/kubernetes/admin.conf添加到最后一行,并保存。

添加变量

将文件加载进内存,如果不做该步,接下来使用kubectl命令都会报以下错误。

[root@k8s-master ~]# . /etc/profile
无环境变量报错

3.Node节点加入Kubernetes集群

接下来远程连接作为Node1与Node2的CVM来进行操作,以下操作只在Node1讲解一次,Node2重复下述操作即可。

ssh连接Node1。

[root@k8s-master ~]# ssh root@k8s-node1
root@k8s-node1's password:
[root@k8s-node1 ~]#
ssh连接

关闭防火墙服务,并禁止其自启动。

[root@k8s-node1 ~]# systemctl disable firewalld
[root@k8s-node1 ~]# systemctl stop firewalld

临时关闭swap,并永久关闭swap分区。

[root@k8s-node1 ~]# swapoff -a
[root@k8s-node1 ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab

关闭SELinux,并修改/etc/sysconfig/selinux文件禁用SELinux。

[root@k8s-node1 ~]# setenforce 0
[root@k8s-node1 ~]# vi /etc/sysconfig/selinux
禁用SELinux

添加kubeadm相关yum源。

[root@k8s-node1 ~]# vi /etc/yum.repos.d/kubernetes.repo

添加如下内容:

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.cloud.tencent.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0

安装kubeadm和相关工具(如果已安装Docker,则取消下面命令中的docker)。

[root@k8s-node1 ~]# yum install -y docker-1.13.1 {kubelet,kubeadm,kubectl}-1.14.2-0.x86_64 kubernetes-cni-0.7.5-0.x86_64

安装完毕后,配置Docker镜像加速。

[root@k8s-node1 ~]# vi /etc/docker/daemon.json

添加"registry-mirrors": ["https://mirror.ccs.tencentyun.com"]内容,并保存。

内容如下:

{
  "registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}
配置docker镜像加速

启动Docker和Kubelet服务,并设置为开机自启动。

[root@k8s-node1 ~]# systemctl enable docker
[root@k8s-node1 ~]# systemctl start docker
[root@k8s-node1 ~]# systemctl enable kubelet
[root@k8s-node1 ~]# systemctl start kubelet

查看第2步中拷贝的镜像打包文件。

[root@k8s-node1 ~]# ls /data
查看镜像

导入镜像。

[root@k8s-node1 ~]# docker load -i /data/k8s-master.tar

导入完毕后,输入第2步最后复制的命令将CVM加入集群。

如果这时报“Unauthorized”错误,可以查看FAQ章节第一个问题。

[root@k8s-node1 ~]# kubeadm join <Master节点内网地址>:6443 --token <token值> \
    --discovery-token-ca-cert-hash <ca证书sha256编码的hash值>
Node1加入集群

加入完毕后,输入exit退出ssh连接,并通过ssh root@node2连接作为Node2节点的CVM。重复第3步操作。

[root@k8s-node1 ~]# exit
[root@k8s-master ~]# ssh root@k8s-node2
root@k8s-node2's password:
[root@k8s-node2 ~]#

完成Node2节点操作后,输入exit回到Master节点上继续操作。

4.检查集群状态

检查Pod状态。

[root@k8s-master ~]# kubectl get pods --all-namespaces
pod状态

检查Node状态。

[root@k8s-master ~]# kubectl get nodes
Node状态

这时Pod状态中的CoreDNS还没有正常工作,Node状态的STATUS显示NotReady,说明现在集群因为还不具备网络功能,所以我们将在下一个任务安装网络插件。