0
点赞
收藏
分享

微信扫一扫

NX二次开发UF_CAM_update_list_object_customization 函数介绍

small_Sun 2023-11-27 阅读 44

1 K8S 简介

K8S是Kubernetes的简称,是一个开源的容器编排平台,用于自动部署、扩展和管理“容器化(containerized)应用程序”的系统。它可以跨多个主机聚集在一起,控制和自动化应用的部署与更新。

K8S 架构

请添加图片描述

Kubernetes 主要由以下几个核心组件组成:

  • etcd 保存了整个集群的状态;
  • apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;
  • controller manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
  • scheduler 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;
  • kubelet 负责维护容器的生命周期,同时也负责 Volume(CSI)和网络(CNI)的管理;
  • Container runtime 负责镜像管理以及 Pod 和容器的真正运行(CRI);
  • kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡;

除了核心组件,还有一些推荐的插件,其中有的已经成为 CNCF 中的托管项目:

  • CoreDNS 负责为整个集群提供 DNS 服务

  • Ingress Controller 为服务提供外网入口

  • Prometheus 提供资源监控

  • Dashboard 提供 GUI

  • Federation 提供跨可用区的集群

整体架构

下图清晰表明了 Kubernetes 的架构设计以及组件之间的通信协议。

请添加图片描述

下面是更抽象的一个视图:

请添加图片描述

Master架构

请添加图片描述

Node架构

请添加图片描述

分层架构

Kubernetes 设计理念和功能其实就是一个类似 Linux 的分层架构,如下图所示。

请添加图片描述

  • 核心层:Kubernetes 最核心的功能,对外提供 API 构建高层的应用,对内提供插件式应用执行环境
  • 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS 解析等)、Service Mesh(部分位于应用层)
  • 管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态 Provision 等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy 等)、Service Mesh(部分位于管理层)
  • 接口层:kubectl 命令行工具、客户端 SDK 以及集群联邦
  • 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴
    • Kubernetes 外部:日志、监控、配置管理、CI/CD、Workflow、FaaS、OTS 应用、ChatOps、GitOps、SecOps 等
    • Kubernetes 内部:CRI、CNI、CSI、镜像仓库、Cloud Provider、集群自身的配置和管理等

2 CPU架构

ARM64和x86是指基于不同架构的处理器。

ARM64是指基于ARM架构的64位处理器,而ARM是指基于ARM架构的32位处理器。ARM架构广泛应用于手机和移动设备领域,具有低成本、高性能、低电耗的特点。

x86则是指基于x86架构的处理器,它可以是32位或64位处理器架构,具体取决于处理器型号。x86架构广泛应用于传统的PC和服务器领域。

因为ARM64与x86是不同的CPU架构,两者的指令集不同,因此在部署时,需要考虑具体适配的软件安装包。

本文将基于arm64架构的国产操作系统统信UOS为例,说明K8S部署流程,仅供参考。

3 环境信息

环境版本说明
操作系统UnionTech OS Server 20
CPU架构aarch64
docker17.09.0-ceOS/Arch: linux/arm64
K8S1.20.11OS/Arch: linux/arm64
rancherv2.5.16-linux-arm64OS/Arch: linux/arm64

4 部署Docker

如果当前环境已经部署完arm64的docker,请忽略此章节。

下面的操作,需要在规划K8S的所有机器上执行。

4.1 环境准备

4.1.1 磁盘挂载

如果磁盘已经挂载,则省略该步骤。

docker推荐使用 xfs 磁盘格式。

磁盘挂载

$ mkfs.xfs -f /dev/vdb
$ mkdir /demo
$ mount /dev/vdb /demo

查看磁盘id

$ blkid 

永久挂载

$ echo "UUID=94be2fa7-93aa-47a4-b661-45963b28fbb4 /demo                xfs     defaults        0 0" >> /etc/fstab
$ mount -a

备注:这里磁盘格式化仅做参考,具体的磁盘格式化以及挂载,请自行参考其他文档。目的就是:挂载xfs格式的磁盘到指定目录下(比如 /demo)

4.1.2 docker 根目录

磁盘挂载路径为/var/lib/docker时可忽略此步

磁盘挂载路径为其他路径时,通过mount --bind方式挂载目录

1 创建挂载目录

$ mkdir -p /demo/data/docker

2 将/demo/data/docker映射到/var/lib/docker

$ mount  --bind /demo/data/docker /var/lib/docker

3 设置永久生效

$ echo "/demo/data/docker /var/lib/docker  none    bind        0 0" >> /etc/fstab

4 挂载

$ mount -a

4.2 下载Docker安装包并且解压

进入 /demo/data/ 目录下,下载 aarch64的docker安装包

执行如下命令:

# wget https://download.docker.com/linux/static/stable/aarch64/docker-17.09.0-ce.tgz

请添加图片描述

下载完成后,在当前目录进行解压操作:

$ tar -zxvf docker-17.09.0-ce.tgz 

在这里插入图片描述

4.3 复制文件

在 /demo/data 目录下执行如下命令:

$ cp docker/* /usr/bin/

4.4 创建containerd的service文件

执行如下命令:

$ touch /etc/systemd/system/docker.service
# 给予可执行权限
$ chmod +x /etc/systemd/system/docker.service

编辑docker.service文件,添加下面的内容:

$ vim /etc/systemd/system/docker.service

内容如下:

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target

请添加图片描述

4.5 启动docker

重新加载配置文件

$ systemctl daemon-reload

启动docker

$ systemctl start docker

设置 docker 开机启动

$ systemctl enable docker.service

5 部署K8S

5.1 关闭selinux

#临时关闭
$ setenforce 0
#永久关闭 SELINUX=disabled
$ vim /etc/sysconfig/selinux

请添加图片描述

5.2 关闭swap分区

#临时关闭
swapoff -a
#永久关闭 注释 swap 行
vim /etc/fstab

5.3 关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

5.4 网络配置 iptables

对iptables内部的nf-call需要打开的内生的桥接功能

$ touch /etc/sysctl.d/k8s.conf
$ vim /etc/sysctl.d/k8s.conf

修改如下内容:

net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0

修改完成后执行:

$ modprobe br_netfilter
$ sysctl -p /etc/sysctl.d/k8s.conf

5.5 配置kubernetes源

创建/etc/yum.repos.d/kubernetes.repo文件

$ touch /etc/yum.repos.d/kubernetes.repo

编辑:

$ vim /etc/yum.repos.d/kubernetes.repo

添加如下内容:

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
#清除缓存
yum clean all
#把服务器的包信息下载到本地电脑缓存起来,makecache建立一个缓存
yum makecache

5.6 安装kubelet kubeadm kubectl

当不指定具体版本时,将下载当前yum源对应的最新版本

$ yum install -y kubelet kubeadm kubectl

也可以指定版本,建议指定如下版本

#安装指定版本的kubelet,kubeadm,kubectl
$ yum install -y kubelet-1.20.11 kubeadm-1.20.11 kubectl-1.20.11

在这里插入图片描述

安装时如果出现 403,解决方案是多尝试几次。

请添加图片描述

安装完成后,查看K8S版本

#查看kubelet版本
$ kubelet --version

在这里插入图片描述

查看kubeadm版本

$ kubeadm version

在这里插入图片描述

5.7 启动kubelet并设置开机启动服务

重新加载配置文件

$ systemctl daemon-reload

启动kubelet

$ systemctl start kubelet

查看kubelet启动状态

$ systemctl status kubelet

没启动成功,报错先不管,后面的kubeadm init会拉起

在这里插入图片描述

设置开机自启动

$ systemctl enable kubelet

在这里插入图片描述

查看kubelet开机启动状态 enabled:开启, disabled:关闭

$ systemctl is-enabled kubelet

在这里插入图片描述

查看日志

$ journalctl -xefu kubelet

arm64环境,到此步后,先看看 FAQ中的问题4.

5.8 初始化K8S集群Master

注意,此操作只在规划的Master服务器上执行

#执行初始化命令
kubeadm init --image-repository registry.aliyuncs.com/google_containers --apiserver-advertise-address=172.31.186.36 --kubernetes-version=v1.20.11 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 

可能比较耗时,请耐心等待

在这里插入图片描述

待初始化完成后,需要按照提示,执行如下命令:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf

这里需要注意,要将最后一个命令复制出来并且保存,用于后续添加节点使用:

kubeadm join 172.31.186.36:6443 --token t4bhv5.xlbh5rivgx7w284m \
    --discovery-token-ca-cert-hash sha256:1bf639b1ff74ac39b72448cef64597f040a89840e20fb56e2358c9b7f8359a9f

查看K8S集群节点

$ kubectl get node

在这里插入图片描述

NAME STATUS ROLES AGE VERSION
rancher-1 NotReady control-plane,master 13h v1.20.11

这里会发现状态是 NotReady ,是因为没有安装网络插件。

查看kubelet的日志

$ journalctl -xef -u kubelet -n 20

5.9 安装flannel网络插件

创建文件夹

$ mkdir -p /demo/package_k8s/flannel
$ cd /demo/package_k8s/flannel

在这里插入图片描述

在/demo/package_k8s/flannel目录,下载文件

curl -O https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

因为网络原因,可能比较耗时,如果下载失败了,请耐心的多尝试几次。

在这里插入图片描述

kube-flannel.yml里需要下载镜像,我这里提前先下载

$ docker pull quay.io/coreos/flannel:v0.14.0-rc1

创建flannel网络插件

$ kubectl apply -f kube-flannel.yml

在这里插入图片描述

5.10 集群添加节点

在其他节点上执行5.1、5.2、5.3、5.4、5.5、5.6、5.7、5.9

执行完后,在除Master之外的节点执行 5.8 生产的命令:

kubeadm join 172.31.186.36:6443 --token t4bhv5.xlbh5rivgx7w284m \
    --discovery-token-ca-cert-hash sha256:1bf639b1ff74ac39b72448cef64597f040a89840e20fb56e2358c9b7f8359a9f

在这里插入图片描述

在master节点执行:

$ kubectl get node

在这里插入图片描述

6 部署rancher

  • 如果不需要用rancher来管理K8S集群,请忽略此章节。

  • 如果当前环境已经部署完arm64的rancher,请忽略此章节。

部署rancher前,请保证arm64架构的docker已经部署成功

6.1 pull 镜像

rancher需要pull第三方镜像,为了节省时间,我们可以提前下载好rancher相关的镜像

这里的 docker中央仓库地址 只是举例,请根据实际情况填写 dockerpull 的镜像地址

执行如下pull:

docker pull docker中央仓库地址/fleet-agent:v0.3.10-security1
docker pull docker中央仓库地址/rancher-agent:v2.5.16
docker pull docker中央仓库地址/rancher:v2.5.16-linux-arm64
docker pull docker中央仓库地址/hyperkube:v1.20.15-rancher2
docker pull docker中央仓库地址/nginx-ingress-controller:nginx-1.2.1-rancher1
docker pull docker中央仓库地址/rke-tools:v0.1.80
docker pull docker中央仓库地址/mirrored-coreos-flannel:v0.15.1
docker pull docker中央仓库地址/mirrored-ingress-nginx-kube-webhook-certgen:v1.1.1
docker pull docker中央仓库地址/hyperkube:v1.20.11-rancher1
docker pull docker中央仓库地址/mirrored-pause:3.6
docker pull docker中央仓库地址/rke-tools:v0.1.78
docker pull docker中央仓库地址/mirrored-metrics-server:v0.5.0
docker pull docker中央仓库地址/nginx-ingress-controller:nginx-0.43.0-rancher3
docker pull docker中央仓库地址/mirrored-coreos-etcd:v3.4.15-rancher1
docker pull docker中央仓库地址/mirrored-coredns-coredns:1.8.0
docker pull docker中央仓库地址/mirrored-cluster-proportional-autoscaler:1.8.1
docker pull docker中央仓库地址/flannel-cni:v0.3.0-rancher6
docker pull docker中央仓库地址/kube-api-auth:v0.1.4
docker pull docker中央仓库地址/mirrored-pause:3.2

注意:执行到docker pull docker中央仓库地址/mirrored-pause:3.2时,可能需要手动按一下回车键。

6.2 启动rancher

这里会先从仓库拉取rancher的镜像,根据网络环境,可能耗时较久,请等待。

docker run -d --privileged --restart=unless-stopped -p 8080:80 -p 8445:443 \
-v /demo/data/rancher/rancher:/var/lib/rancher \
-v /demo/data/rancher/auditlog:/var/log/auditlog \
--name rancher rancher/rancher:v2.5.16-linux-arm64

稍等片刻,浏览器输入:https://ip:8445/g/clusters

部署完rancher后,第一次打开页面,需要进行免密设置

在这里插入图片描述

6.3 导入K8S集群

进入rancher页面,点击右上角的 “添加集群” 操作

在这里插入图片描述


然后选择 “导入”
在这里插入图片描述

填写K8S集群名称
在这里插入图片描述

点击 “创建” 按钮后,会出现三个命令行,将第一个命令行的 [USER_ACCOUNT]替换为 admin。

依次在K8S Master机器上执行下面三个命令行。

在这里插入图片描述

执行命令1

在K8S master机器上执行:

$ kubectl create clusterrolebinding cluster-admin-binding --clusterrole cluster-admin --user admin

执行命令2

$ kubectl apply -f https://172.31.186.36:8445/v3/import/kkksx4xvx4rld7nzh8b2mvwc8kvjrxbsj458ngw264kst9sshbvfr7_c-xqfgn.yaml

如果执行命令2时,x509错误,则可以通过将对应的yaml文件下载到服务器本地,然后执行apply

下载yaml文件

$ wget https://172.31.186.36:8445/v3/import/6w5jzw4wtc7pg7h8cjbhcnj4ptbhgkdrrsc8ftjgkhqkvm2qc557tv_c-9g9rs.yaml --no-check-certificate

执行安装:

$ kubectl apply -f 6w5jzw4wtc7pg7h8cjbhcnj4ptbhgkdrrsc8ftjgkhqkvm2qc557tv_c-9g9rs.yaml

执行命令3

执行复制忽略证书检查命令:

curl --insecure -sfL https://172.31.186.36:8445/v3/import/7d64lpx6gpl8mdz4tz9nzk6r2wb684fls7fs728ns2sbzvzfdw55j4_c-llx8j.yaml | kubectl apply -f -

稍等片刻,如果一切顺利,则可看到如下:

在这里插入图片描述

在这里插入图片描述

FAQ

1 问题:节点状态为NotReady

如果安装了flannel网络插件后,查看节点状态,仍然是 NotReady

且日志显示 failed to find plugin “portmap” in path [/opt/cni/bin]

在这里插入图片描述

查看日志

在这里插入图片描述

解决方案:

下载 cni-plugins-linux-arm64-v1.1.1.tgz 包,然后解压,将其中的文件copy到 /opt/cni/bin/ 目录下即可

tar -zxvf cni-plugins-linux-arm64-v1.1.1.tgz -C /opt/cni/bin

在这里插入图片描述

2 问题:在非master节点执行 kubectl get node

在这里插入图片描述

kubectl命令需要使用kubernetes-admin来运行,需要admin.conf文件(conf文件是通过“ kubeadmin init”命令在主节点/etc/kubernetes 中创建),但是从节点没有conf文件,也没有设置 KUBECONFIG =/root/admin.conf环境变量,所以需要复制conf文件到从节点,并设置环境变量就OK了。

其实这个问题也没必要解决,不影响。

3 问题:rancher面板中 Controller Manager与 Scheduler不健康

如果rancher面板中 Controller Manager与 Scheduler不健康

在这里插入图片描述

登录到master server机器,修改如下文件:

  • /etc/kubernetes/manifests/kube-controller-manager.yaml
  • /etc/kubernetes/manifests/kube-scheduler.yaml

两个文件中删除 --port=0 配置项

然后重启kubelete

$ service kubelet restart

稍等片刻,如果一切顺利,Controller Manager与 Scheduler将恢复健康。

4 问题:failed to find plugin “portmap” in path [/opt/cni/bin]

如果kubelet服务异常,且日志里有如下报错:

failed to find plugin "portmap" in path [/opt/cni/bin]

大概率是/opt/cni/bin目录下没有对应的 portmap 插件

解决方案:

1、下载 cni-plugins-linux-arm64-v1.1.1.tgz 插件

$ wget https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-arm64-v1.1.1.tgz

2、解压 cni-plugins-linux-arm64-v1.1.1.tgz 插件,并且复制到 /opt/cni/bin/

$ tar -zxvf cni-plugins-linux-arm64-v1.1.1.tgz -C /opt/cni/bin/

附录 K8S 运维技术点简介

删除POD

要删除 Kubernetes(K8S)中的 Pod,可以使用 kubectl delete pod 命令。下面是删除 Pod 的一般格式:

# kubectl delete pod <pod-name> [-n=<namespace>]
$ kubectl delete pod coredns-7f89b7bc75-46tlx -n kube-system

按照创建时间升序查看POD

要按照创建时间升序查看 Kubernetes(K8S)中的 Pod,可以使用 kubectl get pods --sort-by=.metadata.creationTimestamp 命令。

$ kubectl get pods  -A --sort-by=.metadata.creationTimestamp
举报

相关推荐

0 条评论