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 如果 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博客

相关推荐
LuiChun1 小时前
docker django uwsgi 报错记录
docker·容器·django
tingting01191 小时前
docker 释放磁盘空间--常用清理命令
运维·docker·容器
Vol火山2 小时前
云原生架构中的中间件容器化:优劣势与实践探索
云原生·中间件·架构·数字化
橙子家czzj3 小时前
关于 K8s 的一些基础概念整理-补充【k8s系列之二】
java·开发语言·kubernetes
dbcat官方4 小时前
2.微服务灰度发布落地实践(agent实现)
微服务·云原生·架构
小安运维日记6 小时前
CKA认证 | Day7 K8s存储
运维·云原生·容器·kubernetes·云计算
AR_xsy6 小时前
K8S--“ Failed to create pod sandbox: nameserver list is empty“
云原生·容器·kubernetes
码农炎可6 小时前
K8S 黑魔法之如何从 Pod 拿到节点的命令行
安全·云原生·容器·kubernetes
Just_Do_IT_OK6 小时前
Docker--MySql
mysql·docker·容器
裁二尺秋风6 小时前
k8s dashboard可视化操作界面的安装
云原生·容器·kubernetes