使用工具
https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/
kubeadm简介:
kubeadm是kubernetes自带的快速搭建kubernetes集群的工具,方便快捷,并且很好的支持自定义搭建。它在开源社区还是很有活力的,虽然目前kubeadm目前还不能用于生产环境,但是伴随着kubenetes版本的更新都会同步更新,方便了版本的升级。
服务器list
节点:
node1 (master)
node2 (slaver)
node3 (slaver)
主要配置:
| 系统 | Centos7.5 |
|---|
| docker | 18.03.0 |
|---|
| kubernetes | 1.8.3 |
|---|
| kubeadm | 1.8.3 |
|---|
| driver | 396.45 |
|---|
| GPU | TITAN |
|---|
步骤
配置master节点的步骤:
1. 关闭防火墙(为了保证开发kubernetes各个组件的端口,为了通讯)
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
|
2. 禁用SELINUX
setenforce 0
vi /etc/selinux/config //修改SELINUX=disabled
|
3. 创建并修改/etc/sysctl.d/k8s.conf文件,添加如下内容:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1 //Docker从1.13版本开始调整了默认的防火墙规则,禁用了iptables filter表中FOWARD链,导致pod无法通信
|
执行sysctl -p /etc/sysctl.d/k8s.conf使修改生效。
4. Kubernetes 1.8开始要求关闭系统的Swap,如果不关闭,默认配置下kubelet将无法启动(当然我们也可以通过修改kubelet的启动参数-fail-swap-on=false更改这个限制)
swappiness参数调整,修改/etc/sysctl.d/k8s.conf添加下面一行:
执行sysctl -p /etc/sysctl.d/k8s.conf使修改生效。
5. 启动docker
systemctl start docker
systemctl status docker
|
6. 安装kubeadm、kubelet、kubectl
//配置kubernetes repo
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
//安装
yum makecache fast
yum install -y kubeadm-1.8.3-0.x86_64 kubelet-1.8.3-0.x86_64 kubectl-1.8.3-0.x86_64
|
注意:这里的源都换成阿里的源,因为无法翻墙,安装的时候要注意版本,如果按照默认安装的话,kubeadm无法配置kubernetes-v1.8.3版本
7. 配置kubelet,修改kubelet的启动环境变量要与docker的cgroup-driver驱动一样,通过docker info查看docker的cgroup-driver驱动,我们这里是cgroupfs
//修改kubelet的启动环境变量为(Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=cgroupfs")
vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
//设置开机启动kubelet 启动kubelet
systemctl enable kubelet.service
systemctl start kubelet.service
|
注意:如果这里没有启动起来不用着急,因为在kubeadm init的时候会主动去配置拉起kubelet的
8. 准备join的时候必要的镜像:
kube-apiserver-amd64:v1.8.3、kube-controller-manager-amd64:v1.8.3、kube-scheduler-amd64:v1.8.3、kube-proxy-amd64:v1.8.3、etcd-amd64:3.0.17、k8s-dns-sidecar-amd64:1.14.5、k8s-dns-kube-dns-amd64:1.14.5、k8s-dns-dnsmasq-nanny-amd64:1.14.5、pause-amd64:3.0
因为默认的是从gcr.io pull镜像,所以没有梯子的话是下载不下来的,init不能通过,所以请“安家”这个仓库中下载
docker pull anjia0532/kube-apiserver-amd64:v1.8.3
docker pull anjia0532/kube-controller-manager-amd64:v1.8.3
docker pull anjia0532/kube-scheduler-amd64:v1.8.3
docker pull anjia0532/kube-proxy-amd64:v1.8.3
docker pull anjia0532/etcd-amd64:3.0.17
docker pull anjia0532/k8s-dns-sidecar-amd64:1.14.5
docker pull anjia0532/k8s-dns-kube-dns-amd64:1.14.5
docker pull anjia0532/k8s-dns-dnsmasq-nanny-amd64:1.14.5
docker pull anjia0532/pause-amd64:3.0
//注意:这里一定要tag回原来的镜像前缀
docker tag anjia0532/kube-apiserver-amd64:v1.8.3 gcr.io/google_containers/kube-apiserver-amd64:v1.8.3
docker tag anjia0532/kube-controller-manager-amd64:v1.8.3 gcr.io/google_containers/kube-controller-manager-amd64:v1.8.3
docker tag anjia0532/kube-scheduler-amd64:v1.8.3 gcr.io/google_containers/kube-scheduler-amd64:v1.8.3
docker tag anjia0532/kube-proxy-amd64:v1.8.3 gcr.io/google_containers/kube-proxy-amd64:v1.8.3
docker tag anjia0532/etcd-amd64:3.0.17 gcr.io/google_containers/etcd-amd64:3.0.17
docker tag anjia0532/k8s-dns-sidecar-amd64:1.14.5 gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.5
docker tag anjia0532/k8s-dns-kube-dns-amd64:1.14.5 gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.5
docker tag anjia0532/k8s-dns-dnsmasq-nanny-amd64:1.14.5 gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.5
docker tag anjia0532/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0
|
9. 一切准备就绪,开始init(因为我们选择flannel作为Pod网络插件,所以指定–pod-network-cidr=10.244.0.0/16)
kubeadm init \
--kubernetes-version=v1.8.3 \ //kubernetes版本指定
--pod-network-cidr=10.244.0.0/16 \ //选择flannel作为Pod网络插件
--apiserver-advertise-address=node1IP //master节点的IP地址
|
安装结束后会给出join node节点的指令:
kubeadm join --token 392097.33e902455 node1IP:6443 --discovery-token-ca-cert-hash sha256:83aa5c4ef343dcb9fb5f2f44c1febbd10a3a520e540745e9b
|
10. 配置kubectl(init之后会自动生成admin.conf,这个文件用于给普通用户配置kubectl访问集群,在这里我们配置的是root用户的kubectl)
mkdir -p ~/.kube
cp -i /etc/kubernetes/admin.conf ~/.kube/config
chown root:root ~/.kube/config
|
11. 查看master启动情况(controller-manager、scheduler、etcd-0都是healthy的状态)
网络插件的安装:
12. 由于docker用的是虚拟的IP地址,所以为了保证各个node节点的pods可以互相通信访问,我们在这里安装flannel网络插件:
kube-flannel.yml下载并启动
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
|
加入node节点的步骤:
当我们配置好master节点的时候,我们就可以往集群中加入node节点,登陆node节点(要有root权限)做以下操作:
1 ~ 7 同master节点
8. 准备join的时候必要的镜像:
kube-proxy-amd64:v1.8.3、k8s-dns-sidecar-amd64:1.14.5、k8s-dns-kube-dns-amd64:1.14.5、k8s-dns-dnsmasq-nanny-amd64:1.14.5、pause-amd64:3.0以及网络插件flannel的镜像quay.io/coreos/flannel:v0.10.0-amd64
因为默认的是从gcr.io pull镜像,所以没有梯子的话是下载不下来的,导致node节点加入之后一直处于NotReady的状态,所以请“安家”这个仓库中下载
docker pull anjia0532/kube-proxy-amd64:v1.8.3
docker pull anjia0532/k8s-dns-sidecar-amd64:1.14.5
docker pull anjia0532/k8s-dns-kube-dns-amd64:1.14.5
docker pull anjia0532/k8s-dns-dnsmasq-nanny-amd64:1.14.5
docker pull anjia0532/pause-amd64:3.0
docker pull quay.io/coreos/flannel:v0.10.0-amd64
//注意:这里一定要tag回原来的镜像前缀
docker tag anjia0532/kube-proxy-amd64:v1.8.3 gcr.io/google_containers/kube-proxy-amd64:v1.8.3
docker tag anjia0532/k8s-dns-sidecar-amd64:1.14.5 gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.5
docker tag anjia0532/k8s-dns-kube-dns-amd64:1.14.5 gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.5
docker tag anjia0532/k8s-dns-dnsmasq-nanny-amd64:1.14.5 gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.5
docker tag anjia0532/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0
|
9. 一切准备就绪,开始加入
kubeadm join --token 392097.b33e902455 node1:6443 --discovery-token-ca-cert-hash sha256:3dcb9fb5f2f44c1febbd83a803010a3a520e540745e9b
|
10. 结果查看(去master节点上查看)(三个节点都是Ready的状态)

安装dashboard:
在这里选择你要安装的dashboard的版本,在这里我是使用了dashboard-1.8.3版本(注意:这个操作是在主节点上的)
注意:如果在这里你是通过如下的方式下载的yaml文件,那么你需要修改一下Service,添加type:NodePort,并设置访问的端口,Kubernetes目前只支持30000以上的端口,在这里我们设置的是30001端口
wget https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
|
create之后,通过https://node1IP:30001就可以直接访问

那么我们如何登陆呢,他有两个方式登录,第一种是config文件的方式,还有一种是token方式,config文件也依赖token,那么我们如何获取这个token呢?管理员在新建namespace的时候需要给 不同队列的用户建立不同的 token,来作为权限管理。在这里我们是管理员权限。
我们来给管理员admin建立一个token(admin-role.yaml如下):
折叠源码
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: admin
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: admin
namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin
namespace: kube-system
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
|
创建之后获取token 的值:
kubectl -n kube-system get secret | grep admin-token
kubectl -n kube-system describe secret admin-token-46t69
|
记录token这个值,并将其加在config文件的最后一行
如果你的集群是GPU集群,那么你就需要安装下面的插件
安装k8s-device-plugin
具体参考:https://github.com/NVIDIA/k8s-device-plugin
功能:
- 在集群中暴露出来每台node的GPU卡数
- 可以用来持续跟踪GPU的健康情况
- 在集群的container运行GPU
它会在master节点上部署一个DaemonSet,他会在所有可以调度的node节点上起要求起的pods,如果有机器加入,他会在默认的机器上起服务,如果有删除,他也会在这台机器上删除pods。
如果你想让master节点也承载一些任务,那么你就需要给master节点打上一个label:node-role.kubernetes.io/node:
kubectl taint nodes yz-gpu-k8s002.hogpu.cc node-role.kubernetes.io/master-
|
完成部署~