[虚拟化/云原生] Kubernetes 安装部署指南
0 序
- 先说我个人对当前ICT行业技术演进趋势的最大定论:大数据/云计算(云原生)/AI时代,
K8s/docker在现在和未来都必将是云里头最重要的基础设施之一。 docker自己玩了很久;在公司里,k8s集群、rancher也用了几年了。docker/docker compose/k8s的架构、设计理念等,也均有所涉猎。
感兴趣的朋友,可拉到文章底部【推荐文献】查阅。
- 唯一的遗憾是,自己从没有动手安装部署过
k8s。 - 这不,最近在研究云边协同架构,不得不倒逼着我要亲手来安装一次 k8s 了。
目前已安装 ok 了,本文做个完整的总结。
1 Kubernetes 安装部署指南
1.1 前置工作与注意事项
部署规划
- 服务器规划
| IP | Role | Hostname | resource | Remark |
|---|---|---|---|---|
| 172.16.1.72 | master 和 node | 2c , 4g, 10GB(个人建议至少2c,2g) | k8s-master-1 | 资源有限,此台机器同时作为 master 和 node 节点 |
- 版本
- cpu : x86-64
- os : centos 7.9
- docker : 26.1.4
也可换为其他的容器运行时(Container runtime)
- k8s : 1.25.0 ≥ 1.24.0 (docker 涉及适配 CRI-O)
安装过程中涉及安装的3大命令模块:
kubelet/kubeadm/kubectl
Kubernetes 架构 - kubernetes.io



- kubeEdge : 1.16.6 [x/本文不涉及]
机器配置
- 系统配置
- 要求:2c 2g 20g 以上
- cpu 至少为2核,否则k8s初始化无法成功。
- 内存 建议master节点内存给4g
操作系统
- OS
- CENTOS 7.9
- 不同版本的系统对k8s影响较大,具体看实际情况而定。 有的还需要更新系统内核
hosts / hostname
- hosts
vim /etc/hosts
172.16.1.72 k8s-master-1 k8s-slave-1
1台机器 1行 host 配置
- hostname配置
○ 每台机器都需配置,这里我们以 172.16.1.72 为例,我们需要设置hostname为 “k8s-master-1” ,与hosts 相匹配。
○ 如果不配置hostname 默认会配置为localhost.localdomain,k8s 运行时会报错Error getting node" err="node \"localhost.localdomain\" not found
# 设置当前机器的hostname
hostnamectl set-hostname k8s-master-1
# 查看当前机器hostname
hostname

- ping 一下
ping k8s-master-1
ping k8s-slave-1
其他注意事项
- k8s安装有多种方式
- 使用
minikube安装单节点集群,用于测试- 采用工具
kubeadm– 我们使用的这种方式(开发环境,机器比较少(几十台以下))- 使用
kubespray, google官方提供的工具- 全手动: 二进制安装(运维)
- 全自动安装: rancher、kubesphere (大型生产环境,百台,万台机器)
- k8s health会依赖一些端口,为了不出现网络问题,我们在虚拟机(master)中开放以下端口:
- 6443 主要
- 2379
- 2380
- kubeadm
- ca 证书:帮助我们安装的ca 证书时限是一年,所以不推荐正式环境使用,或需要手动配置ca证书。
1.2 安装步骤
1.2.1 初始准备 [master + node]
设置 hostname
# 设置当前机器的hostname
hostnamectl set-hostname k8s-master-1
# 查看当前机器hostname
hostname
基础依赖包的安装
# 基础依赖包安装
yum -y install wget vim net-tools ntpdate bash-completion
系统时钟同步
# 向阿里云服务器同步时间
ntpdate time1.aliyun.com
# 删除本地时间并设置时区为上海
rm -rf /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 查看时间
date -R || date
关闭防火墙、selinux
systemctl stop firewalld
systemctl disable firewalld
# 临时关闭
setenforce 0
# 永久关闭
sed -i 's/enforcing/disabled/' /etc/selinux/config
关闭 swap
K8S 不能使用swap
# 临时关闭Swap
swapoff -a
# 修改 /etc/fstab 删除或者注释掉swap的挂载,可永久关闭swap
sed -i '/swap/s/^/#/' /etc/fstab
# 修改完后我们检测一下,看最后一行swap 都是0 就成功了
free -m
#----------------start----------------------
total used free shared buff/cache available
Mem: 1837 721 69 10 1046 944
Swap: 0 0 0
#-----------------end---------------------
网桥过滤
# 网桥过滤
vim /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
net.ipv4.ip_forward=1
net.ipv4.ip_forward_use_pmtu = 0
# 生效命令
sysctl --system
# 查看效果
sysctl -a|grep "ip_forward"
开启ipvs
- 开启ipvs
kubernetes 1.8版本开始,新增了kube-proxy对ipvs的支持,性能和追踪问题比iptable强此步骤为选填项,如果不执行那么默认使用
iptables
# 安装IPVS
yum -y install ipset ipvsdm
# 编译ipvs.modules文件
vi /etc/sysconfig/modules/ipvs.modules
# 文件内容如下
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
# 赋予权限并执行
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules &&lsmod | grep -e ip_vs -e nf_conntrack_ipv4
# 重启电脑,检查是否生效
reboot
lsmod | grep ip_vs_rr
修改hosts
- 修改hosts文件
添加 dns 解析
vim /etc/hosts
172.16.1.72 k8s-master-1 k8s-slave-1
1.2.2 Docker 安装 [master + node]
docker 换源
# 安装yum utils ( 安装 yum-config-manager 命令 )
yum install -y yum-utils
# yum docker-ce config 换源
#yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
ls -la /etc/yum.repos.d/
安装docker
- 安装 docker
# 安装 docker (亦可指定版本)
yum -y install docker-ce docker-ce-cli containerd.io
# 启动docker, enable 为必须,k8s会检测docker.service
systemctl enable docker && systemctl start docker
- 查验 docker 版本
docker version
配置镜像加速
# 创建docker目录
mkdir -p /etc/docker
# 设置镜像源, exec-opts必须指定否则k8s启动报错(cgroup、systemd)
tee /etc/docker/daemon.json <<-'EOF'
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [" https://fl791z1h.mirror.aliyuncs.com"]
}
EOF
# 重启docke并生效镜像加速
systemctl daemon-reload && systemctl restart docker
# 查看 docker 运行的进程和镜像
docker ps
docker images
1.2.3 K8S安装
step1 配置源 [master + node]
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
step2 安装 kubernetes(kubelet/kubeadm/kubectl) [master+node]
注意:阿里源并未与官网同步
gpg(由于官网未开放同步方式, 可能会有索引gpg检查失败的情况,这时请用如下命令安装)
- 安装 kubernetes, 最好指定版本,否则会使用最新版本。
k8s 每个版本的变化都比较大,这里我们的k8s使用 1.25.0 版本
# 检测可用的k8s版本(--nogpgcheck 忽略gpg检测)
yum list --nogpgcheck --showduplicates kubeadm --disableexcludes=kubernetes
# 找到我们想要安装的版本,并安装(这里可以用 1.23.8 / 1.25.0 等版本,目前≥1.24.0 版本安装时启用docker,需要特别安装 CRI,尽量使用 docker 与 k8s 兼容的区间版本
# 安装 kubelet、kubeadm、kubectl 组件
# yum install --nogpgcheck kubelet-1.23.8 kubeadm-1.23.8 kubectl-1.23.8
yum -y install --nogpgcheck kubelet-1.25.0 kubeadm-1.25.0 kubectl-1.25.0
# 此时还不能启动 kubelet :因为此时配置还不能,现在仅仅可设置开机自启动
$ systemctl enable kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
- 安装完成后,我们检查一下
# 检查 kubectl 版本
kubectl version
##########show start############
WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short. Use --output=yaml|json to get the full version.
Client Version: version.Info{Major:"1", Minor:"25", GitVersion:"v1.25.0", GitCommit:"a866cbe2e5bbaa01cfd5e969aa3e033f3282a8a2", GitTreeState:"clean", BuildDate:"2022-08-23T17:44:59Z", GoVersion:"go1.19", Compiler:"gc", Platform:"linux/amd64"}
Kustomize Version: v4.5.7
The connection to the server localhost:8080 was refused - did you specify the right host or port?
###########show end###########
# 检查 kubeadm 版本
kubeadm version
##########show start############
kubeadm version: &version.Info{Major:"1", Minor:"25", GitVersion:"v1.25.0", GitCommit:"a866cbe2e5bbaa01cfd5e969aa3e033f3282a8a2", GitTreeState:"clean", BuildDate:"2022-08-23T17:43:25Z", GoVersion:"go1.19", Compiler:"gc", Platform:"linux/amd64"}
##########show end############
step3 安装容器运行时(CRI) [master + node]
【特别注意】
k8s 1.24及更高版本不能直接兼容docker引擎, Docker Engine 没有实现 CRI, 而这是容器运行时在 Kubernetes 中工作所需要的。
为此,若K8s版本≥1.24时,必须安装一个额外的服务cri-dockerd。 cri-dockerd 是一个基于传统的内置 Docker 引擎支持的项目, 它在 1.24 版本从 kubelet 中移除。
你需要在集群内每个节点上安装一个容器运行时以使Pod可以运行在上面。
Kubernetes 中几个常见的容器运行时:
- containerd
- CRI-O
- Docker Engine
- Mirantis Container Runtime
以下是使用
cri-dockerd适配器*来将 Docker Engine 与 Kubernetes 集成。
安装cri-dockerd
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.6/cri-dockerd-0.2.6.amd64.tgz
tar -xf cri-dockerd-0.2.6.amd64.tgz
cp cri-dockerd/cri-dockerd /usr/bin/
chmod +x /usr/bin/cri-dockerd
配置启动服务(cri-docker.service)
cat <<"EOF" > /usr/lib/systemd/system/cri-docker.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.8
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
主要是通过命令:
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=http://registry.aliyuncs.com/google_containers/pause:3.8
注意:
pause的版本可通过:kubeadm config images list(此命令执行时,可能会有点点慢)
kubeadm config images list
生成 cri-docker.socket 文件
cat <<"EOF" > /usr/lib/systemd/system/cri-docker.socket
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
EOF
启动 cri-docker 服务、并配置开机启动
systemctl daemon-reload
systemctl enable cri-docker
systemctl start cri-docker
systemctl is-active cri-docker
step4 部署Kubernetes [master]
kubeadm init
注意:
node节点不需要执行kubeadm init
这里考虑的是单master,多slave
- 创建
kubeadm.yaml文件,命令如下:
kubeadm init \
--apiserver-advertise-address=172.16.1.72 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.25.0 \
--service-cidr=10.10.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all \
--cri-socket unix:///var/run/cri-dockerd.sock
##########show start############
[init] Using Kubernetes version: v1.25.0
[preflight] Running pre-flight checks
[WARNING CRI]: container runtime is not running: output: time="2025-05-17T16:37:27+08:00" level=fatal msg="validate service connection: CRI v1 runtime API is not implemented for endpoint \"unix:///var/run/cri-dockerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService"
, error: exit status 1
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[WARNING ImagePull]: failed to pull image registry.aliyuncs.com/google_containers/kube-apiserver:v1.25.0: output: time="2025-05-17T16:37:27+08:00" level=fatal msg="validate service connection: CRI v1 image API is not implemented for endpoint \"unix:///var/run/cri-dockerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.ImageService"
, error: exit status 1
[WARNING ImagePull]: failed to pull image registry.aliyuncs.com/google_containers/kube-controller-manager:v1.25.0: output: time="2025-05-17T16:37:27+08:00" level=fatal msg="validate service connection: CRI v1 image API is not implemented for endpoint \"unix:///var/run/cri-dockerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.ImageService"
, error: exit status 1
[WARNING ImagePull]: failed to pull image registry.aliyuncs.com/google_containers/kube-scheduler:v1.25.0: output: time="2025-05-17T16:37:27+08:00" level=fatal msg="validate service connection: CRI v1 image API is not implemented for endpoint \"unix:///var/run/cri-dockerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.ImageService"
, error: exit status 1
[WARNING ImagePull]: failed to pull image registry.aliyuncs.com/google_containers/kube-proxy:v1.25.0: output: time="2025-05-17T16:37:27+08:00" level=fatal msg="validate service connection: CRI v1 image API is not implemented for endpoint \"unix:///var/run/cri-dockerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.ImageService"
, error: exit status 1
[WARNING ImagePull]: failed to pull image registry.aliyuncs.com/google_containers/pause:3.8: output: time="2025-05-17T16:37:27+08:00" level=fatal msg="validate service connection: CRI v1 image API is not implemented for endpoint \"unix:///var/run/cri-dockerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.ImageService"
, error: exit status 1
[WARNING ImagePull]: failed to pull image registry.aliyuncs.com/google_containers/etcd:3.5.4-0: output: time="2025-05-17T16:37:27+08:00" level=fatal msg="validate service connection: CRI v1 image API is not implemented for endpoint \"unix:///var/run/cri-dockerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.ImageService"
, error: exit status 1
[WARNING ImagePull]: failed to pull image registry.aliyuncs.com/google_containers/coredns:v1.9.3: output: time="2025-05-17T16:37:27+08:00" level=fatal msg="validate service connection: CRI v1 image API is not implemented for endpoint \"unix:///var/run/cri-dockerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.ImageService"
, error: exit status 1
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [k8s-master-1 kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.0.0.1 172.16.1.72]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [k8s-master-1 localhost] and IPs [172.16.1.72 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [k8s-master-1 localhost] and IPs [172.16.1.72 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
[control-plane] Creating static Pod manifest for "kube-scheduler"
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[apiclient] All control plane components are healthy after 24.503463 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config" in namespace kube-system with the configuration for the kubelets in the cluster
[upload-certs] Skipping phase. Please see --upload-certs
[mark-control-plane] Marking the node k8s-master-1 as control-plane by adding the labels: [node-role.kubernetes.io/control-plane node.kubernetes.io/exclude-from-external-load-balancers]
[mark-control-plane] Marking the node k8s-master-1 as control-plane by adding the taints [node-role.kubernetes.io/control-plane:NoSchedule]
[bootstrap-token] Using token: 67yn2j.pwv6zn6ci59bw8ma
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to get nodes
[bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] Configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
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 172.16.1.72:6443 --token 67yn2j.pwv6zn6ci59bw8ma \
--discovery-token-ca-cert-hash sha256:ef39262b36489b6f6e8df35af5d921cdee7a4de01148544e2f28c18f5c3d7d1d
##########show end############
浏览器可访问: https://172.16.1.72:6443
--apiserver-advertise-address=master节点IP
--pod-network-cidr=10.244.0.0/16要与后面kube-flannel.yml里的ip一致也就是使用
10.244.0.0/16不要改它。
| 参数名 | 示例值 | 含义 |
|---|---|---|
--kubernetes-version |
v1.25.0 | 版本 |
--apiserver-advertise-address |
172.16.1.72 |
当前机器节点IP |
--image-repository |
registry.aliyuncs.com/google_containers |
镜像仓库 |
--service-cidr |
10.10.0.0/12 | service 网段 |
--pod-network-cidr |
10.244.0.0/16 | k8s内部pod节点的网段,不能和 --service-cidr 相同 |
成功后末尾输出信息如下:
【注意】
这里是通过kubeadm init安装,所以执行后会下载相应的docker镜像,一般会发现在控制台卡着不动很久,这时就是在下载镜像,你可以docker images查看是不是有新的镜像增加。
docker images
step5 配置 .kube/config [master + node]
配置 .kube/config
- 使用kubectl工具,kubeadm安装好后,控制台也会有提示执行以下命令,照着执行。
这也是上一步最后控制台输出的)

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
配置 KUBECONFIG 环境变量
vim /etc/profile
# 加入以下变量
export KUBECONFIG=/etc/kubernetes/admin.conf
source /etc/profile
基于 kubectl 查验集群节点
- 测试一下 kubectl
kubectl get nodes
##########show start############
NAME STATUS ROLES AGE VERSION
k8s-master-1 NotReady control-plane 11m v1.25.0
##########show end############
一般来说状态先会是NotReady ,可能程序还在启动中,过一会再看看就会变成Ready
step6 安装Pod网络插件 flannel [master + node]
- 安装pod网络插件 flannel
flannel和calico是常用的网络插件。故也有网友推荐 callico。
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
或 手动下载下来后,执行: kubectl apply -f /root/kube-flannel.yml
##########show start############
namespace/kube-flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
##########show end############
【注意】
若报错:The connection to the server http://raw.githubusercontent.com was refused - did you specify the right host or port?
原因:国外资源访问不了
解决办法:host配置可以访问的ip(例如下述操作)
vim /etc/hosts
# 在/etc/hosts增加以下这条
199.232.28.133 raw.githubusercontent.com
step7 node节点加入master [node]
此步骤即执行
kubeadm init步骤中控制台输出的内容
提前验证网络连通性
ssh 172.16.1.72 -p 6443 -v
node 加入 master
kubeadm join 172.16.1.72:6443 --token ebe5w8.hfd3b59u9ww1r966 \
--discovery-token-ca-cert-hash sha256:b3683deac5daa34a5778ede0ac0210bfbefce78a380c738aac7c2304c1cb1e4f \
--ignore-preflight-errors=all \
--cri-socket unix:///var/run/cri-dockerd.sock
【注意】
--ignore-preflight-errors=all
--cri-socket unix:///var/run/cri-dockerd.sock这两行配置命令,一定要加上,以避免各种报错:
由于本文中 master 和 node 实际上,均是同一台机器,故本步骤便不再执行,避免报错:
//运行情况:
[preflight] Running pre-flight checks
[WARNING FileAvailable--etc-kubernetes-kubelet.conf]: /etc/kubernetes/kubelet.conf already exists
[WARNING CRI]: container runtime is not running: output: time="2025-05-17T17:26:39+08:00" level=fatal msg="validate service connection: CRI v1 runtime API is not implemented for endpoint \"unix:///var/run/cri-dockerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService"
, error: exit status 1
[WARNING Port-10250]: Port 10250 is in use
[WARNING FileAvailable--etc-kubernetes-pki-ca.crt]: /etc/kubernetes/pki/ca.crt already exists
error execution phase preflight: couldn't validate the identity of the API Server: could not find a JWS signature in the cluster-info ConfigMap for token ID "ebe5w8"
To see the stack trace of this error execute with --v=5 or higher
- 在master可查看集群的node情况
kubectl get nodes

注:网络截图↑

注:此处的实际截图
- 查看 pod 情况
kubectl get pod --all-namespaces
##########show start############
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-flannel kube-flannel-ds-lgrbd 1/1 Running 0 50m
kube-system coredns-c676cc86f-nzj2x 1/1 Running 0 80m
kube-system coredns-c676cc86f-s88tw 1/1 Running 0 80m
kube-system etcd-k8s-master-1 1/1 Running 0 80m
kube-system kube-apiserver-k8s-master-1 1/1 Running 0 80m
kube-system kube-controller-manager-k8s-master-1 1/1 Running 0 80m
kube-system kube-proxy-l9g4h 1/1 Running 0 80m
kube-system kube-scheduler-k8s-master-1 1/1 Running 0 80m
##########show end############
- 到这里,整个k8s集群环境就基本搭建完成了。
【注意】
- 安装时,注意自己安装的程序版本
- k8s组件也是以 docker 容器 的形式存在。所以,会下载很多
dokcer image- 一般安装时可能会出现不少问题,可用
tailf /var/log/messages跟踪下日志- 最好把几台机器的系统时间同步下,节点通讯中的 token 与时间有关
1.2.4 检查系统资源消耗
此时,查看下系统的资源消耗情况:
经实际对比,安装 k8s 前,至现在安装完成k8s后,内存增加了 932-196 = 736 MB;CPU:2核。
free -h
1.2.5 安装dashboard (可选步骤)
- 详情参见:
- 效果预览:(实际,本步骤未执行)

网友的效果图
K8s核心组件的解读
K8s集群组件

Kubelet : 每个工作节点上运行的节点代理
kubelet是在每个节点上运行的主要 “节点代理”。
即:
Kubelet是 kubernetes 工作节点上的一个代理组件,运行在每个节点上。

Kubelet是工作节点上的主要服务,定期从kube-apiserver组件接收新的或修改的Pod规范,并确保Pod及其容器在期望规范下运行。
同时该组件作为工作节点的监控组件,向kube-apiserver汇报主机的运行状况。

- 它可以使用以下方式之一向 API 服务器注册:
- 主机名(hostname);
- 覆盖主机名的参数;
- 特定于某云驱动的逻辑。
kubelet是基于PodSpec来工作的。
- 每个
PodSpec是一个描述 Pod 的 YAML 或 JSON 对象。kubelet接受通过各种机制(主要是通过apiserver)提供的一组PodSpec,并确保这些PodSpec中描述的容器处于运行状态且运行状况良好。kubelet不管理不是由Kubernetes创建的容器。
- 除了来自 API 服务器的
PodSpec之外,还可以通过以下两种方式将容器清单(manifest)提供给kubelet。
- 文件(File):利用命令行参数传递路径。kubelet 周期性地监视此路径下的文件是否有更新。 监视周期默认为 20s,且可通过参数进行配置。
- HTTP 端点(HTTP endpoint):利用命令行参数指定 HTTP 端点。 此端点的监视周期默认为 20 秒,也可以使用参数进行配置。
参考文献
Kubeadm : k8s 部署工具
组件简介
Kubeadm是一个提供了kubeadm init和kubeadm join的工具, 作为创建Kubernetes集群的 “快捷途径” 的最佳实践。kubeadm通过执行必要的操作来启动和运行最小可用集群。
按照设计,它只关注启动引导,而非配置机器。
同样的, 安装各种 “锦上添花” 的扩展,例如 Kubernetes Dashboard、 监控方案、以及特定云平台的扩展,都不在讨论范围内。
相反,k8s官方希望在kubeadm之上构建更高级别以及更加合规的工具, 理想情况下,使用kubeadm作为所有部署工作的基准将会更加易于创建一致性集群。
常用命令
kubeadm init用于搭建控制平面节点kubeadm join用于搭建工作节点并将其加入到集群中
kubeadm join 172.16.1.72:6443 --token 67yn2j.pwv6zn6ci59bw8ma \
--discovery-token-ca-cert-hash sha256:ef39262b36489b6f6e8df35af5d921cdee7a4de01148544e2f28c18f5c3d7d1d
kubeadm upgrade用于升级 Kubernetes 集群到新版本kubeadm config如果你使用了 v1.7.x 或更低版本的 kubeadm 版本初始化你的集群,则使用 kubeadm upgrade 来配置你的集群kubeadm token用于管理 kubeadm join 使用的令牌
# 查看历史的token
kubeadm token list
# 再生成一个token
kubeadm token create --print-join-command
kubeadm reset用于恢复通过 kubeadm init 或者 kubeadm join 命令对节点进行的任何变更kubeadm certs用于管理 Kubernetes 证书kubeadm kubeconfig用于管理 kubeconfig 文件kubeadm version用于打印 kubeadm 的版本信息kubeadm alpha用于预览一组可用于收集社区反馈的特性
参考文献
Kubectl : k8s 命令行工具
组件简介
Kubernetes提供kubectl是使用Kubernetes API与Kubernetes集群的控制面板进行通信的【命令行工具】。
这个工具叫做
kubectl。
- 即:
kubectl作为客户端CLI工具,可以让用户通过命令行的方式对Kubernetes集群进行操作。
- 针对配置信息,
kubectl在$HOME/.kube目录中查找一个名为config的配置文件。
你可以通过设置
KUBECONFIG环境变量或设置--kubeconfig参数来指定其它kubeconfig文件。
- 有关每个命令的详细信息,包括所有受支持的参数和子命令, 请参阅 kubectl 参考文档。
有关安装说明,请参见安装 kubectl; 如需快速指南,请参见备忘单。
如果你更习惯使用 docker 命令行工具, Docker 用户的 kubectl 介绍了一些 Kubernetes 的等价命令。
kubectl可操作的资源对象类型
| 资源对象的名称 | 缩写 |
|---|---|
| cluster | |
| componentstatuses | cs |
| configmaps | cm |
| daemonsets | ds |
| deployments | deploy |
| endpoints | ep |
| events | ev |
| horizontalpodautoscalers | hpa |
| ingresses | ing |
| Jobs | |
| limitranges | limits |
| nodes | no |
| namespaces | ns |
| networkpolicies | |
| statefulsets | |
| persistentvolumeclaims | pvc |
| persistentvolumes | pv |
| pods | po |
| podsecuritypolicies | psp |
| podtemplate | |
| replicasets | rs |
| replicationcontrollers | rc |
| resourcequotas | quota |
| cronjob | |
| secrets | |
| serviceaccounts | |
| services | svc |
| storageclasses | sc |
| thirdpartyresources |
语法格式
$ kubectl [command] [TYPE] [NAME] [flags]
(1)command:子命令,指定要对一个或多个资源执行的操作。例如create、delete、describe、get、apply等。
(2)TYPE:资源对象的类型,不区分大小写,能以单数形式、复数形式或者简写形式表示。例如:以下3种TYPE是等价的。
$ kubectl get pod pod1
$ kubectl get pods pod1
$ kubectl get po pod1
(3)NAME:资源对象的名称,区分大小写。如果不指定名称,则系统将返回属于TYPE的全部对象的列表,例如$ kubectl get pods将返回所有Pod的列表。
在对多个资源执行操作时,你可以按类型和名称指定每个资源,或指定一个或多个文件:
(4)flags:kubectl子命令的可选参数。例如,可使用
-s或--server参数指定指定apiserver的URL地址和端口,而不用默认值。
- 在一个命令行中也可以同时对多个资源对象进行操作,以多个TYPE和NAME的组合表示,示例如下。
$ kubectl get pods pod1 pod2
$ kubectl get pod/pod1 rc/rc1
$ kubectl get pod -f pod1.yaml -f pod2.yaml
$ kubectl create -f pod1.yaml -f rc1.yaml -f service1.yaml
- 用一个或多个文件指定资源:
-f file1 -f file2 -f file<#>
- 使用
YAML而不是JSON
因为 YAML 对用户更友好, 特别是对于配置文件。
例子:kubectl get -f ./pod.yaml
- 注意,从命令行指定的参数会覆盖默认值和任何相应的环境变量。
- 如果你需要帮助,在终端窗口中运行
kubectl help
kubectl 输出格式
kubectl 的输出格式
| 输出格式 | 说明 |
|---|---|
-o=custom-columns=<spec> |
根据自定义列名进行输出,以逗号分隔 |
-o=custom-colimns-file=<filename> |
从文件中获取自定义列名进行输出 |
-o=json |
以JSON格式显示结果 |
-o=jsonpath=<template> |
输出jsonpath表达式定义的字段信息 |
-o=jsonpath-file=<filename> |
输出jsonpath表达式定义的字段信息,来源于文件 |
-o=name |
仅输出资源对象的名称 |
-o=wide |
输出额外信息。对于Pod资源,将输出Pod所在的Node名 |
-o=yaml |
以yaml格式显示结果 |
常见输出格式:
- 显示Pod的更多信息
$ kubectl get pod <pod-name> -o wide
- 以yaml格式显示Pod的详细信息
$ kubectl get pod <pod-name> -o yaml
- 以自定义列名显示Pod的信息
$ kubectl get pod <pod-name> -o=custom-columns=NAME:.metadata.name,RSRC:.metadata.resourceVersion
- 基于文件的自定义列名输出
$ kubectl get pods <pod-name> -o=custom-columns-file=template.txt
- 还可以将输出结果按某个字段排序,通过--sort-by参数以jsonpath表达式进行指定
$ kubectl [command] [TYPE] [NAME] --sort-by=<jsonpath_exp>
例如,按照名字进行排序
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
chaosfomoney-deployment-64ccd59bdc-h72gh 1/1 Running 0 1d
chaosfomoney-deployment-64ccd59bdc-spnpj 1/1 Running 0 1d
chaosfomoney-deployment-64ccd59bdc-xhnjr 1/1 Running 0 1d
$ kubectl get pods --sort-by=.metadata.name
NAME READY STATUS RESTARTS AGE
chaosfomoney-deployment-64ccd59bdc-h72gh 1/1 Running 0 1d
chaosfomoney-deployment-64ccd59bdc-spnpj 1/1 Running 0 1d
chaosfomoney-deployment-64ccd59bdc-xhnjr 1/1 Running 0 1d
常用命令
kubectl create : 创建资源对象
- 根据yaml配置文件一次创建service和rc
$ kubectl create -f my-service.yaml -f my-rc.yaml
- 根据
<directory>目录下所有.yaml、.yml、.json文件的定义进行创建操作
$ kubectl create -f <directory>
kubectl apply : 以文件或标准输入为准应用或更新资源
# 使用 example-service.yaml 中的定义创建 Service。
kubectl apply -f example-service.yaml
# 使用 example-controller.yaml 中的定义创建 replication controller。
kubectl apply -f example-controller.yaml
# 使用 <directory> 路径下的任意 .yaml、.yml 或 .json 文件 创建对象。
kubectl apply -f <directory>
kubectl edit : 直接编辑 K8s 集群的资源对象(Pod/Deployment/Service/...)
- 简要介绍
kubectl edit: 允许直接编辑 Kubernetes 集群中的资源对象(如 Pod、Deployment、Service 等),修改后会立即生效,无需手动执行kubectl apply。- 本质流程:拉取资源当前配置 → 打开编辑器修改 → 提交更新到集群。
- 掌握 kubectl edit 可极大提升 Kubernetes 资源管理效率,但需谨慎操作以避免意外影响。
- 使用语法
- 方式1: 编辑指定资源
kubectl edit <资源类型> <资源名称> -n <命名空间>
# 示例:编辑名为 "nginx" 的 Deployment
kubectl edit deployment nginx -n default
kubectl edit daemonset -n kube-system kube-proxy
- 方式2: 通过文件格式指定资源
# 编辑指定 YAML 文件对应的资源
kubectl edit -f deployment.yaml
- 核心参数
| 参数 | 说明 |
|---|---|
| -o / --output | 指定编辑格式(如 yaml、json),默认由 KUBE_EDITOR 环境变量决定 |
| --record | 在资源注解中记录本次修改的命令(用于审计) |
| --windows-line-endings | 使用 Windows 换行符(CRLF) |
| --allow-missing-template-keys | 允许模板中缺失字段(默认 true) |
| --field-manager | 指定字段管理器名称(用于 Server-Side Apply) |
| --validate | 修改后验证配置合法性(默认 true,设为 false 可跳过验证) |
- 高级功能与技巧
- 指定编辑器
默认使用 vim,可通过环境变量切换编辑器:
# 使用 nano 编辑器
export KUBE_EDITOR="nano"
kubectl edit deploy/nginx
# 临时指定编辑器(无需修改环境变量)
KUBE_EDITOR="code --wait" kubectl edit deploy/nginx # 使用 VS Code
- 编辑特定资源版本
# 显示资源版本、并指定版本编辑
kubectl get deploy nginx -o yaml | grep resourceVersion # 获取当前版本
kubectl edit deploy/nginx --resource-version=<版本号>
- 编辑多个资源
结合标签选择器批量操作
# 编辑所有包含 "app=web" 标签的 Pod
kubectl edit pods -l app=web -n default
- 快速定位字段
在编辑器中直接搜索关键字(如 replicas、image),快速修改核心参数。
- 常见使用场景
- 实时调整副本数
kubectl edit deploy/nginx
# 修改 replicas 字段 → 保存退出后立即生效
- 更新容器镜像
kubectl edit deploy/nginx
# 修改 spec.template.spec.containers[0].image → 保存退出
- 修改 ConfigMap/Secret
# 编辑 ConfigMap
kubectl edit cm app-config -n default
# 编辑 Secret(注意:Base64 编码值需自行处理)
kubectl edit secret db-credentials -n default
- 调试资源限制
kubectl edit deploy/nginx
# 调整 resources.limits 和 resources.requests → 保存退出
- 注意事项
- 并发修改冲突
若资源被其他用户或控制器修改,提交时会提示版本冲突(需重新拉取最新版本后编辑)。
- 格式校验严格
YAML 格式错误(如缩进错误、键名错误)会导致提交失败,需仔细检查。
- 生产环境谨慎使用
直接修改运行中的资源可能引发服务中断,建议在测试环境验证后再操作。
- 备份原始配置
重要操作前备份当前配置:
kubectl get deploy/nginx -o yaml > nginx-backup.yaml
- FAQ / 常见问题排查
- 错误:Edit cancelled, no changes made
原因:编辑器未正确保存修改(如直接关闭未保存)。
解决:重新执行命令并确保保存修改。
- 错误:invalid configuration
原因:YAML 格式或字段值不合法。
解决:
# 关闭验证后强制提交(不推荐)
kubectl edit deploy/nginx --validate=false
- 错误:the object has been modified
原因:资源版本过期(其他人已修改过)。
解决:重新执行 kubectl edit 获取最新版本。
- 替代方案
| 场景 | 替代命令 | 说明 |
|---|---|---|
| 少量字段修改 | kubectl patch | 无需进入编辑器,直接通过 JSON 或 YAML 片段修改 |
| 批量修改 | kubectl apply -f updated.yaml | 通过文件更新配置 |
| 查看历史修改记录 | kubectl rollout history | 查看 Deployment 等资源的修订历史 |
- 参考文献
kubectl get : 列出一个或多个资源(pod/rc/service/ds)
# 获取集群所有的节点
kubectl get node 或 kubectl get no
# 查看rc和service列表
kubectl get rc,service
# 以纯文本输出格式列出所有 Pod
kubectl get pods
# 查询指定节点名(如: edge-1)的 所有 pod
kubectl get pod -A -o wide | grep edge-1
# 以纯文本输出格式列出所有 Pod,并包含附加信息(如【节点名】)。
kubectl get pods -o wide
# 以纯文本输出格式列出具有指定名称的副本控制器。提示:你可以使用别名 'rc' 缩短和替换 'replicationcontroller' 资源类型。
kubectl get replicationcontroller <rc-name>
# 以纯文本输出格式列出所有副本控制器和 Service。
kubectl get rc,services
# 以纯文本输出格式列出所有守护程序集,包括未初始化的守护程序集。
kubectl get ds --include-uninitialized
# 列出在节点 server01 上运行的所有 Pod
kubectl get pods --field-selector=spec.nodeName=server01
- 查询pod
kubectl get pod pod1
kubectl get pods pod1
kubectl get po pod1
- 按命名空间查询pod
kubectl get pod
# 等效于(命名空间=default): kubectl get pod -n default
# 查询所有命名空间下的 pod
kubectl get pod --all-namespaces
# 根据指定命名空间,查询其下的 pod | 不带等同 -n default
kubectl get pods -n kube-system
- 查询所有 Pod,并显示 Node 信息(IP / hostname 等)
[root@k8s-master-1 ~]# kubectl get pods -A -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-flannel kube-flannel-ds-lgrbd 1/1 Running 2 (28h ago) 3d3h 172.12.12.72 k8s-master-1 <none> <none>
kube-flannel kube-flannel-ds-wv2j6 0/1 Init:0/2 0 26h 172.12.12.244 edge-1 <none> <none>
kube-system coredns-c676cc86f-nzj2x 1/1 Running 1 (28h ago) 3d3h 172.10.34.4 k8s-master-1 <none> <none>
kube-system coredns-c676cc86f-s88tw 1/1 Running 1 (28h ago) 3d3h 172.10.34.5 k8s-master-1 <none> <none>
kube-system etcd-k8s-master-1 1/1 Running 1 (28h ago) 3d3h 172.12.12.72 k8s-master-1 <none> <none>
kube-system kube-apiserver-k8s-master-1 1/1 Running 1 (28h ago) 3d3h 172.12.12.72 k8s-master-1 <none> <none>
kube-system kube-controller-manager-k8s-master-1 1/1 Running 1 (28h ago) 3d3h 172.12.12.72 k8s-master-1 <none> <none>
kube-system kube-proxy-c7vf9 0/1 ContainerCreating 0 26h 172.12.12.244 edge-1 <none> <none>
kube-system kube-proxy-l9g4h 1/1 Running 1 (28h ago) 3d3h 172.12.12.72 k8s-master-1 <none> <none>
kube-system kube-scheduler-k8s-master-1 1/1 Running 1 (28h ago) 3d3h 172.12.12.72 k8s-master-1 <none> <none>
kubeedge cloud-iptables-manager-wrdjk 1/1 Running 0 28h 172.12.12.72 k8s-master-1 <none> <none>
kubeedge cloudcore-ffd866959-zblcp 1/1 Running 0 32h 172.12.12.72 k8s-master-1 <none> <none>
- 查询系统命名空间下的pod
[root@k8s-master-1 ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-c676cc86f-nzj2x 1/1 Running 1 (29h ago) 3d3h
coredns-c676cc86f-s88tw 1/1 Running 1 (29h ago) 3d3h
etcd-k8s-master-1 1/1 Running 1 (29h ago) 3d3h
kube-apiserver-k8s-master-1 1/1 Running 1 (29h ago) 3d3h
kube-controller-manager-k8s-master-1 1/1 Running 1 (29h ago) 3d3h
kube-proxy-c7vf9 0/1 ContainerCreating 0 26h
kube-proxy-l9g4h 1/1 Running 1 (29h ago) 3d3h
kube-scheduler-k8s-master-1 1/1 Running 1 (29h ago) 3d3h
- 查询系统命名空间下,Status为
ContainerCreating的 pod name
[root@k8s-master-1 ~]# kubectl get pods -n kube-system | grep ContainerCreating | awk '{print $1}' | xargs
kube-proxy-c7vf9
kubectl delete : 删除资源对象
# 删除所有Pod
kubectl delete pods --all
# 基于pod.yaml定义的名称删除Pod
$ kubectl delete -f pod.yaml
# 删除所有包含某个label的Pod和Service
$ kubectl delete pod,service -l name=<label-name>
kubectl exec : 执行容器的命令
- 执行Pod的date命令,默认使用Pod的第1个容器执行
$ kubectl exec <pod-name> date
- 指定Pod中某个容器执行date命令
$ kubectl exec <pod-name> -c <container-name> date
- 通过bash获得Pod中某个容器的TTY,相当于登陆容器
$ kubectl exec -ti <pod-name> -c <container-name> /bin/bash
kubectl describe : 显示一个或多个资源的详细状态,默认情况下包括未初始化的资源
# 显示名为 <pod-name> 的 Pod 的详细信息。
kubectl describe nodes <node-name>
# 显示名为 <pod-name> 的 Pod 的详细信息。
kubectl describe pods/<pod-name>
# 显示由名为 <rc-name> 的副本控制器管理的所有 Pod 的详细信息。
# 记住:副本控制器创建的任何 Pod 都以副本控制器的名称为前缀。
kubectl describe pods <rc-name>
# 描述所有的 Pod
kubectl describe pods

kubectl logs : 打印 Pod 中容器的日志
# 返回 Pod <pod-name> 的日志快照。
kubectl logs <pod-name>
# 从 Pod <pod-name> 开始流式传输日志。这类似于 'tail -f' Linux 命令。
kubectl logs -f <pod-name>
参考文献
k9s的部分功能,依赖kubectl/kubectl在 windows 的安装与配置
FAQ for K8s安装部署
Q:K8S在kubeadm init后,没有记录kubeadm join如何查询?
# 再生成一个token即可
kubeadm token create --print-join-command
# 可通过如下命令,查看历史的token
kubeadm token list
Q:node节点kubeadm join失败后,要重新join怎么办?
# 先执行
kubeadm -y reset
# 再执行
kubeadm join xx.....
Q:重启kubelet?
systemctl daemon-reload
systemctl restart kubelet
Q:查询K8s集群的 node / pod?
# 查询节点
kubectl get nodes
# 查询pods 一般要带上"-n"即命名空间。不带等同 -n default
kubectl get pods -n kube-system
Q:k8s"弃用"docker?
- 记得当时“k8s弃用docker”解读满天飞,很多文章说docker已死。后来也出来一波说并不是完全弃用docker只是移除了docker作为容器运行时的支持。
- k8s去掉的其实是dockershim,这是一个在kubelet和docker之间的适配器,用来将docker的接口转换为k8s所需的CRI(容器运行时接口)。这样做是为了简化k8s的架构,提高性能和安全性,以及支持更多的容器运行时。
- k8s并没有完全弃用docker,而是默认弃用了docker作为容器运行时的支持。这意味着k8s将不再使用docker来创建和运行容器,而是使用其他符合CRI标准的运行时,如containerd或CRI-O123。这样做的原因是docker不符合CRI标准,而且需要一个叫做dockershim的中间层来适配k8s的API。
- k8s去掉docker并不意味着docker就没有用了,或者你不能或者不应该用docker作为开发工具。docker仍然是构建容器镜像的非常有用的工具,而且它生成的镜像是符合OCI(开放容器倡议)标准的。这意味着任何用docker构建的镜像都可以在k8s中与其他容器运行时正常工作。所以,你不需要担心你的docker镜像会失效或者不兼容。
Q:k8s常用运维命令?
# 查看k8s 运行日志命令
# 比较有用,在k8s 启动、kubeadm init、kubeadm join 阶段可以辅助分析问题。
journalctl -xefu kubelet
# 查看k8s驱动
systemctl show --property=Environment kubelet |cat
##########show start##########
Environment=KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml
##########show end##########
# 重启k8s
systemctl restart kubelet
# 启动k8s
systemctl start kubelet
# 停止k8s
systemctl stop kubelet
# 开机自启k8s
systemctl enable kubelet
# dashboard 获取token
kubectl describe secret admin-user -n kubernetes-dashboard
# kubeadm 重置
# 有些时候我们在使用kubeadm init 命令时会报错,我们根据错误提示修复问题后需要重新进行 init 操作,因此需要进行reset重置
kubeadm reset
Q:环境信息?
# k8s 安装目录
/etc/kubernetes/
##########show start##########
total 44
drwxr-xr-x 4 root root 4096 May 17 16:37 .
drwxr-xr-x. 83 root root 4096 May 17 17:08 ..
-rw------- 1 root root 5635 May 17 16:37 admin.conf
-rw------- 1 root root 5667 May 17 16:37 controller-manager.conf
-rw------- 1 root root 1983 May 17 16:37 kubelet.conf
drwxr-xr-x 2 root root 4096 May 17 16:37 manifests
drwxr-xr-x 3 root root 4096 May 17 16:37 pki
-rw------- 1 root root 5615 May 17 16:37 scheduler.conf
##########show end##########
# 组件配置文件目录
/etc/kubernetes/manifests/
##########show start##########
[root@k8s-master-1 ~]# ls -la /etc/kubernetes/manifests/
total 24
drwxr-xr-x 2 root root 4096 May 17 16:37 .
drwxr-xr-x 4 root root 4096 May 17 16:37 ..
-rw------- 1 root root 2400 May 17 16:37 etcd.yaml
-rw------- 1 root root 3362 May 17 16:37 kube-apiserver.yaml
-rw------- 1 root root 2878 May 17 16:37 kube-controller-manager.yaml
-rw------- 1 root root 1464 May 17 16:37 kube-scheduler.yaml
##########show end##########
# 自定义dashboard yaml文件目录 (此目录,因实际未安装 dashboard,故不存在)
/opt/kube-dashboard/conf/
##########show start##########
总用量 8
-rw-r--r--. 1 root root 1124 6月 29 08:41 admin-user-dashboard.yaml
-rw-r--r--. 1 root root 285 6月 29 08:25 k8s-dashboard.yaml
##########show end##########
Q: Node节点加入(kubeadm join)Master节点时,报错:validate service connection: CRI v1 runtime API is not implemented for endpoint \"unix:///var/run/containerd/containerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService
- 问题描述
安装k8s集群, Node节点加入 Master 节点的时候(
kubeadm join...),报错,报错信息:
[root@node1 ~]# kubeadm join k8s-master:6443 --token 4nm8cy.jgxw8go95c1uqt6c --discovery-token-ca-cert-hash sha256:f1c08bce4ebeb8deb531b950e644cca399efc40e1a9ac99df21b7b38a31a6c02
[preflight] Running pre-flight checks
[WARNING Hostname]: hostname "node1" could not be reached
[WARNING Hostname]: hostname "node1": lookup node1 on 202.96.128.166:53: no such host
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR CRI]: container runtime is not running: output: time="2023-12-27T17:37:21+08:00" level=fatal msg="validate service connection: CRI v1 runtime API is not implemented for endpoint \"unix:///var/run/containerd/containerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService"
, error: exit status 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher
- 问题分析
CRI是 Kubernetes 与容器运行时(如 Docker、containerd 等)之间的接口。
通过这个接口,Kubernetes 可以告诉容器运行时如何创建、删除和管理容器。
如果在配置中看到了disabled_plugins = ["cri"],这意味着该配置禁用了某些插件。
所以,我们将该配置注释即可解决问题。
- 解决方法
# 打开配置并编辑
vim /etc/containerd/config.toml
# 注释 disabled_plugins
disabled_plugins = ["cri"]
# 重启containerd
systemctl restart containerd
-
之后再执行
kubeadm join... 就 OK 了。 -
参考文献
Q:在 K8s 集群节点初始化时,如果无法拉取官方镜像怎么办?
参见下文:
当使用kubeadm命令初始化集群时,会去官方镜像仓库(k8s.gcr.io)拉取镜像。但是国内网络无法访问官方镜像仓库,导致集群初始化失败。
方法1:手动拉取 / 方法2:自动化脚本拉取
for imageName in ${images[@]} ; do
docker pull $DOCKERHUB_URL/$imageName
docker tag $DOCKERHUB_URL/$imageName $GCR_URL/$imageName
docker rmi $DOCKERHUB_URL/$imageName
done
Q:kubeadm config images pull --image-repository 中国区镜像加速?
这是一个针对
Kubernetes集群使用阿里云或其他中国区镜像加速器的命令。
在中国大陆地区,由于网络限制,使用默认的Docker Hub镜像仓库下载Kubernetes所需的Docker镜像可能会非常缓慢或失败。因此,可以使用阿里云、DaoCloud等中国区镜像加速器,加速Kubernetes集群所需镜像的下载。
具体来说,kubeadm config images pull命令用于在安装Kubernetes集群之前,预先下载所有必需的Docker镜像。
在中国区,需要通过添加--image-repository选项指定镜像仓库地址,例如:
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
在此示例中,
registry.aliyuncs.com/google_containers是阿里云提供的Kubernetes镜像仓库地址。
将其添加到--image-repository选项后,Kubernetes将从该地址下载所需的Docker镜像,从而加快安装速度。
请注意,在使用此命令之前,您需要先安装并配置好Docker和kubeadm工具,并且需要拥有阿里云或其他中国区镜像加速器的账号和访问密钥。
Q:Kubernetes Pod pending 是什么意思?Pod 的生命周期?
Kubernetes 中的 Pod 的生命周期由几个不同的阶段组成:
- 创建 pod 时,它从Pending阶段开始。
- 一旦 pod 被调度并且容器已经启动,pod 就会进入Running阶段。
- 大多数 pod 只需要几秒钟就可以从 Pending 到 Running 并在该状态下度过大部分时间。

- 至此,Pod 已被 Kubernetes 集群接受。但是一个或多个容器尚未准备好对外提供服务。这包括 Pod 等待调度所花费的时间以及通过网络下载容器镜像所花费的时间。
- 当 pod 无法从 PendingtoRunning 阶段前进时,生命周期将停止并保留 pod,直到阻止它前进的问题得到修复。
- 如果我们使用 kubectl 列出 pod,我们将看到显示 Kubernetes pod 挂起情况的输出:
$ kubectl -n troubleshooting get pods
NAME READY STATUS RESTARTS AGE
stress-6d6cbc8b9d-s4sbh 0/1 Pending 0 17s
除非我们解决问题,否则 pod 被卡住并且不会运行。
- 参考文献/推荐文献
Q:在K8S中,pending状态一般由什么原因导致的?
在Kubernetes(K8S)中,资源或Pod处于Pending状态可能由多种原因引起。以下是一些常见的原因和详细解释:
-
资源不足:
当集群中的资源不足以满足Pod或服务的需求时,它们可能会被置于Pending状态。这通常涉及到CPU、内存、存储或其他资源。
解决方案是检查集群的资源使用情况,并考虑增加节点或调整资源请求和限制。 -
调度约束:
Pod可能由于调度约束(如亲和性/反亲和性规则)而无法被调度到任何可用的节点上。
解决方案是检查Pod的调度规则,确保这些规则与集群中的节点标签相匹配,或调整规则以允许更多的调度可能性。 -
依赖的服务不可用:
如果Pod依赖于某些服务(如ConfigMaps、Secrets、PVs等),而这些服务尚未准备好或不可用,Pod可能会进入Pending状态。
解决方案是确保所有依赖项都已正确创建并可用。 -
网络问题:
网络问题,如防火墙设置、网络访问控制列表(ACL)或路由表配置,可能会阻止Pod或服务的创建或通信。
解决方案是检查网络配置,确保没有阻止Pod或服务通信的规则。 -
配额限制:
在某些情况下,集群可能设置了资源配额(如CPU或内存限制),这可能会阻止Pod或服务的创建。
解决方案是检查并调整资源配额,以满足Pod或服务的需求。 -
云提供商资源限制:
当使用云上的Kubernetes时,云提供商可能设置了资源限制(如负载均衡器配额)。如果达到这些限制,相关资源可能无法创建。
解决方案是检查云提供商的配额和限制,并根据需要进行调整或等待资源释放。 -
配置错误:
Pod或服务的配置错误(如错误的端口、目标实例等)可能导致它们无法正确创建。
解决方案是检查并修正配置错误。
综上所述,要确定具体的原因,可以查看Kubernetes的事件日志或使用
kubectl describe命令来检查Pod或服务的状态和事件。这些工具可以提供关于为什么资源或Pod处于Pending状态的详细信息。
- 参考文献/推荐文献
Y 推荐文献
- Kubernetes
- [Docker] Docker 基础教程(概念/原理/基础操作) - 博客园/千千寰宇
- [虚拟化] K8S概述 - 博客园/千千寰宇
- [K8s/云原生] 开源 Kubernetes Web UI 管理工具 - 博客园/千千寰宇
- kubernetes+KubeEdge云边环境的安装与部署 - CSDN
- KubeEdge与Kubernets的版本兼容性

https://github.com/kubeedge/kubeedge#kubernetes-compatibility
k8s 1.17 - 1.23
| Kubernetes 1.17 | Kubernetes 1.18 | Kubernetes 1.19 | Kubernetes 1.20 | Kubernetes 1.21 | Kubernetes 1.22 | Kubernetes 1.23 | |
|---|---|---|---|---|---|---|---|
| KubeEdge 1.11 | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | - |
| KubeEdge 1.12 | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | - |
| KubeEdge 1.13 | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
k8s 1.25 - 1.30
| Kubernetes 1.25 | Kubernetes 1.26 | Kubernetes 1.27 | Kubernetes 1.28 | Kubernetes 1.29 | Kubernetes 1.30 |
|---|---|---|---|---|---|
| KubeEdge 1.16 | ✓ | ✓ | ✓ | - | - |
| KubeEdge 1.17 | + | ✓ | ✓ | ✓ | - |
| KubeEdge 1.18 | + | + | ✓ | ✓ | ✓ |
| KubeEdge 1.19 | + | + | ✓ | ✓ | ✓ |
| KubeEdge 1.20 | + | + | + | ✓ | ✓ |
| KubeEdge HEAD (master) | + | + | + | ✓ | ✓ |
√ KubeEdge和Kubernetes版本完全兼容。
+ KubeEdge具有Kubernetes版本中可能不存在的功能或API对象。
- Kubernetes版本有KubeEdge无法使用的特性或API对象。
X 参考文献
其他阅读过的,有一定启发的文献:
- centos7安装kubernetes教程 - 腾讯云 【参考】
- Kubernetes v1.25.0集群搭建实战案例(新版本含Docker容器运行时) - Zhihu
- Found multiple CRI endpoints on the host. Please define which one do you wish to use by setting..... - CSDN
- 部署k8s的时候kube-flannel.yml下载不下来解决 - CSDN
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
Flannel:Flannel是一个流行的CNI插件,它使用虚拟网络覆盖技术(overlay network)来连接不同节点上的容器。Flannel支持多种后端驱动,如VXLAN、UDP、Host-GW等
搭建好k8s集群后,集群中的节点status全部都是NotReady,最后一查资料,原来是网络插件没有安装,看到有安装fannel
export no_proxy=kubernetes.docker.internal,docker-for-desktop,$no_proxy
os:Centos 7.5 200g hdd, 8g mem
kubernetes: 1.15.1
docker: ce 19.03.1
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!

浙公网安备 33010602011771号