安装kubeadm、kubectl、和 kubelet
这里通过百度网盘下载所需要的安装包:
链接: k8s部署包.zip_免费高速下载|百度网盘-分享无限制 提取码: 0000
1、下载部署包到本地后,在k8s部署包/k8s目录下
执行此yum命令安装:yum localinstall ./*.rpm 或 rpm -Uvh *.rpm --nodeps --force
2、在 /etc/sysconfig/kublet 中增加自定义 kubelet 配置
# 设置hostname
hostnamectl set-hostname master
mkdir -p /home/work/kubernetes/log
mkdir -p /home/work/kubernetes/kubelet_data
mkdir -p /home/work/docker
# 自定义kublet配置
vi /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS=" --hostname-override=master --logtostderr=false --log-dir=/home/work/kubernetes/log --v=0\
--root-dir=/home/work/kubernetes/kubelet_data "
3、设置 kubelet 开机启动
systemctl enable kubelet && systemctl start kubelet
docker安装
1、rpm包在k8s部署包/docker目录下
2、切换到该目录下安装
yum localinstall ./*.rpm 或rpm -Uvh *.rpm --nodeps --force
4、若是GPU机节点,需要安装nvidia-dcoker
1、切到k8s部署包/docker/nvidia-dcoker目录下
3、在该目录下执行
rpm -Uvh *.rpm --nodeps --force
4、sudo systemctl restart docker
5、修改docker配置,包括cgroup和仓库地址
vim /etc/docker/daemon.json
# gpu机器:
{
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
},
"registry-mirrors": ["https://23h04een.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"default-runtime": "nvidia",
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
# cpu机器:
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
6、修改docker服务参数,增加docker配置文件,指定docker数据文件目录
vim /etc/kubernetes/docker_opts.env
DOCKER_OPT_IPMASQ="--ip-masq=true"
DOCKER_OPT_MTU="--mtu=1372"
DOCKER_OPTS=" --ip-masq=true --mtu=1372 --data-root=/home/work/docker "
vim /usr/lib/systemd/system/docker.service (EnvironmentFile 对应上面的文件绝对路径)
EnvironmentFile=/etc/kubernetes/docker_opts.env
ExecStart=/usr/bin/dockerd $DOCKER_OPTS -H fd:// --containerd=/run/containerd/containerd.sock
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
7、重启docker,设置开机启动
systemctl daemon-reload
systemctl restart docker
nfs准备
安装nfs,配置挂载
先进入到k8s部署包/nfs-utils目录下
执行命令安装:yum localinstall ./*.rpm 或rpm -Uvh *.rpm --nodeps --force
# 创建本地目录
mkdir /cfs
# 挂载远程目录到本地
mount -t nfs4 -o minorversion=1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport cfs-PJ5X3SRg7M.lb-d065a956.cfs.bj.baidubce.com:/ /cfs
# 设置开机启动
systemctl enable nfs.service
更改服务器配置
1. 关闭防火墙和selinux
[root@centos7 ~] systemctl stop firewalld && systemctl disable firewalld
# 永久关闭selinux
[root@centos7 ~] sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config && cat /etc/selinux/config
# 临时关闭selinux
root@centos7 ~] setenforce 0
1. 禁用swap
# 临时禁用
[root@master ~] swapoff -a
# 永久禁用
[root@master ~] sed -i.bak '/swap/s/^/#/' /etc/fstab
1. 内核参数修改
部署的 k8s 网络使用 flannel,该网络需要设置内核参数 bridge-nf-call-iptables=1
# 临时修改
[root@master ~] sysctl net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-iptables = 1
[root@master ~] sysctl net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-ip6tables = 1
# 永久修改
[root@master ~] cat /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
[root@master ~] sysctl -p /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
1. 处理依赖的docker镜像
所需要的镜像为:
registry.aliyuncs.com/google_containers/kube-apiserver:v1.23.5
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.23.5
registry.aliyuncs.com/google_containers/kube-scheduler:v1.23.5
registry.aliyuncs.com/google_containers/kube-proxy:v1.23.5
registry.aliyuncs.com/google_containers/pause:3.6
registry.aliyuncs.com/google_containers/etcd:3.5.1-0
registry.aliyuncs.com/google_containers/coredns:v1.8.6
在k8s部署包/images下,逐个docker load -i 导入镜像。
kubeadm启动集群
1. 初始化
kubeadm reset -f
若是之前已经创建集群:
* 删除/root/.kube/config文件
* 若是安装了flannel网络,删除 /etc/cni/net.d/ 下的flannel网络文件,10-flannel.conflist
如果报错:[ERROR FileExisting-conntrack]: conntrack not found in system path
解决办法:先下载:yum install --downloadonly --downloaddir=/home/conntrack conntrack
安装到目标服务器上:rpm -Uvh *.rpm --nodeps --force
1. 通过命令+参数初始化集群
kubeadm init --kubernetes-version=v1.23.5 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap --apiserver-advertise-address=10.132.130.197 --image-repository registry.aliyuncs.com/google_containers --v=5
# apiserver-advertise-address 必须填充ip
1. 修改kubectl配置
把 kubectl 所需的 apiserver 服务地址和证书配置添加到环境变量中,否则会无权限访问 6443 端口
mkdir -p $HOME/.kube
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
cp -p $HOME/.bash_profile $HOME/.bash_profile.bak$(date '+%Y%m%d%H%M%S')
echo "export KUBECONFIG=$HOME/.kube/config" >> $HOME/.bash_profile
source $HOME/.bash_profile
4、配置环境变量
export KUBECONFIG=/etc/kubernetes/admin.conf
5、flannel网络搭建
需要的yaml文件:kube-flannel.yml
对应的镜像:
docker.io/flannel/flannel:v0.21.4
docker.io/flannel/flannel-cni-plugin:v1.1.2
在k8s部署包/flannel下,
先docker load -i 导入镜像,然后执行下面命令:
kubectl apply -f kube-flannel.yml
如果 flannel 的 pod 无法启动,显示 CrashLoopBackOff。通过 kubectl logs 显示 node“master“podcidr not assigned 错误,有两种解决方法:
1)安装 kubeadm Init的时候,没有增加 --pod-network-cidr 10.244.0.0/16 参数
注意,安装Flannel时,kubectl create -f https://bd.bcebos.com/datahub-online/k8s/kube-flannel.yml 如果 yml 中的 "Network": "10.244.0.0/16"和--pod-network-cidr 不一样,就修改成一样的。不然可能会使得Node间Cluster IP 不通。
如果你没有快照可以还原,采用方法(2),然后 kubectl delete pod -n kube-system kube-flannel-*, 将错误的 flannel-pod 删除,即可自动重新创建新的 flannel-pod。
如果你有恢复快照,那么在 kubeadm init 时加上 --pod-network-cidr=10.244.0.0/16 参数重新 init 即可。
在搭建完 flannel 网络后把 coredns 的 pod 删了自动重启一下应该就可以 running 了
6、节点加入集群
* 首先k8s集群的node节点同按照上述去安装kubeadmin、kubectl和kubelet,安装docker,更改服务器配置,安装nfs挂载服务
* node节点上不需要去部署集群,只需要安装好k8s的基础环境即可
* 再master节点上运行
kubeadm token create --print-join-command
kubeadm join 10.52.12.2:6443 --token 774333.jxfe29jzo86zsgfo --discovery-token-ca-cert-hash sha256:ffb898db137891d1eb88a8d0727d623312cac68dc84999a4978658b1cbeb3c35
在希望加入集群的节点执行上面命令输出的语句
在node节点上运行 kubeadm join 10.52.12.2:6443 --token 774333.jxfe29jzo86zsgfo --discovery-token-ca-cert-hash sha256:ffb898db137891d1eb88a8d0727d623312cac68dc84999a4978658b1cbeb3c35 即可加入集群中
注意:这里如果之前节点已经加入过集群了,需要做一些清理工作,否则加入不成功
重新初始化集群:kubeadm -f reset
清理网络:ifconfig查看网络,清理之前加入的网络,否则加入集群不成功
sudo ifconfig cni0 down
sudo ip link delete cni0
安装插件
1. 安装nvidia-device-plugin插件,使用gpu
1、在k8s部署包/nvidia-device-plugin文件下
2、在Gpu机器上导入镜像:docker load -i nvidia/k8s-device-plugin:1.0.0-beta6.tar
3、kubectl create -f nvidia-device-plugin.yml
1. 训练调度kube-queue的安装和使用
之前的基于k8s的调度是基于java单独写的一套,他需要不停的轮询队列去查信息进行调度,存在以下问题:
1. 与业务代码耦合,通用性差,可移植性差
2. 持续轮询,有性能瓶颈
3. 稳定性不高
基于此,我们引入了新的队列kube-queue,他基于k8s的informer机制进行时间监听和执行,kube-queue已经过大规模平台验证,稳定性比较高;我们通过编写不同的extender就可以支持job、tf-job、pytorch-job、mxnet-job等多个类型。
1)安装helm
1、在/k8s部署包/kube-queue文件夹下
2、解压:tar -zxvf helm-v3.9.3-linux-amd64.tar.gz
cp helm /usr/local/bin
# helm是一个可执行的二进制文件,可以直接执行,若是想全局执行,将文件复制到/usr/local/bin下
2)安装kube-queue
参考:http://agroup.baidu.com/zhongce_saas/md/article/4816652
1、在/k8s部署包/kube-queue文件夹下
2、解压:tar -zxvf kube-queue.tar.gz
3、cd kube-queue
修改charts/v0.1.0/templates/controller.yaml镜像拉取策略为Never
# 通过helm安装
4、helm install kube-queue -n kube-system ./charts/v0.1.0
#查看kube-queue-controller和job-extension进程是否存在
5、helm get manifest kube-queue -n kube-system | kubectl get -n kube-queue -f -
# 通过helm卸载kube-queue
6、helm uninstall kube-queue -n kube-system
3、NFS Server安装 & K8S适配NFS
1)NFS Server安装
参考:搭建NFS Server_山间漫步人生路的博客-CSDN博客
# 安装nfs server
在k8s部署包/nfs目录下安装:rpm -ivh *.rpm --force --nodeps
docker load -i busybox.tar
# 启动nfs server & 设置开机自启
systemctl start rpcbind
systemctl enable rpcbind
systemctl start nfs-server
systemctl enable nfs-server
# 创建共享目录
mkdir -p /nas/k8s
chmod -R 777 /nas/k8s
# 设置共享目录
vim /etc/exports
/nas/k8s 192.168.3.0/24(insecure,rw,sync,no_root_squash)
exportfs -a # 使exports的修改生效
# 将共享目录挂载到其他服务器,需要已安装nfs-utils
mount -t nfs 10.132.130.197:/nas/k8s /nas/k8s
# 设置开机自挂载,编辑/etc/fstab,增加一条挂载记录
vim /etc/fstab
192.168.3.81:/nas/k8s /data nfs defaults 0 1
2)nfs-provisioner 插件安装
参考:http://agroup.baidu.com/zhongce_saas/md/article/4826066
需要的镜像在k8s部署包/nfs文件夹下。
在k8s部署包/nfs下导入镜像:docker load -i nfs-provisioner.tar
# 解压
tar -xvf nfs-provisioner_file.tar
cd nfs-provisioner/nfs-subdir-external-provisioner
# 设置namespace的rbac权限
NS=$(kubectl config get-contexts|grep -e "^\*" |awk '{print $5}')
NAMESPACE=${NS:-default}
sed -i'' "s/namespace:.*/namespace: $NAMESPACE/g" ./deploy/rbac.yaml ./deploy/deployment.yaml
kubectl create -f deploy/rbac.yaml
如有报错,参考:Error from server: Get “https://[::1]:6443/api/v1/namespaces/victor/resourcequotas“: dial tcp [::1]:_get "https://[::1]:6443/api/v1/namespaces/kube-sys_victorgk的博客-CSDN博客
配置 NFS subdir external provisioner的deploy/deployment.yaml,设置nfs地址和路径并执行,部署的时候需要指定对应的ns,并部署到指定机器上。编辑deployment.yaml,修改nfs-server的地址和共享目录
kubectl create -f deploy/deployment.yaml
执行deploy/class.yaml ,定义了NFS子目录外部提供给Kubernetes的存储目录的存储类
cd nfs-provisioner/nfs-subdir-external-provisioner
kubectl apply -f deploy/class.yaml
测试
# 创建pod,查看创建的pvc是否分配到了nfs共享目录中
kubectl create -f deploy/test-claim.yaml -f deploy/test-pod.yaml
kubectl delete -f deploy/test-pod.yaml -f deploy/test-claim.yaml
4、ingress-controller安装
参考:http://agroup.baidu.com/zhongce_saas/md/article/4890077
1、需要的tar包:ingress-nginx.tar.gz
2、镜像:
registry.baidubce.com/datahub/ingress-nginx-controller:v1.2.0
registry.baidubce.com/datahub/ingress-nginx-kube-webhook-certgen:v1.1.1
registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1
3、tar包和镜像都在/k8s部署包/ingress-controller下
4、解压:tar -zxvf ingress-nginx.tar.gz
5、依次使用docker load -i导入上面的镜像
6、cd ingress-nginx
# 需要修改的地方:deploy.yaml
# externalTrafficPolicy:local -> externalTrafficPolicy: Cluster
# 如果改成Cluster, 含有kube-proxy进程的机器都可以通过端口访问。Local的话只能部署ingress-controller的那台机器可以访问。
# Service的type改成NodePort
# 安装
7、kubectl apply -f deploy.yaml
5、分布式任务的安装和使用
1、在/k8s部署包/分布式任务下
3、解压:tar -xvf training-operator.tar
4、cd training-operator
docker load -i training-operator.tar
5、kubectl apply -k manifests/overlays/standalone
6、filebeat安装
1、需要的包在/k8s部署包/filebeat下
2、解压:tar -zxvf filebeat-7.13.0-zhongcesaas.tar.gz
3、cd filebeat
# 修改的地方:filebeat/values.yaml,修改es的地址,docker
---
daemonset:
# Annotations to apply to the daemonset
annotations: {}
# additionals labels
labels: {}
affinity: {}
# Include the daemonset
enabled: true
# Extra environment variables for Filebeat container.
envFrom: []
# - configMapRef:
# name: config-secret
extraEnvs: []
# - name: MY_ENVIRONMENT_VAR
# value: the_value_goes_here
extraVolumes:
- name: extras
hostPath:
path: /home/work/docker/containers
type: DirectoryOrCreate
extraVolumeMounts:
- name: extras
mountPath: /home/work/docker/containers
readOnly: true
hostNetworking: false
# Allows you to add any config files in /usr/share/filebeat
# such as filebeat.yml for daemonset
filebeatConfig:
filebeat.yml: |
filebeat.inputs:
- type: container
paths:
- /var/log/containers/*-job-*.log
processors:
- add_kubernetes_metadata:
host: ${NODE_NAME}
matchers:
- logs_path:
logs_path: "/var/log/containers"
output.elasticsearch:
host: '${NODE_NAME}'
hosts: '${ELASTICSEARCH_HOSTS:10.138.117.28:8200}'
# 创建namespace
kubectl create ns logs
# 指定ns安装
helm install filebeat -n logs filebeat/
# 卸载
helm uninstall filebeat -n logs
注意点:es的地址需要配置对,否则连接不上es
7、job-extension安装
1、需要的yaml文件:job-extension.yaml
tar包:job-extension-vtest2.tar
2、在/k8s部署包/job-extension下
导入镜像:docker load -i job-extension-vtest2.tar
3、kubectl apply -f job-extension.yaml
8、设置任务优先级资源
1、在/k8s部署包/job-extension下
2、kubectl apply -f priorityclass.yaml
生成ca证书脚本
export clientcert=$(grep client-cert ~/.kube/config |cut -d" " -f 6)
export certauth=$(grep certificate-authority-data ~/.kube/config |cut -d" " -f 6)
export clientkey=$(grep client-key-data ~/.kube/config |cut -d" " -f 6)
echo $clientcert | base64 -d > ./client.pem
echo $clientkey | base64 -d > ./client-key.pem
echo $certauth | base64 -d > ./ca.pem
7、部署node节点参考:
k8s 集群新增 Node 文档
8、k8s集群默认存在污点策略NoSchedule,master节点不会被调度到。如果需要master节点被调度,则需要做去除操作:
kubectl taint nodes --all for-node-role.kubernetes.io/master:NoSchedule-
参考:k8s污点策略与容忍的简单应用_prefernoschedule_xhredeem的博客-CSDN博客