k8s集群搭建及对一些组件的简单理解(k8s集群的工作原理)

k8s集群搭建及对一些组件的简单理解背景 前面写了一篇,k8s集群搭建及对一些组件的简单理解(一),主要讲了下背景和对一些组件的理解。
今天讲一下正式的安装,有网环境的

背景

我之前写过一篇文章《搭建K8S集群并轻松理解一些组件(一)》。本文主要提供一些组件的背景和理解。

今天我们要讲的是正式安装需要网络环境。稍后我们将讨论没有外部网络的纯内网环境。

k8s集群节点、组件

控制平面节点通常部署以下组件:etcd、apiserver、kube-scheduler、kube-controller-manager。这些组件是面向用户的,因此它们通过kubectl 或UI 接收并响应用户请求。

收到请求后,这些组件开始处理该请求。当用户想要运行Pod 时,这些组件会寻找合适的节点来部署Pod。因此,它通常被认为是实际运行用户Pod 的节点。数据平面节点。

有关这些概念的信息,请参阅Kubernetes 组件| Kubernetes。

虽然控制平面中的组件理论上可以分布到任何节点,但安装脚本通常会选择将这些组件安装在同一台机器上并在这些机器上运行用户pod 以实现高可用性。它还安装在多台机器上。因此,这些机器可以称为控制平面节点。

从上图中可以看到,控制平面节点仅包含api-server/etcd/kube-scheduler 等组件。此外,控制平面不会强制用户Pod 不运行。使用kubeadm 构建集群。控制平面节点通常包括控制平面组件和数据平面节点组件,例如kubelet、kube-proxy 和容器运行时。

下面是我使用kubeadm 构建控制平面节点后编译的图。

六个pod(四个绿色部分:etcd、api-server、scheduler、control-manager,两个灰色部分:coredns、kube-proxy),这些pod 可以理解为六个后台进程。

systemctl 管理的三个服务:

/usr/lib/systemd/system/kubelet.service

/usr/lib/systemd/system/cri-docker.service

/usr/lib/systemd/system/docker.service

这三个服务也可以理解为三个后台进程,但是它们并不是以pod容器模式运行的。

这三个服务还提供了三个可用于隐藏目的的二进制文件:kubelet、cri-docker 和dokcer。

2 cli:kubectl和kubeadm,这两个不是后台进程,它们只是简单的cli客户端。

当我第一次安装它时,我有点困惑,因为我面对着近10 个进程和几个名称相似的CLI。随着尝试了几次,我逐渐了解了,正式开始安装。

我们的机器配置:

Virtualbox 创建了两个干净的虚拟机。他们没有安装任何东西,但有一个外部网络。

10.0.2.8 节点4,准备充当主节点

10.0.2.9 node5,准备用作工作节点

操作系统是centos 7.9。

容器运行时

参考文件:

容器运行时|

这里我们选择docker。如果有时间的话,我也会学习其他的东西。

前置条件

IP转发

该文档指出,Linux 上默认没有开启IP 转发,而且k8s 的很多网络插件都需要这个功能,所以必须开启。

默认情况下,Linux 内核不允许IPv4 数据包在接口之间路由。大多数Kubernetes 集群网络实现都会更改此设置(如有必要)。

# 设置需要sysctl 参数,但参数在重新启动后仍然存在

猫EOF | sudo tee /etc/sysctl.d/k8s.conf

net.ipv4.ip_forward=1

结束后

# 应用sysctl参数而不重新启动

sudo sysctl –系统

检查它是否已设置为1。

sysctl net.ipv4.ip_forward

cgroup驱动程序

容器运行时|

Linux 使用控制组来限制进程可以使用的资源。当kubelet 和容器运行时,您必须处理控制组来管理pod 和容器资源并限制CPU、内存和其他可用资源。你不是直接寻址控制组,而是通过控制组驱动程序,可以将其理解为驱动程序。确保容器运行时和kubelet 使用相同的cgroup 驱动程序非常重要。

目前有两个cgroup 驱动程序:cgroupfs 和systemd。

cgroupfs是kubelet的默认驱动,fs代表文件系统,是用户控制资源的文件系统接口。

默认目录是/sys/fs/cgroup。在我们的系统中:

[root@node4 ~]# ll /sys/fs/cgroup

总计0

drwxr-xr-x 2 root root 0 六月23 12:53 blkio

lrwxrwxrwx 1 root root 11 Jun 23 12:53 cpu – cpu, cpuacct

lrwxrwxrwx 1 root root 11 六月23 12:53 cpuacct – cpu,cpuacct

drwxr-xr-x 2 根根0 六月23 12:53 cpu, cpuacct

drwxr-xr-x 2 root root 0 六月23 12:53 cpuset

drwxr-xr-x 4 root root 0 六月23 12:53 设备

drwxr-xr-x 2 root 0 六月23 12:53 冰箱

drwxr-xr-x 2 根根0 六月23 12:53 Hugetlb

drwxr-xr-x 2 根根0 6/23 12:53 内存

lrwxrwxrwx。 1 root root 6 月23 日16 12:53 net_cls – net_cls,net_prio

drwxr-xr-x 2 root root 0 六月23 12:53 net_cls、net_prio

lrwxrwxrwx 1 root root 16 六月23 12:53 net_prio – net_cls,net_prio

drwxr-xr-x 2 根根0 六月23 12:53 perf_event

drwxr-xr-x 2 根根0 六月23 12:53 pid

drwxr-xr-x 4 root root 0 六月23 12:53 systemd

所以,简单来说,这个驱动程序通过直接操作这个目录中的文件来与内核中的控制组进行交互。例如,如果您在此处创建一个组并为特定进程添加PID,则这些PID 将受该组的资源限制设置的约束。

但是,在systemd 管理的系统上(例如centos 7 主要由systemd 管理),不建议使用此cgroupfs 驱动程序。

这是因为在这种系统中,systemd为每个单元配置了一个控制组,例如:

将CPUQuota与systemd一起使用- Thinbug

[单元]

描述=虚拟分布式以太网

[服务]

ExecStart=/usr/bin/ddcommand

CPU配额=10%

[安装]

WantedBy=多用户.Target

此处,CPUQuota 将可用CPU 限制为10%。

有关systemd 资源限制,请检查man systemd.resource-control。

因此,这个systemd系统必须统一使用cgroup驱动systemd。

稍后将解释设置方法。

docker 安装

我使用yum进行安装,但是后面搭建内网k8s需要保存rpm包,所以我下载了rpm包然后手动安装。

参考文档:https://docs.docker.com/engine/install/centos/

在安装yum之前,必须先安装docker yum存储库。否则,如果你直接安装yum,你最终可能会得到一个非常旧的版本。例如,对于centos 7.9:

[root@node4 ~]# yum信息docker

可用套餐

名称: 码头工人

拱门: x86_64

纪元: 2

版本: 1.13.1

发布: 210.git7d71120.el7.centos

尺寸: 17M

存储库: extra/7/x86_64

这是1.13.1,从2017 年开始:https://docs.docker.com/engine/release-notes/prior-releases/

后来改为17.03等格式(最初称为YY.MM格式,现在不太兼容)。一些最新版本是23.0/24.0/25.0/26.0。最新的是26.1。

因此,要安装新版本,首先获取docker yum 存储库。

虽然这是官方的,但遭到了如下批评。

sudo yum install -y yum-utils

sudo yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo

接下来,创建图像。如果您使用云服务器,您可以找到您自己的云供应商提供的Docker 镜像。这种类型通常更快。

wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

下载rpm包。

[root@node4 ~]# mkdir /root/docker-package

[root@node4 ~]# cd /root/docker-package/

[root@node4 docker-package]# yumdownloader –resolve –destdir=. docker-ce docker-ce-clicontainerd.io

我没有安装docker-buildx-plugin 和docker-compose-plugin,所以我认为它们暂时不会有用。

下载完成后,您将看到以下内容:

[root@node4 docker-package]#ll

总计118488

-rw-r–r–.1 root root 78256 2019 年8 月23 日Audit-libs-python-2.8.5-4.el7.x86_64.rpm

-rw-r–r– 1 root root 302068 2018 年11 月12 日checkpolicy-2.5-8.el7.x86_64.rpm

-rw-r–r–。 1 root root 37045876 6月21日18:38containerd.io-1.6.33-3.1.el7.x86_64.rpm

.

使用rpm包安装。

rpm -ivh *.rpm

安装后,将有多个由systemd 管理的单元。

cd /usr/lib/systemd/系统

-rw-r–r– 1 root root 1264 六月5 日16:36containerd.service

-rw-r–r– 1 root root 295 六月5 日19:31 docker.socket

-rw-r–r– 1 root root 1962年6月5日19:31 docker.service

接下来,设置Docker 配置文件(如果不存在,则创建一个新配置文件)。

[root@app1 ~]# vim /etc/docker/daemon.json

{

\’exec-opts\’: [\’native.cgroupdriver=systemd\’],

\’logdriver\’: \’json 文件\’,

\’日志选项\’: {

\’最大尺寸\’: \’100m\’

},

“调试”: 正确

}

基本上,如果您需要配置私有服务器和镜像,则需要修改此文件。例如,添加以下行,但暂时不要添加。

\’注册表镜像\’:[\’http://10.0.218.xxx:8083\’],

\’不安全注册表\’: [\’http://10.0.218.xxx:8083\’]

启动服务。

systemctl启动docker

systemctl 状态泊坞窗

启动:

启用systemctl docker

检查cgroup 驱动程序是否是systemd。

[root@app1 cri-docker]# docker info|grep 组

Cgroup 驱动程序: systemd

Cgroup版本: 1

检查是否可以拉动它。

[root@node4 docker-package]# docker pull hello-world

默认tag:最新使用情况

从最新的:库/hello-world中检索

c1ec31eb5944: 1秒后重试

检索映像配置时出错: 尝试后下载失败=6: 拨号TCP 103.252.114.61:443: I/O 超时

如果拉不下来,也可以查看日志。

日志ctl -u docker

实时观看:

日志ctl -u docker -f

嗯,不。这是因为当您运行docker pull 时,您需要访问网站https://production.cloudflare.docker.com。

如果你不学互联网技术,只能使用官方仓库,docker.io的国内镜像仓库。

我首先看了一些网上整理的镜像网站。

除了倒数第二个以外,除了腾讯是内部使用的(云服务器上可用)外,其他都无法使用。 (当前时间20240623)。

docker pull docker.m.daocloud.io/hello-world

[root@node4 docker-package]# docker 镜像

存储库标签图像ID 创建大小

docker.m.daocloud.io/hello-world 最新d2c94e258dcb 13 个月前13.3kB

另外,我们可以关注Docker提供的外部接口:域UNIX套接字。

[root@node4 docker-package]# netstat -nlp |grep docker

unix 2 [ACC] 流监听40562 1/systemd /run/docker.sock

cri-docker 安装

栗子卡

cri-docker 由Docker 和Mirantis(Docker 商业化公司)共同维护,实现了k8s 的CRI 接口,并适配CRI 接口来转换和响应对Docker 的调用。

最简单的安装方法是安装rpm包并从https://github.com/Mirantis/cri-dockerd/releases下载。

这里下载的文件是cri-dockerd-0.3.14-3.el7.x86_64.rpm。

cd /root/上传

上传rpm

rpm -ivh cri-dockerd-0.3.14-3.el7.x86_64.rpm

安装后,将提供以下服务:

/usr/lib/systemd/system/cri-docker.service

显示内容的主要命令有:

ExecStart=/usr/bin/cri-dockerd –container-runtime-endpoint fd://

显示帮助:

/usr/bin/cri-dockerd -h

这里有很多选项,所以请查看更多。

例如,你可以在这里指定docker的socket的地址。

–docker-endpoint string 将其用于您要与之通信的Docker 端点。

(默认为“unix:///var/run/docker.sock”)

您还可以指定pod 内基础容器的图像坐标。

–pod-infra-container-image string 每个pod 的网络/ipc 命名空间容器使用的镜像(默认为“registry.k8s.io/pause:3.9”)

开始:

[root@node4上传]# systemctl start cri-docker

[root@node4 upload]# systemctl status cri-docker

要侦听的端口是/run/cri-dockerd.sock 或/var/run/cri-dockerd.sock,两者都指向同一文件。

[root@node4上传]# netstat -nlxp|grep cri

unix 2 [ACC] 流监听68693 1/systemd /run/cri-dockerd.sock

日志查看:

Journalctl -u cri-docker

kubelet安装

安装Kubeadm |

前置

安装Kubeadm |

关闭SeLinux。

须藤setenforce 0

sudo sed -i \’s/^SELINUX=enforcing$/SELINUX=permissive/\’ /etc/selinux/config

完成交换:

须藤vi /etc/fstab

注释掉以下行:

# /dev/mapper/centos-swap 交换交换默认0 0

[root@app1 ~]# sudo swapoff -a

检查:

[root@app1 ~]# free -h

安装kubelet

猫EOF | sudo tee /etc/yum.repos.d/kubernetes.repo

[库伯内特]

名称=Kubernetes

Baseurl=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/

有效=1

gpg检查=1

gpgkey=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/repodata/repomd.xml.key

排除=kubelet kubeadm kubectl cri-tools kubernetes-cni

结束后

接下来,先安装kubelet。

安装rpm:

mkdir /root/kubelet-kubeadm

cd /root/kubelet-kubeadm

yumdownloader –resolve –destdir=.kubelet –disableexcludes=kubernetes

rpm -ivh *.rpm

如果直接安装的话,会是这样的:

yum install kubelet –disableexcludes=kubernetes

可以看到它依赖于kubernetes-cni 包。

/usr/lib/systemd/system/kubelet.service

systemctl 状态kubelet

cd /usr/lib/systemd/系统/

[root@node4系统]#ll kubelet*

-rw-r–r– 1 root root 278 六月12 05:15 kubelet.service

看看如果你现在开始,你能做什么。

使用systemctl 启动kubelet

使用systemctl 启用kubelet

systemctl 状态kubelet

未能启动。

显示日志。

日志ctl -u kubelet

您可以看到我们现在处于独立模式。这种模式允许kubelet 在没有API 服务器的情况下独立管理pod。您可以搜索一下详细信息。

安装kubeadm

安装rpm:

cd /root/kubelet-kubeadm

yumdownloader –resolve –destdir=.kubeadm –disableexcludes=kubernetes

rpm -ivh *.rpm

如果直接安装的话,会是这样的:

yum 安装kubeadm –disableex

cludes=kubernetes
发现其会依赖cri-tools

对kubelet的影响

安装完成后,我们再去看kubelet的service目录下:

cd /usr/lib/systemd/system/
[root@node4 system]# ll kubelet*
-rw-r–r–. 1 root root 278 Jun 12 05:15 kubelet.service
kubelet.service.d:
total 4
-rw-r–r–. 1 root root 900 Jun 12 05:14 10-kubeadm.conf

发现多了个目录,目录下还有配置文件10-kubeadm.conf. 这个配置文件其实就是给kubelet指定了些配置,比如后续怎么去连接api-server(就不在是standalone模式了)、以及指定了一些kubelet自身的配置项

另外,也可以查看下kubelet的选项,非常多:

[root@node4 system]# /usr/bin/kubelet -h

kubeadm的流程

此时,其实就可以准备创建集群了。语法很简单:

kubeadm init –pod-network-cidr=192.168.0.0/16 –cri-socket unix:///var/run/cri-dockerd.sock –kubernetes-version v1.30.1 –v=5

具体选项可以看:

kubeadm init -h

我们指定的选项的意思:

–pod-network-cidr,这个是部分cni插件需要指定,我们选的是calico,去calico官网查看文档,发现其默认需要这么指定:192.168.0.0/16,意思就是pod的ip的网段
–cri-socket,这个是因为我们机器上,既有cri-docker,又有containerd,两个cri实现,必须手动指定一个。
–kubernetes-version v1.30.1,联网环境下可以不指定,就是指定k8s的版本;离线环境下指定了就不用去联网发请求
–v,日志级别

但,实际这样还不够,k8s的控制面组件不是有好几个pod吗,pod内容器的镜像,是维护在registry.k8s.io这个仓库下的。

我们直接去拉取镜像会失败:

[root@node4 system]# docker pull registry.k8s.io/kube-apiserver:v1.30.1
Error response from daemon: Head \”https://asia-east1-docker.pkg.dev/v2/k8s-artifacts-prod/images/kube-apiserver/manifests/v1.30.1\”: dial tcp: lookup asia-east1-docker.pkg.dev on 10.0.2.1:53: no such host

这些网址是由Google团队提供的,被q了。

所以,我们只能找找registry.k8s.io的镜像仓库,我这边用的registry-k8s-io.mirrors.sjtug.sjtu.edu.cn。

因此,最后命令是:

kubeadm init –image-repository registry-k8s-io.mirrors.sjtug.sjtu.edu.cn –pod-network-cidr=192.168.0.0/16 –cri-socket unix:///var/run/cri-dockerd.sock –kubernetes-version v1.30.1 –v=5

另外,我们加上–dry-run,先试着跑一下,但是,我建议,还是先提前拉取好镜像,再来跑这个好一点:

kubeadm init –image-repository registry-k8s-io.mirrors.sjtug.sjtu.edu.cn –pod-network-cidr=192.168.0.0/16 –cri-socket unix:///var/run/cri-dockerd.sock –kubernetes-version v1.30.1 –v=5 –dry-run

为啥呢,因为k8s这几个组件的镜像大小有大几百兆,所以界面会一直卡在这里,不知道后台到底怎么样了,是卡死了还是怎么了。

我们如果要提前拉取镜像,先得知道要拉取哪些镜像:

[root@node4 system]# kubeadm config images list
registry.k8s.io/kube-apiserver:v1.30.2
registry.k8s.io/kube-controller-manager:v1.30.2
registry.k8s.io/kube-scheduler:v1.30.2
registry.k8s.io/kube-proxy:v1.30.2
registry.k8s.io/coredns/coredns:v1.11.1
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.12-0

然后,转换为:

docker pull registry-k8s-io.mirrors.sjtug.sjtu.edu.cn/kube-apiserver:v1.30.2
docker pull registry-k8s-io.mirrors.sjtug.sjtu.edu.cn/kube-controller-manager:v1.30.2
docker pull registry-k8s-io.mirrors.sjtug.sjtu.edu.cn/kube-scheduler:v1.30.2
docker pull registry-k8s-io.mirrors.sjtug.sjtu.edu.cn/kube-proxy:v1.30.2
docker pull registry-k8s-io.mirrors.sjtug.sjtu.edu.cn/coredns/coredns:v1.11.1
docker pull registry-k8s-io.mirrors.sjtug.sjtu.edu.cn/pause:3.9
docker pull registry-k8s-io.mirrors.sjtug.sjtu.edu.cn/etcd:3.5.12-0

docker images,确保镜像都存在了,再次运行:

发现会卡在一个拉取coreDns的地方,

pulling: registry-k8s-io.mirrors.sjtug.sjtu.edu.cn/coredns:v1.11.1

这个主要是两个仓库的标签打得有点不一样,我们就把我们已经存在的镜像,重新打个tag:

docker tag registry-k8s-io.mirrors.sjtug.sjtu.edu.cn/coredns/coredns:v1.11.1 registry-k8s-io.mirrors.sjtug.sjtu.edu.cn/coredns:v1.11.1

结果再次运行,发现还是卡:

[api-check] Waiting for a healthy API server. This can take up to 4m0s

检查了几个服务的日志,发现docker日志显示还在拉取:


registry.k8s.io/pause from https://registry.k8s.io

后面查了下,是因为就是我们忽略了一句kubeadm打印的提示:

W0623 16:26:12.928077 22235 checks.go:844] detected that the sandbox image \”registry.k8s.io/pause:3.9\” of the container runtime is inconsistent with that used by kubeadm.It is recommended to use \”registry-k8s-io.mirrors.sjtug.sjtu.edu.cn/pause:3.9\” as the CRI sandbox image.

我们在cri-docker那里,需要修改下镜像坐标。

ExecStart=/usr/bin/cri-dockerd –container-runtime-endpoint fd:// –pod-infra-container-image registry-k8s-io.mirrors.sjtug.sjtu.edu.cn/pause:3.9

systemctl daemon-reload
systemctl restart cri-docker

再次执行,又说一堆东西已经存在了。我们可以先reset下:

kubeadm reset -f –cri-socket unix:///var/run/cri-dockerd.sock

这次基本就能成功了,把最下面的命令存下来:

Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run \”kubectl apply -f [podnetwork].yaml\” with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.0.2.x:6443 –token k3nmtk.kx1k6cbxbsuaqysd \\
–discovery-token-ca-cert-hash sha256:9659ceb5bf342b1a9fa1ef1888a3ce26a1f9c881dbbf4bbadcbb62d5dcde37dd

安装kubectl

这个东西是啥呢,只是个cli,客户端工具,给我们用的,就像redis-cli和mysql命令行客户端一样,主要是和控制面组件中的api-server进行交互。

事实上,各个容器厂商都是做一套界面出来给用户用的,也是直接对接api-server。

这里我们安装下。

rpm安装:
cd /root/kubelet-kubeadm
yumdownloader –resolve –destdir=. kubectl –disableexcludes=kubernetes
rpm -ivh *.rpm
如果直接装就是:
yum install kubectl –disableexcludes=kubernetes

然后执行下:

[root@node4 system]# kubectl get pods -A
E0623 16:40:18.035470 25920 memcache.go:265] couldn\’t get current server API group list: Get \”http://localhost:8080/api?timeout=32s\”: dial tcp [::1]:8080: connect: connection refused

因为还需要指定api-server的地址:

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

再来:

[root@node4 system]# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-86c4446b65-6sr2p 0/1 Pending 0 7m13s
kube-system coredns-86c4446b65-n4xcl 0/1 Pending 0 7m13s
kube-system etcd-node4 1/1 Running 0 7m28s
kube-system kube-apiserver-node4 1/1 Running 0 7m28s
kube-system kube-controller-manager-node4 1/1 Running 0 7m28s
kube-system kube-proxy-rxxc9 1/1 Running 0 7m13s
kube-system kube-scheduler-node4 1/1 Running 0 7m28s

可以发现,coreDns这两个pod是pending状态。看一下这个pod的状态:发现是说没有可用的ready的node。

[root@node4 system]# kubectl get nodes -A
NAME STATUS ROLES AGE VERSION
node4 NotReady control-plane 13m v1.30.2

我们的node确实是NotReady。

[root@node4 system]# kubectl describe node node4

Ready False Sun, 23 Jun 2024 16:43:43 +0800 Sun, 23 Jun 2024 16:33:18 +0800 KubeletNotReady container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized

里面可以看到,是因为cni网络插件尚未ready的原因。

安装网络插件calico

网络插件有好多种,主流用的也有好几种,各种的差别后面我们再讲,其中呢,calico算是一款优秀的网络插件。

Quickstart for Calico on Kubernetes | Calico Documentation

安装operator

wget https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/tigera-operator.yaml
执行:
k create -f tigera-operator.yaml
执行完后,会新增一个pod:
[root@node4 calico-install]# kubectl get pods -A |grep tigera
tigera-operator tigera-operator-5ddc799ffd-fqsps 0/1 ContainerCreating 0 49s

这里又涉及到拉取镜像,这次的镜像是在:

[root@node4 calico-install]# grep image tigera-operator.yaml |grep quay
image: quay.io/tigera/operator:v1.34.0

还好,这个quay.io/tigera/operator:v1.34.0直接网络可以拉取。。不需要镜像

运行网络插件相关pod

Quickstart for Calico on Kubernetes | Calico Documentation

wget https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/custom-resources.yaml
// 这个动作又要拉取镜像,有大几百兆
kubectl create -f custom-resources.yaml

我在我以前成功的机器上看了下,拉取了这些(版本不一定和最新一样):

[root@app1 ~]# docker images |grep calico
calico/typha v3.28.0 a9372c0f51b5 71.1MB
calico/kube-controllers v3.28.0 428d92b02253 79.1MB
calico/apiserver v3.28.0 6c07591fd1cf 97.9MB
calico/cni v3.28.0 107014d9f4c8 209MB
calico/node-driver-registrar v3.28.0 0f80feca743f 23.5MB
calico/csi v3.28.0 1a094aeaf152 18.3MB
calico/pod2daemon-flexvol v3.28.0 587b28ecfc62 13.4MB
calico/node v3.28.0 4e42b6f329bc 353MB

我看了下docker日志,发现又跑去docker.io这个官方仓库拉取calico镜像去了,这尼玛。还是得配个镜像仓库啊。

vim /etc/docker/daemon.json
{
\”exec-opts\”: [\”native.cgroupdriver=systemd\”],
\”log-driver\”: \”json-file\”,
\”log-opts\”: {
\”max-size\”: \”100m\”
},
\”debug\”: true,
\”registry-mirrors\”: [\”https://docker.m.daocloud.io\”]
}

只要镜像下下来了,就没问题了,等一会,pod就会就绪,coreDns也会就绪:

worker节点安装

10.0.2.9 node5

容器运行时

参照主节点,全都需要执行。

rpm包我们scp拷贝过去。

scp * 10.0.2.9:/root/docker-package

scp /etc/docker/daemon.json 10.0.2.9:/etc/docker/daemon.json

systemctl start docker
systemctl status docker
systemctl enable docker

cri-docker安装

参照主节点。

记得修改service文件:

/usr/lib/systemd/system/cri-docker.service
加参数:
–pod-infra-container-image registry-k8s-io.mirrors.sjtug.sjtu.edu.cn/pause:3.9
systemctl start cri-docker
systemctl status cri-docker
systemctl enable cri-docker

kubelet安装

直接装,或者拿主节点的rpm来装:
yum install kubelet –disableexcludes=kubernetes

systemctl start kubelet
systemctl enable kubelet

kubeadm安装

直接装,或者拿主节点的rpm来装:
yum install kubeadm –disableexcludes=kubernetes

拷贝并加载镜像

从主节点中,执行:

[root@node4 docker-package]# docker save -o calico_images.tar $(docker images –format \”{{.Repository}}:{{.Tag}}\” | grep \”^calico\”)
[root@node4 docker-package]# docker save -o pause.tar $(docker images –format \”{{.Repository}}:{{.Tag}}\” | grep \”pause\”)
[root@node4 docker-package]# docker save -o kube-proxy.tar $(docker images –format \”{{.Repository}}:{{.Tag}}\” | grep \”kube-proxy\”)
[root@node4 docker-package]# scp calico_images.tar pause.tar kube-proxy.tar 10.0.2.9:/root/images-for-load

在worker节点上:

cd /root/images-for-load
docker load < kube-proxy.tar
docker load < calico_images.tar
docker load < pause.tar
docker images

join集群

找出之前存下来的join语句:

kubeadm join 10.0.2.8:6443 –token k3nmtk.kx1k6cbxbsuaqysd \\
–discovery-token-ca-cert-hash sha256:9659ceb5bf342b1a9fa1ef1888a3ce26a1f9c881dbbf4bbadcbb62d5dcde37dd –cri-socket unix:///var/run/cri-dockerd.sock –v=5

注意,worker节点不能执行kubectl是正常的,因为一般是在控制节点上执行kubectl。当然,如果有需要,也可以像主节点那样操作,弄一下就行了。

测试

我这边在主节点上:

kubectl create deploy www-nginx-demo –image nginx –replicas=2

如果发现调度到了两台机器上,等nginx镜像拉取完成后(在主、工作节点都要拉取),可以看到pod状态变成正常。

在主节点上,直接访问pod:

在工作节点上,直接访问pod:

容器到容器的网络也是通的,只是容器内太简单了,缺少ping这些基础的工具,以后再说说这块。

总结

后续再讲下完全没有网络的环境中的安装吧,也算是给自己备忘了。

文章转载自: 三国梦回

原文链接:https://www.cnblogs.com/grey-wolf/p/18268158#374937729

体验地址:引迈 – JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

#以上关于k8s集群搭建及对一些组件的简单理解的相关内容来源网络仅供参考,相关信息请以官方公告为准!

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92343.html

(0)
CSDN's avatarCSDN
上一篇 2024年6月26日 下午11:38
下一篇 2024年6月26日 下午11:38

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注