本文所使用的配置文件,在GiHub项目中 https://github.com/aidansu/kubernetes-kubeadm-install
Kubernetes 版本为 1.14
服务器说明
我这里使用的是4台centos-7.5的虚拟机,具体信息如下表:
系统类型 | IP地址 | 节点角色 | CPU | Memory | Hostname |
---|---|---|---|---|---|
centos-7.5 | 192.168.0.51 | master | >=2 | >=2G | manager1 |
centos-7.5 | 192.168.0.60 | harbor | >=2 | >=2G | harbor |
centos-7.5 | 192.168.0.61 | worker | >=2 | >=2G | worker1 |
centos-7.5 | 192.168.0.62 | worker | >=2 | >=2G | worker2 |
集群数量可以根据自己的实际情况而定,建议最少应有一个master和两个worker。
系统设置(所有节点)
主机名
主机名必须每个节点都不一样,并且保证所有点之间可以通过hostname互相访问。
|
|
安装依赖包
|
|
关闭防火墙、swap,重置iptables
|
|
系统参数设置
|
|
如果生效文件时出现以下错误
12 sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directorysysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory执行以下代码后 再执行生效文件
1234 $ modprobe br_netfilter$ ls /proc/sys/net/bridge# 生效文件$ sysctl -p /etc/sysctl.d/kubernetes.conf
安装docker
如果安装过程遇到问题可以参阅官方文档:https://docs.docker.com/engine/install/centos/
|
|
设置参数,如最大分区是/,下面的设置可以跳过
123456789101112131415161718 # 1.查看磁盘挂载$ df -hFilesystem Size Used Avail Use% Mounted on/dev/sda2 98G 2.8G 95G 3% /devtmpfs 63G 0 63G 0% /dev/dev/sda5 1015G 8.8G 1006G 1% /tol/dev/sda1 197M 161M 37M 82% /boot# 2.选择比较大的分区$ mkdir -p /tol/docker-data$ cat <<EOF > /etc/docker/daemon.json{"graph": "/tol/docker-data"}EOF# 启动docker服务$ systemctl restart docker.service
安装必要工具(所有节点)
工具说明
- kubeadm: 部署集群用的命令
- kubelet: 在集群中每台机器上都要运行的组件,负责管理pod、容器的生命周期
- kubectl: 集群管理工具(可选,只要在控制集群的节点上安装即可)
安装方法
|
|
部署master
部署keepalived - apiserver高可用(两个master节点以上 单一master节点跳过这一步)
重要:如果是云环境,一般不支持自定义虚拟ip。这一步可以跳过了。下面所有用到虚拟ip的地方设置为其中某一台master的ip即可。
安装keepalived
创建keepalived配置文件
启动keepalived
部署master节点
|
|
如需重置master节点 执行以下操作
12 $ kubeadm reset$ rm -rf $HOME/.kube
部署网络插件(calico 或 weave)
- calico : 性能、灵活性高,功能全面,不仅提供主机和pod之间的网络连接,还涉及网络安全和管理。
- weave : 配置简便,提供了许多内置和自动配置的功能,因此除了添加网络规则之外,用户无需进行其他配置。
部署 calico
我们使用calico官方的安装方式来部署。
部署 weave
|
|
部署node节点
加入master
|
|
在master查看节点状态
使用 kubectl describe 命令来查看节点(Node)对象的详细信息、状态和事件(Event)
查看集群状态 确认各个组件都处于healthy状态
使用 kubectl get pod 命令查看各节点上各个系统 Pod 的状态
如果有pod提示Init:ImagePullBackOff,说明这个pod的镜像在对应节点上拉取失败,我们可以通过 kubectl describe pod 查看 Pod 具体情况,以确认拉取失败的镜像
加载ipvs相关模块
由于ipvs已经加入到了内核的主干,所以为kube-proxy开启ipvs的前提需要加载以下的内核模块:
在所有的Kubernetes节点执行以下脚本:
上面脚本创建了/etc/sysconfig/modules/ipvs.modules文件,保证在节点重启后能自动加载所需模块。 使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4命令查看是否已经正确加载所需的内核模块。
接下来还需要确保各个节点上已经安装了ipset软件包。 为了便于查看ipvs的代理规则,最好安装一下管理工具ipvsadm。
kube-proxy开启ipvs
修改ConfigMap的kube-system/kube-proxy中的config.conf,mode: “ipvs”:
之后重启各个节点上的kube-proxy pod:
查看日志:
测试集群各个组件
首先验证kube-apiserver, kube-controller-manager, kube-scheduler, pod network 是否正常:
部署一个 Nginx Deployment,包含2个Pod
参考:https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
|
|
验证Nginx Pod是否正确运行,并且会分配集群IP
再验证一下kube-proxy是否正常:以 NodePort 方式对外提供服务
检查各种ip连通性
可以通过任意 NodeIP:Port 在集群外部访问这个服务:
最后验证一下dns, pod network是否正常:
Pod调度到Master节点
出于安全考虑,默认配置下Kubernetes不会将Pod调度到Master节点。查看Taints字段默认配置:
1 $ kubectl describe node manager1如果希望将manager1也当作Node节点使用,可以执行如下命令,其中manager1是主机节点hostname:
1 $ kubectl taint node manager1 node-role.kubernetes.io/master-如果要恢复Master Only状态,执行如下命令:
1 $ kubectl taint node manager1 node-role.kubernetes.io/master=:NoSchedule移除节点
12345 #移除节点和集群 以移除worker1节点为例,在Master节点上运行:$ kubectl drain worker1 --delete-local-data --force --ignore-daemonsets$ kubectl delete node worker1#上面两条命令执行完成后,在worker1节点执行清理命令,重置kubeadm的安装状态:$ kubeadm reset在master上删除node并不会清理worker1运行的容器,需要在删除节点上面手动运行清理命令。
如果你想重新配置集群,使用新的参数重新运行kubeadm init或者kubeadm join即可。
移除podpod
123 #查看pod列表$ kubectl get pod --all-namespaces -o wide$ kubectl delete -n <namespace> pod <name>删除label删除应用
1 $ kubectl delete deployments -l app=nginx
部署dashboard可视化工具
部署服务
准备 /etc/kubernetes/addons/dashboard-all.yaml 文件
其中 image 为镜像仓库地址 这里是用的是:
registry.cn-qingdao.aliyuncs.com/wangxiaoke/kubernetes-dashboard-amd64:v1.10.0
创建服务 (node节点会自动拉取镜像)
查看服务运行情况
访问dashboard
为了集群安全,从 1.7 开始,dashboard 只允许通过 https 访问,我们使用nodeport的方式暴露服务,可以使用 https://NodeIP:NodePort 地址访问
关于自定义证书
默认dashboard的证书是自动生成的,肯定是非安全的证书,如果大家有域名和对应的安全证书可以自己替换掉。使用安全的域名方式访问dashboard。
在dashboard-all.yaml中增加dashboard启动参数,可以指定证书文件,其中证书文件是通过secret注进来的。
- –tls-cert-file
- dashboard.cer
- –tls-key-file
- dashboard.key
登录dashboard
Dashboard 默认只支持 token 认证,所以如果使用 KubeConfig 文件,需要在该文件中指定 token,我们这里使用token的方式登录