K8S-部署
一.kubeadm简介
K8S基础相关概念后续介绍,先使用kubeadm搭建k8s集群
由于原生K8S部署方式过于复杂,被广大k8s用户用户诟病,所以推动了像kubeadm、kops、kubespray等等,虽然原生k8s部署复杂,所以先使用kubeadm进行k8s部署
kubeadm介绍
Kubeadm 是一个工具,它提供了 kubeadm init 以及 kubeadm join 这两个命令作为快速创建 kubernetes 集群的最佳实践
kubeadm能做什么
- kubeadm init 启动一个 Kubernetes 主节点
- kubeadm join 启动一个 Kubernetes 工作节点并且将其加入到集群
- kubeadm upgrade 更新一个 Kubernetes 集群到新版本
- kubeadm config 如果使用 v1.7.x 或者更低版本的 kubeadm 初始化集群,您需要对集群做一些配置以便使用 kubeadm upgrade 命令
- kubeadm token 管理 kubeadm join 使用的令牌
- kubeadm reset 还原 kubeadm init 或者 kubeadm join 对主机所做的任何更改
- kubeadm version 打印 kubeadm 版本
- kubeadm alpha 预览一组可用的新功能以便从社区搜集反馈
kubeadm大大简化部署kubernetes的准备工作,尤其是配置文件,证书等的生成和制作
二.部署前的准备
多台主机hostname一定要不一样,我这里centos7使用 hostnamectl set-hostname 命令进行设置
这里我使用的是centos7,内核版本3.10.xxx,桥接网卡模式,配置静态IP
1.节点主机要求
- 每台机器 2 GB 以上的内存,内存不足时应用会受限制
- 主节点上 2 CPU 以上
- 集群里所有的机器有完全的网络连接,公有网络或者私有网络都可以
1.先关闭和禁用防火墙等
为了两台主机能够互通,先关闭防火墙
1 | systemctl stop firewalld |
禁用SELINUX
1 | setenforce 0 |
创建 /etc/sysctl.d/k8s.conf 文件,添加如下内容
1 | net.bridge.bridge-nf-call-ip6tables = 1 |
执行下面的命令使修改生效
1 | modprobe br_netfilter |
2.安装Docker
使用如下命令安装,我安装的是k8s v1.13.x,最高支持docker-ce 18.06 为了没有警告,我安装的是docker-ce 18.06版本
1 | sudo yum install -y yum-utils device-mapper-persistent-data lvm2 |
可以使用 (yum list docker-ce –showduplicates|sort -r) 查看docker-ce列表,使用( yum install docker-ce-xxxversion )进行安装制定版本docker,v1.13最高docker-ce 18.06
配置阿里云镜像加速器
1 | sudo mkdir -p /etc/docker |
3.安装kubeadm kubectl kubelet
执行如下命令
1 | cat <<EOF > /etc/yum.repos.d/kubernetes.repo |
4.关闭交换分区
k8s从1.8开始要求系统关闭交换分区,否则默认配置的kubelet无法启动
编辑 /etc/fstab ,注释有swap的那一行
用于永久禁用swap,并且使用下面的命令
1 | sudo swapoff -a |
5.kubeadm执行初始化,部署Master节点
初始化Master节点
1 | kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.50.231 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.13.4 |
- –pod-network-cidr :后续安装 flannel 的前提条件,且值为 10.244.0.0/16
- –apiserver-advertise-address :Master 节点的 IP 地址
- –image-repository registry.aliyuncs.com/google_containers 指定镜像下载地址,Kubenetes默认Registries地址是k8s.gcr.io,很明显,在国内并不能访问gcr.io,因此在kubeadm v1.13之前的版本,安装起来非常麻烦,但是在1.13版本中终于解决了国内的痛点,其增加了一个–image-repository参数,默认值是k8s.gcr.io,我们将其指定为国内镜像地址:registry.aliyuncs.com/google_containers,其它的就可以完全按照官方文档来愉快的玩耍了。
日志输出如下
1 | [init] Using Kubernetes version: v1.13.2 |
从下方日志看到,如果要运行集群必须执行下面的命令,拷出来执行一下
1 | mkdir -p $HOME/.kube |
执行完部署并没有结束,你可以看到日志上写到:你应该部署一个在集群中部署一个网络容器,使用kubectl apply -f xxx.yaml,可以从网络插件列表多个中选择一个,下面我还是用flannel进行演示
访问flannel的github,从README.md中看到For Kubernetes v1.7+
1 | kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml |
至此master节点部署结束,使用如下命令查看集群节点信息
1 | kubectl get nodes |
使用如下命令,查看pod
1 | kubectl get pods --all-namespaces |
提示:如果使用上面的命令发现节点的STATUS是NotReady,pod列表中kube-flannel-ds-amd64-mw6nl这些pod的STATUS还不是Running,可能需要等待一下,因为我在安装的时候就发现flannel所需的几个镜像拉到本地的过程有点慢
如果集群安装过程中还出现什么问题可以google,百度等,也可以加WX一起探讨下 Z3pyMTE5MTQ2NTA5Nw== (BASE64)…也可以使用如下命令重置
1 | kubeadm reset |
6.部署Worker节点
在准备好的第二台Centos7主机上部署Worker节点
执行上面的1 2 3 4 步骤
完成之后还记得上面日志中最后输出的kubectl join命令吗,执行上面输出的命令,让Worker加入Cluster
1 | kubeadm join 192.168.50.231:6443 --token iawrnt.h638e985j2cfqj2j --discovery-token-ca-cert-hash sha256:a7f92abb72e4028c214cf5290bb623049235307b39f74af186d11b3f06897e88 |
执行之后输出如下日志
1 | [preflight] Running pre-flight checks |
在主节点上执行如下命令可以看到worker的加入
1 | [root@localhost ~]# kubectl get nodes |
提示:token是有有效期的,默认24小时,如果超过这个明明就不能执行成功,必须在master上重新生成token
7.查看token和重新生成token
node节点join格式为
1 | kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash> |
1 | 执行如下命令可以查看到token的列表 |
8.安装部署dashboard
部署dashboard,因为这又是一个google镜像仓库的镜像,没办法,只能从阿里云镜像仓库先拉下来再改一下tag,曲线救国
1 | docker pull registry.cn-hangzhou.aliyuncs.com/kuberneters/kubernetes-dashboard-amd64:v1.10.1 |
接下来执行如下命令部署dashboard的pod
1 | kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended/kubernetes-dashboard.yaml |
可使用如下命令查看部署好的pod -n是制定namespace
1 | [root@localhost ~]# kubectl get pods -n kube-system |
需要注意的是,dashboard是一个web server,很多人无意中在公有云暴露了dashboard的端口,造成安全隐患,所以在1.7以后的dashboard默认只能通过proxy在本地访问,集群外部访问需要用到ingress