k8s--etcd

目录

静态pod

使用步骤:

关键特性说明:

常见使用场景:

案例:

环境变量

配置全景解析

实操:​​

查看etcd集群节点信息

查看集群健康状态

数据库操作命令

增加(put)

查询(get)

删除(del)

租约命令

添加租约

删除租约


静态pod

以下是一个简洁实用的 ​静态 Pod (Static Pod) 模板,适用于在 Kubernetes 节点上直接部署关键组件(如 etcd、kube-apiserver 等):

复制代码
# static-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-static-pod      # Pod名称
  namespace: default       # 命名空间(静态Pod不受Namespace限制)
spec:
  containers:
  - name: main-container  # 容器名称
    image: nginx:latest   # 容器镜像
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80    # 容器暴露端口
    resources:
      limits:              # 资源限制(可选)
        cpu: "0.5"
        memory: "512Mi"
    livenessProbe:         # 存活探针(可选)
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 5
      periodSeconds: 10
  restartPolicy: Always    # 重启策略(必须为Always)

使用步骤:

  1. 保存文件

    将上述内容保存为 YAML 文件(如 my-static-pod.yaml

  2. 放置到监控目录

    复制到 Master 节点的静态 Pod 目录(默认 /etc/kubernetes/manifests):

    复制代码
    sudo cp my-static-pod.yaml /etc/kubernetes/manifests/
  3. 自动生效

    Kubelet 会自动检测并创建 该 Pod(无需 kubectl apply):

    复制代码
    # 查看Pod状态(约10-20秒后生效)
    kubectl get pods

关键特性说明:

特性 说明
无需控制平面 由节点上的 ​Kubelet 直接管理,不经过 API Server
高可用保障 即使控制平面崩溃,静态 Pod 仍能运行
部署位置 必须放在 Kubelet 的 --pod-manifest-path 指定目录(默认 /etc/kubernetes/manifests
命名规则 名称需唯一,避免与其他静态 Pod 冲突
重启策略 必须为 Always(Kubelet 会持续监控并重启)
删除方式 只能通过删除节点上的 YAML 文件来移除 Pod

常见使用场景:

  1. 部署控制平面组件

    复制代码
    # 典型目录结构(Kubeadm默认配置)
    /etc/kubernetes/manifests/
    ├── etcd.yaml
    ├── kube-apiserver.yaml
    ├── kube-controller-manager.yaml
    └── kube-scheduler.yaml
  2. 节点级监控/日志代理

    复制代码
    containers:
    - name: node-exporter
      image: prom/node-exporter:latest
  3. 网络插件组件

    复制代码
    containers:
    - name: kube-proxy
      image: k8s.gcr.io/kube-proxy:v1.24.0

案例:

cpp 复制代码
###  编辑pod文件
[root@k8s-master ~]# vim nginx.yaml
[root@k8s-master ~]# cp ./nginx.yaml /etc/kubernetes/manifests/
[root@k8s-master ~]# cd /etc/kubernetes/manifests/
[root@k8s-master manifests]# ls
etcd.yaml  kube-apiserver.yaml  kube-controller-manager.yaml  kube-scheduler.yaml  nginx.yaml

###  自动生成pod,
[root@k8s-master manifests]# kubectl get po
NAME                             READY   STATUS    RESTARTS   AGE
mynginx-k8s-master               1/1     Running   0          12s
nginx-deploy1-75c4474d6d-9nzlb   1/1     Running   0          7m42s
nginx-deploy1-75c4474d6d-mv6tp   1/1     Running   0          7m51s
nginx-deploy1-75c4474d6d-zv9cz   1/1     Running   0          7m47s

#### 复制一份给node节点
[root@k8s-master manifests]# scp nginx.yaml 192.168.158.34:/root/

Authorized users only. All activities may be monitored and reported.
nginx.yaml                                                                      100%  386     1.0MB/s   00:00 


###在node节点操作
[root@k8s-node1 ~]# cp nginx.yaml /etc/kubernetes/manifests/

###  master节点 查看pod
[root@k8s-master manifests]# kubectl get po
NAME                             READY   STATUS    RESTARTS   AGE
mynginx-k8s-master               1/1     Running   0          5m2s
mynginx-k8s-node1                1/1     Running   0          7s
nginx-deploy1-75c4474d6d-9nzlb   1/1     Running   0          12m
nginx-deploy1-75c4474d6d-mv6tp   1/1     Running   0          12m
nginx-deploy1-75c4474d6d-zv9cz   1/1     Running   0          12m

etcd

集群管理命令

etcdctl在etcd数据库里面有,但是它etcdctl命令没有映射出来

想要正常使用就,网上github下载

etcdctl是一个**命令行的客户端**,它提供了一些命令,可以方便我们在对服务进行测试或者手动修改数据库内容。etcdctl命令基本用法如下所示:

cpp 复制代码
etcdctl [global options] command [command options] [args...]

具体的命令选项参数可以通过 etcdctl command --help来获取相关帮助

环境变量

获得etcd数据库的访问url

cpp 复制代码
[root@k8s-master ~]# kubectl -n kube-system get pods etcd-k8s-master -o yaml  | grep -A10 "containers:" | grep "https://"
    - --advertise-client-urls=https://192.168.158.33:2379
    - --initial-advertise-peer-urls=https://192.168.158.33:2380
    - --initial-cluster=k8s-master=https://192.168.158.33:2380

参数解析

  1. --advertise-client-urls=https://192.168.158.15:2379

作用:客户端访问地址

含义:

https://192.168.158.15:2379 是 etcd 对外公开的服务地址

Kubernetes 组件(如 kube-apiserver)通过此地址连接 etcd

关键点:

这是集群内部通信的核心入口

必须与 kube-apiserver 的 --etcd-servers 参数配置一致

  1. --initial-advertise-peer-urls=https://192.168.158.15:2380

作用:集群节点间通信地址

含义:

https://192.168.158.15:2380 是 etcd 节点之间互相通信的地址

用于 etcd 集群内部数据同步、选举等

关键点:

此地址必须能被其他 etcd 节点访问(若为多节点集群)

端口 2380 是 etcd 节点间通信的默认端口

  1. --initial-cluster=k8s-master=https://192.168.158.15:2380

作用:定义 etcd 初始集群成员

含义:

k8s-master:当前 etcd 节点的名称(通常与主机名一致)

https://192.168.158.15:2380:该节点的 peer 通信地址

关键点:

在单节点集群中,只需配置自身地址

在多节点集群中,需列出所有成员(如 node1=https://IP1:2380,node2=https://IP2:2380

此参数仅在集群初始化时生效,后续节点变更需通过 etcdctl 操作

配置全景解析

参数 协议/端口 通信方向 使用者 安全机制
advertise-client-urls HTTPS/2379 入站 kube-apiserver TLS 加密 + 证书认证
initial-advertise-peer-urls HTTPS/2380 入站 其他 etcd 节点 TLS 加密 + 证书认证
initial-cluster - - etcd 启动时自检 定义集群拓扑

如果遇到使用了TLS加密的集群,通常每条指令都需要指定证书路径和etcd节点地址,可以把相关命令行参数添加在环境变量中,在**~/.bashrc**添加以下内容:

cpp 复制代码
[root@k8s-master etcd]# cat ~/.bashrc
#没有调用变量就可以不用写下面这两个
HOST_1=https://192.168.166.33:2379
ENDPOINTS=${HOST_1}
# 如果需要使用原生命令,在命令开头加一个\ 例如:\etcdctl command
#每次连接执行如下命令
#向 .bashrc 里添加如下命令行
alias etcdctl="etcdctl --cert /etc/kubernetes/pki/etcd/peer.crt --key /etc/kubernetes/pki/etcd/peer.key --endpoints=https://192.168.158.33:2379  --insecure-skip-tls-verify"
​
#然后执行
[root@k8s-master ~]# source .bashrc
实操:


cpp 复制代码
[root@k8s-master ~]# cat .bashrc
# .bashrc
​
# User specific aliases and functions
​
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
​
# Source global definitions
if [ -f /etc/bashrc ]; then
       . /etc/bashrc
fi
​
###  添加之后如下
[root@k8s-master ~]# vim .bashrc
# .bashrc
​
# User specific aliases and functions
​
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
​
alias etcdctl="etcdctl --cert /etc/kubernetes/pki/etcd/peer.crt --key /etc/kubernetes/pki/etcd/peer.key --endpoints=https://192.168.158.33:2379  --insecure-skip-tls-verify"
​
# Source global definitions
if [ -f /etc/bashrc ]; then
       . /etc/bashrc
fi
​
#然后执行,就可以使用etcdctl命令了
[root@k8s-master ~]# source .bashrc
​

证书存放位置

查看etcd版本

cpp 复制代码
[root@k8s-master ~]# etcdctl version
etcdctl version: 3.5.17
API version: 3.5
查看etcd集群节点信息
cpp 复制代码
[root@k8s-master ~]#  etcdctl  member list -w table
查看集群健康状态
英文表头 (English Header) 中文翻译 (Chinese Translation) 说明 (Explanation)
ENDPOINT 端点 集群中节点的网络访问地址。
ID ID 节点的唯一标识符。
VERSION 版本 节点运行的软件/数据库版本。
DB SIZE 数据库大小 节点上数据库的数据量大小。
IS LEADER 是否为领导者 指示该节点是否是集群中的主节点(领导者)。
IS LEARNER 是否为学习者 指示该节点是否是一个学习者角色(通常不参与投票,只接收数据)。
RAFT TERM RAFT 任期 Raft 一致性算法中的任期编号。
RAFT INDEX RAFT 索引 Raft 日志的当前索引位置。
RAFT APPLIED INDEX RAFT 已应用索引 已被应用到状态机的最新日志条目索引。

总结一下:​

这张表展示了基于 ​Raft 一致性算法​(常用于 etcd、Consul 等分布式系统)的集群节点状态信息。通过此表可以快速了解哪个节点是主节点(Leader)、各节点的数据同步进度(索引信息)以及基本状态。

数据库操作命令

增加(put)

添加一个键值,基本用法如下所示:

cpp 复制代码
etcdctl put [options] <key> <value> [flags]

常用参数如下所示:

参数 功能描述
--prev-kv 输出修改前的键值

注意事项:

  • 其中value接受从stdin的输入内容

  • 如果value是以横线-开始,将会被视为flag,如果不希望出现这种情况,可以使用两个横线代替--

  • 若键已经存在,则进行更新并覆盖原有值,若不存在,则进行添加

增加(put):

cpp 复制代码
[root@k8s-master ~]# etcdctl put name cuiliang
OK
[root@k8s-master ~]# etcdctl put location -- -beijing
OK
[root@k8s-master ~]# etcdctl put foo1 bar1
OK
[root@k8s-master ~]# etcdctl put foo2 bar2
OK
[root@k8s-master ~]# etcdctl put foo3 bar3
OK
查询(get)

常用参数如下所示:

参数 功能描述
--hex 以十六进制形式输出
--limit number 设置输出结果的最大值
--prefix 根据prefix进行匹配key
--order 对输出结果进行排序,ASCEND 或 DESCEND
--sort-by 按给定字段排序,CREATE, KEY, MODIFY, VALUE, VERSION
--print-value-only 仅输出value值
--from-key 按byte进行比较,获取大于等于指定key的结果
--keys-only 仅获取keys

基本命令

cpp 复制代码
#获取所有的键值对
etcdctl get / --prefix --keys-only

# 获取键值
[root@tiaoban etcd]# etcdctl get name
name
cuiliang

# 只获取值
[root@tiaoban etcd]# etcdctl get location --print-value-only
-beijing

# 批量取从foo1到foo3的值,不包括foo3
[root@tiaoban etcd]# etcdctl get foo foo3 --print-value-only
bar1
bar2

# 批量获取前缀为foo的值
[root@tiaoban etcd]# etcdctl get --prefix foo --print-value-only
bar1
bar2
bar3

# 批量获取符合前缀的前两个值
[root@tiaoban etcd]# etcdctl get --prefix --limit=2 foo --print-value-only
bar1
bar2

# 批量获取前缀为foo的值,并排序
[root@tiaoban etcd]# etcdctl get --prefix foo --print-value-only --order DESCEND
bar3
bar2
bar1
删除(del)

删除键值,基本用法如下所示:

常用参数如下所示:

参数 功能描述
--prefix 根据prefix进行匹配删除
--prev-kv 输出删除的键值
--from-key 按byte进行比较,删除大于等于指定key的结果
cpp 复制代码
# 删除name的键值
[root@tiaoban etcd]# etcdctl del name
1
# 删除从foo1到foo3且不包含foo3的键值
[root@tiaoban etcd]# etcdctl del foo1 foo3
2
# 删除前缀为foo的所有键值
[root@tiaoban etcd]# etcdctl del --prefix foo
1

租约命令

租约具有生命周期,需要为租约授予一个TTL(time to live),将租约绑定到一个key上,则key的生命周期与租约一致,可续租,可撤销租约,类似于redis为键设置过期时间

添加租约
cpp 复制代码
[root@k8s-master ~]# etcdctl lease grant 60
lease 1d069904ddf74ef3 granted with TTL(60s)
[root@k8s-master ~]# etcdctl put --lease=1d069904ddf74ef3 foo bar1
OK
[root@k8s-master ~]# etcdctl get foo
foo
bar1
[root@k8s-master ~]# etcdctl get foo
[root@k8s-master ~]# 
返回为空
删除租约

通过租约 ID 撤销租约,撤销租约将删除其所有绑定的 key。 主要用法如下所示:

cpp 复制代码
# 设置600秒后过期租约
[root@tiaoban etcd]# etcdctl lease grant 600
lease 6e1e86f4c6512a39 granted with TTL(600s)
# 把foo和租约绑定,600秒后过期
[root@tiaoban etcd]# etcdctl put --lease=6e1e86f4c6512a39 foo bar
OK
# 查看租约详情
[root@tiaoban etcd]# etcdctl lease timetolive --keys 6e1e86f4c6512a39
lease 6e1e86f4c6512a39 granted with TTL(600s), remaining(556s), attached keys([foo])
# 删除租约
[root@tiaoban etcd]# etcdctl lease revoke 6e1e86f4c6512a39
lease 6e1e86f4c6512a39 revoked
# 查看租约详情
[root@tiaoban etcd]# etcdctl lease timetolive --keys 6e1e86f4c6512a39
lease 6e1e86f4c6512a39 already expired
# 获取键值
[root@tiaoban etcd]# etcdctl get foo
返回为空
相关推荐
lovebugs6 小时前
Docker Java 开发者必须掌握的 Docker 命令大全
后端·docker·容器
COTAS6 小时前
K8S 知识框架和命令操作
java·容器·kubernetes
待磨的钝刨7 小时前
本地构建的 Docker 镜像迁移到另一台电脑上运行
docker·容器·eureka
奋斗的蛋黄8 小时前
CGroup 资源控制组 + Docker 网络模式
网络·docker·容器
AI码上来9 小时前
再见 K8s!3款开源的云原生部署工具
云原生·kubernetes·开源
百思可瑞教育10 小时前
Jenkins+Docker 实现一键自动化部署项目
运维·docker·容器·自动化·jenkins·北京百思可瑞教育·百思可瑞教育
玛丽莲茼蒿11 小时前
K8s学习笔记(一)——
笔记·学习·kubernetes
Arthurmoo13 小时前
Kubernetes集群升级与etcd备份恢复指南
容器·kubernetes·etcd
竹竿袅袅13 小时前
Kubernetes 构建高可用、高性能 Redis 集群
redis·云原生·容器·kubernetes