searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

部署一套自己本地的K8S集群(上)

2023-07-10 08:28:09
188
0

1. 适用场景

  • 容器引擎默认使用containerd
  • 只有普通软件的yum源,没有K8S组件的相关yum源,例如当前时间点,公网ctyunos暂无对应版本的kubelet、kubectl、kubeadm这些组件,也缺少高版本的containerd和runc等组件。
  • 系统版本不是常见的系统,例如ctyunos,但必须为linux + amd64。
  • 只需要搭建一个可用的多节点K8S集群,对是否高可用,网络功能、集群性能没有太高要求。
  • 可能没有公网,但可以传文件。

由于在常见的centos系统中,通过公网yum源可以搞定很多常见软件的安装,但在ctyunos系统中,yum源上软件的不足,在实际部署测试环境中较多困扰。所以就本人的一些经验,结合网上的步骤,整理而得出该文档。

一些常用的部署K8S的软件,有些只支持单节点K8S,有些对系统版本有要求,总的来说,不够通用,在实际部署过程中使用反而麻烦。

 

2. 系统准备(所有节点)

本次用例,以ctyunos为例,内核版本5.4

在开始之前,尽量需要配置基本的yum源畅通

2.1. 节点host配置

进入/etc/hosts,配置IP和hostname的对应关系

10.0.0.24 csitest-centos8-0001

10.0.0.22 csitest-centos8-0002

10.0.0.21 csitest-centos8-0003

10.0.0.30 csitest-centos8-0004

 

2.2. 系统软件下载

通过yum下载一些常用软件,方便部署K8S和后续K8S的维护、开发工作:

yum -y install wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel vim ncurses-devel autoconf automake zlib-devel python-devel openssh-server socat  ipvsadm conntrack ntpdate

除了个别组件外,大部分并非部署K8S急需的组件,根据实际下载情况对K8S部署的影响情况,再决定是不是一定要下载。

 

2.3. 系统配置

完成以下配置:

ntpdate ntp1.aliyun.com

 

swapoff -a

sed -i 's/.*swap.*/#&/' /etc/fstab

 

setenforce 0

sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux

sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

 

modprobe br_netfilter

echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables

echo 1 > /proc/sys/net/ipv4/ip_forward

 

systemctl disable firewalld

systemctl stop firewalld

 

echo """

vm.swappiness = 0

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward = 1

net.bridge.bridge-nf-call-ip6tables = 1

""" > /etc/sysctl.conf

 

sysctl --system

 

3. K8S软件下载(所有节点)

3.1. 下载

创建一个本地目录并进入,用于临时存放这些下载后的组件。

注意:以下下载路径中,涉及到版本的字段,需要自行找到个人需要的版本进行替换,本文档只是以K8S 1.25.5为例,构建的相关组件的地址。(不同版本的K8S可能所需要的组件版本不同)。

如果下载的较慢或者无法访问公网,建议可以直接到对应的地址下载后,放到节点上的同一个目录。

以下涉及到kubectl、runc、containerd、crictl、kubeadm、kubelet、kubernetes-cni这些组件的下载。

curl -LO "https://dl.k8s.io/release/v1.25.5/bin/linux/amd64/kubectl"

wget https://github.com/opencontainers/runc/releases/download/v1.1.7/runc.amd64  

wget https://github.com/containerd/containerd/releases/download/v1.7.2/containerd-1.7.2-linux-amd64.tar.gz

wget "https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.25.0/crictl-v1.25.0-linux-amd64.tar.gz"

wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz

 

3.2. 可执行文件存放

进入上一节下载文件的目录。

除了kubernetes-cni的文件外,将其他文件解压并且chmod +x,然后放入到/usr/local/bin下(其他可执行的路径都行,随意),但需要检查K8S节点上是否已经存在该组件,如果有,则需要删除原有主机上的可执行文件,切记!后续的组件配置中,需要使用到其中某些可执行文件的存放路径。

而kubernetes-cni得文件解压后,放入到/opt/cni/bin/下(固定路径)

chmod +x * -R

 

cp -rf runc.amd64 /usr/bin/runc

 

tar -xvf crictl-v1.25.0-linux-amd64.tar.gz

chmod +x * -R

cp -rf crictl /usr/local/bin

 

tar -xvf containerd-1.7.2-linux-amd64.tar.gz

chmod +x * -R

cp -rf bin/* /usr/local/bin/

 

cp -rf kubectl /usr/local/bin/

 

cp -rf kubeadm kubelet /usr/local/bin/

 

mkdir -p /opt/cni/bin/

tar -xvf cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/bin/

chmod +x /opt/cni/bin/*

 

执行以上组件的相关命令,例如

Which xxx

或者

Xxx version

Xxx -v

类似的命令来确认我们的可执行命令安装到位

 

3.3. Kubelet服务构建

  • 构建kubelet服务

DOWNLOAD_DIR=/usr/local/bin

RELEASE_VERSION="v0.4.0"

curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/kubepkg/templates/latest/deb/kubelet/lib/systemd/system/kubelet.service" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /etc/systemd/system/kubelet.service

sudo mkdir -p /etc/systemd/system/kubelet.service.d

curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/kubepkg/templates/latest/deb/kubeadm/10-kubeadm.conf" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

注意,DOWNLOAD_DIR需要改为存放kubelet的路径。

如果下载的较慢或者无法访问公网,建议可以直接到对应的地址下载后,放到命令中指定的目录,并手动执行命令后半部。

修改完成后,执行systemctl enable --now kubelet

 

  • 构建containerd服务

创建/lib/systemd/system/containerd.service文件,写入以下内容:

[Unit]

Description=containerd container runtime

Documentation=https://containerd.io

After=network.target local-fs.target

 

[Service]

ExecStartPre=-/sbin/modprobe overlay

ExecStart=/usr/local/bin/containerd    #(containerd所在路径)

Type=notify

Delegate=yes

KillMode=process

Restart=always

RestartSec=5

# Having non-zero Limit*s causes performance problems due to accounting

#overhead

# in the kernel. We recommend using cgroups to do container-local

#accounting.

LimitNPROC=infinity

LimitCORE=infinity

LimitNOFILE=infinity

# Comment TasksMax if your systemd version does not supports it.

# Only systemd 226 and above support this version.

TasksMax=infinity

OOMScoreAdjust=-999

[Install]

WantedBy=multi-user.target

 

  • 构建containerd配置

创建/etc/containerd/目录,创建/etc/containerd/config.toml文件,写入以下内容(不采用containerd自动生成的默认的配置,内容太多,这个配置简明扼要):

version = 2

root = "/var/lib/containerd"

state = "/run/containerd"

oom_score = -999

 

[grpc]

  max_recv_message_size = 16777216

  max_send_message_size = 16777216

 

[debug]

  level = "info"

 

[metrics]

  address = ""

  grpc_histogram = false

 

[plugins]

  [plugins."io.containerd.grpc.v1.cri"]

    sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.8"

    max_container_log_line_size = -1

    [plugins."io.containerd.grpc.v1.cri".containerd]

      default_runtime_name = "runc"

      snapshotter = "overlayfs"

      [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]

        [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]

          runtime_type = "io.containerd.runc.v2"

          runtime_engine = ""

          runtime_root = ""

          [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]

            SystemdCgroup = true

    [plugins."io.containerd.grpc.v1.cri".registry]

      config_path = "/etc/containerd/certs.d"

 

完成后执行:systemctl restart containerd && systemctl enable containerd

注意:sandbox_image地址需要根据你下载的镜像地址进行替换,后续会讲到。

另外,这里配置中,使用Systemd作为cgroup管理器,而不是cgroupfs,符合未来K8S的趋势。

不做配置的情况下,默认containerd的sock地址为/var/run/containerd/containerd.sock或者/run/containerd/containerd.sock(两个路径为同一个),一般情况下没必要修改。

 

  • 构建crictl服务

由于crictl可能默认使用sock地址与我们实际环境不同,所以需要创建/etc/crictl.yaml 文件

然后写入以下内容:

runtime-endpoint: unix:///var/run/containerd/containerd.sock

image-endpoint: unix:///var/run/containerd/containerd.sock

timeout: 10

debug: false

具体endpoint地址根据containerd配置的地址有关

0条评论
0 / 1000
勇哥很忙
2文章数
0粉丝数
勇哥很忙
2 文章 | 0 粉丝
勇哥很忙
2文章数
0粉丝数
勇哥很忙
2 文章 | 0 粉丝
原创

部署一套自己本地的K8S集群(上)

2023-07-10 08:28:09
188
0

1. 适用场景

  • 容器引擎默认使用containerd
  • 只有普通软件的yum源,没有K8S组件的相关yum源,例如当前时间点,公网ctyunos暂无对应版本的kubelet、kubectl、kubeadm这些组件,也缺少高版本的containerd和runc等组件。
  • 系统版本不是常见的系统,例如ctyunos,但必须为linux + amd64。
  • 只需要搭建一个可用的多节点K8S集群,对是否高可用,网络功能、集群性能没有太高要求。
  • 可能没有公网,但可以传文件。

由于在常见的centos系统中,通过公网yum源可以搞定很多常见软件的安装,但在ctyunos系统中,yum源上软件的不足,在实际部署测试环境中较多困扰。所以就本人的一些经验,结合网上的步骤,整理而得出该文档。

一些常用的部署K8S的软件,有些只支持单节点K8S,有些对系统版本有要求,总的来说,不够通用,在实际部署过程中使用反而麻烦。

 

2. 系统准备(所有节点)

本次用例,以ctyunos为例,内核版本5.4

在开始之前,尽量需要配置基本的yum源畅通

2.1. 节点host配置

进入/etc/hosts,配置IP和hostname的对应关系

10.0.0.24 csitest-centos8-0001

10.0.0.22 csitest-centos8-0002

10.0.0.21 csitest-centos8-0003

10.0.0.30 csitest-centos8-0004

 

2.2. 系统软件下载

通过yum下载一些常用软件,方便部署K8S和后续K8S的维护、开发工作:

yum -y install wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel vim ncurses-devel autoconf automake zlib-devel python-devel openssh-server socat  ipvsadm conntrack ntpdate

除了个别组件外,大部分并非部署K8S急需的组件,根据实际下载情况对K8S部署的影响情况,再决定是不是一定要下载。

 

2.3. 系统配置

完成以下配置:

ntpdate ntp1.aliyun.com

 

swapoff -a

sed -i 's/.*swap.*/#&/' /etc/fstab

 

setenforce 0

sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux

sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

 

modprobe br_netfilter

echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables

echo 1 > /proc/sys/net/ipv4/ip_forward

 

systemctl disable firewalld

systemctl stop firewalld

 

echo """

vm.swappiness = 0

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward = 1

net.bridge.bridge-nf-call-ip6tables = 1

""" > /etc/sysctl.conf

 

sysctl --system

 

3. K8S软件下载(所有节点)

3.1. 下载

创建一个本地目录并进入,用于临时存放这些下载后的组件。

注意:以下下载路径中,涉及到版本的字段,需要自行找到个人需要的版本进行替换,本文档只是以K8S 1.25.5为例,构建的相关组件的地址。(不同版本的K8S可能所需要的组件版本不同)。

如果下载的较慢或者无法访问公网,建议可以直接到对应的地址下载后,放到节点上的同一个目录。

以下涉及到kubectl、runc、containerd、crictl、kubeadm、kubelet、kubernetes-cni这些组件的下载。

curl -LO "https://dl.k8s.io/release/v1.25.5/bin/linux/amd64/kubectl"

wget https://github.com/opencontainers/runc/releases/download/v1.1.7/runc.amd64  

wget https://github.com/containerd/containerd/releases/download/v1.7.2/containerd-1.7.2-linux-amd64.tar.gz

wget "https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.25.0/crictl-v1.25.0-linux-amd64.tar.gz"

wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz

 

3.2. 可执行文件存放

进入上一节下载文件的目录。

除了kubernetes-cni的文件外,将其他文件解压并且chmod +x,然后放入到/usr/local/bin下(其他可执行的路径都行,随意),但需要检查K8S节点上是否已经存在该组件,如果有,则需要删除原有主机上的可执行文件,切记!后续的组件配置中,需要使用到其中某些可执行文件的存放路径。

而kubernetes-cni得文件解压后,放入到/opt/cni/bin/下(固定路径)

chmod +x * -R

 

cp -rf runc.amd64 /usr/bin/runc

 

tar -xvf crictl-v1.25.0-linux-amd64.tar.gz

chmod +x * -R

cp -rf crictl /usr/local/bin

 

tar -xvf containerd-1.7.2-linux-amd64.tar.gz

chmod +x * -R

cp -rf bin/* /usr/local/bin/

 

cp -rf kubectl /usr/local/bin/

 

cp -rf kubeadm kubelet /usr/local/bin/

 

mkdir -p /opt/cni/bin/

tar -xvf cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/bin/

chmod +x /opt/cni/bin/*

 

执行以上组件的相关命令,例如

Which xxx

或者

Xxx version

Xxx -v

类似的命令来确认我们的可执行命令安装到位

 

3.3. Kubelet服务构建

  • 构建kubelet服务

DOWNLOAD_DIR=/usr/local/bin

RELEASE_VERSION="v0.4.0"

curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/kubepkg/templates/latest/deb/kubelet/lib/systemd/system/kubelet.service" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /etc/systemd/system/kubelet.service

sudo mkdir -p /etc/systemd/system/kubelet.service.d

curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/kubepkg/templates/latest/deb/kubeadm/10-kubeadm.conf" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

注意,DOWNLOAD_DIR需要改为存放kubelet的路径。

如果下载的较慢或者无法访问公网,建议可以直接到对应的地址下载后,放到命令中指定的目录,并手动执行命令后半部。

修改完成后,执行systemctl enable --now kubelet

 

  • 构建containerd服务

创建/lib/systemd/system/containerd.service文件,写入以下内容:

[Unit]

Description=containerd container runtime

Documentation=https://containerd.io

After=network.target local-fs.target

 

[Service]

ExecStartPre=-/sbin/modprobe overlay

ExecStart=/usr/local/bin/containerd    #(containerd所在路径)

Type=notify

Delegate=yes

KillMode=process

Restart=always

RestartSec=5

# Having non-zero Limit*s causes performance problems due to accounting

#overhead

# in the kernel. We recommend using cgroups to do container-local

#accounting.

LimitNPROC=infinity

LimitCORE=infinity

LimitNOFILE=infinity

# Comment TasksMax if your systemd version does not supports it.

# Only systemd 226 and above support this version.

TasksMax=infinity

OOMScoreAdjust=-999

[Install]

WantedBy=multi-user.target

 

  • 构建containerd配置

创建/etc/containerd/目录,创建/etc/containerd/config.toml文件,写入以下内容(不采用containerd自动生成的默认的配置,内容太多,这个配置简明扼要):

version = 2

root = "/var/lib/containerd"

state = "/run/containerd"

oom_score = -999

 

[grpc]

  max_recv_message_size = 16777216

  max_send_message_size = 16777216

 

[debug]

  level = "info"

 

[metrics]

  address = ""

  grpc_histogram = false

 

[plugins]

  [plugins."io.containerd.grpc.v1.cri"]

    sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.8"

    max_container_log_line_size = -1

    [plugins."io.containerd.grpc.v1.cri".containerd]

      default_runtime_name = "runc"

      snapshotter = "overlayfs"

      [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]

        [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]

          runtime_type = "io.containerd.runc.v2"

          runtime_engine = ""

          runtime_root = ""

          [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]

            SystemdCgroup = true

    [plugins."io.containerd.grpc.v1.cri".registry]

      config_path = "/etc/containerd/certs.d"

 

完成后执行:systemctl restart containerd && systemctl enable containerd

注意:sandbox_image地址需要根据你下载的镜像地址进行替换,后续会讲到。

另外,这里配置中,使用Systemd作为cgroup管理器,而不是cgroupfs,符合未来K8S的趋势。

不做配置的情况下,默认containerd的sock地址为/var/run/containerd/containerd.sock或者/run/containerd/containerd.sock(两个路径为同一个),一般情况下没必要修改。

 

  • 构建crictl服务

由于crictl可能默认使用sock地址与我们实际环境不同,所以需要创建/etc/crictl.yaml 文件

然后写入以下内容:

runtime-endpoint: unix:///var/run/containerd/containerd.sock

image-endpoint: unix:///var/run/containerd/containerd.sock

timeout: 10

debug: false

具体endpoint地址根据containerd配置的地址有关

文章来自个人专栏
K8S部署
2 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0