===============================================
2018/3/22_第2次修改 ccb_warlock
更新说明:
2018/3/22:修改了6.7中k8s-dashboard中url错误的问题;
===============================================
为了让产品在迎来业务量爆发式增长前完成应对措施,在浏览无数的资料后,决定将服务逐渐进行容器化,最终能达到容器集群的效果。而容器集群的解决方案中,kubernetes(简称k8s)看起来是个可行的方案。我目前的理解是,k8s就是docker容器集群的一个管理系统,有很多实用功能能提高开发、运维的效率。
尝试过使用在线部署的方式,当时记得即使配了代理有些资源仍然拉不下来,纠结了一天最后查找到了离线部署的教程(https://segmentfault.com/a/1190000012755243),这篇教程基本可以部署出可用的k8s。
本篇的部署内容和这个教程大体相同,我只是根据我部署的过程增补了一些描述和图片、修改了原教程中一些存在问题的内容。
节点配置信息表 | |||||
节点 | 主机名 | IP | OS | CPU核数 | 内存大小 |
Master | K8s-master | 192.168.12.21 | centos 7 | 4 | 4G |
Node1 | K8s-node-1 | 192.168.12.22 | centos 7 | 4 | 4G |
Node2 | K8s-node-2 | 192.168.12.23 | centos 7 | 4 | 4G |
一、基础设置
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证书的问题,暂时只能先通过火狐浏览器增加安全例外的方式访问https://192.168.12.21:32666(端口是6.1中kubernetes-dashboard.yaml文件原作者配置的32666,如果需要修改请在6.1中进行修改后再创建)
6.4中,我配置的用户名/密码为admin/admin,故使用该用户名密码登录。
参考资料:
1.https://segmentfault.com/a/1190000012755243
2.《kubernetes权威指南》
3.https://kubernetes.io/docs/setup/independent/install-kubeadm/