目录
前言
容器技术以其轻量级、便携性和一致性,在云计算领域迅速崛起,彻底改变了应用的开发、部署和运行方式。容器化是一种将应用程序及其依赖项打包的方式,确保应用在任何环境中都能以相同的方式运行。与传统的虚拟化技术相比,容器无需额外的操作系统开销,这使得它们在资源利用率、启动速度和应用程序隔离方面具有显著优势。
容器技术的兴起可以追溯到Linux容器(LXC)的发展,以及后来的Docker的普及。Docker在2013年的发布极大地简化了容器的创建和管理,让开发者可以轻松地打包、分发和运行任何应用程序。容器的普及也催生了一系列新的工具和服务,旨在进一步简化容器的部署、管理和监控。
Kubernetes是一个开源平台,用于自动化部署、扩展和管理容器化应用程序。它最初由Google设计并捐赠给Cloud Native Computing Foundation(CNCF)来维护。Kubernetes的使命是提供一个运行分布式系统的框架,无论是在本地、云环境还是跨云环境中,都能够确保容器应用的稳定性和高可用性。
一、ubernetes简介
1.1 应用部署方式演变
传统部署:互联网早期,会直接将应用程序部署在物理机上
- 优点:简单,不需要其它技术的参与
- 缺点:不能为应用程序定义资源使用边界,很难合理地分配计算资源,而且程序之间容易产生影响
虚拟化部署:可以在一台物理机上运行多个虚拟机,每个虚拟机都是独立的一个环境
- 优点:程序环境不会相互产生影响,提供了一定程度的安全性
- 缺点:增加了操作系统,浪费了部分资源
容器化部署:与虚拟化类似,但是共享了操作系统
容器化部署方式给带来很多的便利,但是也会出现一些问题:
一个容器故障停机了,怎么样让另外一个容器立刻启动去替补停机的容器当并发访问量变大的时候,怎么样做到横向扩展容器数量
1.2 容器编排应用
为了解决这些容器编排问题,就产生了一些容器编排的软件:
-
Swarm:Docker自己的容器编排工具
-
Mesos:Apache的一个资源统一管控的工具,需要和Marathon结合使用
-
Kubernetes:Google开源的的容器编排工具
1.3 kubenetes简介
Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,方便进行声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统,其服务、支持和工具的使用范围广泛。
- 在Docker 作为高级容器引擎快速发展的同时,在Google内部,容器技术已经应用了很多年。
- Borg系统运行管理着成千上万的容器应用。
- Kubernetes项目来源于Borg,可以说是集结了Borg设计思想的精华,并且吸收了Borg系统中的经验和教训。
- Kubernetes对计算资源进行了更高层次的抽象,通过将容器进行细致的组合,将最终的应用服务交给用户。
kubernetes 的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:
- 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
- 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
- 服务发现:服务可以通过自动发现的形式找到它所依赖的服务
- 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
- 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
- 存储编排:可以根据容器自身的需求自动创建存储卷
二、Kubernetes核心概念
2.1 K8S各个组件用途
Master Node(主节点):主节点是Kubernetes集群的控制平面,负责管理集群中的所有活动。
主节点包含以下关键组件:
- kube-apiserver: 提供Kubernetes API的接口,是系统的前端服务。
- kube-scheduler: 负责决定将Pod分配给哪个Node。
- kube-controller-manager: 运行控制器进程,如副本控制器、节点控制器、端点控制器等。
Node(节点):节点是工作负载运行的地方,通常是虚拟机或物理机。
每个节点包含以下关键组件:
- kubelet: 是主节点的代理,负责启动Pods和容器。
- kube-proxy: 网络代理,负责为服务提供TCP/UDP和网络的转发。
- Container Runtime: 负责运行容器,如Docker、containerd、CRI-O等。
2.2 K8S 各组件之间的调用关系
当我们要运行一个 web 服务时
1. kubernetes 环境启动之后, master 和 node 都会将自身的信息存储到 etcd 数据库中
2. web 服务的安装请求会首先被发送到 master 节点的 apiServer 组件
3. apiServer 组件会调用 scheduler 组件来决定到底应该把这个服务安装到哪个 node 节点上
在此时,它会从 etcd 中读取各个 node 节点的信息,然后按照一定的算法进行选择,并将结果告知
apiServer
4. apiServer 调用 controller-manager 去调度 Node 节点安装 web 服务 5. kubelet 接收到指令后,会通知 docker ,然后由 docker 来启动一个 web 服务的 pod
6. 如果需要访问 web 服务,就需要通过 kube-proxy 来对 pod 产生访问的代理
2.3 K8S 的常用名词感念
- Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控
- Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的
- Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器
- Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等
- Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod
- Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签
- NameSpace:命名空间,用来隔离pod的运行环境
2.4 k8S的分层架构
- 核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境
- 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)
- 管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
- 接口层:kubectl命令行工具、客户端SDK以及集群联邦
- 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴
- Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等
- Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等
三、部署前的准备
3.1 k8s中容器的管理方式
K8S 集群创建方式有 3 种:
- centainerd:默认情况下, K8S 在创建集群时使用的方式
- docker:Docker 使用的普记录最高,虽然 K8S 在 1.24 版本后已经费力了 kubelet 对 docker 的支持,但时可以借助cri-docker方式来实现集群创建
- cri-o:CRI-O 的方式是 Kubernetes 创建容器最直接的一种方式,在创建集群的时候,需要借助于 cri-o 插件的方式来实现Kubernetes 集群的创建。
docker 和 cri-o 这两种方式要对 kubelet 程序的启动参数进行设置
3.2 环境准备
3.2.1 部署docker
[root@docker-hub ~]# cd /etc/yum.repos.d/
[root@docker-hub yum.repos.d]# ls
redhat.repo rhel9.repo
[root@docker-hub yum.repos.d]# vim docker.repo
[docker]
name=docker-ce
baseurl=https://mirrors.aliyun.com/docker-ce/linux/rhel/9/x86_64/stable/
gpgcheck=0
[root@docker-hub yum.repos.d]# yum install --allowerasing docker-ce -y
[root@docker-hub yum.repos.d]# cd
[root@docker-hub ~]# vim /usr/lib/systemd/system/docker.service
[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 -H fd:// --containerd=/run/containerd/containerd.sock --iptables=true
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutStartSec=0
RestartSec=2
Restart=always
[root@docker-hub ~]# systemctl enable --now docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
[root@docker-hub ~]# ls
公共 视频 文档 音乐 anaconda-ks.cfg eth160.nmconnection test.sh
模板 图片 下载 桌面 clear_mnt registry.tag.gz
[root@docker-hub ~]# docker load -i registry.tag.gz
ce7f800efff9: Loading layer 7.644MB/7.644MB
30609d4f10dd: Loading layer 792.6kB/792.6kB
3b6a51496c9d: Loading layer 17.55MB/17.55MB
e704e9e3e9dc: Loading layer 3.584kB/3.584kB
f019f591461d: Loading layer 2.048kB/2.048kB
Loaded image: registry:latest
[root@docker-hub ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest cfb4d9904335 12 months ago 25.4MB
3.2.2 配置harbor仓库
[root@docker-hub ~]# ls
公共 图片 音乐 clear_mnt registry.tag.gz
模板 文档 桌面 eth160.nmconnection test.sh
视频 下载 anaconda-ks.cfg harbor-offline-installer-v2.5.4.tgz
[root@docker-hub ~]# tar zxf harbor-offline-installer-v2.5.4.tgz
[root@docker-hub ~]# cd harbor/
[root@docker-hub harbor]# ls
common.sh harbor.v2.5.4.tar.gz harbor.yml.tmpl install.sh LICENSE prepare
[root@docker-hub harbor]# cp harbor.yml.tmpl harbor.yml
[root@docker-hub harbor]# ls
common.sh harbor.yml install.sh prepare
harbor.v2.5.4.tar.gz harbor.yml.tmpl LICENSE
[root@docker-hub harbor]# vim harbor.yml
hostname: reg.timinglee.org
certificate: /data/certs/timinglee.org.crt
private_key: /data/certs/timinglee.org.key
harbor_admin_password: 123456
[root@docker-hub ~]# mkdir certs
[root@docker-hub ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.250 reg.timinglee.org
[root@docker-hub ~]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/timinglee.org.key -addext "subjectAltName = DNS:reg.timinglee.org" -x509 -days 365 -out certs/timinglee.org.crt
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Shanxi
Locality Name (eg, city) [Default City]:XI'an
Organization Name (eg, company) [Default Company Ltd]:docker
Organizational Unit Name (eg, section) []:registry
Common Name (eg, your name or your server's hostname) []:reg.timinglee.org
Email Address []:admin@timinglee.org
[root@docker-hub harbor]# mkdir /data/
[root@docker-hub harbor]# cp /root/certs/ /data/ -r
[root@docker-hub harbor]# ls /data/certs
timinglee.org.crt timinglee.org.key
[root@docker harbor]# ./install.sh --help
Please set --with-notary #证书签名
Please set --with-trivy #安全扫描
Please set --with-chartmuseum if needs enable Chartmuseum in Harbor/
[root@docker-hub harbor]# ./install.sh --with-chartmuseum
[root@docker-hub harbor]# docker compose up -d
测试
3.2.3 上传镜像
上传镜像到harbor仓库要先建立项目
[root@docker-hub harbor]# mkdir -p /etc/docker/certs.d/reg.timinglee.org
[root@docker-hub certs]# cp /root/certs/timinglee.org.crt /etc/docker/certs.d/reg.timinglee.org/ca.crt
[root@docker-hub certs]# ls /etc/docker/certs.d/reg.timinglee.org/ca.crt
/etc/docker/certs.d/reg.timinglee.org/ca.crt
[root@docker-hub certs]# docker login reg.timinglee.org
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores
Login Succeeded
[root@docker-hub certs]# cd
[root@docker-hub ~]# cd harbor/
[root@docker-hub harbor]# docker tag nginx:latest reg.timinglee.org/timinglee/nginx:latest
[root@docker-hub harbor]# docker push reg.timinglee.org/timinglee/nginx:latest
The push refers to repository [reg.timinglee.org/timinglee/nginx]
5f0272c6e96d: Pushed
f4f00eaedec7: Pushed
55e54df86207: Pushed
ec1a2ca4ac87: Pushed
8b87c0c66524: Pushed
72db5db515fd: Pushed
9853575bc4f9: Pushed
latest: digest: sha256:127262f8c4c716652d0e7863bba3b8c45bc9214a57d13786c854272102f7c945 size: 1778
测试
四、Kubernetes集群部署
4.1 实验环境
主机名 | ip | 角色 |
dockr-hub | 172.25.254.250 | harbor仓库 |
k8s-master | 172.25.254.100 | master,k8s集群控制节点 |
k8s-node1 | 172.25.254.10 | worker,k8s集群工作节点 |
k8s-node2 | 172.25.254.20 | worker,k8s集群工作节点 |
4.1.1 配置master主机
[root@k8s-master ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.10 k8s-node1.timinglee.org
172.25.254.20 k8s-node2.timinglee.org
172.25.254.100 k8s-master.timinglee.org
172.25.254.250 reg.timinglee.org
[root@k8s-master ~]# scp /etc/hosts 172.25.254.10:/etc/hosts
[root@k8s-master ~]# scp /etc/hosts 172.25.254.20:/etc/hosts
#检测软件仓库
[root@docker-hub ~]# yum list httpd
正在更新 Subscription Management 软件仓库。
无法读取客户身份
本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。
上次元数据过期检查:1:39:39 前,执行于 2024年10月04日 星期五 14时45分46秒。
可安装的软件包
httpd.x86_64 2.4.53-7.el9 AppStream
#安装docker
[root@k8s-master ~]# ls
公共 containerd.io-1.7.20-3.1.el9.x86_64.rpm
模板 docker-buildx-plugin-0.16.2-1.el9.x86_64.rpm
视频 docker-ce-27.1.2-1.el9.x86_64.rpm
图片 docker-ce-cli-27.1.2-1.el9.x86_64.rpm
文档 docker-ce-rootless-extras-27.1.2-1.el9.x86_64.rpm
下载 docker-compose-plugin-2.29.1-1.el9.x86_64.rpm
音乐 docker.tar.gz
桌面 eth160.nmconnection
anaconda-ks.cfg test.sh clear_mnt
[root@k8s-master ~]# dnf install --allowerasing *.rpm -y
[root@k8s-master ~]# mkdir /etc/docker/certs.d/reg.timinglee.org/ -p
[root@reg ~]# scp /data/certs/timinglee.org.crt 172.25.254.100:/etc/docker/certs.d/reg.timinglee.org/ca.crt
[root@k8s-master ~]# vim /etc/docker/daemon.json
{
"registry-mirrors":["https://reg.timinglee.org"]
}
[root@k8s-master ~]# systemctl enable --now docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
[root@k8s-master ~]# docker info
Registry Mirrors:
https://reg.timinglee.org/
[root@k8s-master ~]# docker pull timinglee/nginx:latest
latest: Pulling from timinglee/nginx
e4fff0779e6d: Pull complete
2a0cb278fd9f: Pull complete
7045d6c32ae2: Pull complete
03de31afb035: Pull complete
0f17be8dcff2: Pull complete
14b7e5e8f394: Pull complete
23fa5a7b99a6: Pull complete
Digest: sha256:127262f8c4c716652d0e7863bba3b8c45bc9214a57d13786c854272102f7c945
Status: Downloaded newer image for timinglee/nginx:latest
docker.io/timinglee/nginx:latest
4.1.2 配置两台node副机
[root@k8s-master ~]# scp *.rpm 172.25.254.10:/root
[root@k8s-master ~]# scp *.rpm 172.25.254.20:/root
[root@k8s-node1 ~]# dnf install --allowerasing *.rpm -y
[root@k8s-node2 ~]# dnf install --allowerasing *.rpm -y
[root@k8s-master ~]# scp -r /etc/docker/ 172.25.254.10:/etc
[root@k8s-master ~]# scp -r /etc/docker/ 172.25.254.20:/etc
[root@k8s-node1 ~]# systemctl enable --now docker
[root@k8s-node2 ~]# systemctl enable --now docker
[root@k8s-node1 ~]# docker pull timinglee/nginx
[root@k8s-node2 ~]# docker pull timinglee/nginx
4.2 集群环境初始化
4.2.1 禁用所有节点的swap
[root@k8s-master ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 4194300 0 -2
[root@k8s-master ~]# systemctl status dev-dm\\x2d1.swap
● dev-dm\x2d1.swap - /dev/dm-1
Follows: unit currently follows state of dev-mapper-rhel\x2dswap.swap
Loaded: loaded
Active: active since Fri 2024-10-04 09:47:14 CST; 7h ago
Until: Fri 2024-10-04 09:47:14 CST; 7h ago
What: /dev/dm-1
[root@k8s-master ~]# systemctl mask dev-dm\\x2d1.swap
Created symlink /etc/systemd/system/dev-dm\x2d1.swap → /dev/null.
[root@k8s-master ~]# vim /etc/fstab
[root@k8s-master ~]# swapoff /dev/dm-1
[root@k8s-master ~]# swapon -s #没有运行的swap节点
[root@k8s-node1 ~]# swapoff /dev/dm-1
[root@k8s-node1 ~]# systemctl mask dev-dm\\x2d1.swap
[root@k8s-node2 ~]# swapoff /dev/dm-1
[root@k8s-node2 ~]# systemctl mask dev-dm\\x2d1.swap
4.2.2 安装k8s部署工具
[root@k8s-master ~]# mv cri-dockerd-0.3.14-3.el8.x86_64.rpm libcgroup-0.41-19.el8.x86_64.rpm /mnt/
[root@k8s-master ~]# cd /mnt/
[root@k8s-master mnt]# ls
cri-dockerd-0.3.14-3.el8.x86_64.rpm hgfs libcgroup-0.41-19.el8.x86_64.rpm
[root@k8s-master mnt]# dnf install *.rpm -y
[root@k8s-master mnt]# systemctl enable --now cri-docker.service
[root@k8s-master mnt]# scp cri-dockerd-0.3.14-3.el8.x86_64.rpm libcgroup-0.41-19.el8.x86_64.rpm 172.25.254.10:/opt/
[root@k8s-master mnt]# scp cri-dockerd-0.3.14-3.el8.x86_64.rpm libcgroup-0.41-19.el8.x86_64.rpm 172.25.254.20:/opt/
#部署软件仓库,添加k8s源
[root@k8s-master mnt]# cd /etc/yum.repos.d/
[root@k8s-master yum.repos.d]# ls
redhat.repo rhel9.repo
[root@k8s-master yum.repos.d]# vim k8s.repo
[k8s]
name=k8s
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/
gpgcheck=0
[root@k8s-master yum.repos.d]# dnf makecache
#安装软件
[root@k8s-master yum.repos.d]# cd
[root@k8s-master ~]# dnf install kubelet-1.30.0 kubeadm-1.30.0 kubectl-1.30.0 --downloadonly --downloaddir=/mnt -y
[root@k8s-master mnt]# dnf install *.rpm -y
#node1,2
[root@k8s-master ~]# scp /etc/yum.repos.d/k8s.repo 172.25.254.10:/etc/yum.repos.d/
[root@k8s-master ~]# scp /etc/yum.repos.d/k8s.repo 172.25.254.20:/etc/yum.repos.d/
[root@k8s-node1 ~]# yum makecache
[root@k8s-node2 ~]# yum makecache
[root@k8s-node1 ~]# dnf install kubelet-1.30.0 kubeadm-1.30.0 kubectl-1.30.0 --downloadonly --downloaddir=/mnt -y
[root@k8s-node1 ~]# cd /mnt/
[root@k8s-node1 mnt]# dnf intall *.rpm -y
[root@k8s-node2 ~]# dnf install kubelet-1.30.0 kubeadm-1.30.0 kubectl-1.30.0 --downloadonly --downloaddir=/mnt -y
[root@k8s-node2 ~]# cd /mnt/
[root@k8s-node2 mnt]# dnf intall *.rpm -y
4.2.3 设置kubectl命令补齐功能
[root@k8s-master mnt]# dnf install bash-completion -y
[root@k8s-master mnt]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@k8s-master mnt]# source ~/.bashrc
4.2.4 在master节点拉取K8S所需镜像
[root@k8s-master ~]# kubeadm config images pull \
> --image-repository registry.aliyuncs.com/google_containers \
> --kubernetes-version v1.30.0 \
> --cri-socket=unix:///var/run/cri-dockerd.sock
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-apiserver:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-controller-manager:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-scheduler:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-proxy:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/coredns:v1.11.1
[config/images] Pulled registry.aliyuncs.com/google_containers/pause:3.9
[config/images] Pulled registry.aliyuncs.com/google_containers/etcd:3.5.12-0
#上传镜像到harbor仓库,需先建立k8s项目
[root@k8s-master ~]# docker images | awk '/google/{ print $1":"$2}' | awk -F "/" '{system("docker tag "$0" reg.timinglee.org/k8s/"$3)}'
[root@k8s-master ~]# docker images | awk '/k8s/{system("docker push "$1":"$2)}'
测试
4.2.5 集群初始化
#指定网络插件名称及基础镜像
[root@k8s-master ~]# vim /lib/systemd/system/cri-docker.service
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=reg.timinglee.org/k8s/pause:3.9
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
[root@k8s-master ~]# systemctl daemon-reload
[root@k8s-master ~]# systemctl restart cri-docker
[root@k8s-master ~]# scp /lib/systemd/system/cri-docker.service 172.25.254.10:/lib/systemd/system/cri-docker.service
[root@k8s-master ~]# scp /lib/systemd/system/cri-docker.service 172.25.254.20:/lib/systemd/system/cri-docker.service
[root@k8s-node1 opt]# systemctl daemon-reload
[root@k8s-node1 opt]# systemctl restart cri-docker
[root@k8s-node2 opt]# systemctl daemon-reload
[root@k8s-node2 opt]# systemctl restart cri-docker
#执行初始化
[root@k8s-master ~]# kubeadm init --pod-network-cidr=192.168.0.0/16 \
> --image-repository reg.timinglee.org/k8s \
> --kubernetes-version v1.30.0 \
> --cri-socket=unix:///var/run/cri-dockerd.sock
[root@k8s-master ~]# export KUBECONFIG=/etc/kubernetes/admin.conf
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master.timinglee.org NotReady control-plane 13m v1.30.0
[root@k8s-master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@k8s-master ~]# source ~/.bash_profile
如果初始化命令失败了可以用这个命令重来
kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock
4.3 Kubernetes网络配置
安装flannel网络插件
[root@k8s-master ~]# vim kube-flannel.yml
value: "5000"
image: reg.timinglee.org/flannel/flannel:v0.25.5
name: kube-flannel
- cp
image: reg.timinglee.org/flannel/flannel-cni-plugin:v1.5.1-flannel1
name: install-cni-plugin
- cp
image: reg.timinglee.org/flannel/flannel:v0.25.5
name: install-cni
[root@k8s-master ~]# docker load -i flannel-0.25.5.tag.gz
#在harbor仓库建立flannel项目
[root@k8s-master ~]# docker tag flannel/flannel:v0.25.5 reg.timinglee.org/flannel/flannel:v0.25.5
[root@k8s-master ~]# docker push reg.timinglee.org/flannel/flannel:v0.25.5
[root@k8s-master ~]# docker tag flannel/flannel-cni-plugin:v1.5.1-flannel1 reg.timinglee.org/flannel/flannel-cni-plugin:v1.5.1-flannel1
[root@k8s-master ~]# docker push reg.timinglee.org/flannel/flannel-cni-plugin:v1.5.1-flannel1
#安装网络插件
[root@k8s-master ~]# kubectl apply -f kube-flannel.yml
测试
4.4 Kubernetes集群扩展
#查看令牌
[root@k8s-master ~]# kubeadm token create --print-join-command
kubeadm join 172.25.254.100:6443 --token m6lje3.iy61zsvjoxu0aq94 --discovery-token-ca-cert-hash sha256:e33711c2250e5dd61115af0ab0c96938e5e39873aabbe2d0f98b42d7da8681fa
#加入集群
[root@k8s-node1 mnt]# kubeadm join 172.25.254.100:6443 --token m6lje3.iy61zsvjoxu0aq94 --discovery-token-ca-cert-hash sha256:e33711c2250e5dd61115af0ab0c96938e5e39873aabbe2d0f98b42d7da8681fa --cri-socket=unix:///var/run/cri-dockerd.sock
[root@k8s-node2 mnt]# kubeadm join 172.25.254.100:6443 --token m6lje3.iy61zsvjoxu0aq94 --discovery-token-ca-cert-hash sha256:e33711c2250e5dd61115af0ab0c96938e5e39873aabbe2d0f98b42d7da8681fa --cri-socket=unix:///var/run/cri-dockerd.sock
测试
所有节点的状态都为ready,就代表安装成功了