为了让产品在迎来业务量爆发式增长前完成应对措施,在浏览无数的资料后,决定将服务逐渐进行容器化,最终能达到容器集群的效果。而容器集群的解决方案中,kubernetes(简称k8s)看起来是个可行的方案。我目前的理解是,k8s就是docker容器集群的一个管理系统,有很多实用功能能提高开发、运维的效率。

 

尝试过使用在线部署的方式,当时记得即使配了代理有些资源仍然拉不下来,纠结了一天最后查找到了离线部署的教程(https://segmentfault.com/a/1190000012755243),这篇教程基本可以部署出可用的k8s。

本篇的部署内容和这个教程大体相同,我只是根据我部署的过程增补了一些描述和图片、修改了原教程中一些存在问题的内容。

 

节点配置信息表
节点主机名IPOSCPU核数  内存大小   
Master    K8s-master       192.168.12.21       centos 7       44G
Node1 K8s-node-1192.168.12.22centos 744G
Node2 K8s-node-2192.168.12.23centos 744G

 

 

 

  

 


 一、基础设置

 1.1 安装vim

yum install -y vim

 

 1.2 设置主机名

 Master上执行:

hostnamectl --static set-hostname  k8s-master

 Node1上执行:

hostnamectl --static set-hostname  k8s-node-1

 Node2上执行:

hostnamectl --static set-hostname  k8s-node-2

 

 # 重启

reboot

 

 1.3 分别修改三个节点的hosts文件,并使内容保持一致

# 编辑hosts文件

vim /etc/hosts

# 新增下面的内容,wq保存。

192.168.12.21 k8s-master
192.168.12.22 k8s-node-1
192.168.12.23 k8s-node-2

 

 1.4 关闭防火墙

这里为了部署方便,我跟原教程一样直接关了防火墙。

systemctl stop firewalld
systemctl disable firewalld

 

 1.5 关闭selinux

为了允许容器访问主机文件系统,这是pod网络所需的。目前必须这样做,直到在kubelet中改进SELinux支持。

# 编辑config文件

vim /etc/selinux/config

将SELINUX=enforcing改为SELINUX=disabled,wq保存。

 

# 当前临时关闭selinux(不重启临时关闭selinux的方式)

setenforce 0

 

 1.6 关闭swap

试验下来k8s需要关闭虚拟内存。

# 当前临时关闭虚拟内存

swapoff -a

 

# 修改/etc/fstab文件

vim /etc/fstab

 

# 加#注释掉下面的语句屏蔽SWAP的自动挂载,wq保存

#/dev/mapper/centos-swap swapswapdefaults0 0

 

# 查看内存使用情况

free -m

 

 1.7 配置路由参数,防止kubeadm报路由警告

CentOS 7上的某些用户报告了由于iptables被绕过而导致流量被错误路由的问题。你应该确保net.bridge.bridge-nf-call-iptables在你的sysctl配置中设置为1。试验下来即使是firewalld的也要修改配置。

# 将内容写入k8s.conf文件

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

 

# 立即生效

sysctl --system

 

 1.8 获取离线包

离线包链接:https://pan.baidu.com/s/1eTWTXSI 

密码:6uma

(教程里作者提供的文件中有个文件名和其教程的命令不一致,我修改该文件名后重新打包)

 

将k8s_images.tar.bz2上传到/root下。

 

# 安装 bzip2

yum install -y bzip2

 

# 解压k8s_images.tar.bz2

tar -xjvf k8s_images.tar.bz2

 

 


 二、部署docker

 选择安装docker1.2,因为官方建议的版本。1.11、1.13和17.03版本也可以。17.06+版本可能有效,但未经过Kubernetes团队的测试。

 

 2.1 安装

yum install -y docker

 

 2.2 启动

systemctl start docker
systemctl enable docker

 

 2.3 查看版本

docker version

 

 2.4 设置镜像加速器

墙的缘故,访问docker hub不够稳定,故需要设置镜像加速器来解决这个问题。
这里我使用的是阿里云的镜像加速器。登录阿里云后,访问https://cr.console.aliyun.com/#/accelerator

 

 ps:registry-mirrors的值必须带https:// (有段时间阿里云的教程中只有域名),否则会出现docker重启报错的情况。

 

 2.5 查看docker文件驱动 

docker info

这里我们主要是看cgroup driver。因为K8S要求cgroup driver与docker的保持一致。yum方式部署的应该是1.12.6,其Cgroup Driver为systemd。

 

 

 


 三、分别在三个节点上部署kubeadm、kubelet、kubectl

 3.1 导入镜像 

复制代码
docker load </root/k8s_images/docker_images/etcd-amd64_v3.1.10.tar
docker load </root/k8s_images/docker_images/flannel_v0.9.1-amd64.tar
docker load </root/k8s_images/docker_images/k8s-dns-dnsmasq-nanny-amd64_v1.14.7.tar
docker load </root/k8s_images/docker_images/k8s-dns-kube-dns-amd64_1.14.7.tar
docker load </root/k8s_images/docker_images/k8s-dns-sidecar-amd64_1.14.7.tar
docker load </root/k8s_images/docker_images/kube-apiserver-amd64_v1.9.0.tar
docker load </root/k8s_images/docker_images/kube-controller-manager-amd64_v1.9.0.tar
docker load </root/k8s_images/docker_images/kube-scheduler-amd64_v1.9.0.tar
docker load </root/k8s_images/docker_images/kube-proxy-amd64_v1.9.0.tar
docker load </root/k8s_images/docker_images/pause-amd64_3.0.tar
docker load </root/k8s_images/kubernetes-dashboard_v1.8.1.tar
复制代码

 

 3.2 安装

cd /root/k8s_images
rpm -ivh socat-1.7.3.2-2.el7.x86_64.rpm
rpm -ivh kubernetes-cni-0.6.0-0.x86_64.rpm  kubelet-1.9.9-9.x86_64.rpm
rpm -ivh kubectl-1.9.0-0.x86_64.rpm
rpm -ivh kubeadm-1.9.0-0.x86_64.rpm

 

 3.3 修改kubelet的配置文件

 kubelet默认的cgroup-driver和docker的不一样,docker有的版本可能是cgroupfs,kubelet默认为systemd,如果不修改则会引起kubelet启动失败。

vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

# 重新载入

systemctl daemon-reload

 

 3.4 启动

systemctl enable kubelet && systemctl start kubelet

ps:此时用systemctl status查看会发现服务没有完全起来,这是因为还缺少许多文件在K8S初始化补齐后才能完全运行,所以我们继续部署。

 


 四、部署master节点

 4.1 初始化k8s

kubeadm init --kubernetes-version=v1.9.0 --pod-network-cidr=10.244.0.0/16

 

 等待1分钟后,出现下面的内容。

如果长时间(等待的时间超过3分钟以上)始终停留在“[init] This might take a minute or longer if the control plane images have to be pulled.”,就要查看/var/log/message里的内容,是什么错误导致初始化失败。
排除错误后,先重置,再初始化。

# 初始化过程出现错误时,使用下面的命令重置
kubeadm reset
# 重置后再初始化
kubeadm init --kubernetes-version=v1.9.0 --pod-network-cidr=10.244.0.0/16

上图中的token信息要记得保留,等会node的加入需要使用。如果忘记了,可以在master上通过kubeadm token list得到。默认token在24小时后过期,后续的node要加入集群需要在master节点上用下面的命令重新生成token。

kubeadm token create

 

 4.2 配置环境变量

此时root用户还不能使用kubelet控制集群,还需要配置该环境变量。

# 将信息写入bash_profile文件

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

# 立即生效

source ~/.bash_profile

 

 4.3 查看版本

kubectl version

 

 4.4 安装flannel

离线包有yml文件,所以直接用。

# 创建flannel

kubectl create -f kube-flannel.yml

 


 五、部署node节点

 # 使用4.1保存的“kubeadm join”的命令,分别将各个node节点加入master(token信息请根据你实际部署的修改掉,这里只是我部署时生成的内容

kubeadm join --token 1ff84c.b7828d504656ba64 192.168.12.21:6443 --discovery-token-ca-cert-hash sha256:ceb2b93ce7543174b8fa87628fbe1f3926b5206915fee06629195ea8b4b89fe7 

根据提示,到master节点上检查下,在master上运行下面的命令。

kubectl get nodes

# kubernetes会在每个node节点创建flannel和kube-proxy的pod

 


 六、部署kubernetes-dashboard

虽然经过几天的学习常用的k8s命令已经能熟练使用了,但是有个页面能够显示信息总比自己一个个命令查询效率来的高,还好原教程的作者也将该页面的yaml文件保存在离线包里了。

由于k8s的工作负载都放在node节点上,所以等node部署完后才进行页面的部署。

 

 6.1 修改配置文件

# 编辑kubernetes-dashboard.yaml

cd /root/k8s_images
vim kubernetes-dashboard.yaml 

 

# 添加type: NodePort,暴露Dashboard服务。注意这里只添加行type: NodePort即可,其他配置不用改。

(我这里需要补个截图)

 

 6.2 创建

kubectl create -f kubernetes-dashboard.yaml

 

 6.3 设置端口

由于系统默认的有效端口为30000-32767,故需要修改kube-apiserver.yaml设置我们需要的端口范围。

# 修改kube-apiserver.yaml

vim /etc/kubernetes/manifests/kube-apiserver.yaml

 

# 添加下面的内容,wq保存。

    - --service-node-port-range=1-65535

ps:-与--之间的不是空格

 

 6.4 设置验证方式

默认验证方式有kubeconfig和token,这里都不用,我们使用basicauth的方式进行apiserver的验证。

 

# 创建/etc/kubernetes/pki/basic_auth_file, 用于存放用户名、密码、用户ID。

cat <<EOF >  /etc/kubernetes/pki/basic_auth_file
admin,admin,2
EOF

 

# 编辑kube-apiserver.yaml,给kube-apiserver添加basic_auth验证

cd /etc/kubernetes/manifests
vim kube-apiserver.yaml

 

# 添加下面的内容,wq保存。

    - --basic_auth_file=/etc/kubernetes/pki/basic_auth_file

ps:-与--之间的不是空格

 

 6.5 更新apiserver

改完kube-apiserver.yaml后如果直接更新kube-apiserver容器,有时会报“The connection to the server 192.168.12.21:6443 was refused - did you specify the right host or port?”,试验后发现在更新之前还需要重启kubelet。

# 重启kubelet

systemctl restart kubelet

# 更新kube-apiserver容器

cd /etc/kubernetes/manifests
kubectl apply -f kube-apiserver.yaml

 

 6.6 授权

k8s 1.6以后的版本都采用RBAC授权模型。

# 查看cluster-admin

kubectl get clusterrole/cluster-admin -o yaml

 

# 给admin授权。默认cluster-admin是拥有全部权限的,将admin和cluster-admin bind这样admin就有cluster-admin的权限。

kubectl create clusterrolebinding login-on-dashboard-with-cluster-admin --clusterrole=cluster-admin --user=admin

 

# 查看

kubectl get clusterrolebinding/login-on-dashboard-with-cluster-admin -o yaml

 

 6.7 登录

由于https证书的问题,暂时只能先通过火狐浏览器增加安全例外的方式访问http://192.168.12.21:32666(端口是6.1中kubernetes-dashboard.yaml文件原作者配置的32666,如果需要修改请在6.1中进行修改后再创建)

6.4中,我配置的用户名/密码为admin/admin,故使用该用户名密码登录。

 

这篇文章非常棒,我按照步骤来,完全没问题。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐