作者:Kevinczp | 来源:互联网 | 2023-10-12 12:22
使用工具 https:kubernetes.iodocssetupindependentcreate-cluster-kubeadmkubeadm简介: kubeadm是ku
使用工具
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 < /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-
|
完成部署~