利用kubeadm搭建测试kubernetes集群

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hanlaipeng11/article/details/83246822

使用工具

    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更改这个限制)

swapoff -a

free -m      //查看

          swappiness参数调整,修改/etc/sysctl.d/k8s.conf添加下面一行:

vm.swappiness=0

         执行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的状态)

kubectl get cs

 

网络插件的安装:

     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的状态)

kubectl get nodes

安装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

功能:

  1. 在集群中暴露出来每台node的GPU卡数
  2. 可以用来持续跟踪GPU的健康情况
  3. 在集群的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-

 

              完成部署~

 

 

 

展开阅读全文

没有更多推荐了,返回首页