k8s
常用命令
// 查看节点信息
kubectl get nodes
// 查看某节点日志
kubectl describe pod 《节点名称》 --namespace 《节点命名空间》
// 强制删除pod
kubectl delete pod <pod_name> --namespace <namespace> --grace-period=0 --force
Ubuntu安装k8s
相关环境准备(所有节点都要操作)
关闭swap
// 要想永久关,得先解除程序占用,临时关闭 swap
swapoff -a
// 编辑配置文件:注释掉关于swap的那一行
vi /etc/fstab
关闭SELinux
注:Ubuntu没有这个东西,可以忽略
// Centos 系统执行
sudo sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
时间同步
// 设置时区
timedatectl set-timezone Asia/Shanghai
// 重启时间同步服务
systemctl restart systemd-timesyncd.service
// 验证
date
主机名解析
// 设置主机名
# 192.168.65.100
hostnamectl set-hostname k8s-master
# 192.168.65.101
hostnamectl set-hostname k8s-node1
# 192.168.65.102
hostnamectl set-hostname k8s-node2
// 主机名解析
cat >> /etc/hosts << EOF
127.0.0.1 $(hostname)
192.168.65.100 k8s-master
192.168.65.101 k8s-node1
192.168.65.102 k8s-node2
EOF
开启流量转发
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
// 查看是否开启成功:net.ipv4.ip_forward = 1 # 开启成功
sysctl net.ipv4.ip_forward
安装Containerd 运行时环境(所有节点都要操作)
apt update && apt install -y containerd
// 验证安装是否成功
containerd -v
sudo mkdir -p /etc/containerd && \
sudo containerd config default > /etc/containerd/config.toml
// 修改/etc/containerd/config.toml 文件:SystemdCgroup 为 true
vim /etc/containerd/config.toml
// 重启containerd
systemctl restart containerd
安装kubeadm、kubelet、kubectl (所有节点都要操作)
sudo apt update && sudo apt upgrade -y
sudo apt install -y apt-transport-https ca-certificates curl gpg
sudo mkdir -p -m 755 /etc/apt/keyrings
// 版本v1.30
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg && \
sudo chmod 644 /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update && \
sudo apt install -y kubelet kubectl kubeadm && \
sudo apt-mark hold kubelet kubeadm kubectl
sudo systemctl enable --now kubelet
kubeadm version
初始化集群主节点(该操作只在主节点上执行)
拉取镜像
sudo kubeadm config images pull \
--kubernetes-version=v1.30.1 \
--cri-socket=unix:///run/containerd/containerd.sock
# --image-repository=registry.aliyuncs.com/google_containers \ # 觉得慢加上这个
初始化节点
sudo kubeadm init \
# 此处需要修改为主节点IP地址
--apiserver-advertise-address=192.168.10.10 \
--control-plane-endpoint=k8s-master \
--kubernetes-version=v1.30.1 \
--service-cidr=10.50.0.0/16 \
--pod-network-cidr=10.60.0.0/16 \
--cri-socket=unix:///run/containerd/containerd.sock
# --image-repository=registry.aliyuncs.com/google_containers \ # 嫌慢的可以加上这句,用阿里云的镜像
注:init 成功后会有如下信息
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get pods -A # 记住,kubectl命令只能在主节点上执行,其他节点上执行会被拒绝
网络插件flannel安装(该操作只需在主节点上执行)
下载相关配置文件
https://github.com/flannel-io/flannel/blob/master/Documentation/kube-flannel.yml
修改pod网段
与初始化集群主节点时的pod-network-cidr参数保持一致即可
sudo kubeadm init \
--apiserver-advertise-address=192.168.10.10 \
--control-plane-endpoint=k8s-master \
--kubernetes-version=v1.30.1 \
--service-cidr=10.50.0.0/16 \
--pod-network-cidr=10.60.0.0/16 \
--cri-socket=unix:///run/containerd/containerd.sock
# --image-repository=registry.aliyuncs.com/google_containers \ # 嫌慢的可以加上这句,用阿里云的镜像
更换相关镜像源
注:具体操作方法可见文末的参考文章
安装flannel
kubectl apply -f kube-flannel.yml
配置阿里云镜像仓库
创建阿里云镜像仓库
注意此处有一个误区:千万不要认为集群节点可以通过docker login 命令成功登录阿里云镜像仓库后就能拉取镜像,因为如果仓库是私有的,则还需要额外进行为k8s进行相关的认证配置
配置k8s私有镜像仓库凭据
创建Secret
kubectl create secret docker-registry <secret-name> \
--docker-server=registry.cn-hangzhou.aliyuncs.com \
--docker-username=<your-username> \
--docker-password=<your-password> \
--docker-email=<your-email>
================相关参数说明=====================
<secret-name>: 自定义的 Secret 名称。
--docker-server: 阿里云镜像仓库的地址。
--docker-username: 阿里云账号。
--docker-password: 阿里云镜像仓库的密码。
--docker-email: 你的电子邮件地址。
使用Secret更新Deployment配置
在Kubernetes Deployment 配置文件中,添加 imagePullSecrets 配置项
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-deployment
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: crpi-wa4qipww4kvt11nv.cn-hangzhou.personal.cr.aliyuncs.com/jxsr/k8s:mysql-5.7
ports:
- containerPort: 3306
imagePullSecrets:
- name: <自定义secret-name>
验证配置是否成功
// 1、删除原有的pod(一般情况下会自动再创建新pod)
kubectl delete pod <pod name>
// 2、检查新pod的状态
kubectl get pods
权限问题
切换到默认管理员用户
检查 kubeconfig 文件中是否有 kubernetes-admin 用户
kubectl config get-contexts
如果有类似 kubernetes-admin@kubernetes 的上下文,切换到管理员上下文
kubectl config use-context kubernetes-admin@kubernetes
如果没有找到管理员上下文,可以尝试重新生成 kubeconfig
进入 Kubernetes 主节点,使用 kubeadm 命令重新导出管理员 kubeconfig
sudo cat /etc/kubernetes/admin.conf > ~/.kube/config
验证权限
kubectl get clusterroles
故障排查
The API server is not healthy after 4m
问题描述
解决方案
// 查看当前 containerd 镜像下载地址
containerd config dump | grep sandbox_image
// 生成默认的containerd 配置文件
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml
// 编辑文件
// 修改后:sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.8"
vim /etc/containerd/config.toml
// 重新加载配置并重启 containerd 服务
systemctl daemon-reload
systemctl restart containerd
init初始化集群主节点失败,相关文件已存在
问题描述
重复初始化集群主节点前,需要重置kubeadm并删除相关文件
解决方案
sudo kubeadm reset # 重置 kubeadm ,执行这个后需要敲 y 回车
sudo rm -rf /etc/cni/net.d # 删除上次 init 生成的文件
sudo rm -rf /var/lib/etcd # 删除上次 init 生成的文件
[ERROR Port-10250]: Port 10250 is in use
问题描述
主节点因为某些原因重新安装,导致子节点需要重新加入集群
解决方案
sudo kubeadm reset # 重置 kubeadm ,执行这个后需要敲 y 回车
sudo rm -rf /etc/cni/net.d # 删除上次 init 生成的文件
sudo rm -rf /var/lib/etcd # 删除上次 init 生成的文件
主节点重启后:couldn't get current server API group list: Get "http://localhost:8080
问题描述
解决方案
mkdir ~/.kube
cp /etc/kubernetes/kubelet.conf ~/.kube/config
registry.k8s.io/pause:3.8 镜像拉取失败问题
问题描述
由于国内相关网络政策,导致无法访问国外的一些镜像仓库,故需要更改为国内镜像源
解决方案
// 从阿里云镜像源拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.8
// 对镜像进行重命名
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.8 registry.k8s.io/pause:3.8
此时镜像为本地docker镜像,但k8s在1.24之后的版本之后kubelet彻底移除了dockershim,改为默认使用Containerd,故该本地docker镜像仍无法使用,还需要进行如下操作:
// 在本地进行镜像打包
docker save -o registry-k8s-io-pause.tar registry.k8s.io/pause:3.8
// 将进行导入Containerd的k8s.io命名空间(默认命名空间)中
ctr -n k8s.io images import registry-k8s-io-pause.tar
// 查看k8s.io命名空间的镜像(只有导入这个命名空间,kubelet才能从本地拉取这个镜像文件)
ctr -n k8s.io i check
k8s 集群部署MySQL
新建并编辑mysql.yaml文件
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
spec:
capacity:
storage: 128Mi
accessModes:
- ReadWriteOnce
hostPath:
path: /pv/mysql
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 128Mi
---
apiVersion: v1
kind: Service
metadata:
name: mysql-service
spec:
ports:
- protocol: TCP
port: 33306
targetPort: 3306
nodePort: 30000
selector:
app: mysql
type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-deployment
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
# 注意镜像源是否可用
image: docker.m.daocloud.io/mysql:latest
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pvc
创建MySQL应用
kubectl apply -f mysql.yaml
查看pod状态
kubectl get pod -A
查看MySQL服务端口
kubectl get svc
查看pod的ip信息
kubectl get pod -owide
参考文章
【1】k8s彻底删除pod
【3】镜像拉取失败问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类