Home / PostsPost
使用 kubeadm 搭建一套kubernetes集群
嘟噜聪2018/09/08 05:51:21 5463人已阅
简介 上一篇我们讲了一下《如何基于Golang设计一套微服务架构》,那么这篇我们来填上次挖的一些坑。为了实现微服务架构, 我们需要搭建一个基础的平台。
使用 kubeadm 搭建一套kubernetes集群
上一篇我们讲了一下《如何基于Golang设计一套微服务架构》,那么这篇我们来填上次挖的一些坑。
为了实现微服务架构, 我们需要搭建一个基础的平台。
在安装前需做些设置让系统环境一致,确保后面顺利安装。
以下安装方式或配置方式仅限于在开发、测试环境快速度使用,生产不建议这么搞,需要把一些组件独立拆分出来。
硬件、系统配置
本套硬件使用的是PC,每台配置有1T硬盘。因资源不够等问题,我们会把其他工具也分别部署在这几台电脑上。
角色 | 配置 | IP | HOSTNAME |
---|---|---|---|
master | 8核32G | 10.106.145.44 | dev-01 |
node | 8核16G | 10.106.145.43 | dev-03 |
node | 8核16G | 10.106.145.45 | dev-02 |
可能需要在 /etc/hosts 加入你每个节点的ip及指向的名称
10.106.145.43 dev-03
10.106.145.44 dev-01
10.106.145.45 dev-02
系统设置
以下这几项很重要
为了减少一些不必要的麻烦,我们先把防火墙、Swap、Selinux都设置为关闭的状态,要不然安装时或加入集群时总是会出现各处各样的问题。
关闭防火墙
$ systemctl stop firewalld
$ systemctl disable firewalld
关闭swap内存
Kubernetes 1.8开始要求关闭系统的Swap,如果不关闭,默认配置下kubelet将无法启动。
- 方法一: 通过kubelet的启动参数–fail-swap-on=false更改这个限制。
方法二: 关闭系统的Swap。
$ swapoff -a $ sed 's/.*swap.*/#&/' /etc/fstab
或修改/etc/fstab文件,注释掉SWAP的自动挂载,使用free -m确认swap已经关闭。
关闭selinux
$ setenforce 0
编辑文件/etc/selinux/config,将SELINUX修改为disabled,如下:
SELINUX=disabled
如果没有可以试试各种目录:
$ sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/sysconfig/selinux
$ sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
$ sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/sysconfig/selinux
$ sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/selinux/config
安装k8s基础设施
分别在每台机器上安装docker、kubelet、kubeadm和kubectl,详细看官方文档。
安装Docker
Docker 建议使用最新的,因为17.xx 的某个版本似乎是有个小问题。或者您也可以参照Docker官方给出的方案 https://docs.docker.com/install/linux/docker-ce/
如果无法安装,请加vpn或使用代理,国内你们都懂的。
$ apt-get update && apt-get install -y apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
$ add-apt-repository \
"deb https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") $(lsb_release -cs) stable
deb http://apt.kubernetes.io/ kubernetes-xenial \
main"
# 先安装docker
$ apt-get update && apt-get install -y docker-ce=$(apt-cache madison docker-ce | grep 18.04 | head -1 | awk '{print $3}')
配置Docker
创建daemon.json文件设置为国内镜像:
$ vim /etc/docker/daemon.json
输入以下代码保存:
{ "registry-mirrors": ["https://registry.docker-cn.com"] }
- 开启iptables filter表的FORWARD链
编辑
/lib/systemd/system/docker.service
,在ExecStart=..
上面加入如下内容:ExecStartPost=/usr/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT
- 配置Cgroup Driver
创建文件/etc/docker/daemon.json,添加如下内容:
{ "exec-opts": ["native.cgroupdriver=systemd"] }
重启Docker服务
$ systemctl daemon-reload && systemctl restart docker && systemctl status docker
安装 kubelet、kubeadm和kubectl
如果无法安装,请加vpn或使用代理,国内你们都懂的。
```
$ apt-get update && apt-get install -y apt-transport-https
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
$ cat <
假设报有 cni错误 试试 apt-get install -y kubernetes-cni 不过咱们不使用这种方式
确保cgroup与kubelet所使用的驱动程序是一样的:
$ docker info | grep -i cgroup $ cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
如果Docker 的cgroup 驱动与 kubelet配置不匹配,改变kubelet配置Docker 的cgroup驱动。你需要改变的标志是——cgroup-driver:
$ sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
重新启动 kubelet
$ systemctl daemon-reload $ systemctl restart kubelet
**记得在每台机器上都安装以上工具及配置**
## 创建master节点
如果之前有设置master 想重新安装执行:
$ kubeadm reset
$ systemctl daemon-reload $ systemctl stop kubelet $ docker rm -f $(docker ps -q); mount | grep "/var/lib/kubelet/" | awk '{print $3}' | xargs umount 1>/dev/null 2>/dev/null; $ rm -rf /var/lib/kubelet /etc/kubernetes /var/lib/etcd /etc/cni $ rm -rf /root/.kube/ $ systemctl start kubelet
选择一台性能较好的机器,我们以**dev-01**作为Master来使用。
![](http://source.lattecake.com/images/2018/09/cf/f1/70/20180909-5d9b117c604d00fc7d6fe59af15cfe69.jpeg)
可以先生成,然后 init 的时间指定,也可以不先生成init后会自动创建token。
$ kubeadm token generate // 可以水 $ kubeadm init –apiserver-advertise-address dev-01 // 也可以水 --pod-network-cidr=10.244.0.0/16
没报错应该就算成功了:
![](http://source.lattecake.com/images/2018/09/2c/a8/ba/20180909-e976ba26f37dabd4b9052572a842c06c.jpeg)
如果失败了,查看失败原因:
1. 上面**系统设置**写的要关闭的东西有没有关闭
2. 通过命令`journalctl -f -u kubelet`查看日志尝试解决
3. Github 搜
4. Google 搜
5. `kubeadm reset` 再来一遍(⁎⁍̴̛ᴗ⁍̴̛⁎)
$ mkdir -p $HOME/.kube $ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config $ sudo chown $(id -u):$(id -g) $HOME/.kube/config
如果是root用户,可使用环境变量设置配置文件:
$ export KUBECONFIG=/etc/kubernetes/admin.conf
按照上面提示执行以下命令,kubectl 命令需要连接的配置文件放到`$HOME/.kube/config` 目录,为什么呢?
查看kubeclt源码不难发现:
![](http://source.lattecake.com/images/2018/09/fb/77/00/20180909-d84d7b1fcab90b2101b6149d770fb12a.jpeg)
它优先获取环境变量`KUBECONFIG`,如果没有则读取当前用户HOME目录下的/.kube/config配置文件
### 将Node加入到Master组成集群
加入到master需要使用mast init生成的一段命令:
$ kubeadm join --token
保存好上面那条命令(master创建成功后会在最后留下一条命令),后续其他node 需要加入集群时通过这条命令加入:
$ kubeadm join 10.106.145.44:6443 --token g8z3gc.ujlihp9kr3oyakgp --discovery-token-ca-cert-hash sha256:1739ed5374f1975b73ceba833d6a5c6c11f2dcf550967e2b813b0ab7d83736c1
如果忘记了token 可以在master使用命令:
$ kubeadm token list | grep authentication,signing | awk '{print $1}'
如果 `discovery-token-ca-cert-hash` 也不记得了, 也可以通过以下命令查询:
$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
![](http://source.lattecake.com/images/2018/09/45/5f/95/20180909-db7bb70e1d15510395d9f1995fd45525.jpeg)
> 这里需要注册, token只会保存24小时如果过期,并且要有新节点加入的话需要执行: `$ kubeadm token create` 创建一个新的token
登陆到已经安装和配置好docker、kubeadm、kubelet的服务器上执行刚刚保存的命令。
![](http://source.lattecake.com/images/2018/09/23/b9/17/20180909-87dbf62e320879fa14f8acecb93234e5.jpeg)
如果没有有报错,那应该是加入成功了,如果有报错试试执行:
$ kubectl reset
当然前提必须是**系统设置**确定已经配置好了。
回到master节点查看node 是否加入成功。
![](http://source.lattecake.com/images/2018/09/5b/54/ee/20180909-4e26f49de067e366e93aef445445b782.jpeg)
通常到这一步都是NotReady,为什么呢?因为我们还没安装网络组件。
查看kubelet 日志 : `journalctl -f -u kubelet`
查看集群状态:
$ kubectl get cs
![](http://source.lattecake.com/images/2018/09/17/39/0e/20180909-ace5655b2d0be525002cab1039b17392.jpeg)
如果有遇到以下这样的错误:
[preflight] WARNING: ebtables not found in system path
[preflight] WARNING: ethtool not found in system path
尝试安装或升级一下 `ebtables`, `ethtool`
- CentOS: `yum install ebtables ethtool`
- Ubuntu: `apt install ebtables ethtool`
#### Node的隔离与恢复
如果发现node有问题,可以使用以下命令对node进行隔离或恢复。
![](http://source.lattecake.com/images/2018/09/c9/db/48/20180909-cc3133047804895a49d1050ddb1c9681.jpeg)
### 安装网络
推荐使用`Calico`, 为了方便这里以官方的flannel为例:
安装网络:
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k8s-manifests/kube-flannel-rbac.yml $ kubectl create -f https://github.com/coreos/flannel/raw/master/Documentation/kube-flannel-rbac.yml $ kubectl create -f https://github.com/coreos/flannel/raw/master/Documentation/kube-flannel.yml
显示以下信息是创建成功了:
clusterrole "flannel" created clusterrolebinding "flannel" created serviceaccount "flannel" created configmap "kube-flannel-cfg" created daemonset "kube-flannel-ds" created
安装完成之后,我们再查看Node是否为 Ready
![](http://source.lattecake.com/images/2018/09/39/b6/7d/20180909-be8ac956bffdd0f77cd78422b6d39003.jpeg)
![](http://source.lattecake.com/images/2018/09/61/05/e6/20180909-913cccf598e66181e485b5cf05361f8b.jpeg)
到这里,我们集群就算是搭建完了。
需要注意的是,我不推荐使用 `kube-proxy` 来代理 apiservice。因为有安全隐患,我们还是应该通过tls加密的方式来进行通信。
#### 从Kubernetes集群中移除节点
$ kubectl drain 10.106.145.43 --delete-local-data --force --ignore-daemonsets $ kubectl delete node 10.106.145.43
## 安装Web UI (Dashboard)
在Master上直接执行:
**方案一:**
$ kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
咱们可以通过命令对dashboard进行编辑:
$ kubectl -n kube-system edit service kubernetes-dashboard
需要有一个对外访问的端口,咱们把`spec`下面的`type`修改为 **NodePort** 然后`:wq` 退出保存就行了。一会pod重启后会自动分配一个宿主机的端口进行映射。
**方案二:**
$ wget https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml $ vim kubernetes-dashboard.yaml # 它进行编辑
把`spec`下面的`type`修改为 **NodePort** 然后`:wq` 退出保存。
再执行命令:
$ kubectl create -f kubernetes-dashboard.yaml
---
*拉取镜像需要一些时间,骚等一会。*
可以执行以下命令查询kubernetes-dashboard-xxxxxx在STATUS:
$ kubectl get pods -n kube-system $ kubectl get pods --all-namespaces # 查看所有有pod
当STATUS为`Running`的时候表示它已经启动了。
查询token:
$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep role | awk '{print $1}')
![](http://source.lattecake.com/images/2018/09/72/37/de/20180909-98dd453ffc23e42ddef8d39237072fa4.jpeg)
好了,我们打开浏览器,输入集群任意一ip加上 kubernetes dashboard 的NodePort访问,注意这里得是https,不是http。
![](http://source.lattecake.com/images/2018/09/14/29/cf/20180909-37d23f860e55f56ec0692c8029014138.jpeg)
如果不知道端口,可以输入以下命令查询...
查看服务运行的端口:
$ kubectl get svc -n kube-system
![](http://source.lattecake.com/images/2018/09/b6/f2/c5/20180909-c9092c4ba88d5f7cc3257d53f27b6c28.jpeg)
到这里,集群已经基本完成了,可以正常使用。
---
## 安装监控
为了保证集群的正常使用,通常我们还需要一些监控工具,这里推荐使用官网推荐的方案。
克隆或下载: [](https://github.com/kubernetes/heapster)
![](http://source.lattecake.com/images/2018/09/93/96/e2/20180909-b2c75dde4c3d2658e8aa5eb096593ebd.jpeg)
然后进入到deploy目录,执行以下命令:
$ ./kube.sh start ```
监控的组件一共有这么些:
grafana
heapster-rbac
heapster
influxdb
方案二
创建目录:
$ mkdir ./heapster/ && cd ./heapster/
下载文件:
$ wget https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/influxdb/grafana.yaml $ wget https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/rbac/heapster-rbac.yaml $ wget https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/influxdb/heapster.yaml $ wget https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/influxdb/influxdb.yaml
执行命令安装:
$ kubectl create -f ./
方案三
克隆github代码:
$ git clone https://github.com/kubernetes/heapster.git $ cd heapster/
执行命令安装
influxdb
:$ kubectl apply -f deploy/kube-config/influxdb/
执行命令安装rbac及控制器:
$ kubectl apply -f deploy/kube-config/rbac/heapster-rbac.yaml $ kubectl apply -f deploy/kube-config/standalone/
安装
api-service
等:$ kubectl apply -f deploy/kube-config/standalone-with-apiserver/
效果如下
回到dashboard看情况:
监控安装成功。
尾巴
如果集群里的应用要对外提供服务我们有几种方案
NodePort
不推荐Ingress
不推荐nginx-ingress
不推荐traefik-ingress
推荐istio-ingressgateway
推荐
我们在集群尽量只开放两个端口,一个是6443 dashboard 一个是ingress的NodePort。其他端口最好关闭,流量都从ingress进入或流出。甚至dashboard的6443端口也可以从Ingress走。
下次我写服务网络的时候再来介绍这几个吧。
下次是什么时候?
不用我说了,大家都懂的。
很赞哦! (178)
文章评论
点击排行
本栏推荐
标签
站点信息
- 微信公众号