最新资讯

  • K8s学习

K8s学习

2025-04-28 11:37:27 0 阅读

Kubernetes

1. Kubernetes介绍

1.1 应用部署方式演变

在部署应用程序的方式上,主要经历了三个时代:

  • 传统部署:互联网早期,会直接将应用程序部署在物理机上

    优点:简单,不需要其它技术的参与

    缺点:不能为应用程序定义资源使用边界,很难合理地分配计算资源,而且程序之间容易产生影响

  • 虚拟化部署:可以在一台物理机上运行多个虚拟机,每个虚拟机都是独立的一个环境

    优点:程序环境不会相互产生影响,提供了一定程度的安全性

    缺点:增加了操作系统,浪费了部分资源

  • 容器化部署:与虚拟化类似,但是共享了操作系统

    优点:

    可以保证每个容器拥有自己的文件系统、CPU、内存、进程空间等

    运行应用程序所需要的资源都被容器包装,并和底层基础架构解耦

    容器化的应用程序可以跨云服务商、跨Linux操作系统发行版进行部署

容器化部署方式给带来很多的便利,但是也会出现一些问题,比如说:

  • 一个容器故障停机了,怎么样让另外一个容器立刻启动去替补停机的容器
  • 当并发访问量变大的时候,怎么样做到横向扩展容器数量

这些容器管理的问题统称为容器编排问题,为了解决这些容器编排问题,就产生了一些容器编排的软件:

  • Swarm:Docker自己的容器编排工具
  • Mesos:Apache的一个资源统一管控的工具,需要和Marathon结合使用
  • Kubernetes:Google开源的的容器编排工具

1.2 kubernetes简介

kubernetes,是一个全新的基于容器技术的分布式架构领先方案,是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本,于2014年9月发布第一个版本,2015年7月发布第一个正式版本。

kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:

  • 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
  • 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
  • 服务发现:服务可以通过自动发现的形式找到它所依赖的服务
  • 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
  • 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
  • 存储编排:可以根据容器自身的需求自动创建存储卷

1.3 kubernetes组件

一个kubernetes集群主要是由控制节点(master)、**工作节点(node)**构成,每个节点上都会安装不同的组件。

master:集群的控制平面,负责集群的决策 ( 管理 )

ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制

Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上

ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等

Etcd :负责存储集群中各种资源对象的信息

node:集群的数据平面,负责为容器提供运行环境 ( 干活 )

Kubelet : 负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器

KubeProxy : 负责提供集群内部的服务发现和负载均衡

Docker : 负责节点上容器的各种操作

下面,以部署一个nginx服务来说明kubernetes系统各个组件调用关系:

  1. 首先要明确,一旦kubernetes环境启动之后,master和node都会将自身的信息存储到etcd数据库中

  2. 一个nginx服务的安装请求会首先被发送到master节点的apiServer组件

  3. apiServer组件会调用scheduler组件来决定到底应该把这个服务安装到哪个node节点上

    在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知apiServer

  4. apiServer调用controller-manager去调度Node节点安装nginx服务

  5. kubelet接收到指令后,会通知docker,然后由docker来启动一个nginx的pod

    pod是kubernetes的最小操作单元,容器必须跑在pod中至此,

  6. 一个nginx服务就运行了,如果需要访问nginx,就需要通过kube-proxy来对pod产生访问的代理

这样,外界用户就可以访问集群中的nginx服务了

1.4 kubernetes概念

Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控

Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行

Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器

Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等

Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod

Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签

NameSpace:命名空间,用来隔离pod的运行环境

2. kubernetes集群环境搭建

2.1 前置知识点

目前生产部署Kubernetes 集群主要有两种方式:

kubeadm

Kubeadm 是一个K8s 部署工具,提供kubeadm init 和kubeadm join,用于快速部署Kubernetes 集群。

官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

二进制包

从github 下载发行版的二进制包,手动部署每个组件,组成Kubernetes 集群。

Kubeadm 降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署Kubernetes 集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。

2.2 kubeadm 部署方式介绍

kubeadm 是官方社区推出的一个用于快速部署kubernetes 集群的工具,这个工具能通过两条指令完成一个kubernetes 集群的部署:

  • 创建一个Master 节点kubeadm init
  • 将Node 节点加入到当前集群中$ kubeadm join

2.3 安装要求

在开始之前,部署Kubernetes 集群机器需要满足以下几个条件:

  • 一台或多台机器,操作系统CentOS7.x-86_x64
  • 硬件配置:2GB 或更多RAM,2 个CPU 或更多CPU,硬盘30GB 或更多
  • 集群中所有机器之间网络互通
  • 可以访问外网,需要拉取镜像
  • 禁止swap 分区

2.4 最终目标

  • 在所有节点上安装Docker 和kubeadm
  • 部署Kubernetes Master
  • 部署容器网络插件
  • 部署Kubernetes Node,将节点加入Kubernetes 集群中
  • 部署Dashboard Web 页面,可视化查看Kubernetes 资源

2.5 准备环境

角色 IP地址 组件
k8s-master01 192.168.5.3 docker,kubectl,kubeadm,kubelet
k8s-node01 192.168.5.4 docker,kubectl,kubeadm,kubelet
k8s-node02 192.168.5.5 docker,kubectl,kubeadm,kubelet

2.6 系统初始化

2.6.1 设置系统主机名以及 Host 文件的相互解析

hostnamectl set-hostname k8s-master01 && bash
hostnamectl set-hostname k8s-node01 && bash
hostnamectl set-hostname k8s-node02 && bash
cat <<EOF>> /etc/hosts
192.168.5.3     k8s-master01
192.168.5.4     k8s-node01
192.168.5.5     k8s-node02
EOF
scp /etc/hosts root@192.168.5.4:/etc/hosts 
scp /etc/hosts root@192.168.5.5:/etc/hosts 

2.6.2 安装依赖文件(所有节点都要操作)

yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git

2.6.3 设置防火墙为 Iptables 并设置空规则(所有节点都要操作)

systemctl stop firewalld && systemctl disable firewalld

yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save

2.6.4 关闭 SELINUX(所有节点都要操作)

swapoff -a && sed -i '/ swap / s/^(.*)$/#/g' /etc/fstab

setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

2.6.5 调整内核参数,对于 K8S(所有节点都要操作)

modprobe br_netfilter

cat <<EOF> kubernetes.conf 
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
vm.overcommit_memory=1 # 不检查物理内存是否够用
vm.panic_on_oom=0 # 开启 OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF

cp kubernetes.conf /etc/sysctl.d/kubernetes.conf

sysctl -p /etc/sysctl.d/kubernetes.conf

2.6.6 调整系统时区(所有节点都要操作)

# 设置系统时区为 中国/上海
timedatectl set-timezone Asia/Shanghai
# 将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0
# 重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond

2.6.7 设置 rsyslogd 和 systemd journald(所有节点都要操作)

# 持久化保存日志的目录
mkdir /var/log/journal 
mkdir /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
# 持久化保存到磁盘
Storage=persistent

# 压缩历史日志
Compress=yes

SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000

# 最大占用空间 10G
SystemMaxUse=10G

# 单日志文件最大 200M
SystemMaxFileSize=200M

# 日志保存时间 2 周
MaxRetentionSec=2week

# 不将日志转发到 syslog
ForwardToSyslog=no
EOF

systemctl restart systemd-journald

2.6.8 kube-proxy开启ipvs的前置条件(所有节点都要操作)

cat <<EOF> /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
EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

2.6.9 安装 Docker 软件(所有节点都要操作)

yum install -y yum-utils device-mapper-persistent-data lvm2

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum install -y docker-ce

## 创建 /etc/docker 目录
mkdir /etc/docker

cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
}
}
EOF
mkdir -p /etc/systemd/system/docker.service.d
# 重启docker服务
systemctl daemon-reload && systemctl restart docker && systemctl enable docker

上传文件到/etc/yum.repos.d/ 目录下,也可以 代替 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 命令

docker-ce.repo

[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-stable-debuginfo]
name=Docker CE Stable - Debuginfo $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/stable
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-stable-source]
name=Docker CE Stable - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/stable
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-test]
name=Docker CE Test - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-test-debuginfo]
name=Docker CE Test - Debuginfo $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-test-source]
name=Docker CE Test - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-nightly]
name=Docker CE Nightly - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-nightly-debuginfo]
name=Docker CE Nightly - Debuginfo $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-nightly-source]
name=Docker CE Nightly - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

2.6.10 安装 Kubeadm (所有节点都要操作)

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

yum install -y kubelet kubeadm kubectl && systemctl enable kubelet

2.7 部署Kubernetes Master

2.7.1 初始化主节点(主节点操作)

kubeadm init --apiserver-advertise-address=192.168.5.3 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.21.1 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

2.7.2 加入主节点以及其余工作节点

kubeadm join 192.168.5.3:6443 --token h0uelc.l46qp29nxscke7f7 
        --discovery-token-ca-cert-hash sha256:abc807778e24bff73362ceeb783cc7f6feec96f20b4fd707c3f8e8312294e28f 

2.7.3 部署网络

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

下边是文件

---
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: psp.flannel.unprivileged
  annotations:
    seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/default
    seccomp.security.alpha.kubernetes.io/defaultProfileName: docker/default
    apparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/default
    apparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default
spec:
  privileged: false
  volumes:
  - configMap
  - secret
  - emptyDir
  - hostPath
  allowedHostPaths:
  - pathPrefix: "/etc/cni/net.d"
  - pathPrefix: "/etc/kube-flannel"
  - pathPrefix: "/run/flannel"
  readOnlyRootFilesystem: false
  # Users and groups
  runAsUser:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  fsGroup:
    rule: RunAsAny
  # Privilege Escalation
  allowPrivilegeEscalation: false
  defaultAllowPrivilegeEscalation: false
  # Capabilities
  allowedCapabilities: ['NET_ADMIN', 'NET_RAW']
  defaultAddCapabilities: []
  requiredDropCapabilities: []
  # Host namespaces
  hostPID: false
  hostIPC: false
  hostNetwork: true
  hostPorts:
  - min: 0
    max: 65535
  # SELinux
  seLinux:
    # SELinux is unused in CaaSP
    rule: 'RunAsAny'
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: flannel
rules:
- apiGroups: ['extensions']
  resources: ['podsecuritypolicies']
  verbs: ['use']
  resourceNames: ['psp.flannel.unprivileged']
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - nodes/status
  verbs:
  - patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: flannel
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: flannel
subjects:
- kind: ServiceAccount
  name: flannel
  namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: flannel
  namespace: kube-system
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: kube-flannel-cfg
  namespace: kube-system
  labels:
    tier: node
    app: flannel
data:
  cni-conf.json: |
    {
      "name": "cbr0",
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "type": "flannel",
          "delegate": {
            "hairpinMode": true,
            "isDefaultGateway": true
          }
        },
        {
          "type": "portmap",
          "capabilities": {
            "portMappings": true
          }
        }
      ]
    }
  net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-flannel-ds
  namespace: kube-system
  labels:
    tier: node
    app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  template:
    metadata:
      labels:
        tier: node
        app: flannel
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/os
                operator: In
                values:
                - linux
      hostNetwork: true
      priorityClassName: system-node-critical
      tolerations:
      - operator: Exists
        effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      - name: install-cni
        image: quay.io/coreos/flannel:v0.14.0
        command:
        - cp
        args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      containers:
      - name: kube-flannel
        image: quay.io/coreos/flannel:v0.14.0
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
          limits:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: false
          capabilities:
            add: ["NET_ADMIN", "NET_RAW"]
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      volumes:
      - name: run
        hostPath:
          path: /run/flannel
      - name: cni
        hostPath:
          path: /etc/cni/net.d
      - name: flannel-cfg
        configMap:
          name: kube-flannel-cfg

2.8 测试kubernetes 集群

2.8.1 部署nginx 测试

kubectl create deployment nginx --image=nginx

kubectl expose deployment nginx --port=80 --type=NodePort

kubectl get pod,svc

3. 资源管理

3.1 资源管理介绍

在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。

kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署服务,其实就是在kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。

kubernetes的最小管理单元是pod而不是容器,所以只能将容器放在Pod中,而kubernetes一般也不会直接管理Pod,而是通过Pod控制器来管理Pod的。

Pod可以提供服务之后,就要考虑如何访问Pod中服务,kubernetes提供了Service资源实现这个功能。

当然,如果Pod中程序的数据需要持久化,kubernetes还提供了各种存储系统。

学习kubernetes的核心,就是学习如何对集群上的Pod、Pod控制器、Service、存储等各种资源进行操作

3.2 YAML语言介绍

YAML是一个类似 XML、JSON 的标记性语言。它强调以数据为中心,并不是以标识语言为重点。因而YAML本身的定义比较简单,号称"一种人性化的数据格式语言"。


    15
    Beijing

heima:
  age: 15
  address: Beijing

YAML的语法比较简单,主要有下面几个:

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进不允许使用tab,只允许空格( 低版本限制 )
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • '#'表示注释

YAML支持以下几种数据类型:

  • 纯量:单个的、不可再分的值
  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hash) / 字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
# 纯量, 就是指的一个简单的值,字符串、布尔值、整数、浮点数、Null、时间、日期
# 1 布尔类型
c1: true (或者True)
# 2 整型
c2: 234
# 3 浮点型
c3: 3.14
# 4 null类型 
c4: ~  # 使用~表示null
# 5 日期类型
c5: 2018-02-17    # 日期必须使用ISO 8601格式,即yyyy-MM-dd
# 6 时间类型
c6: 2018-02-17T15:02:31+08:00  # 时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
# 7 字符串类型
c7: heima     # 简单写法,直接写值 , 如果字符串中间有特殊字符,必须使用双引号或者单引号包裹 
c8: line1
    line2     # 字符串过多的情况可以拆成多行,每一行会被转化成一个空格
# 对象
# 形式一(推荐):
heima:
  age: 15
  address: Beijing
# 形式二(了解):
heima: {age: 15,address: Beijing}
# 数组
# 形式一(推荐):
address:
  - 顺义
  - 昌平  
# 形式二(了解):
address: [顺义,昌平]

小提示:

1 书写yaml切记: 后面要加一个空格

2 如果需要将多段yaml配置放在一个文件中,中间要使用---分隔

3 下面是一个yaml转json的网站,可以通过它验证yaml是否书写正确

https://www.json2yaml.com/convert-yaml-to-json

3.3 资源管理方式

  • 命令式对象管理:直接使用命令去操作kubernetes资源

    kubectl run nginx-pod --image=nginx:1.17.1 --port=80

  • 命令式对象配置:通过命令配置和配置文件去操作kubernetes资源

    kubectl create/patch -f nginx-pod.yaml

  • 声明式对象配置:通过apply命令和配置文件去操作kubernetes资源

    kubectl apply -f nginx-pod.yaml

类型 操作对象 适用环境 优点 缺点
命令式对象管理 对象 测试 简单 只能操作活动对象,无法审计、跟踪
命令式对象配置 文件 开发 可以审计、跟踪 项目大时,配置文件多,操作麻烦
声明式对象配置 目录 开发 支持目录操作 意外情况下难以调试

3.3.1 命令式对象管理

kubectl命令

kubectl是kubernetes集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。kubectl命令的语法如下:

kubectl [command] [type] [name] [flags]

comand:指定要对资源执行的操作,例如create、get、delete

type:指定资源类型,比如deployment、pod、service

name:指定资源的名称,名称大小写敏感

flags:指定额外的可选参数

# 查看所有pod
kubectl get pod 

# 查看某个pod
kubectl get pod pod_name

# 查看某个pod,以yaml格式展示结果
kubectl get pod pod_name -o yaml

资源类型

kubernetes中所有的内容都抽象为资源,可以通过下面的命令进行查看:

kubectl api-resources

经常使用的资源有下面这些:

资源分类 资源名称 缩写 资源作用
集群级别资源 nodes no 集群组成部分
namespaces ns 隔离Pod
pod资源 pods po 装载容器
pod资源控制器 replicationcontrollers rc 控制pod资源
replicasets rs 控制pod资源
deployments deploy 控制pod资源
daemonsets ds 控制pod资源
jobs 控制pod资源
cronjobs cj 控制pod资源
horizontalpodautoscalers hpa 控制pod资源
statefulsets sts 控制pod资源
服务发现资源 services svc 统一pod对外接口
ingress ing 统一pod对外接口
存储资源 volumeattachments 存储
persistentvolumes pv 存储
persistentvolumeclaims pvc 存储
配置资源 configmaps cm 配置
secrets 配置

操作

kubernetes允许对资源进行多种操作,可以通过–help查看详细的操作命令

kubectl --help

经常使用的操作有下面这些:

命令分类 命令 翻译 命令作用
基本命令 create 创建 创建一个资源
edit 编辑 编辑一个资源
get 获取 获取一个资源
patch 更新 更新一个资源
delete 删除 删除一个资源
explain 解释 展示资源文档
运行和调试 run 运行 在集群中运行一个指定的镜像
expose 暴露 暴露资源为Service
describe 描述 显示资源内部信息
logs 日志输出容器在 pod 中的日志 输出容器在 pod 中的日志
attach 缠绕进入运行中的容器 进入运行中的容器
exec 执行容器中的一个命令 执行容器中的一个命令
cp 复制 在Pod内外复制文件
rollout 首次展示 管理资源的发布
scale 规模 扩(缩)容Pod的数量
autoscale 自动调整 自动调整Pod的数量
高级命令 apply rc 通过文件对资源进行配置
label 标签 更新资源上的标签
其他命令 cluster-info 集群信息 显示集群信息
version 版本 显示当前Server和Client的版本

下面以一个namespace / pod的创建和删除简单演示下命令的使用:

# 创建一个namespace
[root@master ~]# kubectl create namespace dev
namespace/dev created

# 获取namespace
[root@master ~]# kubectl get ns
NAME              STATUS   AGE
default           Active   21h
dev               Active   21s
kube-node-lease   Active   21h
kube-public       Active   21h
kube-system       Active   21h

# 在此namespace下创建并运行一个nginx的Pod
[root@master ~]# kubectl run pod --image=nginx:latest -n dev
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/pod created

# 查看新创建的pod
[root@master ~]# kubectl get pod -n dev
NAME  READY   STATUS    RESTARTS   AGE
pod   1/1     Running   0          21s

# 删除指定的pod
[root@master ~]# kubectl delete pod pod-864f9875b9-pcw7x
pod "pod" deleted

# 删除指定的namespace
[root@master ~]# kubectl delete ns dev
namespace "dev" deleted

3.3.2 命令式对象配置

命令式对象配置就是使用命令配合配置文件一起来操作kubernetes资源。

1) 创建一个nginxpod.yaml,内容如下:

apiVersion: v1
kind: Namespace
metadata:
  name: dev

---

apiVersion: v1
kind: Pod
metadata:
  name: nginxpod
  namespace: dev
spec:
  containers:
  - name: nginx-containers
    image: nginx:latest

2)执行create命令,创建资源:

[root@master ~]# kubectl create -f nginxpod.yaml
namespace/dev created
pod/nginxpod created

此时发现创建了两个资源对象,分别是namespace和pod

3)执行get命令,查看资源:

[root@master ~]#  kubectl get -f nginxpod.yaml
NAME            STATUS   AGE
namespace/dev   Active   18s

NAME            READY   STATUS    RESTARTS   AGE
pod/nginxpod    1/1     Running   0          17s

这样就显示了两个资源对象的信息

4)执行delete命令,删除资源:

[root@master ~]# kubectl delete -f nginxpod.yaml
namespace "dev" deleted
pod "nginxpod" deleted

此时发现两个资源对象被删除了

总结:
    命令式对象配置的方式操作资源,可以简单的认为:命令  +  yaml配置文件(里面是命令需要的各种参数)

3.3.3 声明式对象配置

声明式对象配置跟命令式对象配置很相似,但是它只有一个命令apply。

# 首先执行一次kubectl apply -f yaml文件,发现创建了资源
[root@master ~]#  kubectl apply -f nginxpod.yaml
namespace/dev created
pod/nginxpod created

# 再次执行一次kubectl apply -f yaml文件,发现说资源没有变动
[root@master ~]#  kubectl apply -f nginxpod.yaml
namespace/dev unchanged
pod/nginxpod unchanged
总结:
    其实声明式对象配置就是使用apply描述一个资源最终的状态(在yaml中定义状态)
    使用apply操作资源:
        如果资源不存在,就创建,相当于 kubectl create
        如果资源已存在,就更新,相当于 kubectl patch

扩展:kubectl可以在node节点上运行吗 ?

kubectl的运行是需要进行配置的,它的配置文件是$HOME/.kube,如果想要在node节点运行此命令,需要将master上的.kube文件复制到node节点上,即在master节点上执行下面操作:

scp  -r  HOME/.kube   node1: HOME/

使用推荐: 三种方式应该怎么用 ?

创建/更新资源 使用声明式对象配置 kubectl apply -f XXX.yaml

删除资源 使用命令式对象配置 kubectl delete -f XXX.yaml

查询资源 使用命令式对象管理 kubectl get(describe) 资源名称

4. 实战入门

本章节将介绍如何在kubernetes集群中部署一个nginx服务,并且能够对其进行访问。

4.1 Namespace

Namespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离

默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那此时就可以将两个Pod划分到不同的namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的"组",以方便不同的组的资源进行隔离使用和管理。

可以通过kubernetes的授权机制,将不同的namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理。

kubernetes在集群启动之后,会默认创建几个namespace

[root@master ~]# kubectl  get namespace
NAME              STATUS   AGE
default           Active   45h     #  所有未指定Namespace的对象都会被分配在default命名空间
kube-node-lease   Active   45h     #  集群节点之间的心跳维护,v1.13开始引入
kube-public       Active   45h     #  此命名空间下的资源可以被所有人访问(包括未认证用户)
kube-system       Active   45h     #  所有由Kubernetes系统创建的资源都处于这个命名空间

下面来看namespace资源的具体操作:

查看

# 1 查看所有的ns  命令:kubectl get ns
[root@master ~]# kubectl get ns
NAME              STATUS   AGE
default           Active   45h
kube-node-lease   Active   45h
kube-public       Active   45h     
kube-system       Active   45h     

# 2 查看指定的ns   命令:kubectl get ns ns名称
[root@master ~]# kubectl get ns default
NAME      STATUS   AGE
default   Active   45h

# 3 指定输出格式  命令:kubectl get ns ns名称  -o 格式参数
# kubernetes支持的格式有很多,比较常见的是wide、json、yaml
[root@master ~]# kubectl get ns default -o yaml
apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: "2021-05-08T04:44:16Z"
  name: default
  resourceVersion: "151"
  selfLink: /api/v1/namespaces/default
  uid: 7405f73a-e486-43d4-9db6-145f1409f090
spec:
  finalizers:
  - kubernetes
status:
  phase: Active
  
# 4 查看ns详情  命令:kubectl describe ns ns名称
[root@master ~]# kubectl describe ns default
Name:         default
Labels:       <none>
Annotations:  <none>
Status:       Active  # Active 命名空间正在使用中  Terminating 正在删除命名空间

# ResourceQuota 针对namespace做的资源限制
# LimitRange针对namespace中的每个组件做的资源限制
No resource quota.
No LimitRange resource.

创建

# 创建namespace
[root@master ~]# kubectl create ns dev
namespace/dev created

删除

# 删除namespace
[root@master ~]# kubectl delete ns dev
namespace "dev" deleted

配置方式

首先准备一个yaml文件:ns-dev.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: dev

然后就可以执行对应的创建和删除命令了:

创建:kubectl create -f ns-dev.yaml

删除:kubectl delete -f ns-dev.yaml

4.2 Pod

Pod是kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中。

Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器。

kubernetes在集群启动之后,集群中的各个组件也都是以Pod方式运行的。可以通过下面命令查看:

[root@master ~]# kubectl get pod -n kube-system
NAMESPACE     NAME                             READY   STATUS    RESTARTS   AGE
kube-system   coredns-6955765f44-68g6v         1/1     Running   0          2d1h
kube-system   coredns-6955765f44-cs5r8         1/1     Running   0          2d1h
kube-system   etcd-master                      1/1     Running   0          2d1h
kube-system   kube-apiserver-master            1/1     Running   0          2d1h
kube-system   kube-controller-manager-master   1/1     Running   0          2d1h
kube-system   kube-flannel-ds-amd64-47r25      1/1     Running   0          2d1h
kube-system   kube-flannel-ds-amd64-ls5lh      1/1     Running   0          2d1h
kube-system   kube-proxy-685tk                 1/1     Running   0          2d1h
kube-system   kube-proxy-87spt                 1/1     Running   0          2d1h
kube-system   kube-scheduler-master            1/1     Running   0          2d1h

创建并运行

kubernetes没有提供单独运行Pod的命令,都是通过Pod控制器来实现的

# 命令格式: kubectl run (pod控制器名称) [参数] 
# --image  指定Pod的镜像
# --port   指定端口
# --namespace  指定namespace
[root@master ~]# kubectl run nginx --image=nginx:latest --port=80 --namespace dev 
deployment.apps/nginx created

查看pod信息

# 查看Pod基本信息
[root@master ~]# kubectl get pods -n dev
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          43s

# 查看Pod的详细信息
[root@master ~]# kubectl describe pod nginx -n dev
Name:         nginx
Namespace:    dev
Priority:     0
Node:         node1/192.168.5.4
Start Time:   Wed, 08 May 2021 09:29:24 +0800
Labels:       pod-template-hash=5ff7956ff6
              run=nginx
Annotations:  <none>
Status:       Running
IP:           10.244.1.23
IPs:
  IP:           10.244.1.23
Controlled By:  ReplicaSet/nginx
Containers:
  nginx:
    Container ID:   docker://4c62b8c0648d2512380f4ffa5da2c99d16e05634979973449c98e9b829f6253c
    Image:          nginx:latest
    Image ID:       docker-pullable://nginx@sha256:485b610fefec7ff6c463ced9623314a04ed67e3945b9c08d7e53a47f6d108dc7
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Wed, 08 May 2021 09:30:01 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-hwvvw (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  default-token-hwvvw:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-hwvvw
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age        From               Message
  ----    ------     ----       ----               -------
  Normal  Scheduled  <unknown>  default-scheduler  Successfully assigned dev/nginx-5ff7956ff6-fg2db to node1
  Normal  Pulling    4m11s      kubelet, node1     Pulling image "nginx:latest"
  Normal  Pulled     3m36s      kubelet, node1     Successfully pulled image "nginx:latest"
  Normal  Created    3m36s      kubelet, node1     Created container nginx
  Normal  Started    3m36s      kubelet, node1     Started container nginx

访问Pod

# 获取podIP
[root@master ~]# kubectl get pods -n dev -o wide
NAME    READY   STATUS    RESTARTS   AGE    IP             NODE    ... 
nginx   1/1     Running   0          190s   10.244.1.23   node1   ...

#访问POD
[root@master ~]# curl http://10.244.1.23:80
<!DOCTYPE html>
<html>
<head>
	<title>Welcome to nginx!</title>
</head>
<body>
	<p><em>Thank you for using nginx.</em></p>
</body>
</html>

删除指定Pod

# 删除指定Pod
[root@master ~]# kubectl delete pod nginx -n dev
pod "nginx" deleted

# 此时,显示删除Pod成功,但是再查询,发现又新产生了一个 
[root@master ~]# kubectl get pods -n dev
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          21s

# 这是因为当前Pod是由Pod控制器创建的,控制器会监控Pod状况,一旦发现Pod死亡,会立即重建
# 此时要想删除Pod,必须删除Pod控制器

# 先来查询一下当前namespace下的Pod控制器
[root@master ~]# kubectl get deploy -n  dev
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           9m7s

# 接下来,删除此PodPod控制器
[root@master ~]# kubectl delete deploy nginx -n dev
deployment.apps "nginx" deleted

# 稍等片刻,再查询Pod,发现Pod被删除了
[root@master ~]# kubectl get pods -n dev
No resources found in dev namespace.

配置操作

创建一个pod-nginx.yaml,内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: dev
spec:
  containers:
  - image: nginx:latest
    name: pod
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP

然后就可以执行对应的创建和删除命令了:

创建:kubectl create -f pod-nginx.yaml

删除:kubectl delete -f pod-nginx.yaml

4.3 Label

Label是kubernetes系统中的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择。

Label的特点:

  • 一个Label会以key/value键值对的形式附加到各种对象上,如Node、Pod、Service等等
  • 一个资源对象可以定义任意数量的Label ,同一个Label也可以被添加到任意数量的资源对象上去
  • Label通常在资源对象定义时确定,当然也可以在对象创建后动态添加或者删除

可以通过Label实现资源的多维度分组,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作。

一些常用的Label 示例如下:

  • 版本标签:“version”:“release”, “version”:“stable”…
  • 环境标签:“environment”:“dev”,“environment”:“test”,“environment”:“pro”
  • 架构标签:“tier”:“frontend”,“tier”:“backend”

标签定义完毕之后,还要考虑到标签的选择,这就要使用到Label Selector,即:

Label用于给某个资源对象定义标识

Label Selector用于查询和筛选拥有某些标签的资源对象

当前有两种Label Selector:

  • 基于等式的Label Selector

    name = slave: 选择所有包含Label中key="name"且value="slave"的对象

    env != production: 选择所有包括Label中的key="env"且value不等于"production"的对象

  • 基于集合的Label Selector

    name in (master, slave): 选择所有包含Label中的key="name"且value="master"或"slave"的对象

    name not in (frontend): 选择所有包含Label中的key="name"且value不等于"frontend"的对象

标签的选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号","进行分隔即可。例如:

name=slave,env!=production

name not in (frontend),env!=production

命令方式

# 为pod资源打标签
[root@master ~]# kubectl label pod nginx-pod version=1.0 -n dev
pod/nginx-pod labeled

# 为pod资源更新标签
[root@master ~]# kubectl label pod nginx-pod version=2.0 -n dev --overwrite
pod/nginx-pod labeled

# 查看标签
[root@master ~]# kubectl get pod nginx-pod  -n dev --show-labels
NAME        READY   STATUS    RESTARTS   AGE   LABELS
nginx-pod   1/1     Running   0          10m   version=2.0

# 筛选标签
[root@master ~]# kubectl get pod -n dev -l version=2.0  --show-labels
NAME        READY   STATUS    RESTARTS   AGE   LABELS
nginx-pod   1/1     Running   0          17m   version=2.0
[root@master ~]# kubectl get pod -n dev -l version!=2.0 --show-labels
No resources found in dev namespace.

#删除标签
[root@master ~]# kubectl label pod nginx-pod version- -n dev
pod/nginx-pod labeled

配置方式

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: dev
  labels:
    version: "3.0" 
    env: "test"
spec:
  containers:
  - image: nginx:latest
    name: pod
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP

然后就可以执行对应的更新命令了:kubectl apply -f pod-nginx.yaml

4.4 Deployment

在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。Pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod。

在kubernetes中Pod控制器的种类有很多,本章节只介绍一种:Deployment。

命令操作

# 命令格式: kubectl create deployment 名称  [参数] 
# --image  指定pod的镜像
# --port   指定端口
# --replicas  指定创建pod数量
# --namespace  指定namespace
[root@master ~]# kubectl create deploy nginx --image=nginx:latest --port=80 --replicas=3 -n dev
deployment.apps/nginx created

# 查看创建的Pod
[root@master ~]# kubectl get pods -n dev
NAME                     READY   STATUS    RESTARTS   AGE
nginx-5ff7956ff6-6k8cb   1/1     Running   0          19s
nginx-5ff7956ff6-jxfjt   1/1     Running   0          19s
nginx-5ff7956ff6-v6jqw   1/1     Running   0          19s

# 查看deployment的信息
[root@master ~]# kubectl get deploy -n dev
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            3           2m42s

# UP-TO-DATE:成功升级的副本数量
# AVAILABLE:可用副本的数量
[root@master ~]# kubectl get deploy -n dev -o wide
NAME    READY UP-TO-DATE  AVAILABLE   AGE     CONTAINERS   IMAGES              SELECTOR
nginx   3/3     3         3           2m51s   nginx        nginx:latest        run=nginx

# 查看deployment的详细信息
[root@master ~]# kubectl describe deploy nginx -n dev
Name:                   nginx
Namespace:              dev
CreationTimestamp:      Wed, 08 May 2021 11:14:14 +0800
Labels:                 run

本文地址:https://www.vps345.com/4583.html

搜索文章

Tags

PV计算 带宽计算 流量带宽 服务器带宽 上行带宽 上行速率 什么是上行带宽? CC攻击 攻击怎么办 流量攻击 DDOS攻击 服务器被攻击怎么办 源IP 服务器 linux 运维 游戏 云计算 javascript 前端 chrome edge python MCP ssh 阿里云 网络 网络安全 网络协议 llama 算法 opencv 自然语言处理 神经网络 语言模型 ubuntu deepseek Ollama 模型联网 API CherryStudio RTSP xop RTP RTSPServer 推流 视频 进程 操作系统 进程控制 Ubuntu fastapi mcp mcp-proxy mcp-inspector fastapi-mcp agent sse filezilla 无法连接服务器 连接被服务器拒绝 vsftpd 331/530 harmonyos 华为 开发语言 typescript 计算机网络 数据库 centos oracle 关系型 安全 分布式 flutter android 鸿蒙 ssl 前端框架 深度学习 YOLO 目标检测 计算机视觉 人工智能 LDAP 笔记 java tomcat maven intellij idea docker 容器 macos 计算机外设 电脑 mac 软件需求 adb nginx 监控 自动化运维 智能路由器 外网访问 内网穿透 端口映射 运维开发 node.js json html5 firefox windows WSL win11 无法解析服务器的名称或地址 django flask web3.py jmeter 软件测试 asm numpy live555 rtsp rtp Hyper-V WinRM TrustedHosts web安全 Kali Linux 黑客 渗透测试 信息收集 vue3 HTML audio 控件组件 vue3 audio音乐播放器 Audio标签自定义样式默认 vue3播放音频文件音效音乐 自定义audio播放器样式 播放暂停调整声音大小下载文件 golang GaN HEMT 氮化镓 单粒子烧毁 辐射损伤 辐照效应 C 环境变量 进程地址空间 github 创意 社区 Flask FastAPI Waitress Gunicorn uWSGI Uvicorn Windsurf react.js 前端面试题 持续部署 jenkins pytorch transformer Dell R750XS 科技 ai 个人开发 物联网 iot udp unity 产品经理 agi microsoft vim websocket uni-app ollama llm php c++ 深度优先 图论 并集查找 换根法 树上倍增 宝塔面板访问不了 宝塔面板网站访问不了 宝塔面板怎么配置网站能访问 宝塔面板配置ip访问 宝塔面板配置域名访问教程 宝塔面板配置教程 spring boot 后端 ffmpeg 音视频 tcp/ip 微服务 springcloud 面试 性能优化 jdk intellij-idea 架构 pycharm ide vue.js audio vue音乐播放器 vue播放音频文件 Audio音频播放器自定义样式 播放暂停进度条音量调节快进快退 自定义audio覆盖默认样式 机器学习 rust http 漏洞 safari pip Mac 系统 系统架构 linux环境变量 .net 负载均衡 安全威胁分析 vscode 1.86 unix gitlab DeepSeek 服务器繁忙 AI 豆瓣 追剧助手 迅雷 nas 微信 云原生 devops springboot openEuler 设置代理 实用教程 unity3d prometheus k8s资源监控 annotations自动化 自动化监控 监控service 监控jvm 银河麒麟 kylin v10 麒麟 v10 网络穿透 云服务器 spring SSH Linux Xterminal ESP32 单片机 Docker Compose docker compose docker-compose mysql 自动化 kubernetes k8s express okhttp CORS 跨域 CPU 内存 主板 电源 网卡 HarmonyOS Next spring cloud 远程工作 虚拟化 半虚拟化 硬件虚拟化 Hypervisor HCIE 数通 大模型微调 DevEco Studio fpga开发 腾讯云 minicom 串口调试工具 测试工具 TRAE AI编程 AIGC Qwen2.5-coder 离线部署 dubbo android studio gateway Clion Nova ResharperC++引擎 Centos7 远程开发 threejs 3D .netcore code-server word图片自动上传 word一键转存 复制word图片 复制word图文 复制word公式 粘贴word图文 粘贴word公式 Dify wsl2 wsl 1024程序员节 conda pillow 嵌入式硬件 硬件架构 Trae AI代码编辑器 shell kamailio sip VoIP GCC crosstool-ng 大数据 大数据平台 echarts 信息可视化 数据分析 网页设计 统信 国产操作系统 虚拟机安装 c语言 redis jar stm32 W5500 OLED u8g2 TCP服务器 virtualenv Ubuntu 24 常用命令 Ubuntu 24 Ubuntu vi 异常处理 小程序 微信小程序域名配置 微信小程序服务器域名 微信小程序合法域名 小程序配置业务域名 微信小程序需要域名吗 微信小程序添加域名 微信分享 Image wxopensdk ux 多线程 学习方法 经验分享 程序人生 LLM 大模型面经 大模型 职场和发展 Deepseek 大模型学习 低代码 WebRTC gpt vscode 服务器数据恢复 数据恢复 存储数据恢复 北亚数据恢复 oracle数据恢复 webrtc chatgpt oneapi ci/cd excel pdf 多线程服务器 Linux网络编程 springsecurity6 oauth2 授权服务器 token sas DeepSeek-R1 API接口 qt YOLOv12 mongodb Linux awk awk函数 awk结构 awk内置变量 awk参数 awk脚本 awk详解 WSL2 开源 sqlserver visualstudio list 数据结构 命名管道 客户端与服务端通信 av1 电视盒子 机顶盒ROM 魔百盒刷机 3d 数学建模 IDE AI 原生集成开发环境 Trae AI EasyConnect Cline ecmascript nextjs react reactjs https 流式接口 java-ee DigitalOcean GPU服务器购买 GPU服务器哪里有 GPU服务器 apache Kylin-Server 服务器安装 hadoop mount挂载磁盘 wrong fs type LVM挂载磁盘 Centos7.9 交互 ArcTS 登录 ArcUI GridItem gitee 学习 搜索引擎 openwrt 代码调试 ipdb 安装教程 GPU环境配置 Ubuntu22 CUDA PyTorch Anaconda安装 c# NPS 雨云服务器 雨云 环境迁移 源码剖析 rtsp实现步骤 流媒体开发 gpu算力 es jvm cpu 实时 使用 相差8小时 UTC 时间 Java protobuf 序列化和反序列化 安装 pygame 小游戏 五子棋 C语言 强制清理 强制删除 mac废纸篓 软件工程 Agent ollama下载加速 svn 串口服务器 状态管理的 UDP 服务器 Arduino RTOS kvm 无桌面 命令行 RAID RAID技术 磁盘 存储 git gitea 媒体 微信公众平台 web Socket YOLOv8 NPU Atlas800 A300I pro asi_bench postgresql VMware安装Ubuntu Ubuntu安装k8s jupyter mysql离线安装 ubuntu22.04 mysql8.0 混合开发 环境安装 JDK 僵尸进程 matlab 压力测试 ecm bpm mybatis centos-root /dev/mapper yum clean all df -h / du -sh 宕机切换 服务器宕机 stm32项目 蓝耘科技 元生代平台工作流 ComfyUI 企业微信 Linux24.04 deepin llama3 Chatglm 开源大模型 缓存 ddos iDRAC R720xd freebsd debian PVE zotero WebDAV 同步失败 代理模式 远程桌面 ansible playbook XFS xfs文件系统损坏 I_O error 部署 服务器配置 华为云 springboot远程调试 java项目远程debug docker远程debug java项目远程调试 springboot远程 系统开发 binder 车载系统 framework 源码环境 Samba NAS dell服务器 go rabbitmq IIS .net core Hosting Bundle .NET Framework vs2022 html 剧本 集成学习 集成测试 Reactor 设计模式 C++ 远程 命令 执行 sshpass 操作 sql KingBase elasticsearch 多进程 firewalld jetty undertow 爬虫 数据集 UOS 统信操作系统 yum oceanbase rc.local 开机自启 systemd 麒麟 微信小程序 音乐服务器 Navidrome 音流 ping++ kylin 智能手机 Termux DeepSeek行业应用 Heroku 网站部署 文件系统 路径解析 postman mock mock server 模拟服务器 mock服务器 Postman内置变量 Postman随机数据 ruoyi ESXi Dell HPE 联想 浪潮 温湿度数据上传到服务器 Arduino HTTP cuda cudnn anaconda IIS服务器 IIS性能 日志监控 next.js 部署next.js nuxt3 实时音视频 bash 向日葵 银河麒麟服务器操作系统 系统激活 嵌入式 linux驱动开发 arm开发 数据库系统 博客 指令 小番茄C盘清理 便捷易用C盘清理工具 小番茄C盘清理的优势尽显何处? 教你深度体验小番茄C盘清理 C盘变红?!不知所措? C盘瘦身后电脑会发生什么变化? 显示管理器 lightdm gdm AD 域管理 kind 网站搭建 serv00 宝塔面板 同步 备份 建站 历史版本 下载 微信开放平台 微信公众号配置 Open WebUI 远程登录 telnet laravel grafana 直流充电桩 充电桩 IPMI 大语言模型 junit 小智AI服务端 xiaozhi ASR TTS curl wget eNSP 网络规划 VLAN 企业网络 chfs ubuntu 16.04 系统安全 弹性计算 裸金属服务器 弹性裸金属服务器 p2p 鸿蒙系统 nvidia ui EMUI 回退 降级 升级 火绒安全 Nuxt.js linux 命令 sed 命令 linux安装配置 RoboVLM 通用机器人策略 VLA设计哲学 vlm fot robot 视觉语言动作模型 具身智能 kali 共享文件夹 虚拟机 需求分析 规格说明书 bug 备选 网站 api 调用 示例 上传视频至服务器代码 vue3批量上传多个视频并预览 如何实现将本地视频上传到网页 element plu视频上传 ant design vue vue3本地上传视频及预览移除 npm AD域 我的世界服务器搭建 minecraft 自动化任务管理 vSphere vCenter 软件定义数据中心 sddc zabbix 反向代理 致远OA OA服务器 服务器磁盘扩容 prompt easyui AI大模型 langchain ip命令 新增网卡 新增IP 启动网卡 dns dify ragflow 远程连接 程序员 大模型入门 HTTP 服务器控制 ESP32 DeepSeek aws googlecloud 权限 css Playwright 自动化测试 边缘计算 智能硬件 查询数据库服务IP地址 SQL Server yum源切换 更换国内yum源 AutoDL nac 802.1 portal 支付 微信支付 开放平台 arm 单元测试 功能测试 selenium 能力提升 面试宝典 技术 IT信息化 编辑器 rpc 飞牛nas fnos 灵办AI JAVA 链表 计算机 pgpool 图形化界面 华为od 端口测试 sqlite 华为认证 网络工程师 交换机 田俊楠 MS Materials openssl 密码学 业界资讯 鲲鹏 模拟退火算法 课程设计 MQTT mosquitto 消息队列 数据挖掘 r语言 数据可视化 网络结构图 yaml Ultralytics 可视化 华为机试 Python ceph AISphereButler docker命令大全 自定义客户端 SAS 5G 3GPP 卫星通信 Linux环境 银河麒麟高级服务器 外接硬盘 Kylin 国产化 outlook 版本 flink eureka 机器人 visual studio code 框架搭建 游戏程序 回显服务器 UDP的API使用 深度求索 私域 知识库 信息与通信 Java Applet URL操作 服务器建立 Socket编程 网络文件读取 armbian u-boot 大模型教程 remote-ssh 怎么卸载MySQL MySQL怎么卸载干净 MySQL卸载重新安装教程 MySQL5.7卸载 Linux卸载MySQL8.0 如何卸载MySQL教程 MySQL卸载与安装 selete 高级IO rocketmq 多层架构 解耦 ukui 麒麟kylinos openeuler rust腐蚀 其他 腾讯云大模型知识引擎 超融合 RustDesk自建服务器 rustdesk服务器 docker rustdesk mcu ftp 分析解读 VPS Docker Hub docker pull 镜像源 daemon.json pyqt VM搭建win2012 win2012应急响应靶机搭建 攻击者获取服务器权限 上传wakaung病毒 应急响应并溯源 挖矿病毒处置 应急响应综合性靶场 frp 监控k8s 监控kubernetes Claude vscode1.86 1.86版本 ssh远程连接 Linux的基础指令 OD机试真题 华为OD机试真题 服务器能耗统计 open Euler dde 统信UOS RTMP 应用层 AnythingLLM AnythingLLM安装 LLM Web APP Streamlit 报错 big data opensearch helm WebUI DeepSeek V3 飞书 昇腾 npu 孤岛惊魂4 uniapp vue 恒源云 tcp sysctl.conf vm.nr_hugepages adobe 传统数据库升级 银行 LLMs 单一职责原则 kafka qemu libvirt 网络编程 聊天服务器 套接字 TCP 客户端 MacMini 迷你主机 mini Apple IPMITOOL BMC 硬件管理 宠物 毕业设计 免费学习 宠物领养 宠物平台 opcua opcda KEPServer安装 efficientVIT YOLOv8替换主干网络 TOLOv8 open webui 小艺 Pura X 游戏服务器 TrinityCore 魔兽世界 cnn DenseNet 繁忙 解决办法 替代网站 汇总推荐 AI推理 CDN 群晖 飞牛 asp.net大文件上传 asp.net大文件上传下载 asp.net大文件上传源码 ASP.NET断点续传 asp.net上传文件夹 asp.net上传大文件 .net core断点续传 文件分享 dba 中间件 iis VSCode 移动云 云服务 可信计算技术 FTP 服务器 can 线程池 XCC Lenovo spark HistoryServer Spark YARN jobhistory Headless Linux nfs 服务器部署ai模型 安全架构 SSL 域名 rsyslog Anolis nginx安装 linux插件下载 USB网络共享 NFS 监控k8s集群 集群内prometheus embedding IO模型 ruby ios 无人机 raid5数据恢复 磁盘阵列数据恢复 僵尸世界大战 游戏服务器搭建 VR手套 数据手套 动捕手套 动捕数据手套 银河麒麟操作系统 skynet zookeeper 驱动开发 硬件工程 嵌入式实习 k8s集群资源管理 云原生开发 7z 阿里云ECS LORA NLP 输入法 vmware 卡死 n8n 工作流 workflow v10 软件 自动化编程 ssh漏洞 ssh9.9p2 CVE-2025-23419 ai小智 语音助手 ai小智配网 ai小智教程 esp32语音助手 diy语音助手 黑客技术 URL keepalived ros2 moveit 机器人运动 本地部署 架构与原理 多个客户端访问 IO多路复用 TCP相关API Linux PID SSE chrome devtools chromedriver Google pay Apple pay 服务器主板 AI芯片 wireshark 显示过滤器 ICMP Wireshark安装 大文件分片上传断点续传及进度条 如何批量上传超大文件并显示进度 axios大文件切片上传详细教 node服务器合并切片 vue3大文件上传报错提示错误 大文件秒传跨域报错cors 网工 压测 ECS 单例模式 arkUI 服务网格 istio ssrf 失效的访问控制 MI300x elk perf 网络攻击模型 Cursor hive DBeaver 数据仓库 kerberos vue-i18n 国际化多语言 vue2中英文切换详细教程 如何动态加载i18n语言包 把语言json放到服务器调用 前端调用api获取语言配置文件 网络用户购物行为分析可视化平台 大数据毕业设计 xrdp string模拟实现 深拷贝 浅拷贝 经典的string类问题 三个swap Unity Dedicated Server Host Client 无头主机 开发环境 SSL证书 交叉编译 语法 视觉检测 性能测试 openstack VMware Xen KVM odoo 服务器动作 Server action VMware创建虚拟机 常用命令 文本命令 目录命令 崖山数据库 YashanDB tidb GLIBC 视频编解码 Ubuntu 24.04.1 轻量级服务器 redhat 直播推流 高效日志打印 串口通信日志 服务器日志 系统状态监控日志 异常记录日志 策略模式 毕设 midjourney AI写作 Logstash 日志采集 netty 黑苹果 代码托管服务 远程控制 远程看看 远程协助 远程过程调用 Windows环境 sdkman wordpress 无法访问wordpess后台 打开网站页面错乱 linux宝塔面板 wordpress更换服务器 佛山戴尔服务器维修 佛山三水服务器维修 ipython 技能大赛 ROS 自动驾驶 alias unalias 别名 三级等保 服务器审计日志备份 FTP服务器 risc-v 干货分享 黑客工具 密码爆破 bootstrap gradle Ark-TS语言 软考 C# MQTTS 双向认证 emqx 源码 政务 分布式系统 监控运维 Prometheus Grafana 联想开天P90Z装win10 Invalid Host allowedHosts regedit 开机启动 xml 实时互动 Ubuntu DeepSeek DeepSeek Ubuntu DeepSeek 本地部署 DeepSeek 知识库 DeepSeek 私有化知识库 本地部署 DeepSeek DeepSeek 私有化部署 gpt-3 文心一言 京东云 bonding 链路聚合 SSH 服务 SSH Server OpenSSH Server 软件构建 执法记录仪 智能安全帽 smarteye 基础入门 编程 tailscale derp derper 中转 矩阵 线性代数 电商平台 Hive环境搭建 hive3环境 Hive远程模式 camera Arduino 电子信息 虚拟显示器 互信 C++软件实战问题排查经验分享 0xfeeefeee 0xcdcdcdcd 动态库加载失败 程序启动失败 程序运行权限 标准用户权限与管理员权限 大模型应用 cmos 硬件 IDEA tcpdump 重启 排查 系统重启 日志 原因 lua etcd 数据安全 RBAC flash-attention VMware安装mocOS macOS系统安装 金融 cursor MCP server C/S windows日志 seatunnel 数据库架构 数据管理 数据治理 数据编织 数据虚拟化 Minecraft DOIT 四博智联 idm 音乐库 H3C gcc thingsboard epoll 测试用例 双系统 GRUB引导 Linux技巧 磁盘监控 Ubuntu Server Ubuntu 22.04.5 前后端分离 移动魔百盒 minio USB转串口 CH340 飞牛NAS 飞牛OS MacBook Pro 服务器无法访问 ip地址无法访问 无法访问宝塔面板 宝塔面板打不开 FunASR file server http server web server muduo X11 Xming 生物信息学 uni-file-picker 拍摄从相册选择 uni.uploadFile H5上传图片 微信小程序上传图片 LInux Wi-Fi DNS Spring Security mariadb 自学笔记 小米 澎湃OS Android rdp 实验 技术共享 王者荣耀 设备 GPU PCI-Express iphone SysBench 基准测试 阻塞队列 生产者消费者模型 服务器崩坏原因 iftop 网络流量监控 Linux无人智慧超市 LInux多线程服务器 QT项目 LInux项目 单片机项目 c ISO镜像作为本地源 make命令 makefile文件 云电竞 云电脑 todesk Erlang OTP gen_server 热代码交换 事务语义 MNN Qwen ip 备份SQL Server数据库 数据库备份 傲梅企业备份网络版 g++ g++13 蓝桥杯 Cookie 安卓 银河麒麟桌面操作系统 Kylin OS 匿名管道 xss 在线预览 xlsx xls文件 在浏览器直接打开解析xls表格 前端实现vue3打开excel 文件地址url或接口文档流二进 开机自启动 GoogLeNet 游戏机 pppoe radius hugo Portainer搭建 Portainer使用 Portainer使用详解 Portainer详解 Portainer portainer Netty 即时通信 NIO ue4 着色器 ue5 虚幻 SWAT 配置文件 服务管理 网络共享 gaussdb 目标跟踪 OpenVINO 推理应用 saltstack vasp安装 MacOS录屏软件 mamba Vmamba QQ bot Docker AI作画 聊天室 ocr micropython esp32 mqtt AI agent 思科模拟器 思科 Cisco Redis Desktop .net mvc断点续传 DeepSeek r1 算力 串口驱动 CH341 uart 485 Radius qt项目 qt项目实战 qt教程 RAGFLOW RAG 检索增强生成 文档解析 大模型垂直应用 宝塔 国标28181 视频监控 监控接入 语音广播 流程 SIP SDP 服务器管理 配置教程 网站管理 docker run 数据卷挂载 交互模式 clickhouse 进程信号 CLion 社交电子 模拟器 教程 高效远程协作 TrustViewer体验 跨设备操作便利 智能远程控制 EMQX 通信协议 hibernate eclipse 图像处理 计算虚拟化 弹性裸金属 VS Code 游戏引擎 医疗APP开发 app开发 工业4.0 windwos防火墙 defender防火墙 win防火墙白名单 防火墙白名单效果 防火墙只允许指定应用上网 防火墙允许指定上网其它禁止 根服务器 Kali etl 环境配置 hexo xpath定位元素 bat SEO 嵌入式Linux IPC docker部署翻译组件 docker部署deepl docker搭建deepl java对接deepl 翻译组件使用 强化学习 内网服务器 内网代理 内网通信 word ArkUI 多端开发 智慧分发 应用生态 鸿蒙OS apt nlp 中兴光猫 换光猫 网络桥接 自己换光猫 毕昇JDK 相机 c/c++ 串口 vpn log4j 用户缓冲区 模拟实现 语音识别 ArkTs PX4 健康医疗 互联网医院 MacOS fd 文件描述符 换源 国内源 Debian wpf Mac内存不够用怎么办 rustdesk cocoapods xcode EtherNet/IP串口网关 EIP转RS485 EIP转Modbus EtherNet/IP网关协议 EIP转RS485网关 EIP串口服务器 edge浏览器 SenseVoice Xinference RAGFlow vr 元服务 应用上架 yolov8 免费域名 域名解析 ABAP kotlin tensorflow 渗透 trae DocFlow mq wsgiref Web 服务器网关接口 ubuntu24 vivado24 李心怡 Jellyfin deekseek 存储维护 NetApp存储 EMC存储 TrueLicense 做raid 装系统 Linux的权限 ardunio BLE webstorm perl trea idea Python基础 Python教程 Python技巧 WLAN su sudo 项目部署到linux服务器 项目部署过程 jina CVE-2024-7347 Ubuntu22.04 开发人员主页 autodl 信号 软链接 硬链接 composer wps web3 智能音箱 智能家居 CrewAI rime WebVM 键盘 基础环境 开发 流水线 脚本式流水线 IMM python3.11 代理服务器 并查集 leetcode ubuntu24.04.1 程序员创富 ssh远程登录 linux上传下载 信号处理 问题解决 IM即时通讯 剪切板对通 HTML FORMAT 网络药理学 生信 gromacs 分子动力学模拟 MD 动力学模拟 fast 大大通 第三代半导体 碳化硅 Windows ai工具 java-rocketmq ldap 远程服务 浏览器开发 AI浏览器 GIS 遥感 WebGIS 内网环境 lsb_release /etc/issue /proc/version uname -r 查看ubuntu版本 h.264 x64 SIGSEGV xmm0 Typore sonoma 自动更新 xshell termius iterm2 烟花代码 烟花 元旦 性能调优 安全代理 neo4j 数据库开发 database 查看显卡进程 fuser powerpoint dity make 网卡的名称修改 eth0 ens33 IMX317 MIPI H265 VCU ShenTong cpp-httplib less 磁盘清理 searxng Deepseek-R1 私有化部署 推理模型 Docker引擎已经停止 Docker无法使用 WSL进度一直是0 镜像加速地址 人工智能生成内容 镜像 合成模型 扩散模型 图像生成 SRS 流媒体 直播 nvm whistle 序列化反序列化 防火墙 NAT转发 NAT Server 线程 实战案例 产测工具框架 IMX6ULL 管理框架 dash 正则表达式 CentOS 知识图谱 firewall db HarmonyOS OpenHarmony 真机调试 cfssl TCP协议 抗锯齿 拓扑图 QT 5.12.12 QT开发环境 Ubuntu18.04 捆绑 链接 谷歌浏览器 youtube google gmail 图形渲染 信创 信创终端 中科方德 css3 sqlite3 P2P HDLC sentinel sequoiaDB milvus swoole 聚类 程序 性能分析 prometheus数据采集 prometheus数据模型 prometheus特点 MVS 海康威视相机 虚拟局域网 我的世界 我的世界联机 数码 UDP proxy模式 加解密 Yakit yaklang onlyoffice 在线office triton 模型分析 企业网络规划 华为eNSP 显卡驱动 服务器时间 流量运营 webgl OpenSSH KylinV10 麒麟操作系统 Vmware 考研 IPv4 子网掩码 公网IP 私有IP iBMC UltraISO SSH 密钥生成 SSH 公钥 私钥 生成 主从复制 chrome 浏览器下载 chrome 下载安装 谷歌浏览器下载 私有化 aarch64 编译安装 HPC 容器技术 EtherCAT转Modbus ECT转Modbus协议 EtherCAT转485网关 ECT转Modbus串口网关 EtherCAT转485协议 ECT转Modbus网关 ros 安防软件 Ubuntu共享文件夹 共享目录 Linux共享文件夹 docker搭建pg docker搭建pgsql pg授权 postgresql使用 postgresql搭建 iperf3 带宽测试 MySql 树莓派 VNC glibc seleium 域名服务 DHCP 符号链接 配置 uv docker搭建nacos详解 docker部署nacos docker安装nacos 腾讯云搭建nacos centos7搭建nacos fstab Unity插件 iventoy VmWare OpenEuler harmonyOS面试题 代码 对比 工具 meld Beyond Compare DiffMerge 邮件APP 免费软件 top Linux top top命令详解 top命令重点 top常用参数 云桌面 微软 AD域控 证书服务器 个人博客 ubuntu20.04 ros1 Noetic 20.04 apt 安装 本地部署AI大模型 lio-sam SLAM HiCar CarLife+ CarPlay QT RK3588 react native AP配网 AK配网 小程序AP配网和AK配网教程 WIFI设备配网小程序UDP开 deep learning cd 目录切换 Node-Red 编程工具 流编程 影刀 #影刀RPA# deepseek r1 rtsp服务器 rtsp server android rtsp服务 安卓rtsp服务器 移动端rtsp服务 大牛直播SDK 软负载 AI-native Docker Desktop deployment daemonset statefulset cronjob 带外管理 读写锁 实习 AI Agent 字节智能运维 办公自动化 自动化生成 pdf教程 rnn grub 版本升级 扩容 游戏开发 粘包问题 端口 查看 ss 磁盘镜像 服务器镜像 服务器实时复制 实时文件备份 arcgis 大模型推理 figma navicat MQTT协议 消息服务器 win服务器架设 windows server 金仓数据库 2025 征文 数据库平替用金仓 rag ragflow 源码启动 迁移指南 运维监控 llama.cpp pyautogui dns是什么 如何设置电脑dns dns应该如何设置 分布式训练 Linux find grep 钉钉 代理 Attention rclone AList webdav fnOS OpenManus 抓包工具 状态模式 SVN Server tortoise svn miniapp 调试 debug 断点 网络API请求调试方法 matplotlib bcompare docker desktop image 本地知识库部署 DeepSeek R1 模型 软件卸载 系统清理 HAProxy UOS1070e 网络建设与运维 物联网开发 接口优化 k8s二次开发 visual studio gnu 多路转接 数字证书 签署证书 智能电视 解决方案 kernel vllm docker部署Python yum换源 AI员工 风扇控制软件 服务器正确解析请求体 西门子PLC 通讯 网络爬虫 开机黑屏 沙盒 嵌入式系统开发 增强现实 沉浸式体验 应用场景 技术实现 案例分析 AR 极限编程 虚幻引擎 virtualbox conda配置 conda镜像源 nosql Sealos 论文阅读 热榜 稳定性 看门狗 大模型部署 ArtTS MobaXterm 网络搭建 神州数码 神州数码云平台 云平台 js PPI String Cytoscape CytoHubba 鸿蒙开发 移动开发 macOS 搭建个人相关服务器 项目部署 推荐算法 mm-wiki搭建 linux搭建mm-wiki mm-wiki搭建与使用 mm-wiki使用 mm-wiki详解 离线部署dify hosts dock 加速 MDK 嵌入式开发工具 论文笔记 sublime text 本地化部署 ranger MySQL8.0 玩机技巧 软件分享 软件图标 欧标 OCPP HarmonyOS NEXT 原生鸿蒙 达梦 DM8 IO 搜狗输入法 中文输入法 Qwen2.5-VL CentOS Stream yolov5 rpa 端口聚合 windows11 System V共享内存 进程通信 云耀服务器