k8s最详细集群部署

安装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](https://bd.bcebos.com/datahub-online/k8s/kube-flannel.yml "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](http://agroup.baidu.com/zhongce_saas/md/article/4816652 "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](http://agroup.baidu.com/zhongce_saas/md/article/4826066 "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博客](https://blog.csdn.net/weixin_48709775/article/details/127536685 "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](http://agroup.baidu.com/zhongce_saas/md/article/4890077 "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博客

相关推荐
在未来等你3 小时前
互联网大厂Java求职面试:Spring AI与大模型交互的高级模式与自定义开发
java·微服务·云原生·大模型·spring ai
黄暄4 小时前
Docker项目部署深度解析:从基础命令到复杂项目部署
运维·笔记·docker·容器·持续部署
云攀登者-望正茂8 小时前
深度解析:AWS NLB 与 ALB 在 EKS 集群中的最佳选择
kubernetes·aws
编程、小哥哥10 小时前
Java面试深度解析:微服务与云原生技术应用场景详解
java·spring cloud·微服务·云原生·面试·kubernetes·链路追踪
斯普信专业组11 小时前
Kubernetes MCP服务器(K8s MCP):如何使用?
人工智能·kubernetes
Kendra91911 小时前
Docker 运维管理
运维·docker·容器
重整旗鼓~15 小时前
1.portainer
云原生·eureka
码熔burning15 小时前
深入理解 ZAB:ZooKeeper 原子广播协议的工作原理
分布式·zookeeper·云原生
言之。17 小时前
K8s CoreDNS 核心知识点总结
云原生·容器·kubernetes
项目題供诗17 小时前
黑马k8s(十一)
云原生·容器·kubernetes