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

【2】kubeadm init 初始化问题

【3】镜像拉取失败问题

【4】k8s 安装网络插件flannel 无法拉取镜像问题

【5】ubuntu 安装 k8s

【6】Containerd配置镜像加速器

posted @   先娶国王后取经  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示