Linux——K8s集群部署过程
1、环境准备
(1)配置好网络ip和主机名
control:

node1:

node2:

配置ip 主机名的过程省略
配置一个简单的基于hosts文件的名称解析
[root@node1 ~]# vim /etc/hosts
// 文件中新增以下三行
192.168.110.10 control
192.168.110.11 node1
192.168.110.22 node2
[root@node1 ~]# scp /etc/hosts root@node1:/etc/hosts
The authenticity of host 'node1 (192.168.110.11)' can't be established.
ED25519 key fingerprint is SHA256:84EopGSflyn0EP7RLvmnvaWPJCTe8G99eX4dF6XQzFk.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'node1' (ED25519) to the list of known hosts.
root@node1's password:
hosts 100% 223 251.9KB/s 00:00
[root@node1 ~]# scp /etc/hosts root@control:/etc/hosts
The authenticity of host 'control (192.168.110.10)' can't be established.
ED25519 key fingerprint is SHA256:84EopGSflyn0EP7RLvmnvaWPJCTe8G99eX4dF6XQzFk.
This host key is known by the following other names/addresses:~/.ssh/known_hosts:1: node1
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'control' (ED25519) to the list of known hosts.
root@control's password:
hosts 100% 223 103.3KB/s 00:00
[root@node1 ~]# scp /etc/hosts root@node2:/etc/hosts
The authenticity of host 'node2 (192.168.110.22)' can't be established.
ED25519 key fingerprint is SHA256:84EopGSflyn0EP7RLvmnvaWPJCTe8G99eX4dF6XQzFk.
This host key is known by the following other names/addresses:~/.ssh/known_hosts:1: node1~/.ssh/known_hosts:4: control
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'node2' (ED25519) to the list of known hosts.
root@node2's password:
hosts
(2)允许root用户远程登录
从第三步开始,所有的操作需要在三个节点上一起执行。
(3)调整防火墙
[root@control ~]# systemctl disable --now firewalld.service
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
[root@control ~]# nft flush ruleset
(4)允许系统转发ipv4数据包
[root@control ~]# vim /etc/sysctl.d/k8s.conf
[root@control ~]# cat /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
[root@control ~]# sysctl -f /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
[root@control ~]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
(5)设置容器运行时
[root@control ~]# dnf remove -y podman container* runc*
[root@control ~]# dnf -y install dnf-utils //安装仓库配置命令行工具
[root@control ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
设置docker 仓库,安装docker和containerd 服务。
docker 对于容器进行管理的客户端架构,docker只是将用户指令打包给containerd 进行容器启动 停止等控制容器的操作。
containerd 实际的容器管理服务
[root@control ~]# dnf makecache
Waiting for process with pid 33407 to finish.
CentOS Stream 9 - BaseOS 1.3 kB/s | 7.5 kB 00:05
CentOS Stream 9 - AppStream 1.3 kB/s | 7.7 kB 00:05
CentOS Stream 9 - Extras packages 1.6 kB/s | 8.6 kB 00:05
Docker CE Stable - x86_64 1.8 kB/s | 58 kB 00:32
Metadata cache created.
[root@control ~]# dnf install docker-ce docker-ce-cli containerd.io
[root@control ~]# systemctl enable --now containerd.service
Created symlink /etc/systemd/system/multi-user.target.wants/containerd.service → /usr/lib/systemd/system/containerd.service.
[root@control ~]# containerd config dump > /etc/containerd/config.toml // 生成完整配置文件
[root@control ~]# containerd config default > /etc/containerd/config.toml // 生成完整配置文件
[root@control ~]# vim /etc/containerd/config.toml

[root@control ~]# systemctl restart containerd.service
(6)禁用swap交换分区
[root@control ~]# swapoff -a
[root@control ~]# vim /etc/fstab
[root@control ~]# cat /etc/fstab#
# /etc/fstab
# Created by anaconda on Fri Aug 23 00:45:24 2024
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/cs_bogon-root / xfs defaults 0 0
UUID=d910d323-150c-40df-bd32-bdfb1f5c93b9 /boot xfs defaults 0 0
UUID=BA00-CA1F /boot/efi vfat umask=0077,shortname=winnt 0 2
#/dev/mapper/cs_bogon-swap none swap defaults 0 0 // 禁止交换分区在重启后挂载激活
二、K8s安装和集群初始化
(1)安装K8S 安装工具的软件包
[root@control ~]# setenforce 0
[root@control ~]#
[root@control ~]# grep ^SELINUX= /etc/selinux/config
SELINUX=enforcing
[root@control ~]# sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
[root@control ~]# grep ^SELINUX= /etc/selinux/config
SELINUX=permissive
[root@control ~]# cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
[root@control ~]# dnf -y install kubectl kubelet kubeadm --disableexcludes=kubernetes
[root@control ~]# systemctl enable kubelet.service
(2)集群初始化
核心命令 kubeadm init
获取初始化的默认配置,并修改使之符合一般的集群初始化需要。
加快集群初始化进程,提前下载集群运行的镜像。
[root@control ~]# kubeadm config print init-defaults >> init.yml
[root@control ~]# vim init.yml

[root@control ~]# kubeadm config images list --config init.yml
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.31.0
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.31.0
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.31.0
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.31.0
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.11.3
registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.10
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.15-0
[root@control ~]# kubeadm config images pull --config init.yml
在集群初始化时,还是使用较早版本的pause:3.8 ,手动下载并修改镜像仓库标记即可。
拉取pause:3.8镜像 下面这条命令的作用等同于docker pull
[root@control ~]# crictl -r unix:///var/run/containerd/containerd.sock pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.8
Image is up to date for sha256:4873874c08efc72e9729683a83ffbb7502ee729e9a5ac097723806ea7fa13517
[root@control ~]# ctr namespace list
NAME LABELS
k8s.io
改名,这条命令的作用等于docker tag
[root@control ~]# ctr --namespace k8s.io image tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.8 registry.k8s.io/pause:3.8 registry.k8s.io/pause:3.8
查看所有containerd 可以使用的镜像:
[root@control ~]# crictl -r unix:///var/run/containerd/containerd.sock images

registry.cn-hangzhou.aliyuncs.com/google_containers/coredns // k8S 集群内部的域名解析
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd // 存储K8S集群的状态数据
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver // K8S的调用接口
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager // K8S 的控制器
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy //工作节点代理
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler // pod的调度
registry.cn-hangzhou.aliyuncs.com/google_containers/pause // K8S的基础设施
保证所有的节点都有以上列出的所有镜像后,开始调整初始化配置并进行集群的初始化。


运行初始化命令:(只需要在控制节点上运行即可)
[root@control ~]# kubeadm init --config init.yml
初始化成功的输出如下图所示:

集群内加入新节点的指令,这个指令最好保存下来方便使用,

保存控制节点的访问配置
[root@control ~]# mkdir -p $HOME/.kube
[root@control ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@control ~]# chown $(id -u):$(id -g) $HOME/.kube/config
[root@control ~]# kubectl get nodes //目前只有control节点
NAME STATUS ROLES AGE VERSION
control NotReady control-plane 2m45s v1.31.1
[root@control ~]# echo 'kubeadm join 192.168.110.10:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:6ca63b1e4c639dbb7b7222a2dc5cb2f0ccaaf57f159310be5810ea7006b6f388' > .kube/node_join
// echo引号中的内容来自初始化输出,直接复制即可,每个人的值都不一样
检查目前集群状态:
[root@control ~]# kubectl get pods -o wide -A
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system coredns-fcd6c9c4-cvcvt 0/1 Pending 0 5m <none> <none> <none> <none>
kube-system coredns-fcd6c9c4-m9kxk 0/1 Pending 0 5m <none> <none> <none> <none>
kube-system etcd-control 1/1 Running 0 5m6s 192.168.110.10 control <none> <none>
kube-system kube-apiserver-control 1/1 Running 0 5m6s 192.168.110.10 control <none> <none>
kube-system kube-controller-manager-control 1/1 Running 0 5m6s 192.168.110.10 control <none> <none>
kube-system kube-proxy-c8cdj 1/1 Running 0 5m 192.168.110.10 control <none> <none>
kube-system kube-scheduler-control 1/1 Running 0 5m6s 192.168.110.10 control <none> <none>
// 有两个pod的状态不是running,原因是没有设置集群需要的网络插件。
在node1上执行加入集群的指令

在node2上执行加入集群的指令

//上面两张截图的命令并不完整
在控制节点查看集群节点状态
[root@control ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
control NotReady control-plane 12m v1.31.1
node1 NotReady <none> 5m44s v1.31.1
node2 NotReady <none> 4m22s v1.31.1
需要为K8S集群设置网络插件,才是完成了K8S集群的搭建,搭建完成后还可以使用更多的网络插件,结合不同项目的部署需要和实际组网需求。
(3)部署flannel网络插件
为K8S集群设置flannel网络,网络插件以扁平化的网络管理模型,实现K8S集群中pod的通信,管理配置相当简单。
在控制节点配置完成:
[root@control ~]# wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
[root@control ~]# grep image kube-flannel.ymlimage: docker.io/flannel/flannel:v0.25.6image: docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel2image: docker.io/flannel/flannel:v0.25.6
[root@control ~]# systemctl start docker
[root@control ~]# systemctl is-enabled docker
disabled
[root@control ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.registry.cyou","https://docker-cf.registry.cyou","https://dockercf.jsdelivr.fyi","https://docker.jsdelivr.fyi","https://dockertest.jsdelivr.fyi","https://mirror.aliyuncs.com","https://dockerproxy.com","https://mirror.baidubce.com","https://docker.m.daocloud.io","https://docker.nju.edu.cn","https://docker.mirrors.sjtug.sjtu.edu.cn","https://docker.mirrors.ustc.edu.cn","https://mirror.iscas.ac.cn","https://docker.rainbond.cc"]
}
[root@control ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 223.5.5.5
nameserver 8.8.8.8
[root@control ~]# systemctl restart docker
[root@control ~]# docker pull docker.io/flannel/flannel:v0.25.6
[root@control ~]# docker pull docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel2
# 导出镜像并同步给node1 node2,然后导入到containerd的镜像仓库中,使用ctr
[root@control ~]# docker save -o flannel.tar flannel/flannel:v0.25.6
[root@control ~]# docker save -o flannel-cni.tar flannel/flannel-cni-plugin
[root@control ~]# rm -f flannel-cni.tar
[root@control ~]# docker save -o flannel-cni.tar flannel/flannel-cni-plugin:v1.5.1-flannel2
[root@control ~]# scp flannel.tar root@node1:/root
The authenticity of host 'node1 (192.168.110.11)' can't be established.
ED25519 key fingerprint is SHA256:84EopGSflyn0EP7RLvmnvaWPJCTe8G99eX4dF6XQzFk.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'node1' (ED25519) to the list of known hosts.
root@node1's password:
flannel.tar 0% 0 0.0KB/s --:-- ETA^flannel.tar 100% 73MB 55.4MB/s 00:01
[root@control ~]# scp flannel-cni.tar root@node1:/root
root@node1's password:
flannel-cni.tar 100% 10MB 47.4MB/s 00:00
[root@control ~]# scp flannel.tar root@node2:/root
The authenticity of host 'node2 (192.168.110.22)' can't be established.
ED25519 key fingerprint is SHA256:84EopGSflyn0EP7RLvmnvaWPJCTe8G99eX4dF6XQzFk.
This host key is known by the following other names/addresses:~/.ssh/known_hosts:1: node1
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'node2' (ED25519) to the list of known hosts.
root@node2's password:
flannel.tar 0% 0 0.0KB/s --:-- ETA^flannel.tar 100% 73MB 51.3MB/s 00:01
[root@control ~]# scp flannel-cni.tar root@node2:/root
root@node2's password:
flannel-cni.tar 100% 10MB 45.4M
导入镜像:
[root@control ~]# ctr --namespace k8s.io image import flannel.tar
unpacking docker.io/flannel/flannel:v0.25.6 (sha256:9450e8226798aa6b2170093618cf20440bce427d4999d9cfe6f43beaab0dd921)...done
[root@control ~]# ctr --namespace k8s.io image import flannel-cni.tar
unpacking docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel2 (sha256:e6e3646e3663e11d1b129f77f49f58a589c633833130c6c8f30bc0c0e7df4e0c)...done
[root@control ~]# crictl -r unix:///var/run/containerd/containerd.sock images
IMAGE TAG IMAGE ID SIZE
docker.io/flannel/flannel-cni-plugin v1.5.1-flannel2 962fd97b50f9c 10.9MB
docker.io/flannel/flannel v0.25.6 f7b837852a098 76.2MB
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns v1.11.3 c69fa2e9cbf5f 18.6MB
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd 3.5.15-0 2e96e5913fc06 56.9MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver v1.31.0 604f5db92eaa8 28.1MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager v1.31.0 045733566833c 26.2MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy v1.31.0 ad83b2ca7b09e 30.2MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler v1.31.0 1766f54c897f0 20.2MB
registry.cn-hangzhou.aliyuncs.com/google_containers/pause 3.10 873ed75102791 320kB
registry.cn-hangzhou.aliyuncs.com/google_containers/pause 3.8 4873874c08efc 311kB
registry.k8s.io/pause 3.8 4873874c08efc 311kB
node1:
[root@node1 ~]# ctr --namespace k8s.io image import flannel.tar
unpacking docker.io/flannel/flannel:v0.25.6 (sha256:9450e8226798aa6b2170093618cf20440bce427d4999d9cfe6f43beaab0dd921)...done
[root@node1 ~]# ctr --namespace k8s.io image import flannel-cni.tar
unpacking docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel2 (sha256:e6e3646e3663e11d1b129f77f49f58a589c633833130c6c8f30bc0c0e7df4e0c)...done
[root@node1 ~]# crictl -r unix:///var/run/containerd/containerd.sock images
IMAGE TAG IMAGE ID SIZE
docker.io/flannel/flannel-cni-plugin v1.5.1-flannel2 962fd97b50f9c 10.9MB
docker.io/flannel/flannel v0.25.6 f7b837852a098 76.2MB
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns v1.11.3 c69fa2e9cbf5f 18.6MB
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd 3.5.15-0 2e96e5913fc06 56.9MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver v1.31.0 604f5db92eaa8 28.1MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager v1.31.0 045733566833c 26.2MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy v1.31.0 ad83b2ca7b09e 30.2MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler v1.31.0 1766f54c897f0 20.2MB
registry.cn-hangzhou.aliyuncs.com/google_containers/pause 3.10 873ed75102791 320kB
registry.cn-hangzhou.aliyuncs.com/google_containers/pause 3.8 4873874c08efc 311kB
registry.k8s.io/pause 3.8 4873874c08efc 311kB
node1
node1:
[root@node1 ~]# ctr --namespace k8s.io image import flannel.tar
unpacking docker.io/flannel/flannel:v0.25.6 (sha256:9450e8226798aa6b2170093618cf20440bce427d4999d9cfe6f43beaab0dd921)...done
[root@node1 ~]# ctr --namespace k8s.io image import flannel-cni.tar
unpacking docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel2 (sha256:e6e3646e3663e11d1b129f77f49f58a589c633833130c6c8f30bc0c0e7df4e0c)...done
[root@node1 ~]# crictl -r unix:///var/run/containerd/containerd.sock images
IMAGE TAG IMAGE ID SIZE
docker.io/flannel/flannel-cni-plugin v1.5.1-flannel2 962fd97b50f9c 10.9MB
docker.io/flannel/flannel v0.25.6 f7b837852a098 76.2MB
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns v1.11.3 c69fa2e9cbf5f 18.6MB
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd 3.5.15-0 2e96e5913fc06 56.9MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver v1.31.0 604f5db92eaa8 28.1MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager v1.31.0 045733566833c 26.2MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy v1.31.0 ad83b2ca7b09e 30.2MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler v1.31.0 1766f54c897f0 20.2MB
registry.cn-hangzhou.aliyuncs.com/google_containers/pause 3.10 873ed75102791 320kB
registry.cn-hangzhou.aliyuncs.com/google_containers/pause 3.8 4873874c08efc 311kB
registry.k8s.io/pause 3.8 4873874c08efc 311kB
node2
[root@node2 ~]# ctr --namespace k8s.io image import flannel.tar
unpacking docker.io/flannel/flannel:v0.25.6 (sha256:9450e8226798aa6b2170093618cf20440bce427d4999d9cfe6f43beaab0dd921)...done
[root@node2 ~]# ctr --namespace k8s.io image import flannel-cni.tar
unpacking docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel2 (sha256:e6e3646e3663e11d1b129f77f49f58a589c633833130c6c8f30bc0c0e7df4e0c)...done
control 节点:
[root@control ~]# kubectl apply -f kube-flannel.yml
namespace/kube-flannel created
serviceaccount/flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
此时检查K8S集群的核心组件以及节点的状态,均显示健康。
此时检查K8S集群的核心组件以及节点的状态,均显示健康。
[root@control ~]# kubectl get pods -o wide -A
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-flannel kube-flannel-ds-9fgml 1/1 Running 0 24s 192.168.110.10 control <none> <none>
kube-flannel kube-flannel-ds-ghwbq 1/1 Running 0 24s 192.168.110.22 node2 <none> <none>
kube-flannel kube-flannel-ds-mkm4r 1/1 Running 0 24s 192.168.110.11 node1 <none> <none>
kube-system coredns-fcd6c9c4-cvcvt 1/1 Running 0 33m 10.244.1.2 node1 <none> <none>
kube-system coredns-fcd6c9c4-m9kxk 1/1 Running 0 33m 10.244.1.3 node1 <none> <none>
kube-system etcd-control 1/1 Running 0 33m 192.168.110.10 control <none> <none>
kube-system kube-apiserver-control 1/1 Running 0 33m 192.168.110.10 control <none> <none>
kube-system kube-controller-manager-control 1/1 Running 0 33m 192.168.110.10 control <none> <none>
kube-system kube-proxy-54j4f 1/1 Running 0 27m 192.168.110.11 node1 <none> <none>
kube-system kube-proxy-c8cdj 1/1 Running 0 33m 192.168.110.10 control <none> <none>
kube-system kube-proxy-v7td8 1/1 Running 0 26m 192.168.110.22 node2 <none> <none>
kube-system kube-scheduler-control 1/1 Running 0 33m 192.168.110.10 control <none> <none>
[root@control ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
control Ready control-plane 34m v1.31.1
node1 Ready <none> 27m v1.31.1
node2 Ready <none> 26m v1.31.1
至此K8S集群部署完成。
作为一个较为复杂的平台搭建,生产环境下搭建时可以选择对应的自动化组件完成搭建,简化集群维护和扩展的操作复杂度。
使用K8S集调度运行pod。
[root@control ~]# vim my_nginx.yml
[root@control ~]# cat my_nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:name: my-nginx // 资源名称
spec:selector:matchLabels:run: my-nginxreplicas: 2 // 调度两个podtemplate:metadata:labels:run: my-nginxspec:containers:- name: my-nginximage: nginx // 镜像imagePullPolicy: IfNotPresent // 镜像不存在的时候进行拉取ports:- containerPort: 80 // 容器内开放80端口访问[root@control ~]# docker pull nginx // 等待缓慢下载完毕
[root@control ~]# docker images nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 39286ab8a5e1 5 weeks ago 188MB
[root@control ~]# docker save -o nginx.tar nginx:latest
[root@control ~]# scp nginx.tar root@node1:/root
root@node1's password:
nginx.tar 100% 183MB 77.2MB/s 00:02
[root@control ~]# scp nginx.tar root@node2:/root
root@node2's password:
nginx.tar
在node1 和node2 执行镜像导入操作,应用容器一般都会调度到work节点,所以要保证work节点上有nginx镜像。
[root@node1 ~]# ctr -n k8s.io image import nginx.tar
unpacking docker.io/library/nginx:latest (sha256:006a20213cb7f7d8edfadffd6791139d25283f590c5066e3fcd803e61a9c0b74)...done
[root@node1 ~]# crictl -r unix:///var/run/containerd/containerd.sock images
IMAGE TAG IMAGE ID SIZE
docker.io/flannel/flannel-cni-plugin v1.5.1-flannel2 962fd97b50f9c 10.9MB
docker.io/flannel/flannel v0.25.6 f7b837852a098 76.2MB
docker.io/library/nginx latest 39286ab8a5e14 192MB
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns v1.11.3 c69fa2e9cbf5f 18.6MB
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd 3.5.15-0 2e96e5913fc06 56.9MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver v1.31.0 604f5db92eaa8 28.1MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager v1.31.0 045733566833c 26.2MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy v1.31.0 ad83b2ca7b09e 30.2MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler v1.31.0 1766f54c897f0 20.2MB
registry.cn-hangzhou.aliyuncs.com/google_containers/pause 3.10 873ed75102791 320kB
registry.cn-hangzhou.aliyuncs.com/google_containers/pause 3.8 4873874c08efc 311kB
registry.k8s.io/pause 3.8 4873874c08efc 311kB[root@node2 ~]# ctr -n k8s.io image import nginx.tar
unpacking docker.io/library/nginx:latest (sha256:006a20213cb7f7d8edfadffd6791139d25283f590c5066e3fcd803e61a9c0b74)...done
[root@node2 ~]# crictl -r unix:///var/run/containerd/containerd.sock images
IMAGE TAG IMAGE ID SIZE
docker.io/flannel/flannel-cni-plugin v1.5.1-flannel2 962fd97b50f9c 10.9MB
docker.io/flannel/flannel v0.25.6 f7b837852a098 76.2MB
docker.io/library/nginx latest 39286ab8a5e14 192MB
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns v1.11.3 c69fa2e9cbf5f 18.6MB
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd 3.5.15-0 2e96e5913fc06 56.9MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver v1.31.0 604f5db92eaa8 28.1MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager v1.31.0 045733566833c 26.2MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy v1.31.0 ad83b2ca7b09e 30.2MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler v1.31.0 1766f54c897f0 20.2MB
registry.cn-hangzhou.aliyuncs.com/google_containers/pause 3.10 873ed75102791 320kB
registry.cn-hangzhou.aliyuncs.com/google_containers/pause 3.8 4873874c08efc 311kB
registry.k8s.io/pause 3.8 4873874c08efc 311kB
在工作节点上导入完毕镜像,就可以回到控制节点上,进行应用的调度。
[root@control ~]# kubectl apply -f my_nginx.yml
deployment.apps/my-nginx created
[root@control ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
my-nginx-7549dd6888-lhnr6 1/1 Running 0 7s
my-nginx-7549dd6888-z84x4 1/1 Running 0 7s
// 查看pod分到的IP地址,并尝试访问运行在pod中的nginx服务
[root@control ~]# kubectl get pods -l run=my-nginx -o custom-columns=POD_IP:.status.podIPs
POD_IP
[map[ip:10.244.2.6]]
[map[ip:10.244.1.8]]
[root@control ~]# curl 10.244.2.6
# 访问可以成功 省略输出
[root@control ~]# curl 10.244.1.8
# 访问成功省略输出
或者在控制节点上打开火狐浏览器进行访问:


[root@control ~]# kubectl get pods -o wide // 两个pod 一个在node1 一个在node2
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-nginx-7549dd6888-lhnr6 1/1 Running 0 2m32s 10.244.2.6 node2 <none> <none>
my-nginx-7549dd6888-z84x4 1/1 Running 0 2m32s 10.244.1.8 node1 <none> <none>
相关文章:
Linux——K8s集群部署过程
1、环境准备 (1)配置好网络ip和主机名 control: node1: node2: 配置ip 主机名的过程省略 配置一个简单的基于hosts文件的名称解析 [rootnode1 ~]# vim /etc/hosts // 文件中新增以下三行 192.168.110.10 control 192.168.110.11 node1 1…...
二.Unity中使用虚拟摇杆来控制角色移动
上一篇中我们完成了不借助第三方插件实现手游的虚拟摇杆,现在借助这个虚拟摇杆来实现控制角色的移动。 虚拟摇杆实际上就给角色输出方向,类似于键盘的WSAD,也是一个二维坐标,也就是(-1,1)的范围,将摇杆的方向进行归一化…...
基于SpringBoot的旅游管理系统
系统展示 用户前台界面 管理员后台界面 系统背景 近年来,随着社会经济的快速发展和人民生活水平的显著提高,旅游已成为人们休闲娱乐、增长见识的重要方式。国家积极倡导“全民旅游”,鼓励民众利用节假日外出旅行,探索各地自然与人…...
Linux套接字
目录标题 套接字套接字的基本概念套接字的功能与分类套接字的使用流程套接字的应用场景总结套接字在不同操作系统中的实现差异有哪些?如何优化套接字编程以提高网络通信的效率和安全性?原始套接字(SOCK_RAW)的具体应用场景和使用示…...
软件测试面试题(5)——二面(游戏测试)
没想到测试题做完等了会儿就安排面试了,还以为自己会直接挂在测试题,这次面试很刺激。测试题总体来说不算太难,主要是实操写Bug那里真没经历过,所以写的很混乱。 我复盘一下这次面试的问题,这次面试是有两个面试官&…...
C#基于SkiaSharp实现印章管理(8)
上一章虽然增加了按路径绘制文本,支持按矩形、圆形、椭圆等路径,但测试时发现通过调整尺寸、偏移量等方式不是很好控制文本的位置。相对而言,使用弧线路径,通过弧线起始角度及弧线角度控制文本位置更简单。同时基于路径绘制文本时…...
信通院发布首个《大模型媒体生产与处理》标准,阿里云智能媒体服务作为业界首家“卓越级”通过
中国信通院近期正式发布《大模型驱动的媒体生产与处理》标准,阿里云智能媒体服务,以“首批首家”通过卓越级评估,并在9大模块50余项测评中表现为“满分”。 当下,AI大模型的快速发展带动了爆发式的海量AI运用,这其中&a…...
AI学习指南深度学习篇-Adam的Python实践
AI学习指南深度学习篇-Adam的Python实践 在深度学习领域,优化算法是影响模型性能的关键因素之一。Adam(Adaptive Moment Estimation)是一种广泛使用的优化算法,因其在多种问题上均表现优异而被广泛使用。本文将深入探讨Adam优化器…...
08_React redux
React redux 一、理解1、学习文档2、redux 是什么吗3、什么情况下需要使用 redux4、redux 工作流程5、react-redux 模型图 二、redux 的三个核心概念1、action2、reducer3、store 三、redux 的核心 API1、getState()2、dispatch() 四、使用 redux 编写应用1、求和案例\_redux 精…...
2024华为杯研究生数学建模竞赛(研赛)选题建议+初步分析
难度:DE<C<F,开放度:CDE>F。 华为专项的题目(A、B题)暂不进行选题分析,不太建议大多数同学选择,对自己专业技能有很大自信的可以选择华为专项的题目。后续会直接更新A、B题思路&#…...
001.从0开始实现线性回归(pytorch)
000动手从0实现线性回归 0. 背景介绍 我们构造一个简单的人工训练数据集,它可以使我们能够直观比较学到的参数和真实的模型参数的区别。 设训练数据集样本数为1000,输入个数(特征数)为2。给定随机生成的批量样本特征 X∈R10002 …...
Relations Prediction for Knowledge Graph Completion using Large Language Models
文章目录 题目摘要简介相关工作方法论实验结论局限性未来工作 题目 使用大型语言模型进行知识图谱补全的关系预测 论文地址:https://arxiv.org/pdf/2405.02738 项目地址: https://github.com/yao8839836/kg-llm 摘要 知识图谱已被广泛用于以结构化格式表…...
2024年中国研究生数学建模竞赛D题思路代码分析——大数据驱动的地理综合问题
地理系统是自然、人文多要素综合作用的复杂巨系统[1-2],地理学家常用地理综合的方式对地理系统进行主导特征的表达[3]。如以三大阶梯概括中国的地形特征,以秦岭—淮河一线和其它地理区划的方式揭示中国气温、降水、植被、土壤及生态环境在水平和垂直方向…...
全国31省对外开放程度、经济发展水平、政府干预程度指标数据(2000-2022年)
旨在分析2000-2022年间中国31个省份的对外开放程度、经济发展水平和政府干预程度,探讨其背后的动因与影响。 2000年-2022年 全国31省对外开放程度、经济发展水平、政府干预程度指标数据https://download.csdn.net/download/2401_84585615/89478612 数据概览 对外…...
计算机网络传输层---课后综合题
线路:TCP报文下放到物理层传输。 TCP报文段中,“序号”长度为32bit,为了让序列号不会循环,则最多能传输2^32B的数据,则最多能传输:2^32/1500B个报文 结果: 吞吐率一个周期内传输的数据/周期时间…...
【homebrew安装】踩坑爬坑教程
homebrew官网,有安装教程提示,但是在实际安装时,由于待下载的包的尺寸过大,本地git缓存尺寸、超时时间的限制,会报如下错误: error: RPC failed; curl 92 HTTP/2 stream 5 was not closed cleanly…...
反游戏学(Reludology):概念、历史、现状与展望?(豆包AI版)
李升伟 以下是关于“反游戏学(Reludology):概念、历史、现状与展望”的综述: 一、概念 反游戏学(Reludology)是一个相对较新且不太常见的概念,目前尚未有统一明确的定义。一般来说…...
【C/C++语言系列】实现单例模式
1.单例模式概念 定义:单例模式是一种常见的设计模式,它可以保证系统中一个类只有一个实例,而且该实例易于外界访问(一个类一个对象,共享这个对象)。 条件: 只有1个对象易于外界访问共享这个对…...
A. Make All Equal
time limit per test 1 second memory limit per test 256 megabytes You are given a cyclic array a1,a2,…,ana1,a2,…,an. You can perform the following operation on aa at most n−1n−1 times: Let mm be the current size of aa, you can choose any two adjac…...
业务安全治理
业务安全治理 1.账号安全撞库账户盗用 2.爬虫与反爬虫3.API网关防护4.钓鱼与反制钓鱼发现钓鱼处置 5.大数据风控风控介绍 1.账号安全 撞库 撞库分为垂直撞库和水平撞库两种,垂直撞库是对一个账号使用多个不同的密码进行尝试,可以理解为暴力破解&#x…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...
Tauri2学习笔记
教程地址:https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引:https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多,我按照Tauri1的教程来学习&…...
