任务2 搭建Kubernetes集群
任务目的
本任务将通过kubeadm工具搭建Kubernetes集群,在搭建前,还需要做一些yum源配置,Docker镜像加速,镜像预下载等准备动作。
本任务使用的容器镜像与相关的k8s组件或插件的关系为:
组件或插件 | 容器镜像 |
---|---|
pause |
|
etcd |
|
apiserver |
|
scheduler |
|
controller-manager |
|
kube-proxy |
|
coredns |
|
kubernetes-dashboard |
|
任务步骤
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
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和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有可能会出现
ErrImagePull
和ImagePullBackOff
问题。
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节点将通过该命令加入到集群中。
这时设置环境变量。
[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 ~]#
关闭防火墙服务,并禁止其自启动。
[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
添加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和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值>
加入完毕后,输入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
检查Node状态。
[root@k8s-master ~]# kubectl get nodes
这时Pod状态中的CoreDNS还没有正常工作,Node状态的STATUS
显示NotReady,说明现在集群因为还不具备网络功能,所以我们将在下一个任务安装网络插件。
学员评价